phronomy 0.27.0 → 0.29.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 (517) 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 +28 -7
  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/application-recipes.md +229 -0
  11. data/docs/architecture/agent-chat-and-state-ownership.md +7 -1
  12. data/docs/architecture/agent-transition-ownership.md +13 -89
  13. data/docs/architecture/backend-groups.md +152 -0
  14. data/docs/architecture/before-llm-input.md +3 -3
  15. data/docs/architecture/context-management.md +1 -1
  16. data/docs/architecture/dx05-agent-scope.md +119 -0
  17. data/docs/architecture/dx05-workflow-task-state.md +134 -0
  18. data/docs/architecture/error-api-review.md +245 -0
  19. data/docs/architecture/execution-abstraction-review.md +88 -0
  20. data/docs/architecture/execution-boundaries.md +28 -0
  21. data/docs/architecture/execution-metadata-and-values.md +6 -0
  22. data/docs/architecture/multi-agent-handoff.md +6 -5
  23. data/docs/architecture/persistence.md +27 -9
  24. data/docs/architecture/r8-unit1.md +104 -0
  25. data/docs/architecture/r8-unit10.md +72 -0
  26. data/docs/architecture/r8-unit11.md +71 -0
  27. data/docs/architecture/r8-unit12.md +67 -0
  28. data/docs/architecture/r8-unit13.md +61 -0
  29. data/docs/architecture/r8-unit14.md +72 -0
  30. data/docs/architecture/r8-unit15.md +65 -0
  31. data/docs/architecture/r8-unit16.md +54 -0
  32. data/docs/architecture/r8-unit17.md +73 -0
  33. data/docs/architecture/r8-unit18.md +92 -0
  34. data/docs/architecture/r8-unit19.md +61 -0
  35. data/docs/architecture/r8-unit2.md +55 -0
  36. data/docs/architecture/r8-unit20.md +51 -0
  37. data/docs/architecture/r8-unit21.md +79 -0
  38. data/docs/architecture/r8-unit22.md +74 -0
  39. data/docs/architecture/r8-unit23.md +81 -0
  40. data/docs/architecture/r8-unit3.md +130 -0
  41. data/docs/architecture/r8-unit4.md +79 -0
  42. data/docs/architecture/r8-unit5.md +115 -0
  43. data/docs/architecture/r8-unit6.md +71 -0
  44. data/docs/architecture/r8-unit7.md +70 -0
  45. data/docs/architecture/r8-unit8.md +78 -0
  46. data/docs/architecture/r8-unit9.md +73 -0
  47. data/docs/architecture/refactoring-closure.md +10 -1
  48. data/docs/architecture/remaining-refactoring-plan.md +16 -0
  49. data/docs/architecture/storage-execution-boundaries.md +54 -0
  50. data/docs/architecture/tool-schema-recording-gap.md +6 -0
  51. data/docs/architecture/tracing.md +1 -1
  52. data/docs/architecture/workflow-terminal-ownership-design.md +2 -2
  53. data/docs/architecture.md +24 -11
  54. data/docs/decisions/015-tool-public-facade-and-rbs-boundary.md +3 -3
  55. data/docs/decisions/027-llm-adapter-provider-boundary.md +2 -0
  56. data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +2 -0
  57. data/docs/decisions/031-durable-multi-agent-coordination.md +2 -0
  58. data/docs/decisions/032-storage-backend-composition.md +5 -0
  59. data/docs/decisions/034-handoff-runner-coordination-ownership.md +2 -0
  60. data/docs/decisions/035-tool-executor-capability-ownership.md +1 -1
  61. data/docs/decisions/038-responsibility-based-source-layout.md +14 -0
  62. data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +8 -0
  63. data/docs/decisions/040-configuration-default-composition.md +12 -1
  64. data/docs/decisions/045-worker-input-restriction-ownership.md +4 -0
  65. data/docs/decisions/051-execution-outcome-worker-ownership.md +2 -0
  66. data/docs/decisions/056-workflow-terminal-policy-ownership.md +1 -1
  67. data/docs/decisions/058-neutral-storage-primitives.md +5 -0
  68. data/docs/decisions/059-backend-contracts-and-async-clients.md +74 -0
  69. data/docs/decisions/060-runtime-settings-and-application-configuration.md +86 -0
  70. data/docs/decisions/061-persistence-failure-contracts.md +89 -0
  71. data/docs/decisions/062-content-store-service.md +52 -0
  72. data/docs/decisions/063-execution-contracts-and-services.md +88 -0
  73. data/docs/decisions/064-agent-execution-and-multi-agent-responsibility.md +36 -0
  74. data/docs/decisions/065-vector-and-embeddings-common-operations.md +38 -0
  75. data/docs/decisions/066-llm-and-tool-operation-contracts.md +20 -0
  76. data/docs/decisions/067-agent-progress-and-engine-connection.md +29 -0
  77. data/docs/decisions/068-agent-tool-child-progress-and-tool-operation.md +36 -0
  78. data/docs/decisions/README.md +18 -1
  79. data/docs/execution-boundaries-preview.md +45 -0
  80. data/docs/failure-reason-codes.md +45 -0
  81. data/docs/features.md +12 -4
  82. data/docs/getting-started.md +52 -48
  83. data/docs/migrations/0.22.md +2 -2
  84. data/docs/migrations/durable-semantic-coordination-v2.md +2 -0
  85. data/docs/migrations/handoff-runner-multi-agent.md +2 -0
  86. data/docs/migrations/persistence-failure-contracts.md +67 -0
  87. data/docs/migrations/r8-unit10.md +36 -0
  88. data/docs/migrations/r8-unit11.md +33 -0
  89. data/docs/migrations/r8-unit12.md +31 -0
  90. data/docs/migrations/r8-unit13.md +36 -0
  91. data/docs/migrations/r8-unit14.md +31 -0
  92. data/docs/migrations/r8-unit15.md +31 -0
  93. data/docs/migrations/r8-unit16.md +26 -0
  94. data/docs/migrations/r8-unit17.md +28 -0
  95. data/docs/migrations/r8-unit18.md +29 -0
  96. data/docs/migrations/r8-unit19.md +28 -0
  97. data/docs/migrations/r8-unit20.md +24 -0
  98. data/docs/migrations/r8-unit21.md +28 -0
  99. data/docs/migrations/r8-unit22.md +29 -0
  100. data/docs/migrations/r8-unit23.md +20 -0
  101. data/docs/migrations/r8-unit4.md +67 -0
  102. data/docs/migrations/r8-unit5.md +75 -0
  103. data/docs/migrations/r8-unit6.md +109 -0
  104. data/docs/migrations/r8-unit7.md +31 -0
  105. data/docs/migrations/r8-unit8.md +33 -0
  106. data/docs/migrations/r8-unit9.md +28 -0
  107. data/docs/migrations/storage-async-client.md +103 -0
  108. data/docs/migrations/vector-async-clients.md +110 -0
  109. data/docs/ordered-event-delivery.md +54 -0
  110. data/docs/persistence-backends.md +38 -21
  111. data/docs/runtime-and-concurrency.md +26 -1
  112. data/docs/workflow-completion.md +92 -0
  113. data/gemfiles/http_minimum.gemfile +5 -0
  114. data/lib/phronomy/agent/admission.rb +78 -0
  115. data/lib/phronomy/agent/{lifecycle_contract/agent_already_exists_error.rb → agent_already_exists_error.rb} +1 -1
  116. data/lib/phronomy/agent/{lifecycle_contract/agent_busy_error.rb → agent_busy_error.rb} +1 -1
  117. data/lib/phronomy/agent/agent_not_found_error.rb +16 -0
  118. data/lib/phronomy/agent/{lifecycle_contract/agent_purged_error.rb → agent_purged_error.rb} +1 -1
  119. data/lib/phronomy/agent/agent_unloaded_error.rb +14 -0
  120. data/lib/phronomy/agent/api/agent.rb +13 -0
  121. data/lib/phronomy/{recovery → agent/api}/execution_rehydration_required_error.rb +1 -1
  122. data/lib/phronomy/agent/async_event_api.rb +132 -103
  123. data/lib/phronomy/agent/base.rb +146 -113
  124. data/lib/phronomy/agent/before_llm_input.rb +70 -0
  125. data/lib/phronomy/agent/composition/run_once.rb +1 -1
  126. data/lib/phronomy/agent/{context_assembly/context_candidate_resolver.rb → context_candidate_resolver.rb} +2 -2
  127. data/lib/phronomy/agent/{context_assembly/context_assembler.rb → context_preparation.rb} +35 -221
  128. data/lib/phronomy/agent/control_request.rb +21 -0
  129. data/lib/phronomy/agent/execution/agent_execution.rb +1 -1
  130. data/lib/phronomy/agent/execution/agent_invocation.rb +27 -53
  131. data/lib/phronomy/agent/execution/approval_resume_commit.rb +1 -1
  132. data/lib/phronomy/agent/execution/dispatch_preparation.rb +17 -127
  133. data/lib/phronomy/agent/execution/exact_execution.rb +55 -32
  134. data/lib/phronomy/agent/execution/execution_cancellation.rb +8 -4
  135. data/lib/phronomy/agent/execution/execution_coordinator.rb +229 -407
  136. data/lib/phronomy/agent/execution/execution_metadata.rb +1 -0
  137. data/lib/phronomy/agent/execution/execution_outcome_committer.rb +71 -127
  138. data/lib/phronomy/agent/execution/execution_registry.rb +6 -2
  139. data/lib/phronomy/agent/execution/execution_session_runner.rb +22 -27
  140. data/lib/phronomy/agent/execution/initial_preparation.rb +19 -120
  141. data/lib/phronomy/agent/execution/{agent_invocation_session_builder.rb → invocation_actions.rb} +54 -194
  142. data/lib/phronomy/agent/execution/invocation_transitions.rb +39 -1
  143. data/lib/phronomy/agent/execution/runtime_record_encoder.rb +8 -11
  144. data/lib/phronomy/agent/execution_change.rb +161 -0
  145. data/lib/phronomy/agent/execution_environment.rb +36 -0
  146. data/lib/phronomy/agent/execution_extension_state.rb +21 -0
  147. data/lib/phronomy/agent/execution_observation.rb +35 -0
  148. data/lib/phronomy/agent/filterable.rb +188 -0
  149. data/lib/phronomy/agent/handoff/{handoff_context.rb → transfer_context.rb} +4 -4
  150. data/lib/phronomy/agent/handoff/{handoff_projection.rb → transfer_projection.rb} +14 -33
  151. data/lib/phronomy/{llm_contract/transport_error.rb → agent/handoff_error.rb} +1 -1
  152. data/lib/phronomy/agent/journal/journal_projection.rb +1 -1
  153. data/lib/phronomy/agent/knowledge_item.rb +13 -0
  154. data/lib/phronomy/agent/lifecycle/agent_root.rb +1 -1
  155. data/lib/phronomy/agent/lifecycle/lifetime_api.rb +76 -0
  156. data/lib/phronomy/agent/lifecycle/operation_lease.rb +33 -0
  157. data/lib/phronomy/agent/lifecycle/operation_result.rb +53 -0
  158. data/lib/phronomy/agent/lifecycle/ownership_registry.rb +117 -31
  159. data/lib/phronomy/agent/lifecycle/scope.rb +198 -0
  160. data/lib/phronomy/agent/lifecycle/scope_cleanup_error.rb +19 -0
  161. data/lib/phronomy/agent/lifecycle/unload_transition.rb +78 -0
  162. data/lib/phronomy/agent/persistence/agent_repository.rb +29 -21
  163. data/lib/phronomy/agent/persistence/cancellation_repository.rb +51 -0
  164. data/lib/phronomy/agent/persistence/codec.rb +1 -21
  165. data/lib/phronomy/agent/persistence/execution_repository.rb +57 -41
  166. data/lib/phronomy/agent/persistence/journal_repository.rb +27 -18
  167. data/lib/phronomy/agent/persistence/records.rb +33 -0
  168. data/lib/phronomy/agent/persistence/retention_repository.rb +70 -0
  169. data/lib/phronomy/agent/persistence/storage_schema.rb +7 -2
  170. data/lib/phronomy/agent/persistence/watermark.rb +13 -11
  171. data/lib/phronomy/agent/recovery/invocation_restorer.rb +13 -21
  172. data/lib/phronomy/agent/recovery/recovery_coordinator/continuation.rb +13 -12
  173. data/lib/phronomy/agent/recovery/recovery_coordinator/installation.rb +34 -34
  174. data/lib/phronomy/agent/recovery/recovery_coordinator/resolution.rb +33 -39
  175. data/lib/phronomy/agent/recovery/recovery_coordinator.rb +28 -25
  176. data/lib/phronomy/agent/recovery/recovery_rules.rb +119 -0
  177. data/lib/phronomy/agent/recovery/recovery_support.rb +10 -19
  178. data/lib/phronomy/agent/reserved_execution.rb +16 -0
  179. data/lib/phronomy/agent/retention.rb +17 -0
  180. data/lib/phronomy/agent/runtime_binding/engine_environment.rb +60 -0
  181. data/lib/phronomy/agent/runtime_binding/engine_session_builder.rb +34 -0
  182. data/lib/phronomy/agent/runtime_binding/phase_machine_builder.rb +64 -0
  183. data/lib/phronomy/agent/runtime_binding/tool_session_builder.rb +34 -0
  184. data/lib/phronomy/agent/{context_assembly/ruby_llm_materializer.rb → runtime_input.rb} +18 -35
  185. data/lib/phronomy/agent/{context_assembly/saved_context_reader.rb → saved_context_reader.rb} +6 -4
  186. data/lib/phronomy/agent/settings.rb +47 -0
  187. data/lib/phronomy/agent/{context_assembly/state_writer.rb → state_writer.rb} +4 -3
  188. data/lib/phronomy/agent/store.rb +253 -0
  189. data/lib/phronomy/agent/{lifecycle_contract/stream_callback_error.rb → stream_callback_error.rb} +3 -3
  190. data/lib/phronomy/agent/tool_execution/tool_binding.rb +4 -64
  191. data/lib/phronomy/agent/tool_execution/tool_invocation.rb +50 -219
  192. data/lib/phronomy/agent/tool_execution/tool_invocation_actions.rb +107 -0
  193. data/lib/phronomy/agent/tool_execution/tool_invocation_transitions.rb +70 -0
  194. data/lib/phronomy/common/error.rb +65 -1
  195. data/lib/phronomy/configuration/runtime_settings.rb +49 -0
  196. data/lib/phronomy/content_store/base.rb +7 -2
  197. data/lib/phronomy/content_store/storage_schema.rb +1 -0
  198. data/lib/phronomy/content_store/stored_contents.rb +2 -1
  199. data/lib/phronomy/context/assembly.rb +195 -0
  200. data/lib/phronomy/{llm_contract/context_budget_exceeded_error.rb → context/budget_exceeded_error.rb} +3 -1
  201. data/lib/phronomy/context/candidate.rb +51 -0
  202. data/lib/phronomy/context/constraint.rb +47 -0
  203. data/lib/phronomy/{agent/context_contract → context}/context_plan.rb +1 -1
  204. data/lib/phronomy/{agent/context_contract → context}/context_plan_validator.rb +3 -3
  205. data/lib/phronomy/{agent/context_contract → context}/context_policy.rb +1 -1
  206. data/lib/phronomy/{agent/context_contract → context}/context_policy_input.rb +1 -1
  207. data/lib/phronomy/{agent/context_assembly → context}/context_policy_input_builder.rb +1 -1
  208. data/lib/phronomy/context/default_policy.rb +140 -0
  209. data/lib/phronomy/context/final_budget_validator.rb +33 -0
  210. data/lib/phronomy/{agent/context_contract → context}/llm_input_build_context.rb +1 -1
  211. data/lib/phronomy/{agent/context_contract → context}/llm_input_manifest.rb +19 -19
  212. data/lib/phronomy/{agent/context_contract → context}/llm_input_patch.rb +1 -1
  213. data/lib/phronomy/context/manifest_error.rb +10 -0
  214. data/lib/phronomy/context/prompt_template.rb +98 -0
  215. data/lib/phronomy/{vector_store → documents}/loader/base.rb +1 -1
  216. data/lib/phronomy/{vector_store → documents}/loader/csv_loader.rb +2 -2
  217. data/lib/phronomy/{vector_store → documents}/loader/markdown_loader.rb +3 -3
  218. data/lib/phronomy/{vector_store → documents}/loader/plain_text_loader.rb +2 -2
  219. data/lib/phronomy/{vector_store → documents}/splitter/base.rb +1 -1
  220. data/lib/phronomy/{vector_store → documents}/splitter/fixed_size_splitter.rb +2 -2
  221. data/lib/phronomy/{vector_store → documents}/splitter/recursive_splitter.rb +2 -2
  222. data/lib/phronomy/embeddings/async/async_client.rb +44 -0
  223. data/lib/phronomy/embeddings/authentication_error.rb +11 -0
  224. data/lib/phronomy/embeddings/backends/ruby_llm_embeddings.rb +52 -0
  225. data/lib/phronomy/embeddings/base.rb +43 -0
  226. data/lib/phronomy/embeddings/invalid_result_error.rb +11 -0
  227. data/lib/phronomy/embeddings/rate_limit_error.rb +11 -0
  228. data/lib/phronomy/embeddings/transport_error.rb +11 -0
  229. data/lib/phronomy/engine/concurrency/offload_pool.rb +36 -21
  230. data/lib/phronomy/engine/concurrency/pool_registry.rb +47 -12
  231. data/lib/phronomy/engine/diagnostics.rb +1 -1
  232. data/lib/phronomy/engine/event_loop.rb +7 -7
  233. data/lib/phronomy/engine/execution_binding.rb +23 -0
  234. data/lib/phronomy/engine/execution_receiver_binding.rb +43 -0
  235. data/lib/phronomy/engine/fsm_protocol.rb +1 -6
  236. data/lib/phronomy/engine/fsm_session.rb +3 -3
  237. data/lib/phronomy/engine/metrics.rb +16 -14
  238. data/lib/phronomy/engine/runtime/timer_queue.rb +1 -1
  239. data/lib/phronomy/engine/runtime.rb +25 -12
  240. data/lib/phronomy/engine/terminal_decision.rb +7 -0
  241. data/lib/phronomy/execution/async_operation.rb +41 -0
  242. data/lib/phronomy/{engine → execution}/blocking.rb +2 -2
  243. data/lib/phronomy/{engine → execution}/concurrency/cancellation_token.rb +1 -1
  244. data/lib/phronomy/{engine → execution}/concurrency/deadline.rb +0 -17
  245. data/lib/phronomy/{engine → execution}/concurrency/physical_completion_task.rb +1 -1
  246. data/lib/phronomy/{engine → execution}/concurrency/result_collector.rb +1 -1
  247. data/lib/phronomy/{engine → execution}/concurrency/result_composition.rb +33 -12
  248. data/lib/phronomy/{engine/concurrency/subscriptions.rb → execution/concurrency/result_subscriptions.rb} +14 -18
  249. data/lib/phronomy/execution/concurrency/subscriptions.rb +25 -0
  250. data/lib/phronomy/{engine → execution}/execution.rb +61 -27
  251. data/lib/phronomy/{engine → execution}/execution_cancellation_error.rb +2 -2
  252. data/lib/phronomy/execution/execution_receiver.rb +78 -0
  253. data/lib/phronomy/execution/execution_scope_state.rb +35 -0
  254. data/lib/phronomy/{engine → execution}/execution_timeout_error.rb +2 -2
  255. data/lib/phronomy/{engine → execution}/invocation_context.rb +0 -15
  256. data/lib/phronomy/execution/invocation_controls.rb +73 -0
  257. data/lib/phronomy/execution/runnable.rb +24 -0
  258. data/lib/phronomy/{engine → execution}/task_result.rb +9 -4
  259. data/lib/phronomy/execution/wait_policy.rb +24 -0
  260. data/lib/phronomy/filter/{contract/filter_block_error.rb → filter_block_error.rb} +3 -3
  261. data/lib/phronomy/generation/generator_verifier/agent_operation.rb +65 -0
  262. data/lib/phronomy/generation/generator_verifier/default_parser.rb +27 -0
  263. data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +2 -2
  264. data/lib/phronomy/generation/generator_verifier.rb +7 -7
  265. data/lib/phronomy/generation/low_confidence_error.rb +2 -2
  266. data/lib/phronomy/integrations/ordered_event_delivery.rb +208 -0
  267. data/lib/phronomy/llm_adapter/async/async_client.rb +47 -0
  268. data/lib/phronomy/{llm_contract → llm_adapter}/authentication_error.rb +3 -1
  269. data/lib/phronomy/llm_adapter/backends/ruby_llm.rb +183 -0
  270. data/lib/phronomy/llm_adapter/base.rb +49 -68
  271. data/lib/phronomy/{llm_contract → llm_adapter}/context_length_error.rb +3 -1
  272. data/lib/phronomy/llm_adapter/invalid_result_error.rb +10 -0
  273. data/lib/phronomy/llm_adapter/message.rb +62 -0
  274. data/lib/phronomy/{llm_contract → llm_adapter}/rate_limit_error.rb +3 -1
  275. data/lib/phronomy/llm_adapter/request.rb +79 -0
  276. data/lib/phronomy/llm_adapter/response.rb +36 -0
  277. data/lib/phronomy/llm_adapter/stream_chunk.rb +18 -0
  278. data/lib/phronomy/llm_adapter/token_usage.rb +64 -0
  279. data/lib/phronomy/llm_adapter/transport_error.rb +9 -0
  280. data/lib/phronomy/llm_adapter.rb +3 -16
  281. data/lib/phronomy/multi_agent/admission_registry.rb +1 -8
  282. data/lib/phronomy/multi_agent/durable_subagent_coordinator.rb +108 -84
  283. data/lib/phronomy/multi_agent/execution_environment.rb +29 -0
  284. data/lib/phronomy/{agent/handoff → multi_agent}/handoff.rb +2 -2
  285. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_capability_factory.rb +21 -2
  286. data/lib/phronomy/multi_agent/handoff_participant.rb +79 -0
  287. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_policy.rb +1 -1
  288. data/lib/phronomy/multi_agent/handoff_runner.rb +77 -100
  289. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_state.rb +1 -1
  290. data/lib/phronomy/multi_agent/orchestrator.rb +61 -75
  291. data/lib/phronomy/multi_agent/persistence/codec.rb +20 -0
  292. data/lib/phronomy/multi_agent/persistence/handoff_state_repository.rb +77 -0
  293. data/lib/phronomy/multi_agent/persistence/records.rb +27 -0
  294. data/lib/phronomy/multi_agent/persistence/storage_schema.rb +21 -0
  295. data/lib/phronomy/multi_agent/persistence/team_execution_repository.rb +60 -44
  296. data/lib/phronomy/multi_agent/persistence/team_repository.rb +29 -21
  297. data/lib/phronomy/multi_agent/reserved_child_admission.rb +88 -0
  298. data/lib/phronomy/multi_agent/runtime_binding/engine_environment.rb +35 -0
  299. data/lib/phronomy/multi_agent/shared_state.rb +2 -2
  300. data/lib/phronomy/multi_agent/store.rb +156 -0
  301. data/lib/phronomy/multi_agent/team_busy_error.rb +18 -0
  302. data/lib/phronomy/multi_agent/team_coordinator.rb +99 -77
  303. data/lib/phronomy/multi_agent/team_not_found_error.rb +18 -0
  304. data/lib/phronomy/multi_agent/team_ownership_registry.rb +2 -12
  305. data/lib/phronomy/output_parser/parse_error.rb +7 -0
  306. data/lib/phronomy/persistence/content_repository.rb +26 -0
  307. data/lib/phronomy/persistence/errors.rb +16 -0
  308. data/lib/phronomy/persistence/migration/initial_format_migration.rb +2 -2
  309. data/lib/phronomy/persistence/persistence.rb +23 -0
  310. data/lib/phronomy/persistence/save_outcome.rb +24 -0
  311. data/lib/phronomy/persistence/snapshot_comparison.rb +81 -0
  312. data/lib/phronomy/persistence/storage_boundary.rb +32 -0
  313. data/lib/phronomy/persistence/transaction.rb +86 -0
  314. data/lib/phronomy/persistence_composition/storage_schema.rb +9 -4
  315. data/lib/phronomy/persistence_composition/stores.rb +34 -0
  316. data/lib/phronomy/persistence_composition/unit4_migration.rb +276 -0
  317. data/lib/phronomy/runtime_composition/agent_defaults.rb +5 -1
  318. data/lib/phronomy/runtime_composition/configuration.rb +146 -0
  319. data/lib/phronomy/runtime_composition/evaluation_defaults.rb +7 -0
  320. data/lib/phronomy/runtime_composition/execution_defaults.rb +5 -0
  321. data/lib/phronomy/runtime_composition/generation_defaults.rb +6 -0
  322. data/lib/phronomy/runtime_composition/global_configuration.rb +38 -0
  323. data/lib/phronomy/runtime_composition/multi_agent_defaults.rb +9 -0
  324. data/lib/phronomy/runtime_composition/workflow_defaults.rb +4 -0
  325. data/lib/phronomy/storage/async/async_client.rb +60 -0
  326. data/lib/phronomy/storage/backend.rb +8 -2
  327. data/lib/phronomy/storage/condition_failed_error.rb +2 -2
  328. data/lib/phronomy/storage/unique_constraint_error.rb +2 -2
  329. data/lib/phronomy/testing/eval/metrics.rb +1 -1
  330. data/lib/phronomy/testing/eval/scorer/llm_judge.rb +19 -3
  331. data/lib/phronomy/testing/persistence_contract/a_content_store.rb +2 -2
  332. data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +6 -6
  333. data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +55 -52
  334. data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +3 -3
  335. data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +7 -7
  336. data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +11 -11
  337. data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +57 -51
  338. data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +1 -1
  339. data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +23 -22
  340. data/lib/phronomy/tool/authorization.rb +77 -0
  341. data/lib/phronomy/tool/base.rb +551 -9
  342. data/lib/phronomy/tool/call_request.rb +40 -0
  343. data/lib/phronomy/{agent/tool_execution/tool_definition_set.rb → tool/definition_set.rb} +7 -8
  344. data/lib/phronomy/tool/operation.rb +88 -0
  345. data/lib/phronomy/tool/schema.rb +214 -0
  346. data/lib/phronomy/tool/settings.rb +31 -0
  347. data/lib/phronomy/tool/tool_error.rb +7 -0
  348. data/lib/phronomy/tool/tool_executor.rb +58 -0
  349. data/lib/phronomy/tools/agent.rb +22 -90
  350. data/lib/phronomy/tools/mcp.rb +21 -14
  351. data/lib/phronomy/tools/vector_search.rb +4 -4
  352. data/lib/phronomy/tracing/automatic.rb +11 -6
  353. data/lib/phronomy/tracing/base.rb +36 -7
  354. data/lib/phronomy/tracing/observation.rb +37 -0
  355. data/lib/phronomy/tracing/open_telemetry_tracer.rb +4 -29
  356. data/lib/phronomy/tracing/settings.rb +36 -0
  357. data/lib/phronomy/vector_store/{async_backend.rb → async/async_client.rb} +35 -29
  358. data/lib/phronomy/vector_store/{in_memory.rb → backends/in_memory.rb} +12 -10
  359. data/lib/phronomy/vector_store/{pgvector.rb → backends/pgvector.rb} +44 -16
  360. data/lib/phronomy/vector_store/{redis_search.rb → backends/redis_search.rb} +74 -37
  361. data/lib/phronomy/vector_store/base.rb +118 -49
  362. data/lib/phronomy/vector_store/invalid_result_error.rb +12 -0
  363. data/lib/phronomy/vector_store.rb +2 -17
  364. data/lib/phronomy/version.rb +1 -1
  365. data/lib/phronomy/workflow/completion.rb +11 -0
  366. data/lib/phronomy/workflow/execution/workflow.rb +37 -9
  367. data/lib/phronomy/workflow/execution/workflow_action_rules.rb +67 -0
  368. data/lib/phronomy/workflow/execution/workflow_context.rb +2 -2
  369. data/lib/phronomy/workflow/execution/workflow_execution_environment.rb +28 -0
  370. data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +77 -8
  371. data/lib/phronomy/workflow/execution/workflow_runner.rb +105 -92
  372. data/lib/phronomy/workflow/execution/workflow_settings.rb +28 -0
  373. data/lib/phronomy/workflow/execution/workflow_task_execution.rb +153 -0
  374. data/lib/phronomy/workflow/execution/workflow_task_reception.rb +72 -0
  375. data/lib/phronomy/workflow/execution/workflow_task_resume_error.rb +14 -0
  376. data/lib/phronomy/workflow/persistence/state_repository.rb +28 -22
  377. data/lib/phronomy/workflow/persistence/storage_schema.rb +13 -0
  378. data/lib/phronomy/workflow/runtime_binding/workflow_engine_environment.rb +61 -0
  379. data/lib/phronomy/workflow/runtime_binding/workflow_phase_machine_builder.rb +158 -0
  380. data/lib/phronomy/workflow/runtime_binding/workflow_task_session.rb +76 -0
  381. data/lib/phronomy/workflow/{execution → runtime_binding}/workflow_terminal_policy.rb +4 -4
  382. data/lib/phronomy.rb +63 -16
  383. data/scripts/api_snapshot.rb +47 -15
  384. data/scripts/check_readme_ruby.rb +24 -29
  385. data/scripts/check_readme_runnable.rb +92 -81
  386. data/sig/_private/phronomy/agent/settings.rbs +19 -0
  387. data/sig/_private/phronomy/configuration/runtime_settings.rbs +20 -0
  388. data/sig/_private/phronomy/llm_adapter/async/async_client.rbs +10 -0
  389. data/sig/_private/phronomy/multi_agent/store.rbs +8 -0
  390. data/sig/_private/phronomy/persistence/storage_boundary.rbs +7 -0
  391. data/sig/_private/phronomy/tool/settings.rbs +13 -0
  392. data/sig/_private/phronomy/tracing/settings.rbs +15 -0
  393. data/sig/_private/phronomy/workflow/execution/workflow_settings.rbs +13 -0
  394. data/sig/phronomy/agent/admission.rbs +19 -0
  395. data/sig/phronomy/agent/agent_not_found_error.rbs +6 -0
  396. data/sig/phronomy/agent/agent_unloaded_error.rbs +6 -0
  397. data/sig/phronomy/agent/execution_contract.rbs +132 -0
  398. data/sig/phronomy/agent/execution_environment.rbs +20 -0
  399. data/sig/phronomy/agent/store.rbs +73 -0
  400. data/sig/phronomy/agent/stream_callback_error.rbs +8 -0
  401. data/sig/phronomy/agent.rbs +29 -135
  402. data/sig/phronomy/common.rbs +7 -0
  403. data/sig/phronomy/content_store/contracts.rbs +13 -0
  404. data/sig/phronomy/context.rbs +152 -0
  405. data/sig/phronomy/embeddings/async/async_client.rbs +9 -0
  406. data/sig/phronomy/embeddings/base.rbs +23 -0
  407. data/sig/phronomy/engine/concurrency/timer_bindings.rbs +22 -0
  408. data/sig/phronomy/engine/control_bindings.rbs +11 -0
  409. data/sig/phronomy/engine/control_protocols.rbs +23 -0
  410. data/sig/phronomy/engine/execution_binding.rbs +6 -0
  411. data/sig/phronomy/engine/execution_receiver.rbs +15 -0
  412. data/sig/phronomy/engine/observability.rbs +13 -0
  413. data/sig/phronomy/execution/async_operation.rbs +7 -0
  414. data/sig/phronomy/execution/blocking.rbs +5 -0
  415. data/sig/phronomy/execution/concurrency/cancellation_token.rbs +13 -0
  416. data/sig/phronomy/execution/concurrency/deadline.rbs +10 -0
  417. data/sig/phronomy/execution/concurrency/result_composition.rbs +7 -0
  418. data/sig/phronomy/execution/control_protocols.rbs +18 -0
  419. data/sig/phronomy/execution/errors.rbs +7 -0
  420. data/sig/phronomy/execution/execution.rbs +41 -0
  421. data/sig/phronomy/execution/execution_receiver.rbs +40 -0
  422. data/sig/phronomy/execution/execution_scope_state.rbs +9 -0
  423. data/sig/phronomy/execution/invocation_context.rbs +18 -0
  424. data/sig/phronomy/execution/invocation_controls.rbs +13 -0
  425. data/sig/phronomy/execution/task_result.rbs +29 -0
  426. data/sig/phronomy/extensions.rbs +1 -21
  427. data/sig/phronomy/filter/filter_block_error.rbs +6 -0
  428. data/sig/phronomy/generation/low_confidence_error.rbs +6 -0
  429. data/sig/phronomy/handoff.rbs +10 -4
  430. data/sig/phronomy/integrations.rbs +14 -0
  431. data/sig/phronomy/llm_adapter/backends/ruby_llm.rbs +6 -0
  432. data/sig/phronomy/llm_adapter/base.rbs +14 -0
  433. data/sig/phronomy/llm_adapter/usage.rbs +14 -0
  434. data/sig/phronomy/llm_adapter/values.rbs +43 -0
  435. data/sig/phronomy/llm_context_window.rbs +10 -0
  436. data/sig/phronomy/multi_agent/reserved_child_admission.rbs +8 -0
  437. data/sig/phronomy/multi_agent/store.rbs +54 -0
  438. data/sig/phronomy/multi_agent/team_busy_error.rbs +8 -0
  439. data/sig/phronomy/multi_agent/team_not_found_error.rbs +8 -0
  440. data/sig/phronomy/multi_agent.rbs +6 -3
  441. data/sig/phronomy/persistence/errors.rbs +18 -0
  442. data/sig/phronomy/persistence/migration.rbs +13 -0
  443. data/sig/phronomy/persistence/transaction.rbs +19 -0
  444. data/sig/phronomy/persistence.rbs +1 -99
  445. data/sig/phronomy/persistence_composition.rbs +19 -0
  446. data/sig/phronomy/runtime_composition/configuration.rbs +36 -0
  447. data/sig/phronomy/storage/async/async_client.rbs +8 -0
  448. data/sig/phronomy/storage/backends/in_memory.rbs +9 -0
  449. data/sig/phronomy/{storage.rbs → storage/contracts.rbs} +4 -18
  450. data/sig/phronomy/tool.rbs +48 -4
  451. data/sig/phronomy/tracing/observation.rbs +7 -0
  452. data/sig/phronomy/vector_store/async/async_client.rbs +13 -0
  453. data/sig/phronomy/vector_store/base.rbs +23 -0
  454. data/sig/phronomy/workflow/execution/workflow_execution_environment.rbs +15 -0
  455. data/sig/phronomy/workflow/runtime_binding/workflow_terminal_policy.rbs +7 -0
  456. data/sig/phronomy/workflow/store.rbs +8 -0
  457. data/sig/phronomy/workflow.rbs +5 -1
  458. data/sig/phronomy.rbs +4 -49
  459. metadata +365 -117
  460. data/lib/phronomy/agent/concerns/before_llm_input.rb +0 -66
  461. data/lib/phronomy/agent/concerns/error_translation.rb +0 -45
  462. data/lib/phronomy/agent/concerns/filterable.rb +0 -184
  463. data/lib/phronomy/agent/context/capability/base.rb +0 -548
  464. data/lib/phronomy/agent/context/capability/tool_executor.rb +0 -62
  465. data/lib/phronomy/agent/context/instruction/prompt_template.rb +0 -102
  466. data/lib/phronomy/agent/context_assembly/runtime_chat_builder.rb +0 -36
  467. data/lib/phronomy/agent/context_assembly/token_budget_resolver.rb +0 -22
  468. data/lib/phronomy/agent/context_parts/validators/final_budget_validator.rb +0 -37
  469. data/lib/phronomy/agent/context_policies/default.rb +0 -142
  470. data/lib/phronomy/agent/execution/phase_machine_builder.rb +0 -101
  471. data/lib/phronomy/agent/execution/provider_call_outcome.rb +0 -106
  472. data/lib/phronomy/agent/handoff/handoff_execution_coordinator.rb +0 -15
  473. data/lib/phronomy/agent/handoff/handoff_outcome_committer.rb +0 -131
  474. data/lib/phronomy/agent/handoff/handoff_request.rb +0 -45
  475. data/lib/phronomy/agent/lifecycle_contract/handoff_error.rb +0 -7
  476. data/lib/phronomy/agent/persistence/handoff_state_repository.rb +0 -58
  477. data/lib/phronomy/agent/persistence/queries.rb +0 -61
  478. data/lib/phronomy/agent/selection/candidate.rb +0 -53
  479. data/lib/phronomy/agent/selection/constraint.rb +0 -49
  480. data/lib/phronomy/agent/tool_execution/tool_call_intercepted.rb +0 -29
  481. data/lib/phronomy/agent/tool_execution/tool_invocation_session_builder.rb +0 -276
  482. data/lib/phronomy/configuration/configuration.rb +0 -68
  483. data/lib/phronomy/configuration/global_configuration.rb +0 -26
  484. data/lib/phronomy/engine/concurrency/cancellation_scope.rb +0 -124
  485. data/lib/phronomy/engine/concurrency/operation_binding.rb +0 -43
  486. data/lib/phronomy/engine/execution_receiver.rb +0 -65
  487. data/lib/phronomy/engine/runnable.rb +0 -54
  488. data/lib/phronomy/llm_adapter/ruby_llm.rb +0 -47
  489. data/lib/phronomy/llm_contract/token_usage.rb +0 -85
  490. data/lib/phronomy/multi_agent/persistence/queries.rb +0 -30
  491. data/lib/phronomy/multi_agent/storage_contract/team_storage_schema.rb +0 -15
  492. data/lib/phronomy/output_parser/contract/parse_error.rb +0 -7
  493. data/lib/phronomy/persistence/api/persistence.rb +0 -140
  494. data/lib/phronomy/persistence_composition/repositories.rb +0 -77
  495. data/lib/phronomy/recovery/recovery.rb +0 -186
  496. data/lib/phronomy/tool/contract/tool_error.rb +0 -7
  497. data/lib/phronomy/vector_store/embeddings/base.rb +0 -44
  498. data/lib/phronomy/vector_store/embeddings/ruby_llm_embeddings.rb +0 -47
  499. data/lib/phronomy/workflow/phase_machine_builder.rb +0 -205
  500. data/lib/phronomy/workflow/storage_contract/workflow_storage_schema.rb +0 -9
  501. data/sig/phronomy/execution_receiver.rbs +0 -34
  502. data/sig/phronomy/llm_adapter.rbs +0 -11
  503. data/sig/phronomy/runtime.rbs +0 -76
  504. /data/lib/phronomy/agent/{context_assembly/context_importer.rb → context_importer.rb} +0 -0
  505. /data/lib/phronomy/{engine → execution}/backpressure_error.rb +0 -0
  506. /data/lib/phronomy/{engine → execution}/cancellation_error.rb +0 -0
  507. /data/lib/phronomy/{engine → execution}/concurrency/worker_input_restricted.rb +0 -0
  508. /data/lib/phronomy/{engine → execution}/event_loop_reentrancy_error.rb +0 -0
  509. /data/lib/phronomy/{engine → execution}/invalid_async_entry_action_error.rb +0 -0
  510. /data/lib/phronomy/{engine → execution}/invalid_async_transition_action_error.rb +0 -0
  511. /data/lib/phronomy/{engine → execution}/invalid_async_workflow_action_error.rb +0 -0
  512. /data/lib/phronomy/{engine → execution}/pool_shutdown_error.rb +0 -0
  513. /data/lib/phronomy/{engine → execution}/recursion_limit_error.rb +0 -0
  514. /data/lib/phronomy/{engine → execution}/runtime_shutdown_error.rb +0 -0
  515. /data/lib/phronomy/{engine → execution}/runtime_shutdown_reentrancy_error.rb +0 -0
  516. /data/lib/phronomy/{engine → execution}/scheduler_reentrancy_error.rb +0 -0
  517. /data/lib/phronomy/{engine → execution}/timeout_error.rb +0 -0
@@ -19,6 +19,9 @@ module Phronomy
19
19
  end
20
20
 
21
21
  class Orchestrator < ::Phronomy::Agent::Base
22
+ attr_reader coordination_store: Store?
23
+ def self.create: (?coordination_store: Store?, **Object options) ?{ (Object) -> void } -> instance
24
+ def self.load: (String agent_id, persistence: Agent::Store, coordination_store: Store, **Object options) ?{ (Object) -> void } -> instance
22
25
  def self.subagent: (Symbol | String name, singleton(::Phronomy::Agent::Base) agent_class, ?on_error: Symbol, ?inherit_knowledge: bool) -> untyped
23
26
  def self.registered_subagents: () -> Hash[Symbol | String, untyped]
24
27
  def resume: (String execution_id, ?config: Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
@@ -28,7 +31,7 @@ module Phronomy
28
31
 
29
32
  class TeamCoordinator
30
33
  attr_reader team_id: String
31
- attr_reader persistence: ::Phronomy::Persistence
34
+ attr_reader persistence: Store
32
35
  def self.team_definition: (?id: String?, ?version: Integer?) -> Hash[Symbol, String | Integer]
33
36
  def self.coordinator_model: (?String? value) -> String?
34
37
  def self.coordinator_instructions: (?String? value) -> String?
@@ -36,9 +39,9 @@ module Phronomy
36
39
  def self.pool: (size: Integer, agent: singleton(::Phronomy::Agent::Base), ?on_error: Symbol) -> untyped
37
40
  def self.schedule: () { (Array[untyped]) -> untyped } -> untyped
38
41
  def self.aggregate: () { (Array[Hash[Symbol, untyped]]) -> untyped } -> untyped
39
- def self.new: (?team_id: String, ?persistence: ::Phronomy::Persistence?, ?metadata: Hash[String, untyped], ?on_event: ^(untyped) -> untyped) -> instance
42
+ def self.new: (?team_id: String, ?persistence: Store?, ?metadata: Hash[String, untyped], ?on_event: ^(untyped) -> untyped) -> instance
40
43
  def self.create: (**untyped options) -> instance
41
- def self.load: (String team_id, persistence: ::Phronomy::Persistence, ?on_event: ^(untyped) -> untyped) -> instance
44
+ def self.load: (String team_id, persistence: Store, ?on_event: ^(untyped) -> untyped) -> instance
42
45
  def self.get: (String team_id) -> instance?
43
46
  def invoke: (untyped input, ?config: Hash[Symbol, untyped]) -> untyped
44
47
  def stream: (untyped input, ?config: Hash[Symbol, untyped]) ?{ (Hash[Symbol, untyped]) -> untyped } -> untyped
@@ -0,0 +1,18 @@
1
+ module Phronomy
2
+ class Persistence
3
+ class TransactionError < Error
4
+ end
5
+ class Error < Phronomy::Error
6
+ end
7
+ class ConflictError < Error
8
+ end
9
+ class StateConflictError < ConflictError
10
+ end
11
+ class NotFoundError < Error
12
+ end
13
+ class SerializationError < Error
14
+ end
15
+ class UnsupportedBackendError < Error
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Phronomy
2
+ class Persistence
3
+ module Migration
4
+ module InitialFormatMigration
5
+ def self.agent_root: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
6
+ def self.agent_execution: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
7
+ def self.journal_record: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
8
+ def self.workflow_state: (workflow_instance_id: String, revision: Integer, snapshot: Hash[untyped, untyped]) -> Storage::DurableRecord
9
+ def self.llm_input_manifest: (Hash[untyped, untyped] hash) -> Hash[String, untyped]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module Phronomy
2
+ class Persistence
3
+ interface _Participant[T]
4
+ def new: (Storage::View view) -> T
5
+ end
6
+
7
+ class Transaction
8
+ def initialize: (Persistence persistence, Storage::View view, ?parent: Transaction?) -> void
9
+ def participate: [T, R] (persistence: Persistence, adapter: _Participant[T]) { (T) -> R } -> R
10
+ def outermost?: () -> bool
11
+ def committed?: () -> bool
12
+ def validate!: () -> bool
13
+ def close!: () -> bool
14
+ def confirm!: () -> bool
15
+ end
16
+
17
+ def atomic: [R] () { (Transaction) -> R } -> R
18
+ end
19
+ end
@@ -1,105 +1,7 @@
1
1
  module Phronomy
2
- # Runtime/domain-facing repository interfaces.
3
- interface _AgentRepository
4
- def create: (untyped root) -> untyped
5
- def load: (String agent_id) -> untyped
6
- def save: (String agent_id, expected_revision: Integer, root: untyped) -> untyped
7
- def delete: (String agent_id) -> untyped
8
- end
9
-
10
- interface _JournalRepository
11
- def append: (String agent_id, expected_position: Integer, records: Array[untyped]) -> Array[untyped]
12
- def read: (String agent_id, ?after: Integer?, ?limit: Integer?) -> Array[untyped]
13
- def head: (String agent_id) -> Integer
14
- def delete: (String agent_id) -> untyped
15
- end
16
-
17
- interface _ExecutionRepository
18
- def create_active: (untyped execution) -> untyped
19
- def load: (String execution_id) -> untyped
20
- def save: (String execution_id, expected_revision: Integer, execution: untyped) -> untyped
21
- def list_active: (String agent_id) -> Array[untyped]
22
- def list: (String agent_id, ?after: String?, ?limit: Integer) -> Array[untyped]
23
- def delete: (String execution_id) -> untyped
24
- def delete_for_agent: (String agent_id) -> untyped
25
- def assert_idle!: (String agent_id) -> untyped
26
- end
27
-
28
- interface _WorkflowStateRepository
29
- def load: (String workflow_instance_id) -> Hash[untyped, untyped]?
30
- def save: (String workflow_instance_id, expected_revision: Integer?, snapshot: Hash[untyped, untyped]) -> Integer
31
- def delete: (String workflow_instance_id, expected_revision: Integer) -> untyped
32
- end
33
-
34
- # Backend-side record repository interfaces. DurableRecord is the opaque data
35
- # carrier. Identity/revision/index metadata is passed separately so backends do
36
- # not need to interpret DurableRecord#payload.
37
- interface _HandoffStateRepository
38
- def load: (String main_agent_id) -> untyped
39
- def save: (String main_agent_id, expected_revision: Integer?, state: untyped) -> untyped
40
- def delete: (String main_agent_id, expected_revision: Integer) -> untyped
41
- end
42
-
43
- interface _TeamRepository
44
- def create: (untyped root) -> untyped
45
- def load: (String team_id) -> untyped
46
- def save: (String team_id, expected_revision: Integer, root: untyped) -> untyped
47
- def delete: (String team_id) -> untyped
48
- end
49
-
50
- interface _TeamExecutionRepository
51
- def create_active: (untyped execution) -> untyped
52
- def load: (String team_execution_id) -> untyped
53
- def save: (String team_execution_id, expected_revision: Integer, execution: untyped) -> untyped
54
- def list_active: (String team_id) -> Array[untyped]
55
- def list: (String team_id, ?after: String?, ?limit: Integer) -> Array[untyped]
56
- def delete: (String team_execution_id) -> untyped
57
- def delete_for_team: (String team_id) -> untyped
58
- def assert_idle!: (String team_id) -> untyped
59
- end
60
-
61
- interface _PersistenceTransactionView
62
- def contents: () -> _ContentRepository
63
- def agents: () -> _AgentRepository
64
- def journals: () -> _JournalRepository
65
- def executions: () -> _ExecutionRepository
66
- def workflow_states: () -> _WorkflowStateRepository
67
- def handoff_states: () -> _HandoffStateRepository
68
- def teams: () -> _TeamRepository
69
- def team_executions: () -> _TeamExecutionRepository
70
- def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
71
- end
72
-
73
2
  class Persistence
74
- module Migration
75
- module InitialFormatMigration
76
- def self.agent_root: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
77
- def self.agent_execution: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
78
- def self.journal_record: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
79
- def self.workflow_state: (workflow_instance_id: String, revision: Integer, snapshot: Hash[untyped, untyped]) -> Storage::DurableRecord
80
- def self.llm_input_manifest: (Hash[untyped, untyped] hash) -> Hash[String, untyped]
81
- end
82
- end
83
-
84
- attr_reader contents: _ContentRepository
85
- attr_reader agents: _AgentRepository
86
- attr_reader journals: _JournalRepository
87
- attr_reader executions: _ExecutionRepository
88
- attr_reader workflow_states: _WorkflowStateRepository
89
- attr_reader handoff_states: _HandoffStateRepository
90
- attr_reader teams: _TeamRepository
91
- attr_reader team_executions: _TeamExecutionRepository
92
- def handoff_result: (String execution_id, ?main_agent_id: String?) -> Hash[Symbol, untyped]
93
- def execution_result: (String execution_id) -> Hash[Symbol, untyped]
94
- def list_executions: (String agent_id, ?after: String?, ?limit: Integer) -> Array[untyped]
95
- def team_execution_result: (String team_execution_id) -> Hash[Symbol, untyped]
96
- def list_team_executions: (String team_id, ?after: String?, ?limit: Integer) -> Array[untyped]
97
-
98
3
  attr_reader backend: _StorageBackend
99
4
  def initialize: (backend: _StorageBackend) -> void
100
- def self.in_memory: () -> Persistence
101
- def capabilities: () -> Hash[Symbol, bool]
102
- def transaction: () { (_PersistenceTransactionView) -> untyped } -> untyped
103
- def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
5
+ def bind: [T] (_Participant[T] adapter) -> T
104
6
  end
105
7
  end
@@ -0,0 +1,19 @@
1
+ module Phronomy
2
+ module PersistenceComposition
3
+ class Stores < Data
4
+ attr_reader coordinator: ::Phronomy::Persistence
5
+ attr_reader agent: Agent::Store
6
+ attr_reader multi_agent: MultiAgent::Store
7
+ attr_reader workflow: _WorkflowStateRepository
8
+ def self.new: (coordinator: ::Phronomy::Persistence, agent: Agent::Store, multi_agent: MultiAgent::Store, workflow: _WorkflowStateRepository) -> instance
9
+ end
10
+
11
+ class Unit4Migration
12
+ def self.convert: (Hash[String, json_value] snapshot, quiescent: bool) -> Hash[String, json_value]
13
+ end
14
+
15
+ def self.agent: (?backend: _StorageBackend?) -> Agent::Store
16
+ def self.build: (backend: _StorageBackend) -> Stores
17
+ def self.in_memory: () -> Stores
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ module Phronomy
2
+ class ConfigurationError < Error
3
+ end
4
+
5
+ class HandoffError < Error
6
+ end
7
+
8
+ class CancellationError < Error
9
+ end
10
+
11
+ class EventLoopReentrancyError < Error
12
+ end
13
+
14
+ class AgentAlreadyExistsError < Error
15
+ end
16
+
17
+ class AgentPurgedError < Error
18
+ end
19
+
20
+ class PoolShutdownError < Error
21
+ end
22
+
23
+ class BackpressureError < Error
24
+ end
25
+
26
+ class Configuration
27
+ attr_accessor agent_store: Agent::Store?
28
+ attr_accessor multi_agent_store: MultiAgent::Store?
29
+ attr_accessor workflow_store: _WorkflowStateRepository?
30
+ attr_accessor llm_adapter: LLMAdapter::Base
31
+ attr_accessor before_llm_input: Agent::_BeforeLLMInputHook?
32
+ end
33
+
34
+ def self.configuration: () -> Configuration
35
+ def self.configure: () { (Configuration) -> void } -> void
36
+ end
@@ -0,0 +1,8 @@
1
+ module Phronomy
2
+ module Storage
3
+ class AsyncClient
4
+ def initialize: (backend: _StorageBackend, ?pool: untyped) -> void
5
+ def transaction_async: [T] (?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) { (View) -> T } -> TaskResult[T]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Phronomy
2
+ module Storage
3
+ module Backends
4
+ class InMemory < Backend
5
+ def initialize: (?resources: Array[Resource]) -> void
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,18 +1,8 @@
1
1
  module Phronomy
2
- interface _ContentRepository
3
- def put: (String bytes, canonicalization_version: untyped) -> String
4
- def fetch: (String content_id) -> String
5
- def exist?: (String content_id) -> bool
6
- def put_text: (String text) -> String
7
- def put_json: (untyped value) -> String
8
- def fetch_text: (String content_id) -> String
9
- def fetch_json: (String content_id) -> untyped
10
- def fetch_many: (Array[String] content_ids) -> Hash[String, String]
11
- end
12
-
13
2
  interface _StorageBackend
14
3
  def view: () -> Storage::View
15
4
  def capabilities: () -> Hash[Symbol, bool | Integer]
5
+ def transaction_open?: () -> bool
16
6
  def transaction: [T] () { (Storage::View) -> T } -> T
17
7
  end
18
8
 
@@ -26,11 +16,11 @@ module Phronomy
26
16
  class UniqueConstraintError < ConflictError
27
17
  attr_reader resource: String
28
18
  attr_reader constraint: Symbol
29
- def initialize: (resource: Resource, constraint: Symbol) -> void
19
+ def initialize: (resource: Resource, constraint: Symbol, ?code: String?) -> void
30
20
  end
31
21
  class ConditionFailedError < ConflictError
32
22
  attr_reader condition: condition
33
- def initialize: (condition) -> void
23
+ def initialize: (condition, ?code: String?) -> void
34
24
  end
35
25
  class BlobConflictError < ConflictError
36
26
  end
@@ -163,12 +153,8 @@ module Phronomy
163
153
  def initialize: (resources: Array[Resource]) -> void
164
154
  def self.validate_capabilities!: (_StorageBackend backend) -> void
165
155
  def capabilities: () -> Hash[Symbol, bool | Integer]
156
+ def transaction_open?: () -> bool
166
157
  def transaction: [T] () { (View) -> T } -> T
167
158
  end
168
- module Backends
169
- class InMemory < Backend
170
- def initialize: (?resources: Array[Resource]) -> void
171
- end
172
- end
173
159
  end
174
160
  end
@@ -1,6 +1,25 @@
1
1
  module Phronomy
2
2
  module Tool
3
+ module Operation
4
+ def self.call_async: (tool: Base, args: Hash[untyped, untyped], ?cancellation_token: Concurrency::CancellationToken?, ?config: Hash[untyped, untyped], ?submitter: _ExecutionSubmitter, ?on_full: Symbol) -> _CompletionHandle[untyped]
5
+ def self.with_result_transform: (singleton(Base) tool_class) { (untyped, String, Hash[untyped, untyped]) -> untyped } -> singleton(Base)
6
+ end
7
+ class Schema
8
+ def initialize: (?untyped schema) ?{ () -> untyped } -> void
9
+ def json_schema: () -> Hash[String, untyped]
10
+ def validate: (Hash[String | Symbol, untyped] arguments, ?coerce: bool) -> [Hash[Symbol, untyped]?, String?]
11
+ end
12
+ class CallRequest
13
+ attr_reader id: String
14
+ attr_reader name: String
15
+ attr_reader arguments: Hash[String, json_value]
16
+ attr_reader metadata: Hash[String, json_value]
17
+ def initialize: (id: String, name: String, arguments: Hash[String | Symbol, untyped], ?metadata: Hash[String | Symbol, untyped]) -> void
18
+ def self.from_h: (Hash[String | Symbol, untyped] value) -> CallRequest
19
+ def to_h: () -> Hash[String, untyped]
20
+ end
3
21
  class Base
22
+ def self.parameter: (String | Symbol name, ?type: String | Symbol, ?description: String?, ?required: bool) -> untyped
4
23
  def self.tool_name: (?untyped value) -> String?
5
24
  def self.description: (?String text) -> String?
6
25
  def self.desc: (?String text) -> String?
@@ -23,26 +42,51 @@ module Phronomy
23
42
  def self.redact_params: (*untyped names) -> Array[Symbol]
24
43
  def self.max_result_size: (?untyped value) -> untyped
25
44
 
45
+ def description: () -> String?
26
46
  def name: () -> String
27
47
  def parameters_schema: () -> untyped
28
48
  def parameters: () -> Hash[untyped, untyped]
29
49
  def provider_options: () -> Hash[untyped, untyped]
30
50
  def provider_params: () -> Hash[untyped, untyped]
31
51
  def params_schema: () -> untyped
52
+ def validate_arguments: (Hash[String | Symbol, untyped]? args) -> [Hash[Symbol, untyped]?, String?]
32
53
  def call: (Hash[untyped, untyped] args, ?cancellation_token: Concurrency::CancellationToken?) -> untyped
33
54
  def call_async: (Hash[untyped, untyped] args, ?cancellation_token: Concurrency::CancellationToken?, ?config: Hash[untyped, untyped]) -> TaskResult[untyped]
34
55
  def requires_approval?: () -> untyped
35
56
  def tool_origin: () -> Symbol
36
57
  def approval_metadata: () -> Hash[untyped, untyped]
37
58
  def execute: (**untyped args) -> untyped
59
+
60
+ private
61
+
62
+ def call_async_operation: (Hash[untyped, untyped]? args, cancellation_token: Concurrency::CancellationToken?, operation_name: String) { (Hash[Symbol, untyped]) -> _CompletionHandle[untyped] } -> _CompletionHandle[untyped]
63
+ def async_error_value: (Exception error) -> untyped
38
64
  end
39
65
  end
40
66
 
41
- module Agent
42
- module Context
43
- module Capability
44
- class Base = ::Phronomy::Tool::Base
67
+ end
68
+
69
+ module Phronomy
70
+ module Tool
71
+ interface _AuthorizationRequest
72
+ def origin: () -> Symbol
73
+ def with: (?facts: Hash[untyped, untyped], ?default_decision: Symbol?) -> _AuthorizationRequest
74
+ end
75
+
76
+ module Authorization
77
+ class Decision
78
+ attr_reader decision: Symbol
79
+ attr_reader facts: Hash[untyped, untyped]
80
+ attr_reader reason: String?
45
81
  end
82
+ def self.call: (request: _AuthorizationRequest, arguments: Hash[untyped, untyped], context: Hash[untyped, untyped], ?facts: (^(Hash[untyped, untyped], Hash[untyped, untyped]) -> Hash[untyped, untyped]?)?, ?requirement: bool? | (^(_AuthorizationRequest) -> bool?), ?policy: (^(_AuthorizationRequest) -> Symbol)?) -> Decision
83
+ end
84
+
85
+ class DefinitionSet
86
+ attr_reader runtime_tools: Array[untyped]
87
+ attr_reader definitions: Array[Hash[String, untyped]]
88
+ def self.build: (tools: Array[untyped], ?runtime_tools: Array[untyped]) -> DefinitionSet
89
+ def select_definitions: (Array[Hash[String, untyped]] expected_definitions) -> DefinitionSet
46
90
  end
47
91
  end
48
92
  end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ module Tracing
3
+ module Observation
4
+ def self.trace: [A] (String name, ?input: untyped, **untyped meta) { (untyped span) -> [A, LLMAdapter::TokenUsage?] } -> A
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ module Phronomy
2
+ module VectorStore
3
+ class AsyncClient
4
+ # pool is an optional internal execution-pool injection; ordinary callers omit it.
5
+ def initialize: (backend: Base, ?pool: untyped) -> void
6
+ def add_async: (id: String, embedding: Array[Float], ?metadata: Hash[untyped, untyped], ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
7
+ def search_async: (query_embedding: Array[Float], ?k: Integer, ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[Array[Hash[Symbol, untyped]]]
8
+ def remove_async: (id: String, ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
9
+ def clear_async: (?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ module Phronomy
2
+ module VectorStore
3
+ class InvalidResultError < Phronomy::Error
4
+ end
5
+
6
+ class Base
7
+ def add: (id: String, embedding: Array[Numeric], ?metadata: Hash[untyped, untyped], ?cancellation_token: _CancellationSignal?) -> self
8
+ def search: (query_embedding: Array[Numeric], ?k: Integer | String, ?cancellation_token: _CancellationSignal?) -> Array[Hash[Symbol, untyped]]
9
+ def remove: (id: String) -> self
10
+ def clear: () -> self
11
+ def size: () -> Integer
12
+
13
+ # Protected extension SPI at runtime; RBS has no protected visibility.
14
+ private
15
+ def embedding_dimension: () -> Integer?
16
+ def perform_add: (id: String, embedding: Array[Float], metadata: Hash[untyped, untyped], cancellation_token: _CancellationSignal?) -> untyped
17
+ def perform_search: (query_embedding: Array[Float], k: Integer, cancellation_token: _CancellationSignal?) -> Array[Hash[Symbol, untyped]]
18
+ def perform_remove: (id: String) -> untyped
19
+ def perform_clear: () -> untyped
20
+ def perform_size: () -> Integer
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Phronomy
2
+ # Private connection selected by composition, not a public application API.
3
+ class WorkflowExecutionEnvironment
4
+ def self.install_provider: (^() -> WorkflowExecutionEnvironment provider) -> untyped
5
+ def self.current: () -> WorkflowExecutionEnvironment
6
+ def registry: () -> untyped
7
+ def existing_registry: () -> untyped
8
+ def executing?: () -> bool
9
+ def submit: [V] (**untyped options) { () -> V } -> TaskResult[V]
10
+ def compile_transitions: (**untyped definition) -> untyped
11
+ def build_session: (**untyped options) -> untyped
12
+ def register_session: (untyped session, completion: TaskResult[untyped]) -> untyped
13
+ def subscribe_cancellation: (Concurrency::CancellationToken token) { () -> void } -> untyped
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ class WorkflowTerminalPolicy
3
+ def start: (terminal_type: Symbol, context: untyped, event_sink: _FSMEventSink) -> untyped
4
+ def handles?: (Event event) -> bool
5
+ def decision_for: (Event event) -> TerminalDecision
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module Phronomy
2
+ interface _WorkflowStateRepository
3
+ def load: (String workflow_instance_id) -> Hash[untyped, untyped]?
4
+ def save: (String workflow_instance_id, expected_revision: Integer?, snapshot: Hash[untyped, untyped]) -> Integer
5
+ def delete: (String workflow_instance_id, expected_revision: Integer) -> untyped
6
+ end
7
+
8
+ end
@@ -1,4 +1,7 @@
1
1
  module Phronomy
2
+ class WorkflowTaskResumeError < Error
3
+ def initialize: (?String message, ?code: String?) -> void
4
+ end
2
5
  module WorkflowContext
3
6
  def phase: () -> Symbol
4
7
  def halted?: () -> bool
@@ -8,7 +11,7 @@ module Phronomy
8
11
  end
9
12
 
10
13
  class Workflow
11
- def self.define: (Class context_class, ?persistence: Persistence?) { () -> void } -> Workflow
14
+ def self.define: (Class context_class, ?persistence: _WorkflowStateRepository?) { () -> void } -> Workflow
12
15
 
13
16
  def invoke: (untyped input, ?config: Hash[untyped, untyped], ?invocation_context: untyped) -> untyped
14
17
  def invoke_async: (untyped input, ?config: Hash[untyped, untyped], ?invocation_context: untyped) -> TaskResult[untyped]
@@ -20,6 +23,7 @@ module Phronomy
20
23
  class Builder
21
24
  def initial: (Symbol state_name) -> untyped
22
25
  def state: (Symbol name, ?action: untyped) -> untyped
26
+ def task_state: (Symbol name, start: ^(untyped) -> TaskResult[untyped], apply: ^(untyped, untyped) -> untyped) -> void
23
27
  def entry: (Symbol name, untyped callable) -> untyped
24
28
  def exit: (Symbol name, untyped callable) -> untyped
25
29
  def wait_state: (Symbol name) -> untyped
data/sig/phronomy.rbs CHANGED
@@ -2,61 +2,16 @@ module Phronomy
2
2
  VERSION: String
3
3
 
4
4
  class Error < StandardError
5
+ attr_reader code: String?
6
+ def initialize: (?untyped message, ?code: String?) -> void
7
+ def self.diagnostic: (Exception) -> Hash[String, untyped]
8
+ def self.from_diagnostic: (Hash[untyped, untyped], ?remaining: Integer) -> Error
5
9
  end
6
10
 
7
11
  class ParseError < Error
8
12
  end
9
13
 
10
- class RecursionLimitError < Error
11
- end
12
-
13
14
  class ToolError < Error
14
15
  end
15
16
 
16
- class TimeoutError < Error
17
- end
18
-
19
- class ConfigurationError < Error
20
- end
21
-
22
- class HandoffError < Error
23
- end
24
-
25
- class TransportError < Error
26
- end
27
-
28
- class RateLimitError < TransportError
29
- end
30
-
31
- class AuthenticationError < TransportError
32
- end
33
-
34
- class ContextLengthError < Error
35
- end
36
-
37
- class CancellationError < Error
38
- end
39
-
40
- class EventLoopReentrancyError < Error
41
- end
42
-
43
- class AgentAlreadyExistsError < Error
44
- end
45
-
46
- class AgentPurgedError < Error
47
- end
48
-
49
- class PoolShutdownError < Error
50
- end
51
-
52
- class BackpressureError < Error
53
- end
54
-
55
- class Configuration
56
- attr_accessor llm_adapter: LLMAdapter::Base
57
- attr_accessor before_llm_input: Agent::_BeforeLLMInputHook?
58
- end
59
-
60
- def self.configuration: () -> Configuration
61
- def self.configure: () { (Configuration) -> void } -> void
62
17
  end