phronomy 0.27.0 → 0.28.0

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 (475) hide show
  1. checksums.yaml +4 -4
  2. data/.mutant.yml +9 -9
  3. data/CHANGELOG.md +52 -0
  4. data/CONTRIBUTING.md +8 -8
  5. data/README.md +9 -3
  6. data/benchmark/bench_agent_invoke.rb +25 -50
  7. data/benchmark/bench_context_assembler.rb +14 -11
  8. data/benchmark/bench_regression.rb +1 -1
  9. data/benchmark/bench_tool_schema.rb +1 -1
  10. data/docs/architecture/agent-chat-and-state-ownership.md +7 -1
  11. data/docs/architecture/agent-transition-ownership.md +13 -89
  12. data/docs/architecture/backend-groups.md +152 -0
  13. data/docs/architecture/before-llm-input.md +3 -3
  14. data/docs/architecture/context-management.md +1 -1
  15. data/docs/architecture/execution-abstraction-review.md +88 -0
  16. data/docs/architecture/execution-boundaries.md +28 -0
  17. data/docs/architecture/execution-metadata-and-values.md +6 -0
  18. data/docs/architecture/multi-agent-handoff.md +6 -5
  19. data/docs/architecture/persistence.md +27 -9
  20. data/docs/architecture/r8-unit1.md +104 -0
  21. data/docs/architecture/r8-unit10.md +72 -0
  22. data/docs/architecture/r8-unit11.md +71 -0
  23. data/docs/architecture/r8-unit12.md +67 -0
  24. data/docs/architecture/r8-unit13.md +61 -0
  25. data/docs/architecture/r8-unit14.md +72 -0
  26. data/docs/architecture/r8-unit15.md +65 -0
  27. data/docs/architecture/r8-unit16.md +54 -0
  28. data/docs/architecture/r8-unit17.md +73 -0
  29. data/docs/architecture/r8-unit18.md +92 -0
  30. data/docs/architecture/r8-unit19.md +61 -0
  31. data/docs/architecture/r8-unit2.md +55 -0
  32. data/docs/architecture/r8-unit20.md +51 -0
  33. data/docs/architecture/r8-unit21.md +79 -0
  34. data/docs/architecture/r8-unit22.md +74 -0
  35. data/docs/architecture/r8-unit23.md +81 -0
  36. data/docs/architecture/r8-unit3.md +130 -0
  37. data/docs/architecture/r8-unit4.md +79 -0
  38. data/docs/architecture/r8-unit5.md +115 -0
  39. data/docs/architecture/r8-unit6.md +71 -0
  40. data/docs/architecture/r8-unit7.md +70 -0
  41. data/docs/architecture/r8-unit8.md +78 -0
  42. data/docs/architecture/r8-unit9.md +73 -0
  43. data/docs/architecture/refactoring-closure.md +10 -1
  44. data/docs/architecture/remaining-refactoring-plan.md +16 -0
  45. data/docs/architecture/storage-execution-boundaries.md +54 -0
  46. data/docs/architecture/tool-schema-recording-gap.md +6 -0
  47. data/docs/architecture/tracing.md +1 -1
  48. data/docs/architecture/workflow-terminal-ownership-design.md +2 -2
  49. data/docs/architecture.md +24 -11
  50. data/docs/decisions/015-tool-public-facade-and-rbs-boundary.md +3 -3
  51. data/docs/decisions/027-llm-adapter-provider-boundary.md +2 -0
  52. data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +2 -0
  53. data/docs/decisions/031-durable-multi-agent-coordination.md +2 -0
  54. data/docs/decisions/032-storage-backend-composition.md +5 -0
  55. data/docs/decisions/034-handoff-runner-coordination-ownership.md +2 -0
  56. data/docs/decisions/035-tool-executor-capability-ownership.md +1 -1
  57. data/docs/decisions/038-responsibility-based-source-layout.md +14 -0
  58. data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +8 -0
  59. data/docs/decisions/040-configuration-default-composition.md +12 -1
  60. data/docs/decisions/045-worker-input-restriction-ownership.md +4 -0
  61. data/docs/decisions/051-execution-outcome-worker-ownership.md +2 -0
  62. data/docs/decisions/056-workflow-terminal-policy-ownership.md +1 -1
  63. data/docs/decisions/058-neutral-storage-primitives.md +5 -0
  64. data/docs/decisions/059-backend-contracts-and-async-clients.md +74 -0
  65. data/docs/decisions/060-runtime-settings-and-application-configuration.md +86 -0
  66. data/docs/decisions/061-persistence-failure-contracts.md +89 -0
  67. data/docs/decisions/062-content-store-service.md +52 -0
  68. data/docs/decisions/063-execution-contracts-and-services.md +88 -0
  69. data/docs/decisions/064-agent-execution-and-multi-agent-responsibility.md +36 -0
  70. data/docs/decisions/065-vector-and-embeddings-common-operations.md +38 -0
  71. data/docs/decisions/066-llm-and-tool-operation-contracts.md +20 -0
  72. data/docs/decisions/067-agent-progress-and-engine-connection.md +29 -0
  73. data/docs/decisions/068-agent-tool-child-progress-and-tool-operation.md +36 -0
  74. data/docs/decisions/README.md +18 -1
  75. data/docs/execution-boundaries-preview.md +45 -0
  76. data/docs/features.md +8 -3
  77. data/docs/getting-started.md +9 -6
  78. data/docs/migrations/0.22.md +2 -2
  79. data/docs/migrations/durable-semantic-coordination-v2.md +2 -0
  80. data/docs/migrations/handoff-runner-multi-agent.md +2 -0
  81. data/docs/migrations/persistence-failure-contracts.md +67 -0
  82. data/docs/migrations/r8-unit10.md +36 -0
  83. data/docs/migrations/r8-unit11.md +33 -0
  84. data/docs/migrations/r8-unit12.md +31 -0
  85. data/docs/migrations/r8-unit13.md +36 -0
  86. data/docs/migrations/r8-unit14.md +31 -0
  87. data/docs/migrations/r8-unit15.md +31 -0
  88. data/docs/migrations/r8-unit16.md +26 -0
  89. data/docs/migrations/r8-unit17.md +28 -0
  90. data/docs/migrations/r8-unit18.md +29 -0
  91. data/docs/migrations/r8-unit19.md +28 -0
  92. data/docs/migrations/r8-unit20.md +24 -0
  93. data/docs/migrations/r8-unit21.md +28 -0
  94. data/docs/migrations/r8-unit22.md +29 -0
  95. data/docs/migrations/r8-unit23.md +20 -0
  96. data/docs/migrations/r8-unit4.md +67 -0
  97. data/docs/migrations/r8-unit5.md +75 -0
  98. data/docs/migrations/r8-unit6.md +109 -0
  99. data/docs/migrations/r8-unit7.md +31 -0
  100. data/docs/migrations/r8-unit8.md +33 -0
  101. data/docs/migrations/r8-unit9.md +28 -0
  102. data/docs/migrations/storage-async-client.md +103 -0
  103. data/docs/migrations/vector-async-clients.md +110 -0
  104. data/docs/persistence-backends.md +38 -21
  105. data/docs/runtime-and-concurrency.md +26 -1
  106. data/lib/phronomy/agent/admission.rb +78 -0
  107. data/lib/phronomy/agent/{lifecycle_contract/agent_already_exists_error.rb → agent_already_exists_error.rb} +1 -1
  108. data/lib/phronomy/agent/{lifecycle_contract/agent_busy_error.rb → agent_busy_error.rb} +1 -1
  109. data/lib/phronomy/agent/{lifecycle_contract/agent_purged_error.rb → agent_purged_error.rb} +1 -1
  110. data/lib/phronomy/{recovery → agent/api}/execution_rehydration_required_error.rb +1 -1
  111. data/lib/phronomy/agent/async_event_api.rb +37 -32
  112. data/lib/phronomy/agent/base.rb +74 -72
  113. data/lib/phronomy/agent/before_llm_input.rb +64 -0
  114. data/lib/phronomy/agent/composition/run_once.rb +1 -1
  115. data/lib/phronomy/agent/{context_assembly/context_candidate_resolver.rb → context_candidate_resolver.rb} +2 -2
  116. data/lib/phronomy/agent/{context_assembly/context_assembler.rb → context_preparation.rb} +35 -221
  117. data/lib/phronomy/agent/control_request.rb +21 -0
  118. data/lib/phronomy/agent/execution/agent_execution.rb +1 -1
  119. data/lib/phronomy/agent/execution/agent_invocation.rb +27 -53
  120. data/lib/phronomy/agent/execution/approval_resume_commit.rb +1 -1
  121. data/lib/phronomy/agent/execution/dispatch_preparation.rb +17 -127
  122. data/lib/phronomy/agent/execution/exact_execution.rb +44 -23
  123. data/lib/phronomy/agent/execution/execution_cancellation.rb +8 -4
  124. data/lib/phronomy/agent/execution/execution_coordinator.rb +214 -395
  125. data/lib/phronomy/agent/execution/execution_metadata.rb +1 -0
  126. data/lib/phronomy/agent/execution/execution_outcome_committer.rb +70 -126
  127. data/lib/phronomy/agent/execution/execution_registry.rb +6 -2
  128. data/lib/phronomy/agent/execution/execution_session_runner.rb +22 -27
  129. data/lib/phronomy/agent/execution/initial_preparation.rb +18 -116
  130. data/lib/phronomy/agent/execution/{agent_invocation_session_builder.rb → invocation_actions.rb} +54 -194
  131. data/lib/phronomy/agent/execution/invocation_transitions.rb +39 -1
  132. data/lib/phronomy/agent/execution/runtime_record_encoder.rb +7 -7
  133. data/lib/phronomy/agent/execution_change.rb +161 -0
  134. data/lib/phronomy/agent/execution_environment.rb +36 -0
  135. data/lib/phronomy/agent/execution_extension_state.rb +21 -0
  136. data/lib/phronomy/agent/execution_observation.rb +35 -0
  137. data/lib/phronomy/agent/filterable.rb +182 -0
  138. data/lib/phronomy/agent/handoff/{handoff_context.rb → transfer_context.rb} +4 -4
  139. data/lib/phronomy/agent/handoff/{handoff_projection.rb → transfer_projection.rb} +14 -33
  140. data/lib/phronomy/{llm_contract/transport_error.rb → agent/handoff_error.rb} +1 -1
  141. data/lib/phronomy/agent/journal/journal_projection.rb +1 -1
  142. data/lib/phronomy/agent/knowledge_item.rb +13 -0
  143. data/lib/phronomy/agent/lifecycle/agent_root.rb +1 -1
  144. data/lib/phronomy/agent/lifecycle/ownership_registry.rb +18 -23
  145. data/lib/phronomy/agent/persistence/agent_repository.rb +29 -21
  146. data/lib/phronomy/agent/persistence/cancellation_repository.rb +51 -0
  147. data/lib/phronomy/agent/persistence/codec.rb +1 -21
  148. data/lib/phronomy/agent/persistence/execution_repository.rb +57 -41
  149. data/lib/phronomy/agent/persistence/journal_repository.rb +27 -18
  150. data/lib/phronomy/agent/persistence/records.rb +33 -0
  151. data/lib/phronomy/agent/persistence/retention_repository.rb +70 -0
  152. data/lib/phronomy/agent/persistence/storage_schema.rb +7 -2
  153. data/lib/phronomy/agent/persistence/watermark.rb +13 -11
  154. data/lib/phronomy/agent/recovery/invocation_restorer.rb +13 -21
  155. data/lib/phronomy/agent/recovery/recovery_coordinator/continuation.rb +10 -9
  156. data/lib/phronomy/agent/recovery/recovery_coordinator/installation.rb +27 -27
  157. data/lib/phronomy/agent/recovery/recovery_coordinator/resolution.rb +19 -21
  158. data/lib/phronomy/agent/recovery/recovery_coordinator.rb +23 -16
  159. data/lib/phronomy/agent/recovery/recovery_rules.rb +119 -0
  160. data/lib/phronomy/agent/recovery/recovery_support.rb +8 -11
  161. data/lib/phronomy/agent/reserved_execution.rb +16 -0
  162. data/lib/phronomy/agent/retention.rb +17 -0
  163. data/lib/phronomy/agent/runtime_binding/engine_environment.rb +60 -0
  164. data/lib/phronomy/agent/runtime_binding/engine_session_builder.rb +34 -0
  165. data/lib/phronomy/agent/runtime_binding/phase_machine_builder.rb +64 -0
  166. data/lib/phronomy/agent/runtime_binding/tool_session_builder.rb +34 -0
  167. data/lib/phronomy/agent/{context_assembly/ruby_llm_materializer.rb → runtime_input.rb} +18 -35
  168. data/lib/phronomy/agent/{context_assembly/saved_context_reader.rb → saved_context_reader.rb} +6 -4
  169. data/lib/phronomy/agent/settings.rb +47 -0
  170. data/lib/phronomy/agent/{context_assembly/state_writer.rb → state_writer.rb} +4 -3
  171. data/lib/phronomy/agent/store.rb +253 -0
  172. data/lib/phronomy/agent/{lifecycle_contract/stream_callback_error.rb → stream_callback_error.rb} +1 -1
  173. data/lib/phronomy/agent/tool_execution/tool_binding.rb +4 -64
  174. data/lib/phronomy/agent/tool_execution/tool_invocation.rb +50 -219
  175. data/lib/phronomy/agent/tool_execution/tool_invocation_actions.rb +107 -0
  176. data/lib/phronomy/agent/tool_execution/tool_invocation_transitions.rb +70 -0
  177. data/lib/phronomy/configuration/runtime_settings.rb +49 -0
  178. data/lib/phronomy/content_store/storage_schema.rb +1 -0
  179. data/lib/phronomy/content_store/stored_contents.rb +2 -1
  180. data/lib/phronomy/context/assembly.rb +202 -0
  181. data/lib/phronomy/{llm_contract/context_budget_exceeded_error.rb → context/budget_exceeded_error.rb} +3 -1
  182. data/lib/phronomy/context/candidate.rb +51 -0
  183. data/lib/phronomy/context/constraint.rb +47 -0
  184. data/lib/phronomy/{agent/context_contract → context}/context_plan.rb +1 -1
  185. data/lib/phronomy/{agent/context_contract → context}/context_plan_validator.rb +3 -3
  186. data/lib/phronomy/{agent/context_contract → context}/context_policy.rb +1 -1
  187. data/lib/phronomy/{agent/context_contract → context}/context_policy_input.rb +1 -1
  188. data/lib/phronomy/{agent/context_assembly → context}/context_policy_input_builder.rb +1 -1
  189. data/lib/phronomy/context/default_policy.rb +140 -0
  190. data/lib/phronomy/context/final_budget_validator.rb +33 -0
  191. data/lib/phronomy/{agent/context_contract → context}/llm_input_build_context.rb +1 -1
  192. data/lib/phronomy/{agent/context_contract → context}/llm_input_manifest.rb +19 -19
  193. data/lib/phronomy/{agent/context_contract → context}/llm_input_patch.rb +1 -1
  194. data/lib/phronomy/context/manifest_error.rb +10 -0
  195. data/lib/phronomy/context/prompt_template.rb +98 -0
  196. data/lib/phronomy/{vector_store → documents}/loader/base.rb +1 -1
  197. data/lib/phronomy/{vector_store → documents}/loader/csv_loader.rb +2 -2
  198. data/lib/phronomy/{vector_store → documents}/loader/markdown_loader.rb +3 -3
  199. data/lib/phronomy/{vector_store → documents}/loader/plain_text_loader.rb +2 -2
  200. data/lib/phronomy/{vector_store → documents}/splitter/base.rb +1 -1
  201. data/lib/phronomy/{vector_store → documents}/splitter/fixed_size_splitter.rb +2 -2
  202. data/lib/phronomy/{vector_store → documents}/splitter/recursive_splitter.rb +2 -2
  203. data/lib/phronomy/embeddings/async/async_client.rb +44 -0
  204. data/lib/phronomy/embeddings/backends/ruby_llm_embeddings.rb +48 -0
  205. data/lib/phronomy/embeddings/base.rb +43 -0
  206. data/lib/phronomy/embeddings/invalid_result_error.rb +11 -0
  207. data/lib/phronomy/embeddings/transport_error.rb +11 -0
  208. data/lib/phronomy/engine/concurrency/offload_pool.rb +36 -21
  209. data/lib/phronomy/engine/concurrency/pool_registry.rb +47 -12
  210. data/lib/phronomy/engine/diagnostics.rb +1 -1
  211. data/lib/phronomy/engine/event_loop.rb +7 -7
  212. data/lib/phronomy/engine/execution_binding.rb +23 -0
  213. data/lib/phronomy/engine/execution_receiver_binding.rb +43 -0
  214. data/lib/phronomy/engine/fsm_protocol.rb +1 -6
  215. data/lib/phronomy/engine/fsm_session.rb +3 -3
  216. data/lib/phronomy/engine/metrics.rb +16 -14
  217. data/lib/phronomy/engine/runtime/timer_queue.rb +1 -1
  218. data/lib/phronomy/engine/runtime.rb +25 -12
  219. data/lib/phronomy/engine/terminal_decision.rb +7 -0
  220. data/lib/phronomy/execution/async_operation.rb +41 -0
  221. data/lib/phronomy/{engine → execution}/blocking.rb +2 -2
  222. data/lib/phronomy/{engine → execution}/concurrency/cancellation_token.rb +1 -1
  223. data/lib/phronomy/{engine → execution}/concurrency/deadline.rb +0 -17
  224. data/lib/phronomy/{engine → execution}/concurrency/physical_completion_task.rb +1 -1
  225. data/lib/phronomy/{engine → execution}/concurrency/result_collector.rb +1 -1
  226. data/lib/phronomy/{engine → execution}/concurrency/result_composition.rb +33 -12
  227. data/lib/phronomy/{engine/concurrency/subscriptions.rb → execution/concurrency/result_subscriptions.rb} +14 -18
  228. data/lib/phronomy/execution/concurrency/subscriptions.rb +25 -0
  229. data/lib/phronomy/{engine → execution}/execution.rb +61 -27
  230. data/lib/phronomy/execution/execution_receiver.rb +78 -0
  231. data/lib/phronomy/execution/execution_scope_state.rb +35 -0
  232. data/lib/phronomy/{engine → execution}/invocation_context.rb +0 -15
  233. data/lib/phronomy/execution/invocation_controls.rb +73 -0
  234. data/lib/phronomy/execution/runnable.rb +24 -0
  235. data/lib/phronomy/{engine → execution}/task_result.rb +3 -3
  236. data/lib/phronomy/execution/wait_policy.rb +24 -0
  237. data/lib/phronomy/filter/{contract/filter_block_error.rb → filter_block_error.rb} +1 -1
  238. data/lib/phronomy/generation/generator_verifier/agent_operation.rb +65 -0
  239. data/lib/phronomy/generation/generator_verifier/default_parser.rb +27 -0
  240. data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +2 -2
  241. data/lib/phronomy/generation/generator_verifier.rb +7 -7
  242. data/lib/phronomy/llm_adapter/async/async_client.rb +47 -0
  243. data/lib/phronomy/{llm_contract → llm_adapter}/authentication_error.rb +3 -1
  244. data/lib/phronomy/llm_adapter/backends/ruby_llm.rb +183 -0
  245. data/lib/phronomy/llm_adapter/base.rb +49 -68
  246. data/lib/phronomy/{llm_contract → llm_adapter}/context_length_error.rb +3 -1
  247. data/lib/phronomy/llm_adapter/invalid_result_error.rb +10 -0
  248. data/lib/phronomy/llm_adapter/message.rb +62 -0
  249. data/lib/phronomy/{llm_contract → llm_adapter}/rate_limit_error.rb +3 -1
  250. data/lib/phronomy/llm_adapter/request.rb +79 -0
  251. data/lib/phronomy/llm_adapter/response.rb +36 -0
  252. data/lib/phronomy/llm_adapter/stream_chunk.rb +18 -0
  253. data/lib/phronomy/llm_adapter/token_usage.rb +64 -0
  254. data/lib/phronomy/llm_adapter/transport_error.rb +9 -0
  255. data/lib/phronomy/llm_adapter.rb +3 -16
  256. data/lib/phronomy/multi_agent/admission_registry.rb +1 -8
  257. data/lib/phronomy/multi_agent/durable_subagent_coordinator.rb +108 -84
  258. data/lib/phronomy/multi_agent/execution_environment.rb +29 -0
  259. data/lib/phronomy/{agent/handoff → multi_agent}/handoff.rb +2 -2
  260. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_capability_factory.rb +21 -2
  261. data/lib/phronomy/multi_agent/handoff_participant.rb +79 -0
  262. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_policy.rb +1 -1
  263. data/lib/phronomy/multi_agent/handoff_runner.rb +77 -100
  264. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_state.rb +1 -1
  265. data/lib/phronomy/multi_agent/orchestrator.rb +61 -75
  266. data/lib/phronomy/multi_agent/persistence/codec.rb +20 -0
  267. data/lib/phronomy/multi_agent/persistence/handoff_state_repository.rb +77 -0
  268. data/lib/phronomy/multi_agent/persistence/records.rb +27 -0
  269. data/lib/phronomy/multi_agent/persistence/storage_schema.rb +21 -0
  270. data/lib/phronomy/multi_agent/persistence/team_execution_repository.rb +58 -42
  271. data/lib/phronomy/multi_agent/persistence/team_repository.rb +29 -21
  272. data/lib/phronomy/multi_agent/reserved_child_admission.rb +88 -0
  273. data/lib/phronomy/multi_agent/runtime_binding/engine_environment.rb +35 -0
  274. data/lib/phronomy/multi_agent/shared_state.rb +2 -2
  275. data/lib/phronomy/multi_agent/store.rb +156 -0
  276. data/lib/phronomy/multi_agent/team_coordinator.rb +83 -74
  277. data/lib/phronomy/multi_agent/team_ownership_registry.rb +2 -12
  278. data/lib/phronomy/output_parser/parse_error.rb +7 -0
  279. data/lib/phronomy/persistence/content_repository.rb +26 -0
  280. data/lib/phronomy/persistence/errors.rb +16 -0
  281. data/lib/phronomy/persistence/migration/initial_format_migration.rb +2 -2
  282. data/lib/phronomy/persistence/persistence.rb +23 -0
  283. data/lib/phronomy/persistence/save_outcome.rb +24 -0
  284. data/lib/phronomy/persistence/snapshot_comparison.rb +81 -0
  285. data/lib/phronomy/persistence/storage_boundary.rb +32 -0
  286. data/lib/phronomy/persistence/transaction.rb +86 -0
  287. data/lib/phronomy/persistence_composition/storage_schema.rb +9 -4
  288. data/lib/phronomy/persistence_composition/stores.rb +34 -0
  289. data/lib/phronomy/persistence_composition/unit4_migration.rb +276 -0
  290. data/lib/phronomy/runtime_composition/agent_defaults.rb +5 -1
  291. data/lib/phronomy/runtime_composition/configuration.rb +146 -0
  292. data/lib/phronomy/runtime_composition/evaluation_defaults.rb +7 -0
  293. data/lib/phronomy/runtime_composition/execution_defaults.rb +5 -0
  294. data/lib/phronomy/runtime_composition/generation_defaults.rb +6 -0
  295. data/lib/phronomy/runtime_composition/global_configuration.rb +38 -0
  296. data/lib/phronomy/runtime_composition/multi_agent_defaults.rb +9 -0
  297. data/lib/phronomy/runtime_composition/workflow_defaults.rb +4 -0
  298. data/lib/phronomy/storage/async/async_client.rb +60 -0
  299. data/lib/phronomy/storage/backend.rb +8 -2
  300. data/lib/phronomy/testing/eval/metrics.rb +1 -1
  301. data/lib/phronomy/testing/eval/scorer/llm_judge.rb +19 -3
  302. data/lib/phronomy/testing/persistence_contract/a_content_store.rb +2 -2
  303. data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +6 -6
  304. data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +55 -52
  305. data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +3 -3
  306. data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +7 -7
  307. data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +11 -11
  308. data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +57 -51
  309. data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +1 -1
  310. data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +23 -22
  311. data/lib/phronomy/tool/authorization.rb +77 -0
  312. data/lib/phronomy/tool/base.rb +549 -9
  313. data/lib/phronomy/tool/call_request.rb +40 -0
  314. data/lib/phronomy/{agent/tool_execution/tool_definition_set.rb → tool/definition_set.rb} +7 -8
  315. data/lib/phronomy/tool/operation.rb +88 -0
  316. data/lib/phronomy/tool/schema.rb +214 -0
  317. data/lib/phronomy/tool/settings.rb +31 -0
  318. data/lib/phronomy/tool/tool_error.rb +7 -0
  319. data/lib/phronomy/tool/tool_executor.rb +58 -0
  320. data/lib/phronomy/tools/agent.rb +22 -90
  321. data/lib/phronomy/tools/mcp.rb +21 -14
  322. data/lib/phronomy/tools/vector_search.rb +4 -4
  323. data/lib/phronomy/tracing/automatic.rb +11 -6
  324. data/lib/phronomy/tracing/base.rb +1 -1
  325. data/lib/phronomy/tracing/observation.rb +37 -0
  326. data/lib/phronomy/tracing/settings.rb +36 -0
  327. data/lib/phronomy/vector_store/{async_backend.rb → async/async_client.rb} +35 -29
  328. data/lib/phronomy/vector_store/{in_memory.rb → backends/in_memory.rb} +12 -10
  329. data/lib/phronomy/vector_store/{pgvector.rb → backends/pgvector.rb} +44 -16
  330. data/lib/phronomy/vector_store/{redis_search.rb → backends/redis_search.rb} +74 -37
  331. data/lib/phronomy/vector_store/base.rb +118 -49
  332. data/lib/phronomy/vector_store/invalid_result_error.rb +12 -0
  333. data/lib/phronomy/vector_store.rb +2 -17
  334. data/lib/phronomy/version.rb +1 -1
  335. data/lib/phronomy/workflow/completion.rb +11 -0
  336. data/lib/phronomy/workflow/execution/workflow.rb +7 -7
  337. data/lib/phronomy/workflow/execution/workflow_action_rules.rb +67 -0
  338. data/lib/phronomy/workflow/execution/workflow_context.rb +2 -2
  339. data/lib/phronomy/workflow/execution/workflow_execution_environment.rb +27 -0
  340. data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +3 -5
  341. data/lib/phronomy/workflow/execution/workflow_runner.rb +58 -79
  342. data/lib/phronomy/workflow/execution/workflow_settings.rb +28 -0
  343. data/lib/phronomy/workflow/persistence/state_repository.rb +28 -22
  344. data/lib/phronomy/workflow/persistence/storage_schema.rb +13 -0
  345. data/lib/phronomy/workflow/runtime_binding/workflow_engine_environment.rb +38 -0
  346. data/lib/phronomy/workflow/runtime_binding/workflow_phase_machine_builder.rb +156 -0
  347. data/lib/phronomy/workflow/{execution → runtime_binding}/workflow_terminal_policy.rb +4 -4
  348. data/lib/phronomy.rb +57 -16
  349. data/scripts/api_snapshot.rb +35 -15
  350. data/sig/_private/phronomy/agent/settings.rbs +19 -0
  351. data/sig/_private/phronomy/configuration/runtime_settings.rbs +20 -0
  352. data/sig/_private/phronomy/llm_adapter/async/async_client.rbs +10 -0
  353. data/sig/_private/phronomy/multi_agent/store.rbs +8 -0
  354. data/sig/_private/phronomy/persistence/storage_boundary.rbs +7 -0
  355. data/sig/_private/phronomy/tool/settings.rbs +13 -0
  356. data/sig/_private/phronomy/tracing/settings.rbs +15 -0
  357. data/sig/_private/phronomy/workflow/execution/workflow_settings.rbs +13 -0
  358. data/sig/phronomy/agent/admission.rbs +19 -0
  359. data/sig/phronomy/agent/execution_contract.rbs +132 -0
  360. data/sig/phronomy/agent/execution_environment.rbs +20 -0
  361. data/sig/phronomy/agent/store.rbs +73 -0
  362. data/sig/phronomy/agent.rbs +14 -138
  363. data/sig/phronomy/common.rbs +7 -0
  364. data/sig/phronomy/content_store/contracts.rbs +13 -0
  365. data/sig/phronomy/context.rbs +152 -0
  366. data/sig/phronomy/embeddings/async/async_client.rbs +9 -0
  367. data/sig/phronomy/embeddings/base.rbs +17 -0
  368. data/sig/phronomy/engine/concurrency/timer_bindings.rbs +22 -0
  369. data/sig/phronomy/engine/control_bindings.rbs +11 -0
  370. data/sig/phronomy/engine/control_protocols.rbs +23 -0
  371. data/sig/phronomy/engine/execution_binding.rbs +6 -0
  372. data/sig/phronomy/engine/execution_receiver.rbs +15 -0
  373. data/sig/phronomy/engine/observability.rbs +13 -0
  374. data/sig/phronomy/execution/async_operation.rbs +7 -0
  375. data/sig/phronomy/execution/blocking.rbs +5 -0
  376. data/sig/phronomy/execution/concurrency/cancellation_token.rbs +13 -0
  377. data/sig/phronomy/execution/concurrency/deadline.rbs +10 -0
  378. data/sig/phronomy/execution/concurrency/result_composition.rbs +7 -0
  379. data/sig/phronomy/execution/control_protocols.rbs +18 -0
  380. data/sig/phronomy/execution/errors.rbs +7 -0
  381. data/sig/phronomy/execution/execution.rbs +41 -0
  382. data/sig/phronomy/execution/execution_receiver.rbs +40 -0
  383. data/sig/phronomy/execution/execution_scope_state.rbs +9 -0
  384. data/sig/phronomy/execution/invocation_context.rbs +18 -0
  385. data/sig/phronomy/execution/invocation_controls.rbs +13 -0
  386. data/sig/phronomy/execution/task_result.rbs +29 -0
  387. data/sig/phronomy/extensions.rbs +0 -21
  388. data/sig/phronomy/handoff.rbs +10 -4
  389. data/sig/phronomy/llm_adapter/backends/ruby_llm.rbs +6 -0
  390. data/sig/phronomy/llm_adapter/base.rbs +14 -0
  391. data/sig/phronomy/llm_adapter/usage.rbs +14 -0
  392. data/sig/phronomy/llm_adapter/values.rbs +43 -0
  393. data/sig/phronomy/llm_context_window.rbs +10 -0
  394. data/sig/phronomy/multi_agent/reserved_child_admission.rbs +8 -0
  395. data/sig/phronomy/multi_agent/store.rbs +54 -0
  396. data/sig/phronomy/multi_agent.rbs +6 -3
  397. data/sig/phronomy/persistence/errors.rbs +18 -0
  398. data/sig/phronomy/persistence/migration.rbs +13 -0
  399. data/sig/phronomy/persistence/transaction.rbs +19 -0
  400. data/sig/phronomy/persistence.rbs +1 -99
  401. data/sig/phronomy/persistence_composition.rbs +19 -0
  402. data/sig/phronomy/runtime_composition/configuration.rbs +36 -0
  403. data/sig/phronomy/storage/async/async_client.rbs +8 -0
  404. data/sig/phronomy/storage/backends/in_memory.rbs +9 -0
  405. data/sig/phronomy/{storage.rbs → storage/contracts.rbs} +2 -16
  406. data/sig/phronomy/tool.rbs +48 -4
  407. data/sig/phronomy/tracing/observation.rbs +7 -0
  408. data/sig/phronomy/vector_store/async/async_client.rbs +13 -0
  409. data/sig/phronomy/vector_store/base.rbs +23 -0
  410. data/sig/phronomy/workflow/execution/workflow_execution_environment.rbs +14 -0
  411. data/sig/phronomy/workflow/runtime_binding/workflow_terminal_policy.rbs +7 -0
  412. data/sig/phronomy/workflow/store.rbs +8 -0
  413. data/sig/phronomy/workflow.rbs +1 -1
  414. data/sig/phronomy.rbs +0 -49
  415. metadata +318 -117
  416. data/lib/phronomy/agent/concerns/before_llm_input.rb +0 -66
  417. data/lib/phronomy/agent/concerns/error_translation.rb +0 -45
  418. data/lib/phronomy/agent/concerns/filterable.rb +0 -184
  419. data/lib/phronomy/agent/context/capability/base.rb +0 -548
  420. data/lib/phronomy/agent/context/capability/tool_executor.rb +0 -62
  421. data/lib/phronomy/agent/context/instruction/prompt_template.rb +0 -102
  422. data/lib/phronomy/agent/context_assembly/runtime_chat_builder.rb +0 -36
  423. data/lib/phronomy/agent/context_assembly/token_budget_resolver.rb +0 -22
  424. data/lib/phronomy/agent/context_parts/validators/final_budget_validator.rb +0 -37
  425. data/lib/phronomy/agent/context_policies/default.rb +0 -142
  426. data/lib/phronomy/agent/execution/phase_machine_builder.rb +0 -101
  427. data/lib/phronomy/agent/execution/provider_call_outcome.rb +0 -106
  428. data/lib/phronomy/agent/handoff/handoff_execution_coordinator.rb +0 -15
  429. data/lib/phronomy/agent/handoff/handoff_outcome_committer.rb +0 -131
  430. data/lib/phronomy/agent/handoff/handoff_request.rb +0 -45
  431. data/lib/phronomy/agent/lifecycle_contract/handoff_error.rb +0 -7
  432. data/lib/phronomy/agent/persistence/handoff_state_repository.rb +0 -58
  433. data/lib/phronomy/agent/persistence/queries.rb +0 -61
  434. data/lib/phronomy/agent/selection/candidate.rb +0 -53
  435. data/lib/phronomy/agent/selection/constraint.rb +0 -49
  436. data/lib/phronomy/agent/tool_execution/tool_call_intercepted.rb +0 -29
  437. data/lib/phronomy/agent/tool_execution/tool_invocation_session_builder.rb +0 -276
  438. data/lib/phronomy/configuration/configuration.rb +0 -68
  439. data/lib/phronomy/configuration/global_configuration.rb +0 -26
  440. data/lib/phronomy/engine/concurrency/cancellation_scope.rb +0 -124
  441. data/lib/phronomy/engine/concurrency/operation_binding.rb +0 -43
  442. data/lib/phronomy/engine/execution_receiver.rb +0 -65
  443. data/lib/phronomy/engine/runnable.rb +0 -54
  444. data/lib/phronomy/llm_adapter/ruby_llm.rb +0 -47
  445. data/lib/phronomy/llm_contract/token_usage.rb +0 -85
  446. data/lib/phronomy/multi_agent/persistence/queries.rb +0 -30
  447. data/lib/phronomy/multi_agent/storage_contract/team_storage_schema.rb +0 -15
  448. data/lib/phronomy/output_parser/contract/parse_error.rb +0 -7
  449. data/lib/phronomy/persistence/api/persistence.rb +0 -140
  450. data/lib/phronomy/persistence_composition/repositories.rb +0 -77
  451. data/lib/phronomy/recovery/recovery.rb +0 -186
  452. data/lib/phronomy/tool/contract/tool_error.rb +0 -7
  453. data/lib/phronomy/vector_store/embeddings/base.rb +0 -44
  454. data/lib/phronomy/vector_store/embeddings/ruby_llm_embeddings.rb +0 -47
  455. data/lib/phronomy/workflow/phase_machine_builder.rb +0 -205
  456. data/lib/phronomy/workflow/storage_contract/workflow_storage_schema.rb +0 -9
  457. data/sig/phronomy/execution_receiver.rbs +0 -34
  458. data/sig/phronomy/llm_adapter.rbs +0 -11
  459. data/sig/phronomy/runtime.rbs +0 -76
  460. /data/lib/phronomy/agent/{context_assembly/context_importer.rb → context_importer.rb} +0 -0
  461. /data/lib/phronomy/{engine → execution}/backpressure_error.rb +0 -0
  462. /data/lib/phronomy/{engine → execution}/cancellation_error.rb +0 -0
  463. /data/lib/phronomy/{engine → execution}/concurrency/worker_input_restricted.rb +0 -0
  464. /data/lib/phronomy/{engine → execution}/event_loop_reentrancy_error.rb +0 -0
  465. /data/lib/phronomy/{engine → execution}/execution_cancellation_error.rb +0 -0
  466. /data/lib/phronomy/{engine → execution}/execution_timeout_error.rb +0 -0
  467. /data/lib/phronomy/{engine → execution}/invalid_async_entry_action_error.rb +0 -0
  468. /data/lib/phronomy/{engine → execution}/invalid_async_transition_action_error.rb +0 -0
  469. /data/lib/phronomy/{engine → execution}/invalid_async_workflow_action_error.rb +0 -0
  470. /data/lib/phronomy/{engine → execution}/pool_shutdown_error.rb +0 -0
  471. /data/lib/phronomy/{engine → execution}/recursion_limit_error.rb +0 -0
  472. /data/lib/phronomy/{engine → execution}/runtime_shutdown_error.rb +0 -0
  473. /data/lib/phronomy/{engine → execution}/runtime_shutdown_reentrancy_error.rb +0 -0
  474. /data/lib/phronomy/{engine → execution}/scheduler_reentrancy_error.rb +0 -0
  475. /data/lib/phronomy/{engine → execution}/timeout_error.rb +0 -0
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "state_machines"
4
+ require_relative "../execution/workflow_action_rules"
5
+
6
+ module Phronomy
7
+ # Builds the anonymous state-machine Class used by WorkflowRunner.
8
+ #
9
+ # This class compiles Workflow topology into state_machines declarations.
10
+ # It intentionally does not await Tasks, register completion callbacks,
11
+ # cancel external work, or interpret application event payloads.
12
+ #
13
+ # @api private
14
+ class WorkflowPhaseMachineBuilder
15
+ def initialize(
16
+ entry_point:,
17
+ declared_states:,
18
+ wait_state_names:,
19
+ external_events:,
20
+ entry_actions:,
21
+ auto_transitions:,
22
+ exit_actions:
23
+ )
24
+ @entry_point = entry_point
25
+ @declared_states = declared_states
26
+ @wait_state_names = wait_state_names
27
+ @external_events = external_events.transform_values { |items| items.map { |transition| convert_transition(transition) } }
28
+ @entry_actions = entry_actions
29
+ @auto_transitions = auto_transitions.map { |transition| convert_transition(transition) }
30
+ @exit_actions = exit_actions
31
+ end
32
+
33
+ def build
34
+ entry = @entry_point
35
+ all_states = (@declared_states + @wait_state_names + [FSMProtocol::FINISH]).uniq
36
+ auto_transitions = @auto_transitions
37
+ external_events = @external_events
38
+ entry_actions = @entry_actions
39
+ exit_actions = @exit_actions
40
+ condition_builder = method(:build_transition_condition)
41
+ entry_callback_builder = method(:build_entry_callback)
42
+ exit_callback_builder = method(:build_exit_callback)
43
+ transition_callback = build_transition_action_callback
44
+
45
+ Class.new do
46
+ attr_accessor(
47
+ :context,
48
+ :current_event,
49
+ :selected_transition_action,
50
+ :selected_transition_metadata
51
+ )
52
+
53
+ state_machine :phase, initial: entry do
54
+ all_states.each { |state_name| state state_name }
55
+
56
+ event :state_completed do
57
+ auto_transitions.each do |transition_definition|
58
+ transition(
59
+ transition_definition[:from] => transition_definition[:to],
60
+ :if => condition_builder.call(transition_definition)
61
+ )
62
+ end
63
+ end
64
+
65
+ external_events.each do |event_name, transitions|
66
+ event event_name do
67
+ transitions.each do |transition_definition|
68
+ transition(
69
+ transition_definition[:from] => transition_definition[:to],
70
+ :if => condition_builder.call(transition_definition)
71
+ )
72
+ end
73
+ end
74
+ end
75
+
76
+ entry_actions.each do |state_name, callables|
77
+ callables.each do |callable|
78
+ after_transition(
79
+ to: state_name,
80
+ &entry_callback_builder.call(callable, state_name)
81
+ )
82
+ end
83
+ end
84
+
85
+ # Both source exit callbacks and the transition action are
86
+ # before_transition callbacks. Register exits first to preserve the
87
+ # required exit -> transition action -> entry ordering.
88
+ exit_actions.each do |state_name, callables|
89
+ callables.each do |callable|
90
+ before_transition(
91
+ from: state_name,
92
+ &exit_callback_builder.call(callable, state_name)
93
+ )
94
+ end
95
+ end
96
+
97
+ before_transition(&transition_callback)
98
+ end
99
+ end
100
+ rescue => error
101
+ raise ArgumentError, "Failed to build phase machine: #{error.message}"
102
+ end
103
+
104
+ private
105
+
106
+ def convert_transition(transition)
107
+ destination = transition[:to]
108
+ destination = FSMProtocol::FINISH if destination == Workflow::Completion::FINISH
109
+ transition.merge(to: destination)
110
+ end
111
+
112
+ def build_transition_condition(transition_definition)
113
+ guard = transition_definition[:guard]
114
+ action = transition_definition[:action]
115
+ metadata = {
116
+ from: transition_definition[:from],
117
+ event: transition_definition[:event],
118
+ to: public_destination(transition_definition[:to])
119
+ }.freeze
120
+
121
+ ->(machine) {
122
+ matched = WorkflowActionRules.allowed?(guard, machine.context, machine.current_event)
123
+ if matched
124
+ machine.selected_transition_action = action
125
+ machine.selected_transition_metadata = metadata
126
+ end
127
+ matched
128
+ }
129
+ end
130
+
131
+ def build_transition_action_callback
132
+ ->(machine) {
133
+ machine.context = WorkflowActionRules.transition(
134
+ machine.selected_transition_action, machine.context, machine.current_event,
135
+ metadata: machine.selected_transition_metadata || {}
136
+ )
137
+ }
138
+ end
139
+
140
+ def build_entry_callback(callable, state_name)
141
+ ->(machine) {
142
+ machine.context = WorkflowActionRules.apply_entry(callable, machine.context, state_name)
143
+ }
144
+ end
145
+
146
+ def build_exit_callback(callable, state_name)
147
+ ->(machine) { WorkflowActionRules.exit(callable, machine.context, state_name) }
148
+ end
149
+
150
+ def public_destination(destination)
151
+ return Workflow::Completion::FINISH if destination == FSMProtocol::FINISH
152
+
153
+ destination
154
+ end
155
+ end
156
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Phronomy
4
- # Interprets durable Workflow results for the shared FSM terminal gate.
4
+ # Translates classified Workflow outcomes into shared FSM terminal decisions.
5
5
  # The session owns pending state; Runner owns persistence and reconciliation.
6
6
  # @api private
7
7
  class WorkflowTerminalPolicy
@@ -23,14 +23,14 @@ module Phronomy
23
23
  result = event.payload
24
24
  case result.outcome
25
25
  when :success
26
- FSMProtocol::TerminalDecision.new(action: :complete, error: nil)
26
+ Phronomy::TerminalDecision.new(action: :complete, error: nil)
27
27
  when :known_failure
28
- FSMProtocol::TerminalDecision.new(
28
+ Phronomy::TerminalDecision.new(
29
29
  action: :fail,
30
30
  error: result.error || Phronomy::Error.new("Workflow terminal persistence failed")
31
31
  )
32
32
  when :outcome_unknown
33
- FSMProtocol::TerminalDecision.new(action: :retire, error: result.error)
33
+ Phronomy::TerminalDecision.new(action: :retire, error: result.error)
34
34
  else
35
35
  raise Phronomy::Error,
36
36
  "unknown Workflow terminal persistence outcome: #{result.outcome.inspect}"
data/lib/phronomy.rb CHANGED
@@ -13,19 +13,29 @@ loader.inflector.inflect("llm_adapter" => "LLMAdapter")
13
13
  loader.inflector.inflect("llm_operation_result" => "LLMOperationResult")
14
14
  loader.inflector.inflect("ruby_llm" => "RubyLLM")
15
15
  loader.inflector.inflect("canonical_json" => "CanonicalJSON")
16
- loader.inflector.inflect("ruby_llm_materializer" => "RubyLLMMaterializer")
17
16
  loader.inflector.inflect("llm_call_record" => "LLMCallRecord")
18
17
  loader.inflector.inflect("llm_input_manifest" => "LLMInputManifest")
19
18
  loader.inflector.inflect("llm_input_build_context" => "LLMInputBuildContext")
20
19
  loader.inflector.inflect("llm_input_patch" => "LLMInputPatch")
21
20
  loader.inflector.inflect("before_llm_input" => "BeforeLLMInput")
22
21
  # These responsibility directories do not add a public Ruby namespace.
23
- %w[common configuration engine generation llm_contract recovery].each do |directory|
22
+ %w[common configuration engine execution generation runtime_composition].each do |directory|
23
+ loader.collapse("#{__dir__}/phronomy/#{directory}")
24
+ end
25
+ # Backend contracts, execution clients and implementations have separate source
26
+ # directories, while keeping their existing feature namespace.
27
+ %w[
28
+ llm_adapter/async llm_adapter/backends
29
+ vector_store/async vector_store/backends
30
+ embeddings/async embeddings/backends
31
+ storage/async
32
+ multi_agent/runtime_binding
33
+ ].each do |directory|
24
34
  loader.collapse("#{__dir__}/phronomy/#{directory}")
25
35
  end
26
36
  # Agent responsibility directories retain the existing Agent constant names.
27
37
  %w[
28
- context_contract lifecycle execution tool_execution context_assembly
38
+ lifecycle execution tool_execution runtime_binding
29
39
  journal handoff recovery
30
40
  ].each do |directory|
31
41
  loader.collapse("#{__dir__}/phronomy/agent/#{directory}")
@@ -36,44 +46,75 @@ end
36
46
  # beside the feature they belong to, without aliases or a new partial-load API.
37
47
  %w[
38
48
  agent/api
39
- agent/lifecycle_contract
40
- filter/contract
41
- output_parser/contract
42
- persistence/api
43
- tool/contract
44
49
  workflow/execution
45
- workflow/storage_contract
46
- multi_agent/storage_contract
50
+ workflow/runtime_binding
47
51
  ].each do |directory|
48
52
  loader.push_dir("#{__dir__}/phronomy/#{directory}", namespace: Phronomy)
49
53
  end
50
54
 
51
55
  # These files wire composition, reopen namespaces, or patch a dependency.
52
56
  loader.ignore(
53
- "#{__dir__}/phronomy/configuration/global_configuration.rb",
57
+ "#{__dir__}/phronomy/persistence/persistence.rb",
58
+ "#{__dir__}/phronomy/persistence/errors.rb",
59
+ "#{__dir__}/phronomy/persistence_composition/stores.rb",
60
+ "#{__dir__}/phronomy/runtime_composition/global_configuration.rb",
54
61
  "#{__dir__}/phronomy/agent/composition",
55
62
  "#{__dir__}/phronomy/runtime_composition/agent_defaults.rb",
63
+ "#{__dir__}/phronomy/runtime_composition/generation_defaults.rb",
64
+ "#{__dir__}/phronomy/runtime_composition/evaluation_defaults.rb",
65
+ "#{__dir__}/phronomy/runtime_composition/workflow_defaults.rb",
66
+ "#{__dir__}/phronomy/runtime_composition/multi_agent_defaults.rb",
56
67
  "#{__dir__}/phronomy/runtime_composition/configuration_defaults.rb",
57
- "#{__dir__}/phronomy/runtime_composition/global_runtime.rb"
68
+ "#{__dir__}/phronomy/runtime_composition/global_runtime.rb",
69
+ "#{__dir__}/phronomy/runtime_composition/execution_defaults.rb"
58
70
  )
59
71
  # Persistence conformance support must never make production loading require RSpec.
60
72
  loader.ignore(
61
73
  "#{__dir__}/phronomy/testing/persistence_contract.rb",
62
74
  "#{__dir__}/phronomy/testing/persistence_contract"
63
75
  )
76
+ # Failure contracts can define Persistence before ordinary framework loading.
77
+ # Explicitly install its service methods without constructing a backend/Runtime.
78
+ require_relative "phronomy/persistence/persistence"
79
+ require_relative "phronomy/persistence/errors"
80
+ loader.ignore("#{__dir__}/phronomy/tool/tool_error.rb")
81
+ loader.ignore("#{__dir__}/phronomy/filter/filter_block_error.rb")
82
+ loader.ignore("#{__dir__}/phronomy/output_parser/parse_error.rb")
83
+ loader.ignore("#{__dir__}/phronomy/agent/agent_busy_error.rb")
84
+ loader.ignore("#{__dir__}/phronomy/agent/agent_purged_error.rb")
85
+ loader.ignore("#{__dir__}/phronomy/agent/stream_callback_error.rb")
86
+ loader.ignore("#{__dir__}/phronomy/agent/handoff_error.rb")
87
+ loader.ignore("#{__dir__}/phronomy/agent/agent_already_exists_error.rb")
64
88
  loader.setup
89
+ require_relative "phronomy/persistence/transaction"
90
+ require_relative "phronomy/persistence_composition/stores"
91
+ require_relative "phronomy/tool/tool_error"
92
+ require_relative "phronomy/filter/filter_block_error"
93
+ require_relative "phronomy/output_parser/parse_error"
94
+ require_relative "phronomy/agent/agent_busy_error"
95
+ require_relative "phronomy/agent/agent_purged_error"
96
+ require_relative "phronomy/agent/stream_callback_error"
97
+ require_relative "phronomy/agent/handoff_error"
98
+ require_relative "phronomy/agent/agent_already_exists_error"
65
99
 
66
100
  require_relative "phronomy/runtime_composition/configuration_defaults"
67
- require_relative "phronomy/llm_contract/token_usage"
68
- require_relative "phronomy/configuration/global_configuration"
101
+ require_relative "phronomy/llm_adapter/token_usage"
102
+ require_relative "phronomy/runtime_composition/global_configuration"
69
103
  require_relative "phronomy/runtime_composition/global_runtime"
104
+ require_relative "phronomy/runtime_composition/execution_defaults"
70
105
 
71
106
  # Explicitly install the Agent namespace extensions even if its factory
72
107
  # contract was loaded first. Composition owns both concrete binding and the
73
108
  # run_once method definition; neither is required from Agent execution files.
74
109
  require_relative "phronomy/agent/api/agent"
75
110
  require_relative "phronomy/runtime_composition/agent_defaults"
111
+ require_relative "phronomy/runtime_composition/multi_agent_defaults"
112
+ require_relative "phronomy/runtime_composition/workflow_defaults"
113
+ require_relative "phronomy/runtime_composition/generation_defaults"
114
+ require_relative "phronomy/runtime_composition/evaluation_defaults"
76
115
  require_relative "phronomy/agent/composition/run_once"
77
116
 
78
- # Load the common recovery vocabulary during ordinary application loading.
79
- require_relative "phronomy/recovery/recovery"
117
+ # Preserve ordinary boot loading of the existing recovery rules and comparisons
118
+ # while giving each definition its owning domain.
119
+ require_relative "phronomy/agent/recovery/recovery_rules"
120
+ require_relative "phronomy/persistence/snapshot_comparison"
@@ -19,31 +19,49 @@ require_relative "../lib/phronomy"
19
19
  PUBLIC_API_ENTRIES = [
20
20
  # Stable
21
21
  Phronomy::Agent::Base,
22
- Phronomy::Agent::ContextPolicy,
23
- Phronomy::Agent::ContextPolicyInput,
24
- Phronomy::Agent::ContextPolicyInput::Provenance,
25
- Phronomy::Agent::ContextPolicyInput::InstructionItem,
26
- Phronomy::Agent::ContextPolicyInput::KnowledgeItem,
27
- Phronomy::Agent::ContextPolicyInput::ToolItem,
28
- Phronomy::Agent::ContextPolicyInput::ConversationItem,
29
- Phronomy::Agent::ContextPlan,
22
+ Phronomy::Agent::ReservedExecution,
23
+ Phronomy::Agent::ExecutionObservation,
24
+ Phronomy::Agent::KnowledgeItem,
25
+ Phronomy::Agent::Retention,
26
+ Phronomy::Agent::ExecutionExtensionState,
27
+ Phronomy::Agent::ControlRequest,
28
+ Phronomy::Context::ContextPolicy,
29
+ Phronomy::Context::ContextPolicyInput,
30
+ Phronomy::Context::ContextPolicyInput::Provenance,
31
+ Phronomy::Context::ContextPolicyInput::InstructionItem,
32
+ Phronomy::Context::ContextPolicyInput::KnowledgeItem,
33
+ Phronomy::Context::ContextPolicyInput::ToolItem,
34
+ Phronomy::Context::ContextPolicyInput::ConversationItem,
35
+ Phronomy::Context::ContextPlan,
30
36
  Phronomy::InvocationContext,
31
- Phronomy::Agent::Context::Capability::Base,
37
+ Phronomy::Tool::Base,
32
38
  Phronomy::Workflow,
33
39
  Phronomy::WorkflowContext,
34
40
  Phronomy::Runnable,
35
- Phronomy::Agent::Context::Instruction::PromptTemplate,
41
+ Phronomy::Context::PromptTemplate,
36
42
  # Beta
37
- Phronomy::Agent::Handoff,
38
- Phronomy::Agent::HandoffPolicy,
43
+ Phronomy::Tool::Schema,
44
+ Phronomy::Tool::CallRequest,
45
+ Phronomy::Tool::Operation,
46
+ Phronomy::LLMAdapter::Base,
47
+ Phronomy::LLMAdapter::Request,
48
+ Phronomy::LLMAdapter::Message,
49
+ Phronomy::LLMAdapter::Response,
50
+ Phronomy::LLMAdapter::StreamChunk,
51
+ Phronomy::LLMAdapter::TokenUsage,
52
+ Phronomy::MultiAgent::Handoff,
53
+ Phronomy::MultiAgent::HandoffPolicy,
39
54
  Phronomy::MultiAgent::HandoffRunner,
40
55
  Phronomy::MultiAgent::Orchestrator,
41
56
  Phronomy::MultiAgent::TeamCoordinator,
42
57
  Phronomy::Filter::Base,
43
58
  Phronomy::Filter::PromptInjectionFilter,
59
+ Phronomy::Storage::AsyncClient,
44
60
  Phronomy::VectorStore::Base,
61
+ Phronomy::VectorStore::AsyncClient,
45
62
  Phronomy::VectorStore::InMemory,
46
- Phronomy::VectorStore::Embeddings::Base,
63
+ Phronomy::Embeddings::Base,
64
+ Phronomy::Embeddings::AsyncClient,
47
65
  Phronomy::Tracing::Base,
48
66
  Phronomy::Tracing::NullTracer,
49
67
  Phronomy::Tools::Mcp,
@@ -67,13 +85,15 @@ def snapshot_entry(klass)
67
85
  {
68
86
  "name" => klass.name,
69
87
  "type" => "module",
70
- "public_instance_methods" => own_methods
88
+ "public_instance_methods" => own_methods,
89
+ "public_class_methods" => (klass.public_methods(false) - BASELINE_CLASS_METHODS).sort
71
90
  }
72
91
  else
73
92
  internal_context_methods = (klass == Phronomy::InvocationContext) ?
74
93
  %i[__bind_execution __execution_scope] : []
75
94
  instance_methods = (klass.public_instance_methods - BASELINE_INSTANCE_METHODS - internal_context_methods).sort
76
- class_methods = (klass.public_methods(false) - BASELINE_CLASS_METHODS).sort
95
+ internal_class_methods = (klass == Phronomy::Storage::AsyncClient) ? %i[submit] : []
96
+ class_methods = (klass.public_methods(false) - BASELINE_CLASS_METHODS - internal_class_methods).sort
77
97
  {
78
98
  "name" => klass.name,
79
99
  "type" => "class",
@@ -0,0 +1,19 @@
1
+ module Phronomy
2
+ module Agent
3
+ class Settings
4
+ def self.install_provider: () { () -> Settings } -> void
5
+ def self.current: () -> Settings
6
+ def initialize: (llm_adapter: LLMAdapter::Base?, authorization_timeout: Numeric?, stream_callback_error_policy: Symbol) -> void
7
+ attr_accessor default_model: String?
8
+ attr_accessor before_llm_input: _BeforeLLMInputHook?
9
+ attr_accessor agent_store: Store?
10
+ attr_accessor llm_adapter: LLMAdapter::Base?
11
+ attr_accessor authorization_timeout: Numeric?
12
+ attr_accessor stream_callback_error_policy: Symbol
13
+ end
14
+ end
15
+
16
+ class Configuration
17
+ attr_reader __agent_settings: Agent::Settings
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module Phronomy
2
+ # Internal Engine-facing settings; application-specific types do not belong here.
3
+ class RuntimeSettings
4
+ def self.install_provider: () { () -> RuntimeSettings } -> void
5
+ def self.current: () -> RuntimeSettings
6
+ def initialize: () -> void
7
+ attr_accessor logger: untyped
8
+ attr_accessor event_loop_stop_grace_seconds: Numeric
9
+ attr_accessor event_loop_starvation_threshold_seconds: Numeric?
10
+ attr_accessor event_loop_dispatch_threshold_seconds: Numeric?
11
+ attr_accessor offload_pool_size: Integer
12
+ attr_accessor offload_queue_size: Integer
13
+ attr_accessor authorization_pool_size: Integer
14
+ attr_accessor authorization_queue_size: Integer
15
+ end
16
+
17
+ class Configuration
18
+ attr_reader __runtime_settings: RuntimeSettings
19
+ end
20
+ end
@@ -0,0 +1,10 @@
1
+ # Framework-internal API. Loaded by -I sig; not exported by gem library loading.
2
+ module Phronomy
3
+ module LLMAdapter
4
+ class AsyncClient
5
+ def initialize: (adapter: Base, ?pool: untyped, ?submitter: _ExecutionSubmitter) -> void
6
+ def complete_async: (Request request, ?cancellation_token: Concurrency::CancellationToken?, ?pool: untyped) -> TaskResult[Response]
7
+ def stream_async: (Request request, ?cancellation_token: Concurrency::CancellationToken?, ?pool: untyped) { (StreamChunk chunk) -> void } -> TaskResult[Response]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ module Phronomy
2
+ module MultiAgent
3
+ class Store
4
+ def self.install_configured_provider: () { () -> Store? } -> void
5
+ def self.configured: () -> Store?
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ class Persistence
3
+ module StorageBoundary
4
+ def self.call: [T] () { () -> T } -> T
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ module Phronomy
2
+ module Tool
3
+ class Settings
4
+ def self.install_provider: () { () -> Settings } -> void
5
+ def self.current: () -> Settings
6
+ attr_accessor max_result_size: Integer?
7
+ end
8
+ end
9
+
10
+ class Configuration
11
+ attr_reader __tool_settings: Tool::Settings
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Phronomy
2
+ module Tracing
3
+ class Settings
4
+ def self.install_provider: () { () -> Settings } -> void
5
+ def self.current: () -> Settings
6
+ def initialize: (tracer: Tracing::Base?) -> void
7
+ attr_accessor tracer: Tracing::Base?
8
+ attr_accessor trace_pii: bool
9
+ end
10
+ end
11
+
12
+ class Configuration
13
+ attr_reader __tracing_settings: Tracing::Settings
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Phronomy
2
+ class WorkflowSettings
3
+ def self.install_provider: () { () -> WorkflowSettings } -> void
4
+ def self.current: () -> WorkflowSettings
5
+ def initialize: (recursion_limit: Integer) -> void
6
+ attr_accessor recursion_limit: Integer
7
+ attr_accessor workflow_store: _WorkflowStateRepository?
8
+ end
9
+
10
+ class Configuration
11
+ attr_reader __workflow_settings: WorkflowSettings
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module Phronomy
2
+ module Agent
3
+ # Coordination owns reservation semantics; Agent owns the acceptance operation.
4
+ interface _AdmissionOwner
5
+ def admit: (Admission admission) -> void
6
+ end
7
+
8
+ class Admission
9
+ attr_reader agent_id: String
10
+ attr_reader execution_id: String
11
+ attr_reader correlation: Hash[String, json_value]?
12
+ def initialize: (persistence: Store, root: untyped, input: String,
13
+ config: Hash[Symbol, untyped], preparation_metadata: Hash[String, untyped]) -> void
14
+ def accept: () -> nil
15
+ def accept_in: (::Phronomy::Persistence::Transaction scope) -> nil
16
+ def result: () -> [untyped, untyped]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,132 @@
1
+ module Phronomy
2
+
3
+ module Agent
4
+ type execution_wiring = { ?phronomy_execution_participant: _ExecutionParticipant, ?phronomy_control_bindings: Array[_ControlCapability], ?phronomy_transfer_context: TransferContext, ?phronomy_admission: _AdmissionOwner, ?phronomy_reservation: Hash[String, json_value] }
5
+ type execution_result = { agent_id: String, execution_id: String, status: Symbol, result: String?, output: String?, error: Hash[String, json_value]? }
6
+
7
+ class ReservedExecution < Data
8
+ attr_reader agent_id: String
9
+ attr_reader execution_id: String
10
+ attr_reader correlation: Hash[String, json_value]?
11
+ def self.new: (agent_id: String, execution_id: String, ?correlation: Hash[String, json_value]?) -> instance
12
+ end
13
+
14
+ class ExecutionObservation < Data
15
+ attr_reader agent_id: String
16
+ attr_reader execution_id: String
17
+ attr_reader status: Symbol
18
+ attr_reader result: String?
19
+ attr_reader error: Hash[String, json_value]?
20
+ attr_reader reservation: ReservedExecution?
21
+ attr_reader transfer_receipt: Hash[String, json_value]?
22
+ attr_reader cancellation_requested: bool
23
+ def self.new: (agent_id: String, execution_id: String, status: Symbol, result: String?, error: Hash[String, json_value]?, reservation: ReservedExecution?, transfer_receipt: Hash[String, json_value]?, cancellation_requested: bool) -> instance
24
+ def self.from_result: (execution_result) -> instance
25
+ def absent?: () -> bool
26
+ def terminal?: () -> bool
27
+ def active?: () -> bool
28
+ def continuable?: () -> bool
29
+ def value!: () -> execution_result
30
+ def to_result: () -> execution_result
31
+ end
32
+
33
+ class ExecutionExtensionState < Data
34
+ attr_reader binding_key: String
35
+ attr_reader binding_version: Integer
36
+ attr_reader state_ref: String?
37
+ def self.new: (binding_key: String, binding_version: Integer, ?state_ref: String?) -> instance
38
+ def self.from_h: (Hash[String, json_value]) -> instance
39
+ def to_h: () -> Hash[String, json_value]
40
+ end
41
+
42
+ class KnowledgeItem < Data
43
+ attr_reader content: String
44
+ attr_reader metadata: Hash[String, json_value]
45
+ def self.new: (content: String, ?metadata: Hash[String, json_value]) -> instance
46
+ end
47
+
48
+ class Retention < Data
49
+ attr_reader agent_id: String
50
+ attr_reader execution_id: String?
51
+ attr_reader owner_key: String
52
+ def self.new: (agent_id: String, owner_key: String, ?execution_id: String?) -> instance
53
+ def to_h: () -> Hash[String, json_value]
54
+ end
55
+
56
+ class ControlRequest < Data
57
+ attr_reader target_agent_id: String
58
+ attr_reader responsibility: String
59
+ attr_reader selection: Hash[Symbol, bool]
60
+ attr_reader llm_call_id: String?
61
+ attr_reader tool_call_id: String?
62
+ def self.new: (target_agent_id: String, responsibility: String, selection: Hash[Symbol, bool], ?llm_call_id: String?, ?tool_call_id: String?) -> instance
63
+ end
64
+
65
+ interface _ControlCapability
66
+ def source_agent_id: () -> String
67
+ def request: (arguments: Hash[String, json_value], llm_call_id: String?, tool_call_id: String?) -> ControlRequest
68
+ end
69
+
70
+ interface _ExecutionParticipant
71
+ def binding: () -> ExecutionExtensionState
72
+ def guard_change: (ExecutionChange change, ::Phronomy::Persistence::Transaction scope) -> void
73
+ def change_evidence: (ExecutionChange change, ::Phronomy::Persistence::Transaction scope) -> json_value
74
+ def commit: (ExecutionChange change) -> void
75
+ end
76
+
77
+ class ExecutionChange
78
+ attr_reader kind: :dispatch | :terminal
79
+ attr_reader agent_id: String
80
+ attr_reader execution_id: String
81
+ attr_reader extension: ExecutionExtensionState?
82
+ attr_reader operations: Array[Store::AuthorizedOperation]
83
+ attr_reader control_request: ControlRequest?
84
+ attr_reader cancel_requested: bool
85
+ attr_reader recovery_required: bool
86
+ attr_reader durable_context: Hash[String, json_value]?
87
+ attr_reader correlation: Hash[String, json_value]?
88
+ attr_reader coordinator: ::Phronomy::Persistence
89
+ def finishing?: () -> bool
90
+ def prepare_in: (::Phronomy::Persistence::Transaction scope) -> nil
91
+ def commit_in: (::Phronomy::Persistence::Transaction scope, ?state: ExecutionExtensionState?, ?transfer_receipt: Hash[String, json_value]?, ?pending: bool) -> nil
92
+ def transfer_context: (::Phronomy::Persistence::Transaction scope) -> TransferContext
93
+ end
94
+
95
+ class TransferContext
96
+ attr_reader responsibility: String
97
+ attr_reader items: Array[Item]
98
+ def self.from_h: (Hash[String, json_value]) -> instance
99
+ def initialize: (responsibility: String, ?items: Array[Item]) -> void
100
+ def to_h: () -> Hash[String, json_value]
101
+ class Item < Data
102
+ attr_reader candidate_category: Symbol
103
+ attr_reader policy_category: Symbol
104
+ attr_reader role: Symbol?
105
+ attr_reader content: json_value
106
+ attr_reader content_format: Symbol
107
+ attr_reader tool_call_id: String?
108
+ attr_reader provenance: Provenance
109
+ attr_reader metadata: Hash[String, json_value]
110
+ end
111
+ class Provenance < Data
112
+ attr_reader origin_agent_id: String?
113
+ attr_reader origin_record_id: String?
114
+ attr_reader origin_execution_id: String?
115
+ attr_reader origin_llm_call_id: String?
116
+ attr_reader origin_tool_call_id: String?
117
+ attr_reader transfer_path: Array[String]
118
+ def forwarded_to: (String agent_id) -> instance
119
+ def to_h: () -> Hash[String, json_value]
120
+ end
121
+ end
122
+ end
123
+
124
+ class Persistence
125
+ class SaveOutcome < Data
126
+ attr_reader disposition: :committed | :not_committed | :unknown
127
+ attr_reader original_error: Exception?
128
+ attr_reader read_error: Exception?
129
+ def self.compare: [V] (before: V, after: V, ?original_error: Exception?) { () -> V } -> instance
130
+ end
131
+ end
132
+ end