phronomy 0.26.0 → 0.27.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 (304) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -0
  3. data/README.md +4 -0
  4. data/VERIFY.sh +27 -27
  5. data/benchmark/bench_agent_invoke.rb +26 -22
  6. data/benchmark/bench_context_assembler.rb +4 -5
  7. data/docs/architecture/agent-chat-and-state-ownership.md +147 -0
  8. data/docs/architecture/agent-configuration-and-tool-binding.md +139 -0
  9. data/docs/architecture/agent-context.md +4 -2
  10. data/docs/architecture/agent-transition-ownership.md +89 -0
  11. data/docs/architecture/before-llm-input.md +6 -0
  12. data/docs/architecture/context-management.md +30 -0
  13. data/docs/architecture/context-preparation-steps.md +90 -0
  14. data/docs/architecture/entry-action-and-team-wording.md +72 -0
  15. data/docs/architecture/execution-metadata-and-values.md +80 -0
  16. data/docs/architecture/generator-verifier-ownership.md +111 -0
  17. data/docs/architecture/multi-agent-handoff.md +8 -2
  18. data/docs/architecture/persistence-refactoring-plan.md +50 -0
  19. data/docs/architecture/persistence.md +27 -4
  20. data/docs/architecture/refactoring-closure.md +334 -0
  21. data/docs/architecture/remaining-refactoring-plan.md +374 -0
  22. data/docs/architecture/rubyllm-2-token-ownership.md +82 -0
  23. data/docs/architecture/tool-schema-recording-gap.md +50 -0
  24. data/docs/architecture/tracing.md +1 -1
  25. data/docs/architecture/workflow-terminal-ownership-design.md +104 -0
  26. data/docs/architecture.md +209 -0
  27. data/docs/decisions/014-unified-persistence-durable-state.md +11 -0
  28. data/docs/decisions/024-event-loop-single-writer-agent-runtime.md +5 -1
  29. data/docs/decisions/025-process-local-agent-ownership-and-runtime-admission.md +13 -3
  30. data/docs/decisions/026-workflow-runtime-admission-and-durable-terminal-barrier.md +5 -1
  31. data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +5 -0
  32. data/docs/decisions/031-durable-multi-agent-coordination.md +5 -0
  33. data/docs/decisions/032-storage-backend-composition.md +80 -0
  34. data/docs/decisions/033-domain-persistence-ownership.md +79 -0
  35. data/docs/decisions/034-handoff-runner-coordination-ownership.md +76 -0
  36. data/docs/decisions/035-tool-executor-capability-ownership.md +68 -0
  37. data/docs/decisions/036-context-contract-ownership.md +86 -0
  38. data/docs/decisions/037-common-definition-ownership.md +62 -0
  39. data/docs/decisions/038-responsibility-based-source-layout.md +131 -0
  40. data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +74 -0
  41. data/docs/decisions/040-configuration-default-composition.md +94 -0
  42. data/docs/decisions/041-feature-owned-identity-registries.md +100 -0
  43. data/docs/decisions/042-feature-owned-execution-state.md +106 -0
  44. data/docs/decisions/043-storage-execution-constraint-notifications.md +75 -0
  45. data/docs/decisions/044-agent-default-and-one-shot-composition.md +106 -0
  46. data/docs/decisions/045-worker-input-restriction-ownership.md +100 -0
  47. data/docs/decisions/046-agent-responsibility-layout-and-shared-records.md +110 -0
  48. data/docs/decisions/047-recovered-execution-continuation-contract.md +116 -0
  49. data/docs/decisions/048-dispatch-preparation-worker-ownership.md +120 -0
  50. data/docs/decisions/049-initial-preparation-worker-ownership.md +111 -0
  51. data/docs/decisions/050-approval-resume-snapshot-and-commit-ownership.md +98 -0
  52. data/docs/decisions/051-execution-outcome-worker-ownership.md +151 -0
  53. data/docs/decisions/052-tool-invocation-restoration-ownership.md +92 -0
  54. data/docs/decisions/053-shared-state-coordination-ownership.md +71 -0
  55. data/docs/decisions/054-workflow-terminal-save-single-owner.md +76 -0
  56. data/docs/decisions/055-terminal-observer-failure-settlement.md +60 -0
  57. data/docs/decisions/056-workflow-terminal-policy-ownership.md +87 -0
  58. data/docs/decisions/057-storage-transaction-boundaries.md +73 -0
  59. data/docs/decisions/058-neutral-storage-primitives.md +78 -0
  60. data/docs/decisions/README.md +35 -6
  61. data/docs/design/durable-semantic-coordination/IMPLEMENTATION_DESIGN_V2.md +6 -0
  62. data/docs/design/durable-semantic-coordination/IMPLEMENTATION_REPORT.md +6 -0
  63. data/docs/features.md +9 -3
  64. data/docs/getting-started.md +4 -4
  65. data/docs/migrations/0.15.md +5 -0
  66. data/docs/migrations/durable-semantic-coordination-v2.md +6 -0
  67. data/docs/migrations/handoff-runner-multi-agent.md +35 -0
  68. data/docs/migrations/neutral-storage-spi.md +43 -0
  69. data/docs/migrations/parallel-tool-chat-removal.md +49 -0
  70. data/docs/migrations/shared-state-multi-agent.md +44 -0
  71. data/docs/migrations/storage-backend-composition.md +117 -0
  72. data/docs/migrations/storage-transaction-boundaries.md +74 -0
  73. data/docs/persistence-backends.md +162 -204
  74. data/docs/runtime-and-concurrency.md +117 -32
  75. data/lib/phronomy/agent/api/agent.rb +17 -0
  76. data/lib/phronomy/agent/async_event_api.rb +2 -2
  77. data/lib/phronomy/agent/base.rb +51 -241
  78. data/lib/phronomy/{agent.rb → agent/composition/run_once.rb} +4 -13
  79. data/lib/phronomy/agent/context/capability/base.rb +67 -26
  80. data/lib/phronomy/agent/context/capability/tool_executor.rb +62 -0
  81. data/lib/phronomy/agent/{context_assembler.rb → context_assembly/context_assembler.rb} +143 -88
  82. data/lib/phronomy/agent/{context_importer.rb → context_assembly/context_importer.rb} +2 -2
  83. data/lib/phronomy/agent/{ruby_llm_materializer.rb → context_assembly/ruby_llm_materializer.rb} +4 -7
  84. data/lib/phronomy/agent/context_assembly/runtime_chat_builder.rb +36 -0
  85. data/lib/phronomy/agent/context_assembly/saved_context_reader.rb +53 -0
  86. data/lib/phronomy/agent/context_assembly/state_writer.rb +165 -0
  87. data/lib/phronomy/agent/context_assembly/token_budget_resolver.rb +22 -0
  88. data/lib/phronomy/agent/{context_plan.rb → context_contract/context_plan.rb} +1 -1
  89. data/lib/phronomy/agent/{context_policy_input.rb → context_contract/context_policy_input.rb} +6 -6
  90. data/lib/phronomy/agent/{llm_input_build_context.rb → context_contract/llm_input_build_context.rb} +1 -1
  91. data/lib/phronomy/agent/{llm_input_manifest.rb → context_contract/llm_input_manifest.rb} +20 -20
  92. data/lib/phronomy/agent/{llm_input_patch.rb → context_contract/llm_input_patch.rb} +2 -2
  93. data/lib/phronomy/agent/{agent_execution.rb → execution/agent_execution.rb} +8 -4
  94. data/lib/phronomy/agent/{agent_invocation.rb → execution/agent_invocation.rb} +8 -13
  95. data/lib/phronomy/agent/{agent_invocation_session_builder.rb → execution/agent_invocation_session_builder.rb} +19 -95
  96. data/lib/phronomy/agent/execution/approval_resume_commit.rb +108 -0
  97. data/lib/phronomy/agent/execution/dispatch_preparation.rb +305 -0
  98. data/lib/phronomy/agent/{exact_execution.rb → execution/exact_execution.rb} +9 -10
  99. data/lib/phronomy/agent/{execution_cancellation.rb → execution/execution_cancellation.rb} +2 -3
  100. data/lib/phronomy/agent/execution/execution_coordinator.rb +1925 -0
  101. data/lib/phronomy/agent/execution/execution_failure.rb +30 -0
  102. data/lib/phronomy/agent/execution/execution_metadata.rb +53 -0
  103. data/lib/phronomy/agent/execution/execution_outcome_committer.rb +344 -0
  104. data/lib/phronomy/agent/execution/execution_registry.rb +459 -0
  105. data/lib/phronomy/agent/execution/execution_session_runner.rb +118 -0
  106. data/lib/phronomy/agent/execution/initial_preparation.rb +421 -0
  107. data/lib/phronomy/agent/execution/invocation_transitions.rb +86 -0
  108. data/lib/phronomy/agent/{phase_machine_builder.rb → execution/phase_machine_builder.rb} +20 -71
  109. data/lib/phronomy/agent/{provider_call_outcome.rb → execution/provider_call_outcome.rb} +9 -9
  110. data/lib/phronomy/agent/execution/runtime_record_encoder.rb +210 -0
  111. data/lib/phronomy/agent/{handoff_context.rb → handoff/handoff_context.rb} +2 -2
  112. data/lib/phronomy/agent/handoff/handoff_execution_coordinator.rb +15 -0
  113. data/lib/phronomy/agent/handoff/handoff_outcome_committer.rb +131 -0
  114. data/lib/phronomy/agent/{handoff_state.rb → handoff/handoff_state.rb} +1 -1
  115. data/lib/phronomy/agent/{journal_projection.rb → journal/journal_projection.rb} +4 -0
  116. data/lib/phronomy/agent/{journal_record.rb → journal/journal_record.rb} +3 -3
  117. data/lib/phronomy/agent/{llm_call_record.rb → journal/llm_call_record.rb} +2 -2
  118. data/lib/phronomy/agent/{agent_root.rb → lifecycle/agent_root.rb} +6 -2
  119. data/lib/phronomy/agent/lifecycle/default_persistence.rb +29 -0
  120. data/lib/phronomy/{engine/runtime/agent_ownership_registry.rb → agent/lifecycle/ownership_registry.rb} +24 -10
  121. data/lib/phronomy/{agent_already_exists_error.rb → agent/lifecycle_contract/agent_already_exists_error.rb} +2 -0
  122. data/lib/phronomy/{agent_busy_error.rb → agent/lifecycle_contract/agent_busy_error.rb} +2 -0
  123. data/lib/phronomy/{agent_purged_error.rb → agent/lifecycle_contract/agent_purged_error.rb} +2 -0
  124. data/lib/phronomy/agent/lifecycle_contract/handoff_error.rb +7 -0
  125. data/lib/phronomy/{stream_callback_error.rb → agent/lifecycle_contract/stream_callback_error.rb} +2 -0
  126. data/lib/phronomy/agent/persistence/agent_repository.rb +61 -0
  127. data/lib/phronomy/agent/persistence/codec.rb +358 -0
  128. data/lib/phronomy/agent/persistence/execution_repository.rb +108 -0
  129. data/lib/phronomy/agent/persistence/handoff_state_repository.rb +58 -0
  130. data/lib/phronomy/agent/persistence/journal_repository.rb +54 -0
  131. data/lib/phronomy/agent/persistence/queries.rb +61 -0
  132. data/lib/phronomy/agent/persistence/storage_schema.rb +24 -0
  133. data/lib/phronomy/agent/persistence/watermark.rb +27 -0
  134. data/lib/phronomy/agent/recovery/invocation_restorer.rb +132 -0
  135. data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/continuation.rb +21 -45
  136. data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/installation.rb +32 -37
  137. data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/resolution.rb +37 -40
  138. data/lib/phronomy/agent/{recovery_coordinator.rb → recovery/recovery_coordinator.rb} +6 -10
  139. data/lib/phronomy/agent/recovery/recovery_support.rb +227 -0
  140. data/lib/phronomy/agent/selection/candidate.rb +1 -1
  141. data/lib/phronomy/agent/{approval_evaluation_request.rb → tool_execution/approval_evaluation_request.rb} +1 -12
  142. data/lib/phronomy/agent/{tool_approval_request.rb → tool_execution/tool_approval_request.rb} +1 -10
  143. data/lib/phronomy/agent/tool_execution/tool_binding.rb +90 -0
  144. data/lib/phronomy/agent/{tool_call_intercepted.rb → tool_execution/tool_call_intercepted.rb} +2 -2
  145. data/lib/phronomy/agent/{tool_definition_set.rb → tool_execution/tool_definition_set.rb} +9 -4
  146. data/lib/phronomy/agent/{tool_invocation.rb → tool_execution/tool_invocation.rb} +69 -34
  147. data/lib/phronomy/common/configuration_error.rb +7 -0
  148. data/lib/phronomy/common/error.rb +5 -0
  149. data/lib/phronomy/{agent → common/values}/immutable.rb +9 -1
  150. data/lib/phronomy/common/values/serializable.rb +32 -0
  151. data/lib/phronomy/{configuration.rb → configuration/configuration.rb} +14 -5
  152. data/lib/phronomy/configuration/global_configuration.rb +26 -0
  153. data/lib/phronomy/content_store/storage_schema.rb +11 -0
  154. data/lib/phronomy/content_store/stored_contents.rb +43 -0
  155. data/lib/phronomy/engine/backpressure_error.rb +7 -0
  156. data/lib/phronomy/{blocking.rb → engine/blocking.rb} +1 -1
  157. data/lib/phronomy/engine/cancellation_error.rb +7 -0
  158. data/lib/phronomy/engine/concurrency/cancellation_token.rb +4 -0
  159. data/lib/phronomy/engine/concurrency/offload_pool.rb +4 -0
  160. data/lib/phronomy/engine/concurrency/operation_binding.rb +1 -1
  161. data/lib/phronomy/engine/concurrency/worker_input_restricted.rb +14 -0
  162. data/lib/phronomy/engine/event_loop.rb +158 -624
  163. data/lib/phronomy/engine/event_loop_reentrancy_error.rb +8 -0
  164. data/lib/phronomy/{execution.rb → engine/execution.rb} +0 -7
  165. data/lib/phronomy/{execution_cancellation_error.rb → engine/execution_cancellation_error.rb} +2 -0
  166. data/lib/phronomy/engine/execution_receiver.rb +65 -0
  167. data/lib/phronomy/{execution_timeout_error.rb → engine/execution_timeout_error.rb} +2 -0
  168. data/lib/phronomy/engine/fsm_protocol.rb +14 -0
  169. data/lib/phronomy/engine/fsm_session.rb +35 -28
  170. data/lib/phronomy/{invalid_async_entry_action_error.rb → engine/invalid_async_entry_action_error.rb} +2 -0
  171. data/lib/phronomy/{invalid_async_transition_action_error.rb → engine/invalid_async_transition_action_error.rb} +2 -0
  172. data/lib/phronomy/{invalid_async_workflow_action_error.rb → engine/invalid_async_workflow_action_error.rb} +2 -0
  173. data/lib/phronomy/engine/pool_shutdown_error.rb +7 -0
  174. data/lib/phronomy/engine/recursion_limit_error.rb +7 -0
  175. data/lib/phronomy/engine/runtime.rb +80 -84
  176. data/lib/phronomy/engine/runtime_shutdown_error.rb +7 -0
  177. data/lib/phronomy/engine/runtime_shutdown_reentrancy_error.rb +7 -0
  178. data/lib/phronomy/engine/scheduler_reentrancy_error.rb +9 -0
  179. data/lib/phronomy/engine/task_result.rb +4 -0
  180. data/lib/phronomy/engine/timeout_error.rb +7 -0
  181. data/lib/phronomy/filter/contract/filter_block_error.rb +14 -0
  182. data/lib/phronomy/generation/generator_verifier/agent_result_receiver.rb +89 -0
  183. data/lib/phronomy/generation/generator_verifier/pipeline_state.rb +57 -0
  184. data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +112 -0
  185. data/lib/phronomy/generation/generator_verifier.rb +118 -0
  186. data/lib/phronomy/generation/low_confidence_error.rb +14 -0
  187. data/lib/phronomy/llm_context_window/token_budget.rb +6 -7
  188. data/lib/phronomy/llm_contract/authentication_error.rb +7 -0
  189. data/lib/phronomy/{context_budget_exceeded_error.rb → llm_contract/context_budget_exceeded_error.rb} +2 -0
  190. data/lib/phronomy/llm_contract/context_length_error.rb +7 -0
  191. data/lib/phronomy/llm_contract/rate_limit_error.rb +7 -0
  192. data/lib/phronomy/{token_usage.rb → llm_contract/token_usage.rb} +2 -2
  193. data/lib/phronomy/llm_contract/transport_error.rb +7 -0
  194. data/lib/phronomy/multi_agent/admission_registry.rb +22 -2
  195. data/lib/phronomy/multi_agent/durable_subagent_coordinator.rb +5 -5
  196. data/lib/phronomy/{agent → multi_agent}/handoff_runner.rb +18 -17
  197. data/lib/phronomy/multi_agent/orchestrator.rb +2 -2
  198. data/lib/phronomy/multi_agent/persistence/codec.rb +55 -0
  199. data/lib/phronomy/multi_agent/persistence/queries.rb +30 -0
  200. data/lib/phronomy/multi_agent/persistence/team_execution_repository.rb +108 -0
  201. data/lib/phronomy/multi_agent/persistence/team_repository.rb +61 -0
  202. data/lib/phronomy/{agent → multi_agent}/shared_state.rb +56 -39
  203. data/lib/phronomy/multi_agent/storage_contract/team_storage_schema.rb +15 -0
  204. data/lib/phronomy/multi_agent/team_coordinator.rb +21 -18
  205. data/lib/phronomy/multi_agent/team_execution.rb +1 -1
  206. data/lib/phronomy/{engine/runtime → multi_agent}/team_ownership_registry.rb +14 -4
  207. data/lib/phronomy/multi_agent/team_root.rb +1 -1
  208. data/lib/phronomy/output_parser/contract/parse_error.rb +7 -0
  209. data/lib/phronomy/persistence/api/persistence.rb +140 -0
  210. data/lib/phronomy/persistence/migration/initial_format_migration.rb +19 -19
  211. data/lib/phronomy/persistence_composition/repositories.rb +77 -0
  212. data/lib/phronomy/persistence_composition/storage_schema.rb +24 -0
  213. data/lib/phronomy/{execution_rehydration_required_error.rb → recovery/execution_rehydration_required_error.rb} +2 -0
  214. data/lib/phronomy/{recovery.rb → recovery/recovery.rb} +1 -1
  215. data/lib/phronomy/runtime_composition/agent_defaults.rb +7 -0
  216. data/lib/phronomy/runtime_composition/configuration_defaults.rb +9 -0
  217. data/lib/phronomy/runtime_composition/global_runtime.rb +19 -0
  218. data/lib/phronomy/storage/backend.rb +101 -0
  219. data/lib/phronomy/storage/backends/in_memory.rb +157 -0
  220. data/lib/phronomy/storage/blob_conflict_error.rb +10 -0
  221. data/lib/phronomy/storage/blobs.rb +31 -0
  222. data/lib/phronomy/storage/condition.rb +25 -0
  223. data/lib/phronomy/storage/condition_failed_error.rb +16 -0
  224. data/lib/phronomy/storage/conflict_error.rb +9 -0
  225. data/lib/phronomy/{persistence → storage}/durable_record.rb +12 -12
  226. data/lib/phronomy/storage/entry.rb +33 -0
  227. data/lib/phronomy/storage/guard_ref.rb +13 -0
  228. data/lib/phronomy/storage/not_found_error.rb +9 -0
  229. data/lib/phronomy/storage/record_codec.rb +177 -0
  230. data/lib/phronomy/storage/records.rb +61 -0
  231. data/lib/phronomy/storage/resource.rb +126 -0
  232. data/lib/phronomy/storage/scope.rb +25 -0
  233. data/lib/phronomy/storage/serialization_error.rb +9 -0
  234. data/lib/phronomy/storage/streams.rb +44 -0
  235. data/lib/phronomy/storage/transaction_error.rb +10 -0
  236. data/lib/phronomy/storage/unique_constraint_error.rb +17 -0
  237. data/lib/phronomy/storage/unsupported_backend_error.rb +9 -0
  238. data/lib/phronomy/storage/validation.rb +53 -0
  239. data/lib/phronomy/storage/view.rb +131 -0
  240. data/lib/phronomy/testing/persistence_contract/a_content_store.rb +1 -1
  241. data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +4 -4
  242. data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +10 -7
  243. data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +2 -2
  244. data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +6 -6
  245. data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +6 -6
  246. data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +8 -8
  247. data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +263 -0
  248. data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +123 -0
  249. data/lib/phronomy/testing/persistence_contract.rb +4 -0
  250. data/lib/phronomy/tool/contract/tool_error.rb +7 -0
  251. data/lib/phronomy/tools/agent.rb +1 -1
  252. data/lib/phronomy/version.rb +1 -1
  253. data/lib/phronomy/{workflow.rb → workflow/execution/workflow.rb} +8 -6
  254. data/lib/phronomy/{workflow_context.rb → workflow/execution/workflow_context.rb} +4 -0
  255. data/lib/phronomy/workflow/execution/workflow_context_ownership_error.rb +7 -0
  256. data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +188 -0
  257. data/lib/phronomy/{workflow_runner.rb → workflow/execution/workflow_runner.rb} +122 -71
  258. data/lib/phronomy/workflow/execution/workflow_terminal_policy.rb +40 -0
  259. data/lib/phronomy/workflow/persistence/codec.rb +153 -0
  260. data/lib/phronomy/workflow/persistence/state_repository.rb +57 -0
  261. data/lib/phronomy/workflow/phase_machine_builder.rb +2 -2
  262. data/lib/phronomy/workflow/storage_contract/workflow_storage_schema.rb +9 -0
  263. data/lib/phronomy.rb +52 -94
  264. data/scripts/api_snapshot.rb +1 -1
  265. data/scripts/storage_spi_snapshot.rb +36 -0
  266. data/sig/phronomy/agent.rbs +0 -1
  267. data/sig/phronomy/execution_receiver.rbs +34 -0
  268. data/sig/phronomy/handoff.rbs +4 -2
  269. data/sig/phronomy/multi_agent.rbs +18 -0
  270. data/sig/phronomy/persistence.rbs +7 -91
  271. data/sig/phronomy/storage.rbs +174 -0
  272. data/sig/phronomy/tool.rbs +10 -1
  273. metadata +230 -99
  274. data/lib/phronomy/agent/execution_coordinator.rb +0 -3151
  275. data/lib/phronomy/agent/handoff_execution_coordinator.rb +0 -143
  276. data/lib/phronomy/agent/recovery_support.rb +0 -504
  277. data/lib/phronomy/agent/token_budget_resolver.rb +0 -70
  278. data/lib/phronomy/agent/tool_executor.rb +0 -55
  279. data/lib/phronomy/generator_verifier.rb +0 -369
  280. data/lib/phronomy/invalid_context_budget_configuration_error.rb +0 -8
  281. data/lib/phronomy/multi_agent/parallel_tool_chat.rb +0 -116
  282. data/lib/phronomy/persistence/durable_codec.rb +0 -706
  283. data/lib/phronomy/persistence/in_memory.rb +0 -690
  284. data/lib/phronomy/persistence/repository_facades.rb +0 -535
  285. data/lib/phronomy/persistence.rb +0 -276
  286. data/lib/phronomy/ruby_llm_patches.rb +0 -24
  287. data/lib/phronomy/workflow_recovery.rb +0 -123
  288. /data/lib/phronomy/agent/{context_candidate_resolver.rb → context_assembly/context_candidate_resolver.rb} +0 -0
  289. /data/lib/phronomy/agent/{context_policy_input_builder.rb → context_assembly/context_policy_input_builder.rb} +0 -0
  290. /data/lib/phronomy/agent/{context_plan_validator.rb → context_contract/context_plan_validator.rb} +0 -0
  291. /data/lib/phronomy/agent/{context_policy.rb → context_contract/context_policy.rb} +0 -0
  292. /data/lib/phronomy/agent/{llm_operation_result.rb → execution/llm_operation_result.rb} +0 -0
  293. /data/lib/phronomy/agent/{handoff.rb → handoff/handoff.rb} +0 -0
  294. /data/lib/phronomy/agent/{handoff_capability_factory.rb → handoff/handoff_capability_factory.rb} +0 -0
  295. /data/lib/phronomy/agent/{handoff_policy.rb → handoff/handoff_policy.rb} +0 -0
  296. /data/lib/phronomy/agent/{handoff_projection.rb → handoff/handoff_projection.rb} +0 -0
  297. /data/lib/phronomy/agent/{handoff_request.rb → handoff/handoff_request.rb} +0 -0
  298. /data/lib/phronomy/agent/{tool_invocation_session_builder.rb → tool_execution/tool_invocation_session_builder.rb} +0 -0
  299. /data/lib/phronomy/{canonical_json.rb → common/canonical_json.rb} +0 -0
  300. /data/lib/phronomy/{diagnostics.rb → engine/diagnostics.rb} +0 -0
  301. /data/lib/phronomy/{event.rb → engine/event.rb} +0 -0
  302. /data/lib/phronomy/{invocation_context.rb → engine/invocation_context.rb} +0 -0
  303. /data/lib/phronomy/{metrics.rb → engine/metrics.rb} +0 -0
  304. /data/lib/phronomy/{runnable.rb → engine/runnable.rb} +0 -0
@@ -1,10 +1,4 @@
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
- end
7
-
8
2
  # Runtime/domain-facing repository interfaces.
9
3
  interface _AgentRepository
10
4
  def create: (untyped root) -> untyped
@@ -40,37 +34,6 @@ module Phronomy
40
34
  # Backend-side record repository interfaces. DurableRecord is the opaque data
41
35
  # carrier. Identity/revision/index metadata is passed separately so backends do
42
36
  # not need to interpret DurableRecord#payload.
43
- interface _BackendAgentRecordRepository
44
- def create: (agent_id: String, agent_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
45
- def load: (String agent_id) -> Persistence::DurableRecord
46
- def save: (String agent_id, expected_revision: Integer, next_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
47
- def delete: (String agent_id) -> untyped
48
- end
49
-
50
- interface _BackendJournalRecordRepository
51
- def append: (String agent_id, expected_position: Integer, records: Array[Persistence::DurableRecord], record_ids: Array[String]) -> Array[Persistence::DurableRecord]
52
- def read: (String agent_id, ?after: Integer?, ?limit: Integer?) -> Array[Persistence::DurableRecord]
53
- def head: (String agent_id) -> Integer
54
- def delete: (String agent_id) -> untyped
55
- end
56
-
57
- interface _BackendExecutionRecordRepository
58
- def create_active: (execution_id: String, agent_id: String, execution_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
59
- def load: (String execution_id) -> Persistence::DurableRecord
60
- def save: (String execution_id, expected_revision: Integer, next_revision: Integer, agent_id: String, active: bool, record: Persistence::DurableRecord) -> Persistence::DurableRecord
61
- def list_active: (String agent_id) -> Array[Persistence::DurableRecord]
62
- def list: (String agent_id, ?after: String?, ?limit: Integer) -> Array[Persistence::DurableRecord]
63
- def delete: (String execution_id) -> untyped
64
- def delete_for_agent: (String agent_id) -> untyped
65
- def assert_idle!: (String agent_id) -> untyped
66
- end
67
-
68
- interface _BackendWorkflowStateRecordRepository
69
- def load: (String workflow_instance_id) -> Persistence::DurableRecord?
70
- def save: (String workflow_instance_id, expected_revision: Integer?, next_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
71
- def delete: (String workflow_instance_id, expected_revision: Integer) -> untyped
72
- end
73
-
74
37
  interface _HandoffStateRepository
75
38
  def load: (String main_agent_id) -> untyped
76
39
  def save: (String main_agent_id, expected_revision: Integer?, state: untyped) -> untyped
@@ -95,34 +58,6 @@ module Phronomy
95
58
  def assert_idle!: (String team_id) -> untyped
96
59
  end
97
60
 
98
- interface _BackendHandoffStateRecordRepository
99
- def load: (String main_agent_id) -> Persistence::DurableRecord?
100
- def save: (String main_agent_id, expected_revision: Integer?, next_revision: Integer, active_agent_id: String, record: Persistence::DurableRecord) -> Persistence::DurableRecord
101
- def delete: (String main_agent_id, expected_revision: Integer) -> untyped
102
- end
103
-
104
- interface _BackendTeamRecordRepository
105
- def create: (team_id: String, team_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
106
- def load: (String team_id) -> Persistence::DurableRecord
107
- def save: (String team_id, expected_revision: Integer, next_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
108
- def delete: (String team_id) -> untyped
109
- end
110
-
111
- interface _BackendTeamExecutionRecordRepository
112
- def create_active: (team_execution_id: String, team_id: String, execution_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
113
- def load: (String team_execution_id) -> Persistence::DurableRecord
114
- def save: (String team_execution_id, expected_revision: Integer, next_revision: Integer, team_id: String, active: bool, record: Persistence::DurableRecord) -> Persistence::DurableRecord
115
- def list_active: (String team_id) -> Array[Persistence::DurableRecord]
116
- def list: (String team_id, ?after: String?, ?limit: Integer) -> Array[Persistence::DurableRecord]
117
- def delete: (String team_execution_id) -> untyped
118
- def delete_for_team: (String team_id) -> untyped
119
- def assert_idle!: (String team_id) -> untyped
120
- end
121
-
122
- interface _BackendWatermark
123
- def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
124
- end
125
-
126
61
  interface _PersistenceTransactionView
127
62
  def contents: () -> _ContentRepository
128
63
  def agents: () -> _AgentRepository
@@ -136,36 +71,16 @@ module Phronomy
136
71
  end
137
72
 
138
73
  class Persistence
139
- class ConflictError < Phronomy::Error
140
- end
141
- class NotFoundError < Phronomy::Error
142
- end
143
- class UnsupportedBackendError < Phronomy::Error
144
- end
145
- class SerializationError < Phronomy::Error
146
- end
147
-
148
- class DurableRecord
149
- FORMAT_VERSION_PATTERN: Regexp
150
- attr_reader record_type: String
151
- attr_reader format_version: String
152
- attr_reader payload: Hash[String, untyped]
153
- def initialize: (record_type: String, format_version: String, payload: Hash[String, untyped]) -> void
154
- def copy: () -> DurableRecord
155
- end
156
-
157
74
  module Migration
158
75
  module InitialFormatMigration
159
- def self.agent_root: (Hash[untyped, untyped] hash) -> DurableRecord
160
- def self.agent_execution: (Hash[untyped, untyped] hash) -> DurableRecord
161
- def self.journal_record: (Hash[untyped, untyped] hash) -> DurableRecord
162
- def self.workflow_state: (workflow_instance_id: String, revision: Integer, snapshot: Hash[untyped, untyped]) -> DurableRecord
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
163
80
  def self.llm_input_manifest: (Hash[untyped, untyped] hash) -> Hash[String, untyped]
164
81
  end
165
82
  end
166
83
 
167
- REQUIRED_CAPABILITIES: Hash[Symbol, bool]
168
-
169
84
  attr_reader contents: _ContentRepository
170
85
  attr_reader agents: _AgentRepository
171
86
  attr_reader journals: _JournalRepository
@@ -180,10 +95,11 @@ module Phronomy
180
95
  def team_execution_result: (String team_execution_id) -> Hash[Symbol, untyped]
181
96
  def list_team_executions: (String team_id, ?after: String?, ?limit: Integer) -> Array[untyped]
182
97
 
183
- def initialize: (contents: _ContentRepository, agents: _BackendAgentRecordRepository, journals: _BackendJournalRecordRepository, executions: _BackendExecutionRecordRepository, workflow_states: _BackendWorkflowStateRecordRepository, handoff_states: _BackendHandoffStateRecordRepository, teams: _BackendTeamRecordRepository, team_executions: _BackendTeamExecutionRecordRepository) -> void
98
+ attr_reader backend: _StorageBackend
99
+ def initialize: (backend: _StorageBackend) -> void
100
+ def self.in_memory: () -> Persistence
184
101
  def capabilities: () -> Hash[Symbol, bool]
185
102
  def transaction: () { (_PersistenceTransactionView) -> untyped } -> untyped
186
- def build_transaction_view: (contents: _ContentRepository, agents: _BackendAgentRecordRepository, journals: _BackendJournalRecordRepository, executions: _BackendExecutionRecordRepository, workflow_states: _BackendWorkflowStateRecordRepository, handoff_states: _BackendHandoffStateRecordRepository, teams: _BackendTeamRecordRepository, team_executions: _BackendTeamExecutionRecordRepository, watermark: _BackendWatermark) -> _PersistenceTransactionView
187
103
  def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
188
104
  end
189
105
  end
@@ -0,0 +1,174 @@
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
+ interface _StorageBackend
14
+ def view: () -> Storage::View
15
+ def capabilities: () -> Hash[Symbol, bool | Integer]
16
+ def transaction: [T] () { (Storage::View) -> T } -> T
17
+ end
18
+
19
+ module Storage
20
+ type attributes = Hash[Symbol, String | Integer | bool | nil]
21
+ type resource_ref = Resource | String
22
+ type condition = Condition::RevisionIs | Condition::StreamHeadIs | Condition::NoRows
23
+
24
+ class ConflictError < Phronomy::Error
25
+ end
26
+ class UniqueConstraintError < ConflictError
27
+ attr_reader resource: String
28
+ attr_reader constraint: Symbol
29
+ def initialize: (resource: Resource, constraint: Symbol) -> void
30
+ end
31
+ class ConditionFailedError < ConflictError
32
+ attr_reader condition: condition
33
+ def initialize: (condition) -> void
34
+ end
35
+ class BlobConflictError < ConflictError
36
+ end
37
+ class TransactionError < Phronomy::Error
38
+ end
39
+ class NotFoundError < Phronomy::Error
40
+ end
41
+ class UnsupportedBackendError < Phronomy::Error
42
+ end
43
+ class SerializationError < Phronomy::Error
44
+ end
45
+
46
+ class DurableRecord
47
+ FORMAT_VERSION_PATTERN: Regexp
48
+ attr_reader record_type: String
49
+ attr_reader format_version: String
50
+ attr_reader payload: Hash[String, untyped]
51
+ def initialize: (record_type: String, format_version: String, payload: Hash[String, untyped]) -> void
52
+ def copy: () -> DurableRecord
53
+ end
54
+
55
+ class Resource
56
+ attr_reader id: String
57
+ attr_reader kind: Symbol
58
+ attr_reader attributes: Hash[Symbol, Symbol]
59
+ attr_reader immutable_attributes: Array[Symbol]
60
+ attr_reader indexes: Hash[Symbol, Array[Symbol]]
61
+ attr_reader unique: Array[Hash[Symbol, untyped]]
62
+ attr_reader guard: Hash[Symbol, untyped]?
63
+ def initialize: (id: String, kind: Symbol, ?attributes: Hash[Symbol, Symbol], ?immutable_attributes: Array[Symbol], ?indexes: Hash[Symbol, Array[Symbol]], ?unique: Array[Hash[Symbol, untyped]], ?guard: Hash[Symbol, untyped]?) -> void
64
+ def validate_attributes: (attributes, ?partial: bool) -> attributes
65
+ def index_values: (Symbol, attributes) -> attributes
66
+ end
67
+
68
+ module Entry
69
+ class Record
70
+ attr_reader key: String
71
+ attr_reader revision: Integer
72
+ attr_reader attributes: attributes
73
+ attr_reader record: DurableRecord
74
+ def initialize: (key: String, revision: Integer, attributes: attributes, record: DurableRecord) -> void
75
+ def to_h: () -> Hash[Symbol, untyped]
76
+ end
77
+ class Append
78
+ attr_reader id: String
79
+ attr_reader record: DurableRecord
80
+ def initialize: (id: String, record: DurableRecord) -> void
81
+ def to_h: () -> Hash[Symbol, untyped]
82
+ end
83
+ class Stream
84
+ attr_reader position: Integer
85
+ attr_reader id: String
86
+ attr_reader record: DurableRecord
87
+ def initialize: (position: Integer, id: String, record: DurableRecord) -> void
88
+ def to_h: () -> Hash[Symbol, untyped]
89
+ end
90
+ class Blob
91
+ attr_reader key: String
92
+ attr_reader bytes: String
93
+ attr_reader attributes: attributes
94
+ def initialize: (key: String, bytes: String, attributes: attributes) -> void
95
+ def to_h: () -> Hash[Symbol, untyped]
96
+ end
97
+ end
98
+
99
+ class GuardRef
100
+ attr_reader resource: resource_ref
101
+ attr_reader key: String
102
+ def initialize: (resource: resource_ref, key: String) -> void
103
+ end
104
+ module Condition
105
+ class RevisionIs
106
+ attr_reader resource: resource_ref
107
+ attr_reader key: String
108
+ attr_reader expected: Integer
109
+ def initialize: (resource: resource_ref, key: String, expected: Integer) -> void
110
+ end
111
+ class StreamHeadIs
112
+ attr_reader resource: resource_ref
113
+ attr_reader stream: String
114
+ attr_reader expected: Integer
115
+ def initialize: (resource: resource_ref, stream: String, expected: Integer) -> void
116
+ end
117
+ class NoRows
118
+ attr_reader resource: resource_ref
119
+ attr_reader index: Symbol
120
+ attr_reader equals: attributes
121
+ def initialize: (resource: resource_ref, index: Symbol, equals: attributes) -> void
122
+ end
123
+ end
124
+
125
+ class Records
126
+ UNCHECKED: Object
127
+ attr_reader resource: Resource
128
+ def initialize: (View, Resource) -> void
129
+ def insert: (key: String, revision: Integer, attributes: attributes, record: DurableRecord) -> Entry::Record
130
+ def read: (String) -> Entry::Record?
131
+ def fetch: (String) -> Entry::Record
132
+ def replace: (key: String, expected_revision: Integer, next_revision: Integer, attributes: attributes, record: DurableRecord, ?expected_attributes: attributes) -> Entry::Record
133
+ def delete: (key: String, ?expected_revision: Integer | Object) -> nil
134
+ def scan: (index: Symbol, equals: attributes, ?after: String?, ?limit: Integer?) -> Array[Entry::Record]
135
+ def delete_matching: (index: Symbol, equals: attributes) -> nil
136
+ end
137
+ class Streams
138
+ attr_reader resource: Resource
139
+ def initialize: (View, Resource) -> void
140
+ def append: (stream: String, expected_head: Integer, entries: Array[Entry::Append]) -> Array[Entry::Stream]
141
+ def read: (stream: String, ?after: Integer, ?limit: Integer?) -> Array[Entry::Stream]
142
+ def head: (stream: String) -> Integer
143
+ def delete: (stream: String) -> nil
144
+ end
145
+ class Blobs
146
+ attr_reader resource: Resource
147
+ def initialize: (View, Resource) -> void
148
+ def put_if_absent: (key: String, bytes: String, attributes: attributes) -> Entry::Blob
149
+ def fetch: (String) -> Entry::Blob
150
+ def exist?: (String) -> bool
151
+ end
152
+ class View
153
+ def records: (resource_ref) -> Records
154
+ def streams: (resource_ref) -> Streams
155
+ def blobs: (resource_ref) -> Blobs
156
+ def check!: (guards: Array[GuardRef], conditions: Array[condition]) -> true
157
+ def atomic: [T] () { (View) -> T } -> T
158
+ end
159
+ class Backend
160
+ REQUIRED_CAPABILITIES: Hash[Symbol, bool | Integer]
161
+ attr_reader resources: Hash[String, Resource]
162
+ attr_reader view: View
163
+ def initialize: (resources: Array[Resource]) -> void
164
+ def self.validate_capabilities!: (_StorageBackend backend) -> void
165
+ def capabilities: () -> Hash[Symbol, bool | Integer]
166
+ def transaction: [T] () { (View) -> T } -> T
167
+ end
168
+ module Backends
169
+ class InMemory < Backend
170
+ def initialize: (?resources: Array[Resource]) -> void
171
+ end
172
+ end
173
+ end
174
+ end
@@ -4,7 +4,12 @@ module Phronomy
4
4
  def self.tool_name: (?untyped value) -> String?
5
5
  def self.description: (?String text) -> String?
6
6
  def self.desc: (?String text) -> String?
7
- def self.parameters: () -> Hash[untyped, untyped]
7
+ def self.parameters: (?untyped schema) ?{ () -> untyped } -> untyped
8
+ def self.declared_parameters: () -> Hash[untyped, untyped]
9
+ def self.parameters_schema_definition: () -> untyped
10
+ def self.params: (?untyped schema) ?{ () -> untyped } -> untyped
11
+ def self.provider_options: (?untyped options) -> Hash[untyped, untyped]
12
+ def self.with_params: (**untyped options) -> untyped
8
13
  def self.params_schema_definition: () -> untyped
9
14
  def self.provider_params: () -> Hash[untyped, untyped]
10
15
  def self.param: (untyped name, ?enum: untyped, ?properties: untyped, **untyped options) -> untyped
@@ -19,6 +24,10 @@ module Phronomy
19
24
  def self.max_result_size: (?untyped value) -> untyped
20
25
 
21
26
  def name: () -> String
27
+ def parameters_schema: () -> untyped
28
+ def parameters: () -> Hash[untyped, untyped]
29
+ def provider_options: () -> Hash[untyped, untyped]
30
+ def provider_params: () -> Hash[untyped, untyped]
22
31
  def params_schema: () -> untyped
23
32
  def call: (Hash[untyped, untyped] args, ?cancellation_token: Concurrency::CancellationToken?) -> untyped
24
33
  def call_async: (Hash[untyped, untyped] args, ?cancellation_token: Concurrency::CancellationToken?, ?config: Hash[untyped, untyped]) -> TaskResult[untyped]