igniter 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +162 -624
  4. data/bin/igniter-stack +94 -0
  5. data/docs/README.md +62 -0
  6. data/examples/README.md +74 -349
  7. data/examples/agent_orchestration.rb +76 -0
  8. data/examples/agents.rb +2 -1
  9. data/examples/catalog.rb +412 -0
  10. data/examples/consensus.rb +13 -11
  11. data/examples/dataflow.rb +3 -2
  12. data/examples/distributed_workflow.rb +1 -1
  13. data/examples/effects.rb +10 -9
  14. data/examples/incremental.rb +4 -3
  15. data/examples/introspection.rb +49 -0
  16. data/examples/invariants.rb +4 -3
  17. data/examples/llm_tools.rb +18 -18
  18. data/examples/mesh.rb +16 -14
  19. data/examples/mesh_discovery.rb +41 -21
  20. data/examples/mesh_gossip.rb +19 -17
  21. data/examples/reactive_auditing.rb +50 -0
  22. data/examples/run.rb +163 -0
  23. data/lib/igniter/monorepo_packages.rb +17 -0
  24. data/lib/igniter/stack.rb +5 -0
  25. data/lib/igniter.rb +33 -17
  26. data/packages/igniter-agents/README.md +22 -0
  27. data/{lib → packages/igniter-agents/lib}/igniter/agent/ref.rb +1 -0
  28. data/{lib → packages/igniter-agents/lib}/igniter/agent/runner.rb +12 -0
  29. data/{lib → packages/igniter-agents/lib}/igniter/agent.rb +6 -0
  30. data/{lib → packages/igniter-agents/lib}/igniter/agents/proactive_agent.rb +1 -1
  31. data/packages/igniter-agents/lib/igniter/agents.rb +23 -0
  32. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/chain_agent.rb +4 -2
  33. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/critic_agent.rb +4 -2
  34. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/evaluator_agent.rb +4 -2
  35. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/evolution_agent.rb +4 -2
  36. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/observer_agent.rb +4 -2
  37. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/planner_agent.rb +4 -2
  38. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/router_agent.rb +4 -2
  39. data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/ai/agents}/self_reflection_agent.rb +4 -2
  40. data/packages/igniter-agents/lib/igniter/ai/agents.rb +25 -0
  41. data/{lib → packages/igniter-agents/lib}/igniter/registry.rb +2 -0
  42. data/packages/igniter-agents/lib/igniter/runtime/registry_agent_adapter.rb +102 -0
  43. data/{lib → packages/igniter-agents/lib}/igniter/supervisor.rb +3 -0
  44. data/packages/igniter-agents/lib/igniter-agents.rb +7 -0
  45. data/packages/igniter-ai/README.md +20 -0
  46. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/config.rb +1 -1
  47. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/context.rb +2 -2
  48. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/executor.rb +14 -14
  49. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/anthropic.rb +5 -5
  50. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/base.rb +1 -1
  51. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/ollama.rb +4 -4
  52. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/openai.rb +5 -5
  53. data/{lib/igniter → packages/igniter-ai/lib/igniter/ai}/skill/feedback.rb +4 -4
  54. data/{lib/igniter → packages/igniter-ai/lib/igniter/ai}/skill/output_schema.rb +6 -6
  55. data/packages/igniter-ai/lib/igniter/ai/skill/runtime_contract.rb +87 -0
  56. data/packages/igniter-ai/lib/igniter/ai/skill.rb +107 -0
  57. data/packages/igniter-ai/lib/igniter/ai/tool_registry.rb +79 -0
  58. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/assemblyai.rb +8 -8
  59. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/base.rb +3 -3
  60. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/deepgram.rb +3 -3
  61. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/providers/openai.rb +3 -3
  62. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/transcriber.rb +6 -6
  63. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/transcription/transcript_result.rb +1 -1
  64. data/{lib/igniter/integrations/llm.rb → packages/igniter-ai/lib/igniter/ai.rb} +18 -15
  65. data/packages/igniter-ai/lib/igniter-ai.rb +3 -0
  66. data/packages/igniter-app/README.md +19 -0
  67. data/packages/igniter-app/lib/igniter/app/app_config.rb +43 -0
  68. data/packages/igniter-app/lib/igniter/app/app_host.rb +56 -0
  69. data/packages/igniter-app/lib/igniter/app/app_host_config.rb +27 -0
  70. data/packages/igniter-app/lib/igniter/app/app_host_pack.rb +13 -0
  71. data/{lib/igniter/application → packages/igniter-app/lib/igniter/app}/autoloader.rb +2 -2
  72. data/packages/igniter-app/lib/igniter/app/cluster_app_host.rb +95 -0
  73. data/packages/igniter-app/lib/igniter/app/cluster_app_host_config.rb +78 -0
  74. data/packages/igniter-app/lib/igniter/app/credentials/config_loader.rb +152 -0
  75. data/packages/igniter-app/lib/igniter/app/credentials/credential.rb +48 -0
  76. data/packages/igniter-app/lib/igniter/app/credentials/credential_policy.rb +38 -0
  77. data/packages/igniter-app/lib/igniter/app/credentials/events/credential_event.rb +179 -0
  78. data/packages/igniter-app/lib/igniter/app/credentials/events.rb +12 -0
  79. data/packages/igniter-app/lib/igniter/app/credentials/lease_request.rb +153 -0
  80. data/packages/igniter-app/lib/igniter/app/credentials/policies/ephemeral_lease_policy.rb +35 -0
  81. data/packages/igniter-app/lib/igniter/app/credentials/policies/local_only_policy.rb +33 -0
  82. data/packages/igniter-app/lib/igniter/app/credentials/policies.rb +13 -0
  83. data/packages/igniter-app/lib/igniter/app/credentials/store.rb +21 -0
  84. data/packages/igniter-app/lib/igniter/app/credentials/stores/file_store.rb +114 -0
  85. data/packages/igniter-app/lib/igniter/app/credentials/trail.rb +254 -0
  86. data/packages/igniter-app/lib/igniter/app/credentials.rb +20 -0
  87. data/packages/igniter-app/lib/igniter/app/dev_output_sync.rb +4 -0
  88. data/packages/igniter-app/lib/igniter/app/diagnostics/app_host_contributor.rb +71 -0
  89. data/packages/igniter-app/lib/igniter/app/diagnostics/cluster_app_host_contributor.rb +97 -0
  90. data/packages/igniter-app/lib/igniter/app/diagnostics/credential_contributor.rb +66 -0
  91. data/packages/igniter-app/lib/igniter/app/diagnostics/evolution_contributor.rb +74 -0
  92. data/packages/igniter-app/lib/igniter/app/diagnostics/ignite_contributor.rb +121 -0
  93. data/packages/igniter-app/lib/igniter/app/diagnostics/loader_contributor.rb +68 -0
  94. data/packages/igniter-app/lib/igniter/app/diagnostics/orchestration_contributor.rb +200 -0
  95. data/packages/igniter-app/lib/igniter/app/diagnostics/runtime_contributor.rb +68 -0
  96. data/packages/igniter-app/lib/igniter/app/diagnostics/scheduler_contributor.rb +72 -0
  97. data/packages/igniter-app/lib/igniter/app/diagnostics/sdk_contributor.rb +284 -0
  98. data/packages/igniter-app/lib/igniter/app/diagnostics.rb +62 -0
  99. data/packages/igniter-app/lib/igniter/app/evolution/approval_decision.rb +115 -0
  100. data/packages/igniter-app/lib/igniter/app/evolution/approval_request.rb +36 -0
  101. data/packages/igniter-app/lib/igniter/app/evolution/plan.rb +72 -0
  102. data/packages/igniter-app/lib/igniter/app/evolution/planner.rb +85 -0
  103. data/packages/igniter-app/lib/igniter/app/evolution/result.rb +45 -0
  104. data/packages/igniter-app/lib/igniter/app/evolution/runner.rb +102 -0
  105. data/packages/igniter-app/lib/igniter/app/evolution/store.rb +21 -0
  106. data/packages/igniter-app/lib/igniter/app/evolution/stores/file_store.rb +241 -0
  107. data/packages/igniter-app/lib/igniter/app/evolution/trail.rb +108 -0
  108. data/packages/igniter-app/lib/igniter/app/evolution.rb +11 -0
  109. data/packages/igniter-app/lib/igniter/app/filesystem_loader_adapter.rb +21 -0
  110. data/packages/igniter-app/lib/igniter/app/generator.rb +636 -0
  111. data/packages/igniter-app/lib/igniter/app/generators/cluster.rb +1367 -0
  112. data/packages/igniter-app/lib/igniter/app/generators/dashboard.rb +152 -0
  113. data/packages/igniter-app/lib/igniter/app/generators/playground.rb +1227 -0
  114. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/README.md.erb +37 -0
  115. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/app.rb.erb +19 -0
  116. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/contexts/home_context.rb.erb +54 -0
  117. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/frontend/application.js.erb +3 -0
  118. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/spec/dashboard_app_spec.rb.erb +79 -0
  119. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/support/stack_overview.rb.erb +23 -0
  120. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/handlers/home_handler.rb.erb +27 -0
  121. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.arb.erb +44 -0
  122. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.rb.erb +56 -0
  123. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/layout.arb.erb +17 -0
  124. data/packages/igniter-app/lib/igniter/app/host_adapter.rb +26 -0
  125. data/packages/igniter-app/lib/igniter/app/host_config.rb +40 -0
  126. data/packages/igniter-app/lib/igniter/app/host_registry.rb +43 -0
  127. data/packages/igniter-app/lib/igniter/app/loader_adapter.rb +15 -0
  128. data/packages/igniter-app/lib/igniter/app/loader_pack.rb +8 -0
  129. data/packages/igniter-app/lib/igniter/app/loader_registry.rb +39 -0
  130. data/packages/igniter-app/lib/igniter/app/observability/operator_action_handler.rb +147 -0
  131. data/packages/igniter-app/lib/igniter/app/observability/operator_console_handler.rb +747 -0
  132. data/packages/igniter-app/lib/igniter/app/observability/operator_overview_handler.rb +350 -0
  133. data/packages/igniter-app/lib/igniter/app/observability.rb +5 -0
  134. data/packages/igniter-app/lib/igniter/app/observability_pack.rb +71 -0
  135. data/packages/igniter-app/lib/igniter/app/operator/dispatcher.rb +40 -0
  136. data/packages/igniter-app/lib/igniter/app/operator/handler_registry.rb +40 -0
  137. data/packages/igniter-app/lib/igniter/app/operator/handler_result.rb +67 -0
  138. data/packages/igniter-app/lib/igniter/app/operator/handlers/base.rb +79 -0
  139. data/packages/igniter-app/lib/igniter/app/operator/handlers/ignite_handler.rb +108 -0
  140. data/packages/igniter-app/lib/igniter/app/operator/handlers/orchestration_handler.rb +33 -0
  141. data/packages/igniter-app/lib/igniter/app/operator/handlers.rb +5 -0
  142. data/packages/igniter-app/lib/igniter/app/operator/lifecycle_contract.rb +55 -0
  143. data/packages/igniter-app/lib/igniter/app/operator/policy.rb +157 -0
  144. data/packages/igniter-app/lib/igniter/app/operator.rb +17 -0
  145. data/packages/igniter-app/lib/igniter/app/orchestration/action_result_builder.rb +65 -0
  146. data/packages/igniter-app/lib/igniter/app/orchestration/followup_request.rb +36 -0
  147. data/packages/igniter-app/lib/igniter/app/orchestration/handler_registry.rb +58 -0
  148. data/packages/igniter-app/lib/igniter/app/orchestration/handlers.rb +106 -0
  149. data/packages/igniter-app/lib/igniter/app/orchestration/inbox.rb +283 -0
  150. data/packages/igniter-app/lib/igniter/app/orchestration/inbox_query.rb +293 -0
  151. data/packages/igniter-app/lib/igniter/app/orchestration/lane_registry.rb +100 -0
  152. data/packages/igniter-app/lib/igniter/app/orchestration/operator_query.rb +449 -0
  153. data/packages/igniter-app/lib/igniter/app/orchestration/plan.rb +68 -0
  154. data/packages/igniter-app/lib/igniter/app/orchestration/planner.rb +89 -0
  155. data/packages/igniter-app/lib/igniter/app/orchestration/policies.rb +125 -0
  156. data/packages/igniter-app/lib/igniter/app/orchestration/policy_registry.rb +63 -0
  157. data/packages/igniter-app/lib/igniter/app/orchestration/result.rb +43 -0
  158. data/packages/igniter-app/lib/igniter/app/orchestration/routing_registry.rb +43 -0
  159. data/packages/igniter-app/lib/igniter/app/orchestration/runner.rb +50 -0
  160. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_event_query.rb +205 -0
  161. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_overview_builder.rb +286 -0
  162. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_query_overview_builder.rb +20 -0
  163. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_result_builder.rb +23 -0
  164. data/packages/igniter-app/lib/igniter/app/orchestration.rb +113 -0
  165. data/packages/igniter-app/lib/igniter/app/runtime.rb +4 -0
  166. data/packages/igniter-app/lib/igniter/app/runtime_context.rb +101 -0
  167. data/packages/igniter-app/lib/igniter/app/runtime_pack.rb +16 -0
  168. data/packages/igniter-app/lib/igniter/app/scaffold_pack.rb +6 -0
  169. data/{lib/igniter/application → packages/igniter-app/lib/igniter/app}/scheduler.rb +2 -2
  170. data/packages/igniter-app/lib/igniter/app/scheduler_adapter.rb +17 -0
  171. data/packages/igniter-app/lib/igniter/app/scheduler_pack.rb +8 -0
  172. data/packages/igniter-app/lib/igniter/app/scheduler_registry.rb +39 -0
  173. data/packages/igniter-app/lib/igniter/app/stack.rb +1726 -0
  174. data/packages/igniter-app/lib/igniter/app/stack_pack.rb +3 -0
  175. data/packages/igniter-app/lib/igniter/app/threaded_scheduler_adapter.rb +35 -0
  176. data/packages/igniter-app/lib/igniter/app/yml_loader.rb +43 -0
  177. data/packages/igniter-app/lib/igniter/app.rb +2367 -0
  178. data/packages/igniter-app/lib/igniter/ignite/bootstrap_agent.rb +334 -0
  179. data/packages/igniter-app/lib/igniter/ignite/bootstrap_target.rb +79 -0
  180. data/packages/igniter-app/lib/igniter/ignite/deployment_intent.rb +82 -0
  181. data/packages/igniter-app/lib/igniter/ignite/ignition_agent.rb +1011 -0
  182. data/packages/igniter-app/lib/igniter/ignite/ignition_plan.rb +83 -0
  183. data/packages/igniter-app/lib/igniter/ignite/ignition_report.rb +144 -0
  184. data/packages/igniter-app/lib/igniter/ignite/store.rb +19 -0
  185. data/packages/igniter-app/lib/igniter/ignite/stores/file_store.rb +112 -0
  186. data/packages/igniter-app/lib/igniter/ignite/trail.rb +215 -0
  187. data/packages/igniter-app/lib/igniter/ignite.rb +11 -0
  188. data/packages/igniter-app/lib/igniter-app.rb +5 -0
  189. data/packages/igniter-cluster/README.md +9 -0
  190. data/packages/igniter-cluster/lib/igniter/cluster/agent_route_resolver.rb +58 -0
  191. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/cluster.rb +8 -4
  192. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/errors.rb +3 -1
  193. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/executors.rb +3 -1
  194. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/node.rb +3 -1
  195. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/read_query.rb +5 -3
  196. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/consensus/state_machine.rb +4 -2
  197. data/packages/igniter-cluster/lib/igniter/cluster/consensus.rb +18 -0
  198. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/governance_contributor.rb +90 -0
  199. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/identity_contributor.rb +98 -0
  200. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/routing_contributor.rb +674 -0
  201. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics.rb +24 -0
  202. data/packages/igniter-cluster/lib/igniter/cluster/events/envelope.rb +136 -0
  203. data/packages/igniter-cluster/lib/igniter/cluster/events/hook_support.rb +33 -0
  204. data/packages/igniter-cluster/lib/igniter/cluster/events/log.rb +102 -0
  205. data/packages/igniter-cluster/lib/igniter/cluster/events/projection_feed.rb +98 -0
  206. data/packages/igniter-cluster/lib/igniter/cluster/events/read_model_projector.rb +32 -0
  207. data/packages/igniter-cluster/lib/igniter/cluster/events.rb +131 -0
  208. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_decision.rb +41 -0
  209. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_policy.rb +66 -0
  210. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_queue.rb +88 -0
  211. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_request.rb +62 -0
  212. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_workflow.rb +214 -0
  213. data/packages/igniter-cluster/lib/igniter/cluster/governance/checkpoint.rb +141 -0
  214. data/packages/igniter-cluster/lib/igniter/cluster/governance/compaction_record.rb +33 -0
  215. data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/checkpoint_store.rb +89 -0
  216. data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/file_store.rb +249 -0
  217. data/packages/igniter-cluster/lib/igniter/cluster/governance/trail.rb +164 -0
  218. data/packages/igniter-cluster/lib/igniter/cluster/governance.rb +12 -0
  219. data/packages/igniter-cluster/lib/igniter/cluster/identity/capability_attestation.rb +114 -0
  220. data/packages/igniter-cluster/lib/igniter/cluster/identity/manifest.rb +139 -0
  221. data/packages/igniter-cluster/lib/igniter/cluster/identity/node_identity.rb +106 -0
  222. data/packages/igniter-cluster/lib/igniter/cluster/identity.rb +5 -0
  223. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/announcer.rb +37 -4
  224. data/packages/igniter-cluster/lib/igniter/cluster/mesh/checkpoint_gossip.rb +60 -0
  225. data/packages/igniter-cluster/lib/igniter/cluster/mesh/config.rb +146 -0
  226. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/discovery.rb +7 -2
  227. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/errors.rb +10 -5
  228. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/gossip.rb +19 -4
  229. data/packages/igniter-cluster/lib/igniter/cluster/mesh/mesh_ql.rb +470 -0
  230. data/packages/igniter-cluster/lib/igniter/cluster/mesh/node_observation.rb +281 -0
  231. data/packages/igniter-cluster/lib/igniter/cluster/mesh/observation_query.rb +284 -0
  232. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer.rb +51 -0
  233. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_capacity_report.rb +42 -0
  234. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_identity_envelope.rb +158 -0
  235. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_metadata.rb +122 -0
  236. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_registry.rb +81 -0
  237. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_decision.rb +64 -0
  238. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_planner.rb +154 -0
  239. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_policy.rb +103 -0
  240. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/mesh/poller.rb +19 -4
  241. data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_plan.rb +66 -0
  242. data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_planner.rb +153 -0
  243. data/packages/igniter-cluster/lib/igniter/cluster/mesh/repair_loop.rb +169 -0
  244. data/packages/igniter-cluster/lib/igniter/cluster/mesh/router.rb +306 -0
  245. data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_signal.rb +46 -0
  246. data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_tracker.rb +215 -0
  247. data/packages/igniter-cluster/lib/igniter/cluster/mesh.rb +452 -0
  248. data/packages/igniter-cluster/lib/igniter/cluster/ownership/claim.rb +69 -0
  249. data/packages/igniter-cluster/lib/igniter/cluster/ownership/errors.rb +19 -0
  250. data/packages/igniter-cluster/lib/igniter/cluster/ownership/owner_client.rb +76 -0
  251. data/packages/igniter-cluster/lib/igniter/cluster/ownership/registry.rb +98 -0
  252. data/packages/igniter-cluster/lib/igniter/cluster/ownership/resolver.rb +62 -0
  253. data/packages/igniter-cluster/lib/igniter/cluster/ownership.rb +81 -0
  254. data/packages/igniter-cluster/lib/igniter/cluster/projection_store.rb +62 -0
  255. data/packages/igniter-cluster/lib/igniter/cluster/rag/chunk.rb +49 -0
  256. data/packages/igniter-cluster/lib/igniter/cluster/rag/fanout_retriever.rb +93 -0
  257. data/packages/igniter-cluster/lib/igniter/cluster/rag/knowledge_shard.rb +140 -0
  258. data/packages/igniter-cluster/lib/igniter/cluster/rag/net_http_adapter.rb +85 -0
  259. data/packages/igniter-cluster/lib/igniter/cluster/rag/ranker.rb +46 -0
  260. data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_query.rb +30 -0
  261. data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_result.rb +77 -0
  262. data/packages/igniter-cluster/lib/igniter/cluster/rag.rb +38 -0
  263. data/packages/igniter-cluster/lib/igniter/cluster/remote_adapter.rb +101 -0
  264. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrapper.rb +3 -1
  265. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrappers/gem.rb +11 -4
  266. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrappers/git.rb +9 -2
  267. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/bootstrappers/tarball.rb +8 -2
  268. data/packages/igniter-cluster/lib/igniter/cluster/replication/capability_query.rb +675 -0
  269. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/expansion_plan.rb +5 -3
  270. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/expansion_planner.rb +41 -29
  271. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/manifest.rb +3 -1
  272. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/network_topology.rb +44 -17
  273. data/packages/igniter-cluster/lib/igniter/cluster/replication/node_profile.rb +134 -0
  274. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/reflective_replication_agent.rb +50 -29
  275. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/replication_agent.rb +4 -2
  276. data/{lib/igniter → packages/igniter-cluster/lib/igniter/cluster}/replication/ssh_session.rb +3 -1
  277. data/packages/igniter-cluster/lib/igniter/cluster/replication.rb +38 -0
  278. data/packages/igniter-cluster/lib/igniter/cluster/routed_agent_adapter.rb +79 -0
  279. data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_executor.rb +427 -0
  280. data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_result.rb +38 -0
  281. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_plan.rb +34 -0
  282. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_planner.rb +76 -0
  283. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_result.rb +34 -0
  284. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_runner.rb +125 -0
  285. data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_assessment.rb +37 -0
  286. data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_store.rb +58 -0
  287. data/packages/igniter-cluster/lib/igniter/cluster/trust/verifier.rb +80 -0
  288. data/packages/igniter-cluster/lib/igniter/cluster/trust.rb +9 -0
  289. data/packages/igniter-cluster/lib/igniter/cluster.rb +71 -0
  290. data/packages/igniter-cluster/lib/igniter-cluster.rb +3 -0
  291. data/packages/igniter-core/README.md +21 -0
  292. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/capabilities.rb +3 -1
  293. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/compiled_graph.rb +40 -2
  294. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_pipeline.rb +1 -0
  295. data/packages/igniter-core/lib/igniter/core/compiler/validators/agent_validator.rb +142 -0
  296. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/dependencies_validator.rb +40 -1
  297. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler.rb +1 -0
  298. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/contract.rb +76 -6
  299. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow.rb +7 -7
  300. data/packages/igniter-core/lib/igniter/core/diagnostics/agent_contributor.rb +241 -0
  301. data/packages/igniter-core/lib/igniter/core/diagnostics/capability_contributor.rb +162 -0
  302. data/packages/igniter-core/lib/igniter/core/diagnostics/orchestration_contributor.rb +75 -0
  303. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/report.rb +81 -6
  304. data/packages/igniter-core/lib/igniter/core/diagnostics.rb +58 -0
  305. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/contract_builder.rb +163 -6
  306. data/packages/igniter-core/lib/igniter/core/dto/record.rb +189 -0
  307. data/packages/igniter-core/lib/igniter/core/dto.rb +8 -0
  308. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect.rb +4 -0
  309. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/errors.rb +26 -3
  310. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/graph_formatter.rb +32 -1
  311. data/packages/igniter-core/lib/igniter/core/extensions/introspection/plan_formatter.rb +85 -0
  312. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/runtime_formatter.rb +26 -0
  313. data/packages/igniter-core/lib/igniter/core/extensions/invariants.rb +70 -0
  314. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental.rb +4 -4
  315. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/memorable.rb +1 -1
  316. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/stores/sqlite.rb +5 -3
  317. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory.rb +11 -11
  318. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics/prometheus_exporter.rb +1 -1
  319. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics.rb +8 -8
  320. data/packages/igniter-core/lib/igniter/core/model/agent_interaction_contract.rb +172 -0
  321. data/packages/igniter-core/lib/igniter/core/model/agent_node.rb +86 -0
  322. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/branch_node.rb +37 -1
  323. data/packages/igniter-core/lib/igniter/core/model/remote_node.rb +91 -0
  324. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model.rb +2 -0
  325. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/node_cache.rb +1 -1
  326. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing.rb +8 -8
  327. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/builder.rb +30 -1
  328. data/packages/igniter-core/lib/igniter/core/runtime/agent_adapter.rb +41 -0
  329. data/packages/igniter-core/lib/igniter/core/runtime/agent_result_contract.rb +91 -0
  330. data/packages/igniter-core/lib/igniter/core/runtime/agent_route.rb +60 -0
  331. data/packages/igniter-core/lib/igniter/core/runtime/agent_route_resolver.rb +26 -0
  332. data/packages/igniter-core/lib/igniter/core/runtime/agent_session.rb +922 -0
  333. data/packages/igniter-core/lib/igniter/core/runtime/agent_session_query.rb +379 -0
  334. data/packages/igniter-core/lib/igniter/core/runtime/agent_transport.rb +30 -0
  335. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/cache.rb +6 -3
  336. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/deferred_result.rb +27 -1
  337. data/packages/igniter-core/lib/igniter/core/runtime/execution.rb +913 -0
  338. data/packages/igniter-core/lib/igniter/core/runtime/job_worker.rb +39 -0
  339. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/node_state.rb +4 -2
  340. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_overview.rb +213 -0
  341. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_runtime_state.rb +176 -0
  342. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_transition_query.rb +208 -0
  343. data/packages/igniter-core/lib/igniter/core/runtime/planner.rb +301 -0
  344. data/packages/igniter-core/lib/igniter/core/runtime/proxy_agent_adapter.rb +124 -0
  345. data/packages/igniter-core/lib/igniter/core/runtime/remote_adapter.rb +26 -0
  346. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/resolver.rb +250 -57
  347. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/result.rb +2 -0
  348. data/packages/igniter-core/lib/igniter/core/runtime/stores/sqlite_store.rb +155 -0
  349. data/packages/igniter-core/lib/igniter/core/runtime/stream_result.rb +171 -0
  350. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime.rb +15 -0
  351. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/temporal.rb +1 -1
  352. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/tool/discoverable.rb +3 -3
  353. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/tool.rb +6 -2
  354. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/version.rb +1 -1
  355. data/packages/igniter-core/lib/igniter/core.rb +23 -0
  356. data/packages/igniter-core/lib/igniter-core.rb +3 -0
  357. data/packages/igniter-extensions/README.md +21 -0
  358. data/packages/igniter-extensions/lib/igniter/extensions/auditing.rb +3 -0
  359. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/capabilities.rb +1 -1
  360. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/content_addressing.rb +1 -1
  361. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/dataflow.rb +1 -1
  362. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/differential.rb +1 -1
  363. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/execution_report.rb +1 -1
  364. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/incremental.rb +1 -1
  365. data/packages/igniter-extensions/lib/igniter/extensions/introspection.rb +3 -0
  366. data/packages/igniter-extensions/lib/igniter/extensions/invariants.rb +3 -0
  367. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/provenance.rb +1 -1
  368. data/packages/igniter-extensions/lib/igniter/extensions/reactive.rb +3 -0
  369. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/saga.rb +1 -1
  370. data/packages/igniter-extensions/lib/igniter/extensions.rb +8 -0
  371. data/packages/igniter-extensions/lib/igniter-extensions.rb +3 -0
  372. data/packages/igniter-frontend/README.md +224 -0
  373. data/packages/igniter-frontend/lib/igniter/frontend/app.rb +90 -0
  374. data/packages/igniter-frontend/lib/igniter/frontend/app_access.rb +36 -0
  375. data/packages/igniter-frontend/lib/igniter/frontend/arbre/component.rb +120 -0
  376. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/action_group.rb +53 -0
  377. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/badge.rb +91 -0
  378. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/boolean.rb +53 -0
  379. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/breadcrumbs.rb +71 -0
  380. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/card.rb +114 -0
  381. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/conversation_panel.rb +61 -0
  382. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/datetime.rb +42 -0
  383. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/display_value_support.rb +38 -0
  384. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/empty_state.rb +39 -0
  385. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/event_list.rb +44 -0
  386. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/filters.rb +183 -0
  387. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/indicator.rb +59 -0
  388. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/json_panel.rb +36 -0
  389. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/key_value_list.rb +40 -0
  390. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/loading_state.rb +43 -0
  391. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/metric_grid.rb +37 -0
  392. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/number.rb +53 -0
  393. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/page_header.rb +53 -0
  394. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/pagination.rb +143 -0
  395. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/panel.rb +67 -0
  396. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/percentage.rb +79 -0
  397. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/resource_list.rb +38 -0
  398. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/scenario_card.rb +48 -0
  399. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/shell_columns.rb +67 -0
  400. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/sidebar_shell.rb +106 -0
  401. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/table_with.rb +203 -0
  402. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/tabs.rb +147 -0
  403. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/viz.rb +185 -0
  404. data/packages/igniter-frontend/lib/igniter/frontend/arbre/page.rb +74 -0
  405. data/packages/igniter-frontend/lib/igniter/frontend/arbre/raw_text_node.rb +40 -0
  406. data/packages/igniter-frontend/lib/igniter/frontend/arbre/template_page.rb +243 -0
  407. data/packages/igniter-frontend/lib/igniter/frontend/arbre.rb +48 -0
  408. data/packages/igniter-frontend/lib/igniter/frontend/arbre_page.rb +7 -0
  409. data/packages/igniter-frontend/lib/igniter/frontend/assets.rb +101 -0
  410. data/packages/igniter-frontend/lib/igniter/frontend/builder.rb +124 -0
  411. data/packages/igniter-frontend/lib/igniter/frontend/component.rb +24 -0
  412. data/packages/igniter-frontend/lib/igniter/frontend/components.rb +7 -0
  413. data/packages/igniter-frontend/lib/igniter/frontend/context.rb +53 -0
  414. data/packages/igniter-frontend/lib/igniter/frontend/form_builder.rb +63 -0
  415. data/packages/igniter-frontend/lib/igniter/frontend/handler.rb +92 -0
  416. data/packages/igniter-frontend/lib/igniter/frontend/javascript.rb +353 -0
  417. data/packages/igniter-frontend/lib/igniter/frontend/page.rb +24 -0
  418. data/packages/igniter-frontend/lib/igniter/frontend/request.rb +61 -0
  419. data/packages/igniter-frontend/lib/igniter/frontend/response.rb +67 -0
  420. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/adapters.rb +226 -0
  421. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/presets.rb +147 -0
  422. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime.rb +259 -0
  423. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/surfaces.rb +1074 -0
  424. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/ui.rb +1438 -0
  425. data/packages/igniter-frontend/lib/igniter/frontend/tailwind.rb +180 -0
  426. data/packages/igniter-frontend/lib/igniter/frontend/version.rb +9 -0
  427. data/packages/igniter-frontend/lib/igniter/frontend.rb +35 -0
  428. data/packages/igniter-frontend/lib/igniter-frontend.rb +3 -0
  429. data/packages/igniter-rails/README.md +96 -0
  430. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/contract/templates/contract.rb.tt +22 -0
  431. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/install/templates/igniter.rb.tt +16 -0
  432. data/packages/igniter-rails/lib/igniter-rails.rb +3 -0
  433. data/packages/igniter-schema-rendering/README.md +27 -0
  434. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/page.rb +35 -0
  435. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/patcher.rb +47 -0
  436. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/renderer.rb +268 -0
  437. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/schema.rb +172 -0
  438. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/store.rb +53 -0
  439. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_normalizer.rb +117 -0
  440. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_processor.rb +91 -0
  441. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_validator.rb +62 -0
  442. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/version.rb +9 -0
  443. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering.rb +20 -0
  444. data/packages/igniter-schema-rendering/lib/igniter-schema-rendering.rb +3 -0
  445. data/packages/igniter-sdk/README.md +25 -0
  446. data/packages/igniter-sdk/lib/igniter/sdk/channels/base.rb +84 -0
  447. data/packages/igniter-sdk/lib/igniter/sdk/channels/delivery_result.rb +61 -0
  448. data/packages/igniter-sdk/lib/igniter/sdk/channels/message.rb +101 -0
  449. data/packages/igniter-sdk/lib/igniter/sdk/channels/telegram.rb +161 -0
  450. data/packages/igniter-sdk/lib/igniter/sdk/channels/webhook.rb +213 -0
  451. data/packages/igniter-sdk/lib/igniter/sdk/channels.rb +17 -0
  452. data/packages/igniter-sdk/lib/igniter/sdk/data/store.rb +31 -0
  453. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/file.rb +113 -0
  454. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/in_memory.rb +63 -0
  455. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/sqlite.rb +144 -0
  456. data/packages/igniter-sdk/lib/igniter/sdk/data.rb +34 -0
  457. data/packages/igniter-sdk/lib/igniter/sdk/tools/agent_bootstrap_tool.rb +151 -0
  458. data/packages/igniter-sdk/lib/igniter/sdk/tools/local_workflow_selector_tool.rb +269 -0
  459. data/packages/igniter-sdk/lib/igniter/sdk/tools/system_discovery_tool.rb +198 -0
  460. data/packages/igniter-sdk/lib/igniter/sdk/tools.rb +9 -0
  461. data/packages/igniter-sdk/lib/igniter/sdk.rb +86 -0
  462. data/packages/igniter-sdk/lib/igniter-sdk.rb +3 -0
  463. data/packages/igniter-server/README.md +9 -0
  464. data/packages/igniter-server/lib/igniter/server/agent_session_store.rb +98 -0
  465. data/packages/igniter-server/lib/igniter/server/agent_transport.rb +95 -0
  466. data/packages/igniter-server/lib/igniter/server/app_host.rb +3 -0
  467. data/{lib → packages/igniter-server/lib}/igniter/server/client.rb +96 -6
  468. data/packages/igniter-server/lib/igniter/server/config.rb +70 -0
  469. data/packages/igniter-server/lib/igniter/server/handlers/agent_message_handler.rb +107 -0
  470. data/packages/igniter-server/lib/igniter/server/handlers/agent_session_handler.rb +125 -0
  471. data/packages/igniter-server/lib/igniter/server/handlers/manifest_handler.rb +77 -0
  472. data/{lib → packages/igniter-server/lib}/igniter/server/handlers/metrics_handler.rb +1 -1
  473. data/{lib → packages/igniter-server/lib}/igniter/server/handlers/peers_handler.rb +38 -17
  474. data/{lib → packages/igniter-server/lib}/igniter/server/http_server.rb +91 -15
  475. data/{lib → packages/igniter-server/lib}/igniter/server/rack_app.rb +27 -2
  476. data/packages/igniter-server/lib/igniter/server/remote_adapter.rb +27 -0
  477. data/packages/igniter-server/lib/igniter/server/router.rb +291 -0
  478. data/{lib → packages/igniter-server/lib}/igniter/server/server_logger.rb +3 -1
  479. data/{lib → packages/igniter-server/lib}/igniter/server.rb +58 -1
  480. data/packages/igniter-server/lib/igniter-server.rb +3 -0
  481. metadata +631 -282
  482. data/docs/API_V2.md +0 -537
  483. data/docs/APPLICATION_V1.md +0 -253
  484. data/docs/ARCHITECTURE_V2.md +0 -317
  485. data/docs/BACKLOG.md +0 -166
  486. data/docs/BRANCHES_V1.md +0 -213
  487. data/docs/CAPABILITIES_V1.md +0 -207
  488. data/docs/COLLECTIONS_V1.md +0 -303
  489. data/docs/CONSENSUS_V1.md +0 -477
  490. data/docs/CONTENT_ADDRESSING_V1.md +0 -221
  491. data/docs/DATAFLOW_V1.md +0 -274
  492. data/docs/DISTRIBUTED_CONTRACTS_V1.md +0 -493
  493. data/docs/EXECUTION_MODEL_V2.md +0 -324
  494. data/docs/IGNITER_CONCEPTS.md +0 -81
  495. data/docs/LLM_V1.md +0 -335
  496. data/docs/MESH_V1.md +0 -732
  497. data/docs/NODE_CACHE_V1.md +0 -324
  498. data/docs/PATTERNS.md +0 -411
  499. data/docs/PROACTIVE_AGENTS_V1.md +0 -293
  500. data/docs/SERVER_V1.md +0 -512
  501. data/docs/SKILLS_V1.md +0 -213
  502. data/docs/STORE_ADAPTERS.md +0 -154
  503. data/docs/TEMPORAL_V1.md +0 -174
  504. data/docs/TOOLS_V1.md +0 -347
  505. data/docs/TRANSCRIPTION_V1.md +0 -403
  506. data/lib/igniter/agents.rb +0 -56
  507. data/lib/igniter/application/app_config.rb +0 -32
  508. data/lib/igniter/application/generator.rb +0 -157
  509. data/lib/igniter/application/yml_loader.rb +0 -39
  510. data/lib/igniter/application.rb +0 -174
  511. data/lib/igniter/consensus.rb +0 -58
  512. data/lib/igniter/diagnostics.rb +0 -8
  513. data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
  514. data/lib/igniter/extensions/invariants.rb +0 -116
  515. data/lib/igniter/extensions/mesh.rb +0 -31
  516. data/lib/igniter/integrations/agents.rb +0 -18
  517. data/lib/igniter/mesh/config.rb +0 -45
  518. data/lib/igniter/mesh/peer.rb +0 -21
  519. data/lib/igniter/mesh/peer_registry.rb +0 -51
  520. data/lib/igniter/mesh/router.rb +0 -109
  521. data/lib/igniter/mesh.rb +0 -85
  522. data/lib/igniter/model/remote_node.rb +0 -42
  523. data/lib/igniter/replication/node_role.rb +0 -42
  524. data/lib/igniter/replication/role_registry.rb +0 -73
  525. data/lib/igniter/replication.rb +0 -54
  526. data/lib/igniter/runtime/execution.rb +0 -416
  527. data/lib/igniter/runtime/job_worker.rb +0 -18
  528. data/lib/igniter/runtime/planner.rb +0 -126
  529. data/lib/igniter/server/config.rb +0 -34
  530. data/lib/igniter/server/handlers/manifest_handler.rb +0 -34
  531. data/lib/igniter/server/router.rb +0 -108
  532. data/lib/igniter/skill.rb +0 -218
  533. data/lib/igniter/tool_registry.rb +0 -144
  534. /data/{lib → packages/igniter-agents/lib}/igniter/agent/mailbox.rb +0 -0
  535. /data/{lib → packages/igniter-agents/lib}/igniter/agent/message.rb +0 -0
  536. /data/{lib → packages/igniter-agents/lib}/igniter/agent/state_holder.rb +0 -0
  537. /data/{lib → packages/igniter-agents/lib}/igniter/agents/observability/metrics_agent.rb +0 -0
  538. /data/{lib → packages/igniter-agents/lib}/igniter/agents/pipeline/batch_processor_agent.rb +0 -0
  539. /data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/agents/proactive}/alert_agent.rb +0 -0
  540. /data/{lib/igniter/agents/ai → packages/igniter-agents/lib/igniter/agents/proactive}/health_check_agent.rb +0 -0
  541. /data/{lib → packages/igniter-agents/lib}/igniter/agents/reliability/retry_agent.rb +0 -0
  542. /data/{lib → packages/igniter-agents/lib}/igniter/agents/scheduling/cron_agent.rb +0 -0
  543. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/graph_compiler.rb +0 -0
  544. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/type_resolver.rb +0 -0
  545. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_context.rb +0 -0
  546. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validator.rb +0 -0
  547. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/await_validator.rb +0 -0
  548. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/callable_validator.rb +0 -0
  549. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/outputs_validator.rb +0 -0
  550. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/remote_validator.rb +0 -0
  551. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/type_compatibility_validator.rb +0 -0
  552. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/uniqueness_validator.rb +0 -0
  553. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/content_addressing.rb +0 -0
  554. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/aggregate_operators.rb +0 -0
  555. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/aggregate_state.rb +0 -0
  556. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/diff.rb +0 -0
  557. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/diff_state.rb +0 -0
  558. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/incremental_collection_result.rb +0 -0
  559. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dataflow/window_filter.rb +0 -0
  560. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/console_formatter.rb +0 -0
  561. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/markdown_formatter.rb +0 -0
  562. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -0
  563. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -0
  564. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/divergence.rb +0 -0
  565. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/formatter.rb +0 -0
  566. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/report.rb +0 -0
  567. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/runner.rb +0 -0
  568. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential.rb +0 -0
  569. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/schema_builder.rb +0 -0
  570. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl.rb +0 -0
  571. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect_registry.rb +0 -0
  572. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/bus.rb +0 -0
  573. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/event.rb +0 -0
  574. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events.rb +0 -0
  575. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/builder.rb +0 -0
  576. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/formatter.rb +0 -0
  577. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/node_entry.rb +0 -0
  578. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/report.rb +0 -0
  579. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report.rb +0 -0
  580. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/executor.rb +0 -0
  581. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/executor_registry.rb +0 -0
  582. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing/timeline.rb +0 -0
  583. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing.rb +0 -0
  584. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection.rb +0 -0
  585. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/engine.rb +0 -0
  586. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/matcher.rb +0 -0
  587. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/reaction.rb +0 -0
  588. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive.rb +0 -0
  589. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions.rb +0 -0
  590. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/fingerprint.rb +0 -0
  591. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/formatter.rb +0 -0
  592. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/result.rb +0 -0
  593. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/tracker.rb +0 -0
  594. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/invariant.rb +0 -0
  595. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/agent_memory.rb +0 -0
  596. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/episode.rb +0 -0
  597. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/fact.rb +0 -0
  598. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/reflection_cycle.rb +0 -0
  599. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/reflection_record.rb +0 -0
  600. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/store.rb +0 -0
  601. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/memory/stores/in_memory.rb +0 -0
  602. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics/collector.rb +0 -0
  603. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/metrics/snapshot.rb +0 -0
  604. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/aggregate_node.rb +0 -0
  605. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/await_node.rb +0 -0
  606. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/collection_node.rb +0 -0
  607. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/composition_node.rb +0 -0
  608. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/compute_node.rb +0 -0
  609. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/effect_node.rb +0 -0
  610. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/graph.rb +0 -0
  611. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/input_node.rb +0 -0
  612. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/node.rb +0 -0
  613. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/output_node.rb +0 -0
  614. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/formatter.rb +0 -0
  615. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/generators.rb +0 -0
  616. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/result.rb +0 -0
  617. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/run.rb +0 -0
  618. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/runner.rb +0 -0
  619. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/lineage.rb +0 -0
  620. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/node_trace.rb +0 -0
  621. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/text_formatter.rb +0 -0
  622. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance.rb +0 -0
  623. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/collection_result.rb +0 -0
  624. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/input_validator.rb +0 -0
  625. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/invalidator.rb +0 -0
  626. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runner_factory.rb +0 -0
  627. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/inline_runner.rb +0 -0
  628. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/store_runner.rb +0 -0
  629. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/thread_pool_runner.rb +0 -0
  630. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/active_record_store.rb +0 -0
  631. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/file_store.rb +0 -0
  632. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/memory_store.rb +0 -0
  633. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/redis_store.rb +0 -0
  634. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation.rb +0 -0
  635. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation_record.rb +0 -0
  636. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/executor.rb +0 -0
  637. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/formatter.rb +0 -0
  638. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/result.rb +0 -0
  639. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga.rb +0 -0
  640. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/stream_loop.rb +0 -0
  641. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/type_system.rb +0 -0
  642. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/cable_adapter.rb +0 -0
  643. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/contract_job.rb +0 -0
  644. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/contract/contract_generator.rb +0 -0
  645. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/install/install_generator.rb +0 -0
  646. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/railtie.rb +0 -0
  647. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/webhook_concern.rb +0 -0
  648. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails.rb +0 -0
  649. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/base.rb +0 -0
  650. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/contracts_handler.rb +0 -0
  651. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/event_handler.rb +0 -0
  652. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/execute_handler.rb +0 -0
  653. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/health_handler.rb +0 -0
  654. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/liveness_handler.rb +0 -0
  655. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/readiness_handler.rb +0 -0
  656. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/status_handler.rb +0 -0
  657. /data/{lib → packages/igniter-server/lib}/igniter/server/registry.rb +0 -0
@@ -3,7 +3,7 @@
3
3
  require "json"
4
4
 
5
5
  module Igniter
6
- module LLM
6
+ module AI
7
7
  # Raised when the tool-use loop exceeds max_tool_iterations.
8
8
  class ToolLoopError < Error; end
9
9
 
@@ -14,7 +14,7 @@ module Igniter
14
14
  #
15
15
  # == Simple usage (no tools)
16
16
  #
17
- # class DocumentSummarizer < Igniter::LLM::Executor
17
+ # class DocumentSummarizer < Igniter::AI::Executor
18
18
  # provider :ollama
19
19
  # model "llama3.2"
20
20
  # system_prompt "You are a concise technical writer."
@@ -26,7 +26,7 @@ module Igniter
26
26
  #
27
27
  # == With Igniter::Tool classes (auto tool-use loop)
28
28
  #
29
- # class ResearchAgent < Igniter::LLM::Executor
29
+ # class ResearchAgent < Igniter::AI::Executor
30
30
  # provider :anthropic
31
31
  # model "claude-sonnet-4-6"
32
32
  # system_prompt "You are a research assistant. Use tools when needed."
@@ -43,7 +43,7 @@ module Igniter
43
43
  #
44
44
  # == Provider failover
45
45
  #
46
- # class MyAgent < Igniter::LLM::Executor
46
+ # class MyAgent < Igniter::AI::Executor
47
47
  # provider :anthropic, fallback: [:openai, :ollama]
48
48
  # model "claude-sonnet-4-6", fallback: ["gpt-4o", "llama3.2"]
49
49
  # # On ProviderError, retries with OpenAI/GPT-4o, then Ollama/llama3.2
@@ -56,7 +56,7 @@ module Igniter
56
56
  # @param fallback [Array<Symbol>] providers to try on ProviderError, in order
57
57
  def provider(name = nil, fallback: nil)
58
58
  if name.nil?
59
- @provider_chain&.first || Igniter::LLM.config.default_provider
59
+ @provider_chain&.first || Igniter::AI.config.default_provider
60
60
  else
61
61
  chain = [name] + Array(fallback)
62
62
  @provider_chain = chain.map(&:to_sym)
@@ -76,7 +76,7 @@ module Igniter
76
76
  def model(name = nil, fallback: nil)
77
77
  if name.nil?
78
78
  @model_chain&.first || default_model_for(
79
- @provider_chain&.first || Igniter::LLM.config.default_provider
79
+ @provider_chain&.first || Igniter::AI.config.default_provider
80
80
  )
81
81
  else
82
82
  @model_chain = [name] + Array(fallback)
@@ -132,15 +132,15 @@ module Igniter
132
132
  private
133
133
 
134
134
  def default_model_for(prov)
135
- Igniter::LLM.config.provider_config(prov).default_model
135
+ Igniter::AI.config.provider_config(prov).default_model
136
136
  rescue StandardError
137
137
  "llama3.2"
138
138
  end
139
139
 
140
140
  def provider_config
141
- Igniter::LLM.provider_instance(provider).instance_of?(Class) ? nil : Igniter::LLM.config.provider_config(provider)
141
+ Igniter::AI.provider_instance(provider).instance_of?(Class) ? nil : Igniter::AI.config.provider_config(provider)
142
142
  rescue StandardError
143
- Igniter::LLM.config.ollama
143
+ Igniter::AI.config.ollama
144
144
  end
145
145
  end
146
146
 
@@ -165,9 +165,9 @@ module Igniter
165
165
  # @return [String] final LLM text response
166
166
  def complete(prompt, context: nil) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
167
167
  with_provider_fallback do
168
- # Accept both Igniter::Tool and Igniter::Skill subclasses (duck-type check).
168
+ # Accept both Igniter::Tool and Igniter::AI::Skill subclasses (duck-type check).
169
169
  # Using respond_to? avoids a circular require: skill.rb requires this file,
170
- # so we can't safely reference Igniter::Skill or Igniter::Tool::Discoverable here.
170
+ # so we can't safely reference Igniter::AI::Skill or Igniter::Tool::Discoverable here.
171
171
  tool_classes = self.class.tools.select do |t|
172
172
  t.is_a?(Class) && t.respond_to?(:tool_name) && t.respond_to?(:to_schema)
173
173
  end
@@ -228,7 +228,7 @@ module Igniter
228
228
  # Iterate through the provider/model chain, retrying on ProviderError.
229
229
  # ConfigurationError propagates immediately (missing API key = config bug).
230
230
  #
231
- # Does NOT call Igniter::LLM.provider_instance directly; instead it resets
231
+ # Does NOT call Igniter::AI.provider_instance directly; instead it resets
232
232
  # @provider_instance = nil before each attempt so that the #provider_instance
233
233
  # accessor re-evaluates (or a test's define_method override takes effect).
234
234
  def with_provider_fallback # rubocop:disable Metrics/MethodLength
@@ -243,7 +243,7 @@ module Igniter
243
243
 
244
244
  begin
245
245
  return yield
246
- rescue Igniter::LLM::ProviderError => e
246
+ rescue Igniter::AI::ProviderError => e
247
247
  last_error = e
248
248
  end
249
249
  end
@@ -317,7 +317,7 @@ module Igniter
317
317
  end
318
318
 
319
319
  def provider_instance
320
- @provider_instance ||= Igniter::LLM.provider_instance(@last_provider || self.class.provider)
320
+ @provider_instance ||= Igniter::AI.provider_instance(@last_provider || self.class.provider)
321
321
  end
322
322
 
323
323
  def build_messages(prompt:, context: nil)
@@ -5,7 +5,7 @@ require "json"
5
5
  require "uri"
6
6
 
7
7
  module Igniter
8
- module LLM
8
+ module AI
9
9
  module Providers
10
10
  # Anthropic Claude provider.
11
11
  # Requires ANTHROPIC_API_KEY environment variable or explicit api_key:.
@@ -142,7 +142,7 @@ module Igniter
142
142
  response = http.request(request)
143
143
  handle_response(response)
144
144
  rescue Errno::ECONNREFUSED, Errno::EADDRNOTAVAIL, SocketError, Net::OpenTimeout => e
145
- raise Igniter::LLM::ProviderError, "Cannot connect to Anthropic API: #{e.message}"
145
+ raise Igniter::AI::ProviderError, "Cannot connect to Anthropic API: #{e.message}"
146
146
  end
147
147
 
148
148
  def headers
@@ -161,18 +161,18 @@ module Igniter
161
161
  {}
162
162
  end
163
163
  error_msg = body.dig("error", "message") || response.body.to_s.slice(0, 200)
164
- raise Igniter::LLM::ProviderError, "Anthropic API error #{response.code}: #{error_msg}"
164
+ raise Igniter::AI::ProviderError, "Anthropic API error #{response.code}: #{error_msg}"
165
165
  end
166
166
 
167
167
  JSON.parse(response.body)
168
168
  rescue JSON::ParserError => e
169
- raise Igniter::LLM::ProviderError, "Anthropic returned invalid JSON: #{e.message}"
169
+ raise Igniter::AI::ProviderError, "Anthropic returned invalid JSON: #{e.message}"
170
170
  end
171
171
 
172
172
  def validate_api_key!
173
173
  return if @api_key && !@api_key.empty?
174
174
 
175
- raise Igniter::LLM::ConfigurationError,
175
+ raise Igniter::AI::ConfigurationError,
176
176
  "Anthropic API key not configured. Set ANTHROPIC_API_KEY or pass api_key: to the provider."
177
177
  end
178
178
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Igniter
4
- module LLM
4
+ module AI
5
5
  module Providers
6
6
  class Base
7
7
  attr_reader :last_usage
@@ -5,7 +5,7 @@ require "json"
5
5
  require "uri"
6
6
 
7
7
  module Igniter
8
- module LLM
8
+ module AI
9
9
  module Providers
10
10
  # Ollama provider — calls the local Ollama REST API.
11
11
  # Requires Ollama to be running: https://ollama.com
@@ -63,7 +63,7 @@ module Igniter
63
63
  response = http.request(request)
64
64
  handle_response(response)
65
65
  rescue Errno::ECONNREFUSED, Errno::EADDRNOTAVAIL, SocketError, Net::OpenTimeout => e
66
- raise Igniter::LLM::ProviderError, "Cannot connect to Ollama at #{@base_url}: #{e.message}"
66
+ raise Igniter::AI::ProviderError, "Cannot connect to Ollama at #{@base_url}: #{e.message}"
67
67
  end
68
68
 
69
69
  def get(path)
@@ -76,13 +76,13 @@ module Igniter
76
76
 
77
77
  def handle_response(response)
78
78
  unless response.is_a?(Net::HTTPSuccess)
79
- raise Igniter::LLM::ProviderError,
79
+ raise Igniter::AI::ProviderError,
80
80
  "Ollama API error #{response.code}: #{response.body.to_s.slice(0, 200)}"
81
81
  end
82
82
 
83
83
  JSON.parse(response.body)
84
84
  rescue JSON::ParserError => e
85
- raise Igniter::LLM::ProviderError, "Ollama returned invalid JSON: #{e.message}"
85
+ raise Igniter::AI::ProviderError, "Ollama returned invalid JSON: #{e.message}"
86
86
  end
87
87
 
88
88
  def normalize_messages(messages)
@@ -5,7 +5,7 @@ require "json"
5
5
  require "uri"
6
6
 
7
7
  module Igniter
8
- module LLM
8
+ module AI
9
9
  module Providers
10
10
  # OpenAI provider (also compatible with Azure OpenAI and any OpenAI-compatible API).
11
11
  # Requires OPENAI_API_KEY environment variable or explicit api_key:.
@@ -144,7 +144,7 @@ module Igniter
144
144
  response = http.request(request)
145
145
  handle_response(response)
146
146
  rescue Errno::ECONNREFUSED, Errno::EADDRNOTAVAIL, SocketError, Net::OpenTimeout => e
147
- raise Igniter::LLM::ProviderError, "Cannot connect to OpenAI API at #{@base_url}: #{e.message}"
147
+ raise Igniter::AI::ProviderError, "Cannot connect to OpenAI API at #{@base_url}: #{e.message}"
148
148
  end
149
149
 
150
150
  def headers
@@ -162,18 +162,18 @@ module Igniter
162
162
  {}
163
163
  end
164
164
  error_msg = body.dig("error", "message") || response.body.to_s.slice(0, 200)
165
- raise Igniter::LLM::ProviderError, "OpenAI API error #{response.code}: #{error_msg}"
165
+ raise Igniter::AI::ProviderError, "OpenAI API error #{response.code}: #{error_msg}"
166
166
  end
167
167
 
168
168
  JSON.parse(response.body)
169
169
  rescue JSON::ParserError => e
170
- raise Igniter::LLM::ProviderError, "OpenAI returned invalid JSON: #{e.message}"
170
+ raise Igniter::AI::ProviderError, "OpenAI returned invalid JSON: #{e.message}"
171
171
  end
172
172
 
173
173
  def validate_api_key!
174
174
  return if @api_key && !@api_key.empty?
175
175
 
176
- raise Igniter::LLM::ConfigurationError,
176
+ raise Igniter::AI::ConfigurationError,
177
177
  "OpenAI API key not configured. Set OPENAI_API_KEY or pass api_key: to the provider."
178
178
  end
179
179
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Igniter
4
- class Skill
4
+ module AI
5
5
  # Immutable record of one rated invocation of a Skill.
6
- FeedbackEntry = Struct.new(
6
+ Skill::FeedbackEntry = Struct.new(
7
7
  :input, # String — the prompt that was sent to the LLM
8
8
  :output, # String — the response that was returned
9
9
  :rating, # Symbol — :good, :bad, or :neutral
@@ -18,7 +18,7 @@ module Igniter
18
18
  end
19
19
 
20
20
  # Thread-safe in-memory store for feedback entries.
21
- module FeedbackStore
21
+ module Skill::FeedbackStore
22
22
  class Memory
23
23
  MAX_SIZE = 500
24
24
 
@@ -69,7 +69,7 @@ module Igniter
69
69
  # improved = skill.refine_system_prompt
70
70
  # # Inspect it, then use it:
71
71
  # MySkill.system_prompt improved
72
- class FeedbackRefiner
72
+ class Skill::FeedbackRefiner
73
73
  TEMPLATE = <<~PROMPT
74
74
  You are improving a system prompt for an AI skill based on user feedback.
75
75
  Return ONLY the improved system prompt text, with no explanation or preamble.
@@ -3,7 +3,7 @@
3
3
  require "json"
4
4
 
5
5
  module Igniter
6
- class Skill
6
+ module AI
7
7
  # DSL for declaring a typed JSON output contract on a Skill.
8
8
  #
9
9
  # When an +output_schema+ block is given, the Skill automatically:
@@ -13,7 +13,7 @@ module Igniter
13
13
  #
14
14
  # == Definition
15
15
  #
16
- # class AnalysisSkill < Igniter::Skill
16
+ # class AnalysisSkill < Igniter::AI::Skill
17
17
  # output_schema do
18
18
  # field :summary, String
19
19
  # field :confidence, Float
@@ -27,7 +27,7 @@ module Igniter
27
27
  # result.summary # => "This document covers..."
28
28
  # result.confidence # => 0.91
29
29
  # result.to_h # => { summary: "...", confidence: 0.91, sources: [...] }
30
- class OutputSchema
30
+ class Skill::OutputSchema
31
31
  # Raised when the LLM response cannot be parsed into the declared schema.
32
32
  class ParseError < Igniter::Error; end
33
33
 
@@ -78,7 +78,7 @@ module Igniter
78
78
  raise ParseError, "No JSON object found in LLM response" unless json_str
79
79
 
80
80
  data = JSON.parse(json_str)
81
- StructuredResult.new(@fields, data)
81
+ Skill::StructuredResult.new(@fields, data)
82
82
  rescue JSON::ParserError => e
83
83
  raise ParseError, "Invalid JSON in LLM response: #{e.message}"
84
84
  end
@@ -86,7 +86,7 @@ module Igniter
86
86
 
87
87
  # A typed result object returned by skills with an +output_schema+.
88
88
  # Provides reader methods for each declared field plus +to_h+ / +to_json+.
89
- class StructuredResult
89
+ class Skill::StructuredResult
90
90
  def initialize(fields, data)
91
91
  @fields = fields
92
92
  @data = data.transform_keys(&:to_sym)
@@ -103,7 +103,7 @@ module Igniter
103
103
  end
104
104
 
105
105
  def inspect
106
- "#<Igniter::Skill::StructuredResult #{to_h}>"
106
+ "#<Igniter::AI::Skill::StructuredResult #{to_h}>"
107
107
  end
108
108
  end
109
109
  end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Igniter
4
+ module AI
5
+ class Skill < Executor
6
+ # Canonical runtime-facing contract for AI skills.
7
+ #
8
+ # This gathers the skill semantics that previously lived across separate
9
+ # class-level methods into one immutable object:
10
+ # - structured output contract
11
+ # - feedback/refinement behavior
12
+ # - capability requirements
13
+ # - nested tool/skill affordances
14
+ class RuntimeContract
15
+ attr_reader :output_schema, :feedback_enabled, :feedback_store,
16
+ :required_capabilities, :tools
17
+
18
+ def initialize(output_schema:, feedback_enabled:, feedback_store:, required_capabilities:, tools:)
19
+ @output_schema = output_schema
20
+ @feedback_enabled = !!feedback_enabled
21
+ @feedback_store = feedback_store
22
+ @required_capabilities = Array(required_capabilities).map(&:to_sym).freeze
23
+ @tools = Array(tools).freeze
24
+ @tool_classes = @tools.select do |tool|
25
+ tool.is_a?(Class) && tool.respond_to?(:tool_name) && tool.respond_to?(:to_schema)
26
+ end.freeze
27
+ @tool_names = @tool_classes.map(&:tool_name).freeze
28
+ freeze
29
+ end
30
+
31
+ def structured_output?
32
+ output_schema.is_a?(Skill::OutputSchema)
33
+ end
34
+
35
+ def feedback?
36
+ feedback_enabled
37
+ end
38
+
39
+ def tool_classes
40
+ @tool_classes
41
+ end
42
+
43
+ def tool_names
44
+ @tool_names
45
+ end
46
+
47
+ def tool_schemas(provider = nil)
48
+ tool_classes.map { |tool| tool.to_schema(provider) }
49
+ end
50
+
51
+ def to_h
52
+ {
53
+ structured_output: structured_output?,
54
+ output_schema: serialize_output_schema,
55
+ feedback_enabled: feedback_enabled,
56
+ feedback_store: serialize_feedback_store,
57
+ required_capabilities: required_capabilities,
58
+ tool_names: tool_names,
59
+ tool_count: tool_classes.size,
60
+ }.freeze
61
+ end
62
+
63
+ private
64
+
65
+ def serialize_output_schema
66
+ if structured_output?
67
+ {
68
+ type: "structured",
69
+ fields: output_schema.fields.map { |field| { name: field.name, type: field.type.name } },
70
+ }
71
+ else
72
+ output_schema
73
+ end
74
+ end
75
+
76
+ def serialize_feedback_store
77
+ return nil unless feedback_store
78
+
79
+ {
80
+ class_name: feedback_store.class.name,
81
+ size: feedback_store.respond_to?(:size) ? feedback_store.size : nil,
82
+ }.freeze
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "igniter/core/errors"
4
+ require "igniter/core/tool"
5
+ require_relative "executor"
6
+
7
+ module Igniter
8
+ module AI
9
+ # Base class for AI-callable skills — composable units of agent capability.
10
+ class Skill < Executor
11
+ CapabilityError = Igniter::Tool::CapabilityError
12
+
13
+ include Igniter::Tool::Discoverable
14
+
15
+ class << self
16
+ def inherited(subclass)
17
+ super
18
+ subclass.instance_variable_set(:@output_schema, @output_schema)
19
+ subclass.instance_variable_set(:@feedback_enabled, @feedback_enabled)
20
+ copy_discoverable_state_to(subclass)
21
+ end
22
+
23
+ def output_schema(value = nil, &block)
24
+ if block
25
+ @output_schema = Skill::OutputSchema.new(&block)
26
+ elsif value
27
+ super(value)
28
+ else
29
+ @output_schema || super
30
+ end
31
+ end
32
+
33
+ def feedback_enabled(val = nil)
34
+ val.nil? ? (@feedback_enabled || false) : (@feedback_enabled = val)
35
+ end
36
+
37
+ def feedback_store(val = nil)
38
+ return @feedback_store if val.nil?
39
+
40
+ @feedback_store = val == :memory ? Skill::FeedbackStore::Memory.new : val
41
+ end
42
+
43
+ def runtime_contract
44
+ Skill::RuntimeContract.new(
45
+ output_schema: output_schema,
46
+ feedback_enabled: feedback_enabled,
47
+ feedback_store: feedback_store,
48
+ required_capabilities: required_capabilities,
49
+ tools: tools
50
+ )
51
+ end
52
+ end
53
+
54
+ protected
55
+
56
+ def complete(prompt, context: nil)
57
+ contract = self.class.runtime_contract
58
+ schema = contract.output_schema
59
+
60
+ adjusted = if schema.is_a?(Skill::OutputSchema)
61
+ "#{prompt}\n\nRespond ONLY with valid JSON matching this schema: #{schema.to_json_description}"
62
+ else
63
+ prompt
64
+ end
65
+
66
+ result = super(adjusted, context: context)
67
+ schema.is_a?(Skill::OutputSchema) ? schema.parse(result) : result
68
+ end
69
+
70
+ public
71
+
72
+ def feedback(output, rating:, notes: nil) # rubocop:disable Metrics/MethodLength
73
+ contract = self.class.runtime_contract
74
+ return self unless contract.feedback?
75
+
76
+ store = contract.feedback_store
77
+ return self unless store
78
+
79
+ output_str = output.to_s
80
+ matched = (call_history || []).reverse.find { |h| h[:output] == output_str }
81
+
82
+ store.store(FeedbackEntry.new(
83
+ input: matched&.dig(:input),
84
+ output: output_str,
85
+ rating: rating.to_sym,
86
+ notes: notes,
87
+ timestamp: Time.now
88
+ ))
89
+ self
90
+ end
91
+
92
+ def refine_system_prompt
93
+ store = self.class.feedback_store
94
+ raise Igniter::Error, "No feedback_store configured on #{self.class.name}" unless store
95
+
96
+ FeedbackRefiner.new(provider_instance, current_model).refine(
97
+ self.class.system_prompt.to_s,
98
+ store.all
99
+ )
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ require_relative "skill/output_schema"
106
+ require_relative "skill/feedback"
107
+ require_relative "skill/runtime_contract"
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "set"
4
+
5
+ require "igniter/core/errors"
6
+ require "igniter/core/tool"
7
+ require_relative "skill"
8
+
9
+ module Igniter
10
+ module AI
11
+ module ToolRegistry
12
+ SCOPES = %i[bundled managed workspace].freeze
13
+
14
+ @tools = {}
15
+
16
+ class << self
17
+ def register(*tool_classes, scope: :workspace) # rubocop:disable Metrics/MethodLength
18
+ unless SCOPES.include?(scope)
19
+ raise ArgumentError, "Invalid scope #{scope.inspect}. Must be one of #{SCOPES.inspect}"
20
+ end
21
+
22
+ tool_classes.flatten.each do |klass|
23
+ unless discoverable?(klass)
24
+ raise ArgumentError,
25
+ "#{klass.inspect} must be an Igniter::Tool or Igniter::AI::Skill subclass"
26
+ end
27
+
28
+ @tools[klass.tool_name] = { klass: klass, scope: scope }
29
+ end
30
+ self
31
+ end
32
+
33
+ def find(name)
34
+ @tools[name.to_s]&.fetch(:klass)
35
+ end
36
+
37
+ def all(scope: nil)
38
+ entries_for(scope).map { |e| e[:klass] }
39
+ end
40
+
41
+ def tools_for(capabilities: [], scope: nil)
42
+ allowed = capabilities.map(&:to_sym).to_set
43
+ matching = entries_for(scope).select do |e|
44
+ e[:klass].required_capabilities.all? { |c| allowed.include?(c) }
45
+ end
46
+ matching.map { |e| e[:klass] }
47
+ end
48
+
49
+ def schemas(provider = nil, capabilities: nil, scope: nil)
50
+ list = if capabilities
51
+ tools_for(capabilities: capabilities, scope: scope)
52
+ else
53
+ all(scope: scope)
54
+ end
55
+ list.map { |klass| klass.to_schema(provider) }
56
+ end
57
+
58
+ def size = @tools.size
59
+ def empty? = @tools.empty?
60
+
61
+ def clear!
62
+ @tools = {}
63
+ self
64
+ end
65
+
66
+ private
67
+
68
+ def entries_for(scope)
69
+ scope ? @tools.values.select { |e| e[:scope] == scope } : @tools.values
70
+ end
71
+
72
+ def discoverable?(klass)
73
+ klass.is_a?(Class) &&
74
+ (klass < Igniter::Tool || klass < Igniter::AI::Skill)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Igniter
4
- module LLM
4
+ module AI
5
5
  module Transcription
6
6
  module Providers
7
7
  # AssemblyAI transcription provider.
@@ -70,9 +70,9 @@ module Igniter
70
70
  request.body = audio_data
71
71
 
72
72
  response = handle_response(http.request(request))
73
- response["upload_url"] || raise(Igniter::LLM::ProviderError, "AssemblyAI: no upload_url in response")
73
+ response["upload_url"] || raise(Igniter::AI::ProviderError, "AssemblyAI: no upload_url in response")
74
74
  rescue Errno::ECONNREFUSED, SocketError, Net::OpenTimeout => e
75
- raise Igniter::LLM::ProviderError, "Cannot connect to AssemblyAI API: #{e.message}"
75
+ raise Igniter::AI::ProviderError, "Cannot connect to AssemblyAI API: #{e.message}"
76
76
  end
77
77
 
78
78
  # ── Step 2: Submit job ─────────────────────────────────────────────
@@ -99,7 +99,7 @@ module Igniter
99
99
  request.body = JSON.generate(body)
100
100
 
101
101
  response = handle_response(http.request(request))
102
- response["id"] || raise(Igniter::LLM::ProviderError, "AssemblyAI: no transcript id in response")
102
+ response["id"] || raise(Igniter::AI::ProviderError, "AssemblyAI: no transcript id in response")
103
103
  end
104
104
 
105
105
  # ── Step 3: Poll ───────────────────────────────────────────────────
@@ -114,12 +114,12 @@ module Igniter
114
114
  case result["status"]
115
115
  when "completed" then return result
116
116
  when "error"
117
- raise Igniter::LLM::ProviderError,
117
+ raise Igniter::AI::ProviderError,
118
118
  "AssemblyAI transcription failed: #{result["error"]}"
119
119
  end
120
120
 
121
121
  if Time.now > deadline
122
- raise Igniter::LLM::ProviderError,
122
+ raise Igniter::AI::ProviderError,
123
123
  "AssemblyAI transcription timed out after #{timeout}s (job_id: #{job_id})"
124
124
  end
125
125
 
@@ -134,7 +134,7 @@ module Igniter
134
134
  request = Net::HTTP::Get.new(uri.path, auth_headers)
135
135
  handle_response(http.request(request))
136
136
  rescue Errno::ECONNREFUSED, SocketError, Net::OpenTimeout => e
137
- raise Igniter::LLM::ProviderError, "Cannot connect to AssemblyAI API: #{e.message}"
137
+ raise Igniter::AI::ProviderError, "Cannot connect to AssemblyAI API: #{e.message}"
138
138
  end
139
139
 
140
140
  # ── Result building ────────────────────────────────────────────────
@@ -190,7 +190,7 @@ module Igniter
190
190
  def validate_api_key!
191
191
  return if @api_key && !@api_key.empty?
192
192
 
193
- raise Igniter::LLM::ConfigurationError,
193
+ raise Igniter::AI::ConfigurationError,
194
194
  "AssemblyAI API key not configured. Set ASSEMBLYAI_API_KEY or pass api_key: to the provider."
195
195
  end
196
196
  end
@@ -5,7 +5,7 @@ require "json"
5
5
  require "uri"
6
6
 
7
7
  module Igniter
8
- module LLM
8
+ module AI
9
9
  module Transcription
10
10
  module Providers
11
11
  # Abstract base for all transcription providers.
@@ -105,11 +105,11 @@ module Igniter
105
105
  end
106
106
  msg = body["error"].is_a?(Hash) ? body.dig("error", "message") : body["error"]
107
107
  msg ||= response.body.to_s.slice(0, 200)
108
- raise Igniter::LLM::ProviderError, "#{provider_name} error #{response.code}: #{msg}"
108
+ raise Igniter::AI::ProviderError, "#{provider_name} error #{response.code}: #{msg}"
109
109
  end
110
110
  JSON.parse(response.body)
111
111
  rescue JSON::ParserError => e
112
- raise Igniter::LLM::ProviderError, "#{provider_name} returned invalid JSON: #{e.message}"
112
+ raise Igniter::AI::ProviderError, "#{provider_name} returned invalid JSON: #{e.message}"
113
113
  end
114
114
 
115
115
  def provider_name