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
@@ -0,0 +1,22 @@
1
+ module Phronomy
2
+ interface _TimerQueue
3
+ def schedule: (seconds: Numeric) { () -> void } -> self
4
+ def cancel: (^() -> void callback) -> bool
5
+ end
6
+
7
+ module Concurrency
8
+ class OffloadPool
9
+ @timer_queue_provider: (^() -> _TimerQueue)?
10
+ def initialize: (?pool_size: Integer, ?queue_size: Integer, ?name: (String | Symbol)?, ?logger: untyped, ?timer_queue_provider: (^() -> _TimerQueue)?) -> void
11
+ def begin_shutdown: () -> self
12
+ def terminated?: () -> bool
13
+ def shutdown: (?drain_timeout: Numeric, ?deadline: Numeric?) -> self
14
+ end
15
+
16
+ class PoolRegistry
17
+ @timer_queue_provider: (^() -> _TimerQueue)?
18
+ def initialize: (?timer_queue_provider: (^() -> _TimerQueue)?) -> void
19
+ def shutdown: (?deadline: Numeric) -> bool
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ module Phronomy
2
+ class FSMSession
3
+ @terminal_policy: _TerminalPolicy?
4
+ @event_sink: _FSMEventSink
5
+ end
6
+
7
+ class EventLoop
8
+ @execution_receivers: Hash[untyped, _ExecutionReceiver]
9
+ @session_receivers: Hash[String, _ExecutionReceiver]
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ module Phronomy
2
+ interface _FSMEventSink
3
+ def post: (Symbol type, ?untyped payload) -> untyped
4
+ end
5
+
6
+ interface _TerminalPolicy
7
+ def start: (terminal_type: Symbol, context: untyped, event_sink: _FSMEventSink) -> untyped
8
+ def handles?: (Event event) -> bool
9
+ def decision_for: (Event event) -> TerminalDecision
10
+ end
11
+
12
+ class Event
13
+ attr_reader type: Symbol
14
+ attr_reader payload: untyped
15
+ end
16
+
17
+ class TerminalDecision < Data
18
+ attr_reader action: (:complete | :fail | :retire)
19
+ attr_reader error: Exception?
20
+ def self.new: (action: (:complete | :fail | :retire), error: Exception?) -> instance
21
+ end
22
+
23
+ end
@@ -0,0 +1,6 @@
1
+ module Phronomy
2
+ module ExecutionBinding
3
+ def self.submit: [V] (?pool: _ExecutionPool?, ?runtime: _ExecutionRuntime?, ?pool_name: Symbol?, ?size: Integer, ?queue_size: Integer, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
4
+ def self.after: (Numeric seconds) { () -> void } -> ^() -> untyped
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ module Phronomy
2
+ class EventLoop
3
+ def __execution_receiver: (key: untyped) -> ExecutionReceiver?
4
+ def __register_execution_receiver: (key: untyped, receiver: ExecutionReceiver) -> ExecutionReceiver
5
+ def __synchronize_execution_state: [V] () { () -> V } -> V
6
+ def __admit_execution: [V] (ExecutionReceiver receiver) { () -> V } -> V
7
+ def __post_execution: (ExecutionReceiver receiver, untyped message, ?admission: bool, ?completion: TaskResult[untyped]?) -> bool
8
+ def __route_execution_event: (ExecutionReceiver receiver) { () -> untyped } -> bool
9
+ def __receiver_cleanup_complete?: () -> bool
10
+ end
11
+
12
+ class Runtime
13
+ def __event_loop_if_initialized: () -> EventLoop?
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # Internal lookup operations. None of these methods initializes a resource.
2
+ module Phronomy
3
+ class Runtime
4
+ def self.__default_if_initialized: () -> Runtime?
5
+ def __offload_if_initialized: () -> Concurrency::OffloadPool?
6
+ end
7
+
8
+ module Concurrency
9
+ class PoolRegistry
10
+ def default_pool_if_initialized: () -> OffloadPool?
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ module AsyncOperation
3
+ def self.map: [A, B] (_CompletionHandle[A] source, name: String, ?on_error: (^(Exception) -> B)?) { (A) -> B } -> TaskResult[B]
4
+ def self.call: [A, B] (name: String, ?on_error: (^(Exception) -> B)?, ?transform: ^(A) -> B) { () -> _CompletionHandle[A] } -> TaskResult[B]
5
+ def self.capture: [V] (name: String, ?on_error: (^(Exception) -> V)?) { () -> V } -> TaskResult[V]
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Phronomy
2
+ module Blocking
3
+ def self.call_async: [V] (?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?invocation_context: InvocationContext?) { () -> V } -> TaskResult[V]
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ module Phronomy
2
+ module Concurrency
3
+ class CancellationToken
4
+ def self.timeout_after: (Numeric seconds) -> CancellationToken
5
+ def initialize: (?monotonic_deadline: Float?) -> void
6
+ def remaining_monotonic_seconds: () -> Float?
7
+ def on_cancel: () { () -> void } -> self
8
+ def cancel!: () -> self
9
+ def cancelled?: () -> bool
10
+ def raise_if_cancelled!: (?String message) -> nil
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ module Phronomy
2
+ module Concurrency
3
+ class Deadline
4
+ def self.in: (Numeric seconds) -> instance
5
+ def initialize: (Numeric monotonic_at) -> void
6
+ def expired?: () -> bool
7
+ def remaining_seconds: () -> Float
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ module Concurrency
3
+ class ResultComposition
4
+ @scope: _ExecutionScope?
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module Phronomy
2
+ # Only the operations used across the execution boundary; no concrete runtime.
3
+ interface _CompletionHandle[A]
4
+ def on_complete: () { (A?, Exception?) -> void } -> untyped
5
+ end
6
+
7
+ interface _ExecutionScope
8
+ def __while_open: [V] () { () -> V } -> V?
9
+ def __open?: () -> bool
10
+ def __cancellation_token: () -> Concurrency::CancellationToken
11
+ def __cancellation_error: () -> Exception
12
+ end
13
+
14
+ module WaitPolicy
15
+ def self.blocking_forbidden?: () -> bool
16
+ def self.without_blocking: [V] () { () -> V } -> V
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ class RecursionLimitError < Error
3
+ end
4
+
5
+ class TimeoutError < Error
6
+ end
7
+ end
@@ -0,0 +1,41 @@
1
+ module Phronomy
2
+ interface _ExecutionSubmitter
3
+ def submit: [V] (?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
4
+ end
5
+
6
+ interface _ExecutionPool
7
+ def submit: [V] (?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
8
+ end
9
+
10
+ interface _ExecutionRuntime
11
+ def offload: () -> _ExecutionPool
12
+ def pool: (Symbol name, size: Integer, queue_size: Integer) -> _ExecutionPool
13
+ end
14
+
15
+ interface _ExecutionBackend
16
+ def submit: [V] (?pool: _ExecutionPool?, ?runtime: _ExecutionRuntime?, ?pool_name: Symbol?, ?size: Integer, ?queue_size: Integer, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
17
+ def after: (Numeric seconds) { () -> void } -> ^() -> untyped
18
+ end
19
+ class Execution
20
+ def self.backend_provider=: (^() -> _ExecutionBackend provider) -> ^() -> _ExecutionBackend
21
+ def self.submit: [V] (?pool: _ExecutionPool?, ?runtime: _ExecutionRuntime?, ?pool_name: Symbol?, ?size: Integer, ?queue_size: Integer, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
22
+ def self.after: (Numeric seconds) { () -> void } -> ^() -> untyped
23
+ attr_reader invocation_context: InvocationContext
24
+
25
+ def self.run_async: [I, V] (Array[I] inputs, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?invocation_context: InvocationContext?, ?max_concurrency: Integer?) { (I, Execution) -> TaskResult[V] } -> TaskResult[Array[TaskResult::Outcome[V]]]
26
+ def self.run: [I, V] (Array[I] inputs, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?invocation_context: InvocationContext?, ?max_concurrency: Integer?) { (I, Execution) -> TaskResult[V] } -> Array[TaskResult::Outcome[V]]
27
+ def start_child: [V] (?invocation_context: InvocationContext?, ?cancellation_token: Concurrency::CancellationToken?, ?parent_task_id: String?) { (InvocationContext, Concurrency::CancellationToken) -> TaskResult[V] } -> TaskResult[V]
28
+ def observe: [V] (TaskResult[V] source_result) -> TaskResult[V]
29
+ end
30
+
31
+ class ExecutionTimeoutError < TimeoutError
32
+ attr_reader outcomes: Array[TaskResult::Outcome[untyped]]
33
+ def initialize: (?String message, outcomes: Array[TaskResult::Outcome[untyped]], ?code: String?) -> void
34
+ end
35
+
36
+ class ExecutionCancellationError < CancellationError
37
+ attr_reader outcomes: Array[TaskResult::Outcome[untyped]]
38
+ def initialize: (?String message, outcomes: Array[TaskResult::Outcome[untyped]], ?code: String?) -> void
39
+ end
40
+
41
+ end
@@ -0,0 +1,40 @@
1
+ module Phronomy
2
+ interface _ExecutionReceiver
3
+ def idle?: () -> bool
4
+ def deliver: (untyped message) -> untyped
5
+ def shutdown: (error: Exception?) -> untyped
6
+ def session_retired: (String session_id, reason: Symbol) -> untyped
7
+ end
8
+
9
+ interface _ExecutionChannel
10
+ def bound_to?: (untyped owner) -> bool
11
+ def current?: () -> bool
12
+ def synchronize: [V] () { () -> V } -> V
13
+ def admit: [V] (ExecutionReceiver receiver) { () -> V } -> V
14
+ def post: (ExecutionReceiver receiver, untyped message, admission: bool, completion: TaskResult[untyped]?) -> bool
15
+ def route: (ExecutionReceiver receiver, type: Symbol, payload: untyped) { () -> String? } -> bool
16
+ end
17
+
18
+ # Internal serial-owner contract; composition supplies the transport.
19
+ class ExecutionReceiver
20
+ def self.install_binding: (^() -> untyped provider) -> untyped
21
+ def self.binding: () -> untyped
22
+ def self.for: (untyped owner) -> instance
23
+ def self.existing_for: (untyped owner) -> instance?
24
+ def initialize: (channel: _ExecutionChannel) -> void
25
+ def __bound_to?: (untyped owner) -> bool
26
+ def idle?: () -> bool
27
+ def deliver: (untyped message) -> untyped
28
+ def shutdown: (error: Exception?) -> untyped
29
+ def session_retired: (String fsm_session_id, reason: Symbol) -> untyped
30
+
31
+ private
32
+
33
+ def synchronize: [V] () { () -> V } -> V
34
+ def admit: [V] () { () -> V } -> V
35
+ def post_message: (untyped message, ?admission: bool, ?completion: TaskResult[untyped]?) -> bool
36
+ def route_event: (type: Symbol, ?payload: untyped) { () -> String? } -> bool
37
+ def assert_event_loop_thread!: () -> void
38
+ end
39
+
40
+ end
@@ -0,0 +1,9 @@
1
+ module Phronomy
2
+ class ExecutionScopeState
3
+ def __while_open: [V] () { () -> V } -> V?
4
+ def __open?: () -> bool
5
+ def __cancellation_token: () -> Concurrency::CancellationToken
6
+ def __cancellation_error: () -> Exception
7
+ def __set_cancellation_error: (Exception error) -> Exception
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ module Phronomy
2
+ class InvocationContext
3
+ @execution_scope: _ExecutionScope?
4
+ def __bind_execution: (_ExecutionScope? scope) -> self
5
+ def __execution_scope: () -> _ExecutionScope?
6
+
7
+ attr_reader user_id: String?
8
+ attr_reader cancellation_token: Concurrency::CancellationToken?
9
+ attr_reader deadline: Concurrency::Deadline?
10
+ attr_reader token_budget: Integer?
11
+ attr_reader approval_policy: untyped
12
+ attr_reader redaction_policy: untyped
13
+ attr_reader task_id: String?
14
+ attr_reader parent_task_id: String?
15
+
16
+ def initialize: (?user_id: String?, ?cancellation_token: Concurrency::CancellationToken?, ?deadline: Concurrency::Deadline?, ?token_budget: Integer?, ?approval_policy: untyped, ?redaction_policy: untyped, ?task_id: String?, ?parent_task_id: String?) -> void
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Phronomy
2
+ class InvocationControls
3
+ @scope: _ExecutionScope?
4
+ attr_reader token: Concurrency::CancellationToken?
5
+ def self.attach: [V] (TaskResult[V] result, invocation_context: InvocationContext?, cancellation_token: Concurrency::CancellationToken?) -> instance
6
+ def initialize: (invocation_context: InvocationContext?, cancellation_token: Concurrency::CancellationToken?) -> void
7
+ def check_start!: () -> nil
8
+ def bind: [V] (TaskResult[V] result) -> TaskResult[V]
9
+ def track: [V] (TaskResult[V] result) -> TaskResult[V]
10
+ def close: () -> untyped
11
+ def self.effective_timeout_token: (InvocationContext context) -> Concurrency::CancellationToken?
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ module Phronomy
2
+ class TaskResult[A]
3
+ @execution_scope: _ExecutionScope?
4
+ def __bind_execution: (_ExecutionScope? scope) -> self
5
+ def __execution_scope: () -> _ExecutionScope?
6
+ class Outcome[V]
7
+ attr_reader index: Integer
8
+ attr_reader status: (:completed | :failed | :cancelled | :unfinished)
9
+ attr_reader value: V?
10
+ attr_reader error: Exception?
11
+ end
12
+
13
+ def self.completed: [V] (V value, ?name: String?) -> TaskResult[V]
14
+ | (?name: String?) -> TaskResult[nil]
15
+ def self.failed: (Exception error, ?name: String?) -> TaskResult[untyped]
16
+ def self.all_settled: [V] (Array[TaskResult[V]] results) -> TaskResult[Array[Outcome[V]]]
17
+ attr_reader name: String?
18
+ attr_reader parent: TaskResult[untyped]?
19
+
20
+ def status: () -> (:pending | :completed | :failed | :cancelled)
21
+ def done?: () -> bool
22
+ def alive?: () -> bool
23
+ def wait_result: (?timeout: Numeric?) -> A
24
+ def on_complete: () { (A?, Exception?) -> void } -> self
25
+ def map: [B] () { (A) -> B } -> TaskResult[B]
26
+ def flat_map: [B] () { (A) -> TaskResult[B] } -> TaskResult[B]
27
+ end
28
+
29
+ end
@@ -14,33 +14,13 @@ module Phronomy
14
14
 
15
15
  module Tracing
16
16
  class Base
17
+ def self.trace_with: [A] (untyped tracer, String name, ?record_output: bool, ?attributes: Hash[Symbol, untyped]) { (untyped span) -> [A, untyped] } -> A
17
18
  def start_span: (String name, **untyped attributes) -> untyped
18
19
  def finish_span: (untyped span, ?output: untyped, ?usage: untyped, ?error: Exception?) -> untyped
19
20
  def trace: [A] (String name, ?input: untyped, **untyped meta) { (untyped span) -> [A, untyped] } -> A
20
21
  end
21
22
  end
22
23
 
23
- module VectorStore
24
- class Base
25
- def add: (id: String, embedding: Array[Float], ?metadata: Hash[untyped, untyped], ?cancellation_token: Concurrency::CancellationToken?) -> untyped
26
- def search: (query_embedding: Array[Float], ?k: Integer, ?cancellation_token: Concurrency::CancellationToken?) -> Array[Hash[Symbol, untyped]]
27
- def remove: (id: String) -> untyped
28
- def clear: () -> untyped
29
- def size: () -> Integer
30
-
31
- def add_async: (id: String, embedding: Array[Float], ?metadata: Hash[untyped, untyped], ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
32
- def search_async: (query_embedding: Array[Float], ?k: Integer, ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[Array[Hash[Symbol, untyped]]]
33
- def remove_async: (id: String, ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
34
- def clear_async: (?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
35
- end
36
-
37
- module Embeddings
38
- class Base
39
- def embed: (String text, ?Concurrency::CancellationToken? cancellation_token) -> Array[Float]
40
- def embed_async: (String text, ?Concurrency::CancellationToken? cancellation_token, ?timeout: Numeric?) -> TaskResult[Array[Float]]
41
- end
42
- end
43
- end
44
24
  module Testing
45
25
  module PersistenceContract
46
26
  SHARED_EXAMPLES: Array[String]
@@ -0,0 +1,6 @@
1
+ module Phronomy
2
+ class FilterBlockError < Error
3
+ attr_reader filter: untyped
4
+ def initialize: (String message, ?filter: untyped, ?code: String?) -> void
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Phronomy
2
+ class LowConfidenceError < Error
3
+ attr_reader result: untyped
4
+ def initialize: (untyped result, ?code: String?) -> void
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  module Phronomy
2
- module Agent
2
+ module MultiAgent
3
3
  class Handoff
4
4
  attr_reader source_agent: ::Phronomy::Agent::Base
5
5
  attr_reader target_agent: ::Phronomy::Agent::Base
@@ -10,6 +10,12 @@ module Phronomy
10
10
  end
11
11
 
12
12
  class HandoffPolicy
13
+ class Rule < Data
14
+ attr_reader category: Symbol
15
+ attr_reader mode: Symbol
16
+ attr_reader default: Symbol?
17
+ end
18
+
13
19
  CATEGORIES: Array[Symbol]
14
20
  MODES: Array[Symbol]
15
21
  DEFAULTS: Array[Symbol]
@@ -17,7 +23,7 @@ module Phronomy
17
23
  def self.define: () { () -> void } -> HandoffPolicy
18
24
  def self.default: () -> HandoffPolicy
19
25
 
20
- def rule: (Symbol | String) -> untyped
26
+ def rule: (Symbol | String) -> Rule
21
27
  def required?: (Symbol | String) -> bool
22
28
  def forbidden?: (Symbol | String) -> bool
23
29
  def selectable?: (Symbol | String) -> bool
@@ -32,9 +38,9 @@ module Phronomy
32
38
  MAX_HANDOFFS: Integer
33
39
 
34
40
  attr_reader main_agent: ::Phronomy::Agent::Base
35
- attr_reader handoffs: Array[::Phronomy::Agent::Handoff]
41
+ attr_reader handoffs: Array[::Phronomy::MultiAgent::Handoff]
36
42
 
37
- def initialize: (main_agent: ::Phronomy::Agent::Base, ?handoffs: Array[::Phronomy::Agent::Handoff]) -> void
43
+ def initialize: (main_agent: ::Phronomy::Agent::Base, ?handoffs: Array[::Phronomy::MultiAgent::Handoff], persistence: Store) -> void
38
44
  def invoke: (untyped input, ?config: Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
39
45
  def result: (String execution_id) -> Hash[Symbol, untyped]
40
46
  def cancel: (String execution_id) -> Hash[Symbol, untyped]
@@ -0,0 +1,14 @@
1
+ module Phronomy
2
+ module Integrations
3
+ class OrderedEventDelivery
4
+ class ClosedError < Phronomy::Error
5
+ end
6
+ class OverflowError < Phronomy::Error
7
+ end
8
+ def self.open: [T] (?capacity: Integer, ?batch_size: Integer, ?flush_timeout: Numeric?, deliver: ^(untyped) -> untyped, ?prepare_batch: (^(Array[untyped]) -> Array[untyped])?) { (OrderedEventDelivery) -> T } -> T
9
+ def initialize: (?capacity: Integer, ?batch_size: Integer, ?prepare_batch: (^(Array[untyped]) -> Array[untyped])?) { (untyped) -> untyped } -> void
10
+ def publish: (untyped) -> self
11
+ def close_and_wait: (?timeout: Numeric?) -> self
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ module Phronomy
2
+ module LLMAdapter
3
+ class RubyLLM < Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module Phronomy
2
+ module LLMAdapter
3
+ class Base
4
+ def identity: () -> Hash[String, String?]
5
+ def input_budget: (Hash[String, untyped] model_config) -> LlmContextWindow::TokenBudget?
6
+ def complete: (Request request, ?cancellation_token: _CancellationSignal?) -> Response
7
+ def stream: (Request request, ?cancellation_token: _CancellationSignal?) { (StreamChunk chunk) -> void } -> Response
8
+ # Protected extension SPI at runtime; RBS has no protected visibility.
9
+ private
10
+ def perform_complete: (Request request, cancellation_token: _CancellationSignal?) -> Response
11
+ def perform_stream: (Request request, cancellation_token: _CancellationSignal?) { (StreamChunk chunk) -> void } -> Response
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Phronomy
2
+ module LLMAdapter
3
+ class TokenUsage
4
+ attr_reader input: Integer?
5
+ attr_reader output: Integer?
6
+ attr_reader cached: Integer?
7
+ attr_reader cache_creation: Integer?
8
+ def initialize: (?input: Integer?, ?output: Integer?, ?cached: Integer?, ?cache_creation: Integer?) -> void
9
+ def self.zero: () -> TokenUsage
10
+ def +: (TokenUsage? other) -> TokenUsage
11
+ def to_h: () -> Hash[Symbol, Integer?]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ module Phronomy
2
+ module LLMAdapter
3
+ class Request
4
+ attr_reader model_config: Hash[String, untyped]
5
+ attr_reader system: String?
6
+ attr_reader messages: Array[Message]
7
+ attr_reader tools: Array[Hash[String, untyped]]
8
+ attr_reader message: String?
9
+ def initialize: (?model_config: Hash[String | Symbol, untyped], ?system: String?, ?messages: Array[Message], ?tools: Array[Hash[String, untyped]], ?message: String?) -> void
10
+ end
11
+ class Message
12
+ attr_reader role: Symbol
13
+ attr_reader content: json_value
14
+ attr_reader tool_calls: Array[Tool::CallRequest]
15
+ attr_reader tool_call_id: String?
16
+ attr_reader metadata: Hash[String, json_value]
17
+ def initialize: (role: String | Symbol, ?content: json_value, ?tool_calls: Array[Tool::CallRequest], ?tool_call_id: String?, ?metadata: Hash[String, json_value]) -> void
18
+ def tool_call?: () -> bool
19
+ def content_present?: () -> bool
20
+ def to_h: () -> Hash[String, untyped]
21
+ end
22
+ class Response < Message
23
+ attr_reader usage: TokenUsage
24
+ def initialize: (?content: json_value, ?tool_calls: Array[Tool::CallRequest], ?usage: TokenUsage, ?metadata: Hash[String, json_value], ?role: String | Symbol) -> void
25
+ def self.from_h: (Hash[String | Symbol, untyped] value) -> Response
26
+ def to_h: () -> Hash[String, untyped]
27
+ end
28
+ class StreamChunk
29
+ attr_reader content: String?
30
+ def initialize: (content: String?) -> void
31
+ end
32
+ class InvalidResultError < Error
33
+ end
34
+ class TransportError < Error
35
+ end
36
+ class RateLimitError < TransportError
37
+ end
38
+ class AuthenticationError < TransportError
39
+ end
40
+ class ContextLengthError < Error
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ module Phronomy
2
+ module LlmContextWindow
3
+ class TokenBudget
4
+ attr_reader max_input_tokens: Integer
5
+ def initialize: (max_input_tokens: Integer) -> void
6
+ def effective_input_limit: () -> Integer
7
+ def available: (?used: Integer) -> Integer
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ module Phronomy
2
+ module MultiAgent
3
+ class ReservedChildAdmission
4
+ def initialize: (persistence: (Store | Agent::Store), owner: Hash[String, untyped]) -> void
5
+ def admit: (::Phronomy::Agent::Admission admission) -> nil
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,54 @@
1
+ module Phronomy
2
+ interface _HandoffStateRepository
3
+ def load: (String main_agent_id) -> untyped
4
+ def load_locked: (String main_agent_id) -> untyped
5
+ def save: (String main_agent_id, expected_revision: Integer?, state: untyped) -> untyped
6
+ def delete: (String main_agent_id, expected_revision: Integer) -> untyped
7
+ end
8
+
9
+ interface _TeamRepository
10
+ def create: (untyped root) -> untyped
11
+ def load: (String team_id) -> untyped
12
+ def save: (String team_id, expected_revision: Integer, root: untyped) -> untyped
13
+ def delete: (String team_id) -> untyped
14
+ end
15
+
16
+ interface _TeamExecutionRepository
17
+ def create_active: (untyped execution) -> untyped
18
+ def load: (String team_execution_id) -> untyped
19
+ def save: (String team_execution_id, expected_revision: Integer, execution: untyped) -> untyped
20
+ def list_active: (String team_id) -> Array[untyped]
21
+ def list: (String team_id, ?after: String?, ?limit: Integer) -> Array[untyped]
22
+ def delete: (String team_execution_id) -> untyped
23
+ def delete_for_team: (String team_id) -> untyped
24
+ def assert_idle!: (String team_id) -> untyped
25
+ end
26
+
27
+ module MultiAgent
28
+ interface _Records
29
+ def contents: () -> _ContentRepository
30
+ def handoff_states: () -> _HandoffStateRepository
31
+ def teams: () -> _TeamRepository
32
+ def team_executions: () -> _TeamExecutionRepository
33
+ def guard_team!: (String team_id) -> untyped
34
+ end
35
+
36
+ class Store
37
+ attr_reader coordinator: ::Phronomy::Persistence
38
+ attr_reader contents: _ContentRepository
39
+ attr_reader handoff_states: _HandoffStateRepository
40
+ attr_reader teams: _TeamRepository
41
+ attr_reader team_executions: _TeamExecutionRepository
42
+ attr_reader agent_store: Agent::Store
43
+ def initialize: (coordinator: ::Phronomy::Persistence, records: ::Phronomy::Persistence::_Participant[_Records], agent_store: Agent::Store) -> void
44
+ def transaction: [R] () { (_Records, ::Phronomy::Persistence::Transaction) -> R } -> R
45
+ def participate: [R] (::Phronomy::Persistence::Transaction scope) { (_Records) -> R } -> R
46
+ def handoff_leaf: (String execution_id, main_agent_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> Agent::ExecutionObservation
47
+ def handoff_result: (String execution_id, main_agent_id: String) -> Agent::execution_result
48
+ def forget_handoff: (String main_agent_id) -> bool
49
+ def forget_subagents: (agent_id: String, execution_id: String) -> bool
50
+ def result: (String execution_id) -> Hash[Symbol, untyped]
51
+ def runs: (String owner_id, ?after: String?, ?limit: Integer) -> Array[untyped]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,8 @@
1
+ module Phronomy
2
+ module MultiAgent
3
+ class TeamBusyError < Phronomy::Error
4
+ attr_reader team_id: String
5
+ def initialize: (?String? message, team_id: untyped) -> void
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Phronomy
2
+ module MultiAgent
3
+ class TeamNotFoundError < Phronomy::Persistence::NotFoundError
4
+ attr_reader team_id: String
5
+ def initialize: (?String? message, team_id: untyped) -> void
6
+ end
7
+ end
8
+ end