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,132 @@
1
+ module Phronomy
2
+
3
+ module Agent
4
+ type execution_wiring = { ?phronomy_execution_participant: _ExecutionParticipant, ?phronomy_control_bindings: Array[_ControlCapability], ?phronomy_transfer_context: TransferContext, ?phronomy_admission: _AdmissionOwner, ?phronomy_reservation: Hash[String, json_value] }
5
+ type execution_result = { agent_id: String, execution_id: String, status: Symbol, result: String?, output: String?, error: Hash[String, json_value]? }
6
+
7
+ class ReservedExecution < Data
8
+ attr_reader agent_id: String
9
+ attr_reader execution_id: String
10
+ attr_reader correlation: Hash[String, json_value]?
11
+ def self.new: (agent_id: String, execution_id: String, ?correlation: Hash[String, json_value]?) -> instance
12
+ end
13
+
14
+ class ExecutionObservation < Data
15
+ attr_reader agent_id: String
16
+ attr_reader execution_id: String
17
+ attr_reader status: Symbol
18
+ attr_reader result: String?
19
+ attr_reader error: Hash[String, json_value]?
20
+ attr_reader reservation: ReservedExecution?
21
+ attr_reader transfer_receipt: Hash[String, json_value]?
22
+ attr_reader cancellation_requested: bool
23
+ def self.new: (agent_id: String, execution_id: String, status: Symbol, result: String?, error: Hash[String, json_value]?, reservation: ReservedExecution?, transfer_receipt: Hash[String, json_value]?, cancellation_requested: bool) -> instance
24
+ def self.from_result: (execution_result) -> instance
25
+ def absent?: () -> bool
26
+ def terminal?: () -> bool
27
+ def active?: () -> bool
28
+ def continuable?: () -> bool
29
+ def value!: () -> execution_result
30
+ def to_result: () -> execution_result
31
+ end
32
+
33
+ class ExecutionExtensionState < Data
34
+ attr_reader binding_key: String
35
+ attr_reader binding_version: Integer
36
+ attr_reader state_ref: String?
37
+ def self.new: (binding_key: String, binding_version: Integer, ?state_ref: String?) -> instance
38
+ def self.from_h: (Hash[String, json_value]) -> instance
39
+ def to_h: () -> Hash[String, json_value]
40
+ end
41
+
42
+ class KnowledgeItem < Data
43
+ attr_reader content: String
44
+ attr_reader metadata: Hash[String, json_value]
45
+ def self.new: (content: String, ?metadata: Hash[String, json_value]) -> instance
46
+ end
47
+
48
+ class Retention < Data
49
+ attr_reader agent_id: String
50
+ attr_reader execution_id: String?
51
+ attr_reader owner_key: String
52
+ def self.new: (agent_id: String, owner_key: String, ?execution_id: String?) -> instance
53
+ def to_h: () -> Hash[String, json_value]
54
+ end
55
+
56
+ class ControlRequest < Data
57
+ attr_reader target_agent_id: String
58
+ attr_reader responsibility: String
59
+ attr_reader selection: Hash[Symbol, bool]
60
+ attr_reader llm_call_id: String?
61
+ attr_reader tool_call_id: String?
62
+ def self.new: (target_agent_id: String, responsibility: String, selection: Hash[Symbol, bool], ?llm_call_id: String?, ?tool_call_id: String?) -> instance
63
+ end
64
+
65
+ interface _ControlCapability
66
+ def source_agent_id: () -> String
67
+ def request: (arguments: Hash[String, json_value], llm_call_id: String?, tool_call_id: String?) -> ControlRequest
68
+ end
69
+
70
+ interface _ExecutionParticipant
71
+ def binding: () -> ExecutionExtensionState
72
+ def guard_change: (ExecutionChange change, ::Phronomy::Persistence::Transaction scope) -> void
73
+ def change_evidence: (ExecutionChange change, ::Phronomy::Persistence::Transaction scope) -> json_value
74
+ def commit: (ExecutionChange change) -> void
75
+ end
76
+
77
+ class ExecutionChange
78
+ attr_reader kind: :dispatch | :terminal
79
+ attr_reader agent_id: String
80
+ attr_reader execution_id: String
81
+ attr_reader extension: ExecutionExtensionState?
82
+ attr_reader operations: Array[Store::AuthorizedOperation]
83
+ attr_reader control_request: ControlRequest?
84
+ attr_reader cancel_requested: bool
85
+ attr_reader recovery_required: bool
86
+ attr_reader durable_context: Hash[String, json_value]?
87
+ attr_reader correlation: Hash[String, json_value]?
88
+ attr_reader coordinator: ::Phronomy::Persistence
89
+ def finishing?: () -> bool
90
+ def prepare_in: (::Phronomy::Persistence::Transaction scope) -> nil
91
+ def commit_in: (::Phronomy::Persistence::Transaction scope, ?state: ExecutionExtensionState?, ?transfer_receipt: Hash[String, json_value]?, ?pending: bool) -> nil
92
+ def transfer_context: (::Phronomy::Persistence::Transaction scope) -> TransferContext
93
+ end
94
+
95
+ class TransferContext
96
+ attr_reader responsibility: String
97
+ attr_reader items: Array[Item]
98
+ def self.from_h: (Hash[String, json_value]) -> instance
99
+ def initialize: (responsibility: String, ?items: Array[Item]) -> void
100
+ def to_h: () -> Hash[String, json_value]
101
+ class Item < Data
102
+ attr_reader candidate_category: Symbol
103
+ attr_reader policy_category: Symbol
104
+ attr_reader role: Symbol?
105
+ attr_reader content: json_value
106
+ attr_reader content_format: Symbol
107
+ attr_reader tool_call_id: String?
108
+ attr_reader provenance: Provenance
109
+ attr_reader metadata: Hash[String, json_value]
110
+ end
111
+ class Provenance < Data
112
+ attr_reader origin_agent_id: String?
113
+ attr_reader origin_record_id: String?
114
+ attr_reader origin_execution_id: String?
115
+ attr_reader origin_llm_call_id: String?
116
+ attr_reader origin_tool_call_id: String?
117
+ attr_reader transfer_path: Array[String]
118
+ def forwarded_to: (String agent_id) -> instance
119
+ def to_h: () -> Hash[String, json_value]
120
+ end
121
+ end
122
+ end
123
+
124
+ class Persistence
125
+ class SaveOutcome < Data
126
+ attr_reader disposition: :committed | :not_committed | :unknown
127
+ attr_reader original_error: Exception?
128
+ attr_reader read_error: Exception?
129
+ def self.compare: [V] (before: V, after: V, ?original_error: Exception?) { () -> V } -> instance
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,20 @@
1
+ module Phronomy
2
+ module Agent
3
+ # Private composition port; serial ownership and routing are process-local.
4
+ class ExecutionEnvironment
5
+ def self.install_provider: (^() -> ExecutionEnvironment provider) -> untyped
6
+ def self.current: () -> ExecutionEnvironment
7
+ def registry: () -> untyped
8
+ def existing_registry: () -> untyped
9
+ def ownership: () -> untyped
10
+ def existing_ownership: () -> untyped
11
+ def executing?: () -> bool
12
+ def session_phase: (String id) -> Symbol?
13
+ def submit: [V] (**untyped options) { () -> V } -> TaskResult[V]
14
+ def submit_authorization: [V] (timeout: Numeric?, cancellation_token: Concurrency::CancellationToken?) { () -> V } -> TaskResult[V]
15
+ def build_agent_session: (invocation: untyped, ?resume_event: Symbol?, ?resume_phase: Symbol?) -> untyped
16
+ def build_tool_session: (invocation: untyped, parent_sink: untyped, ?resume_event: Symbol?, ?resume_phase: Symbol?) -> untyped
17
+ def register_session: (untyped session, completion: TaskResult[untyped]) -> untyped
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,73 @@
1
+ module Phronomy
2
+ interface _AgentRepository
3
+ def create: (untyped root) -> untyped
4
+ def load: (String agent_id) -> untyped
5
+ def save: (String agent_id, expected_revision: Integer, root: untyped) -> untyped
6
+ def delete: (String agent_id) -> untyped
7
+ end
8
+
9
+ interface _JournalRepository
10
+ def append: (String agent_id, expected_position: Integer, records: Array[untyped]) -> Array[untyped]
11
+ def read: (String agent_id, ?after: Integer?, ?limit: Integer?) -> Array[untyped]
12
+ def head: (String agent_id) -> Integer
13
+ def delete: (String agent_id) -> untyped
14
+ end
15
+
16
+ interface _ExecutionRepository
17
+ def create_active: (untyped execution) -> untyped
18
+ def load: (String execution_id) -> untyped
19
+ def save: (String execution_id, expected_revision: Integer, execution: untyped) -> untyped
20
+ def list_active: (String agent_id) -> Array[untyped]
21
+ def list: (String agent_id, ?after: String?, ?limit: Integer) -> Array[untyped]
22
+ def delete: (String execution_id) -> untyped
23
+ def delete_for_agent: (String agent_id) -> untyped
24
+ def assert_idle!: (String agent_id) -> untyped
25
+ end
26
+
27
+ module Agent
28
+ interface _Records
29
+ def contents: () -> _ContentRepository
30
+ def agents: () -> _AgentRepository
31
+ def journals: () -> _JournalRepository
32
+ def executions: () -> _ExecutionRepository
33
+ def guard_agent!: (String agent_id) -> untyped
34
+ def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
35
+ end
36
+
37
+ class Store
38
+ class AuthorizedOperation < Data
39
+ attr_reader invocation_id: String
40
+ attr_reader name: String
41
+ attr_reader arguments: Hash[String, json_value]
42
+ def self.new: (invocation_id: String, name: String, arguments: Hash[String, json_value]) -> instance
43
+ end
44
+
45
+ attr_reader coordinator: ::Phronomy::Persistence
46
+ attr_reader contents: _ContentRepository
47
+ attr_reader agents: _AgentRepository
48
+ attr_reader journals: _JournalRepository
49
+ attr_reader executions: _ExecutionRepository
50
+ def initialize: (coordinator: ::Phronomy::Persistence, records: ::Phronomy::Persistence::_Participant[_Records]) -> void
51
+ def transaction: [R] () { (_Records, ::Phronomy::Persistence::Transaction) -> R } -> R
52
+ def participate: [R] (::Phronomy::Persistence::Transaction scope) { (_Records) -> R } -> R
53
+ def exist?: (String agent_id) -> bool
54
+ def authorized_operations: (::Phronomy::Persistence::Transaction scope, agent_id: String, execution_id: String, invocation_id: String, name: String, arguments: Hash[String, untyped], names: Array[String]) -> Array[AuthorizedOperation]
55
+ def result: (String execution_id) -> Hash[Symbol, untyped]
56
+ def runs: (String owner_id, ?after: String?, ?limit: Integer) -> Array[untyped]
57
+ def observe_execution: (agent_id: String, execution_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> ExecutionObservation
58
+ def active_executions: (agent_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> Array[ExecutionObservation]
59
+ def definition: (agent_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> { id: String, version: Integer }
60
+ def knowledge_snapshot: (agent_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> Array[KnowledgeItem]
61
+ def execution_extension: (agent_id: String, execution_id: String, binding_key: String, ?scope: ::Phronomy::Persistence::Transaction?) -> ExecutionExtensionState?
62
+ def guard_agents: (::Phronomy::Persistence::Transaction scope, agent_ids: Array[String]) -> nil
63
+ def remove_execution_extension: (agent_id: String, execution_id: String, binding_key: String, scope: ::Phronomy::Persistence::Transaction) -> nil
64
+ def execution_identity: (String execution_id, ?scope: ::Phronomy::Persistence::Transaction?) -> ReservedExecution
65
+ def retained_references: (agent_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> Array[Retention]
66
+ def retain: (Retention retention, ?scope: ::Phronomy::Persistence::Transaction?) -> Retention
67
+ def release_retention: (agent_id: String, owner_key: String, scope: ::Phronomy::Persistence::Transaction) -> nil
68
+ def request_cancellation: (agent_id: String, execution_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> bool
69
+ def cancellation_requested?: (agent_id: String, execution_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> bool
70
+ def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,8 @@
1
+ module Phronomy
2
+ class StreamCallbackError < Error
3
+ attr_reader event_type: Symbol
4
+ attr_reader original_error: Exception
5
+ attr_reader result: untyped
6
+ def initialize: (event_type: Symbol, original_error: Exception, ?result: untyped, ?code: String?) -> void
7
+ end
8
+ end
@@ -1,25 +1,23 @@
1
1
  module Phronomy
2
2
  module Agent
3
- interface _BeforeLLMInputHook
4
- def call: (LLMInputBuildContext context) -> LLMInputPatch?
3
+ # The block's TaskResult is awaited and unwrapped; Scope itself is process-local.
4
+ def self.open_scope: [R] () { (Scope) -> (R | Phronomy::TaskResult[R]) } -> R
5
+
6
+ class Scope
7
+ def create: (singleton(Base) agent_class, **untyped options) ?{ (untyped event) -> void } -> Base
8
+ def create_async: (singleton(Base) agent_class, **untyped options) ?{ (untyped event) -> void } -> Phronomy::TaskResult[Base]
9
+ def load: (singleton(Base) agent_class, String agent_id, persistence: Store, **untyped options) ?{ (untyped event) -> void } -> Base
10
+ def load_async: (singleton(Base) agent_class, String agent_id, persistence: Store, **untyped options) ?{ (untyped event) -> void } -> Phronomy::TaskResult[Base]
5
11
  end
6
12
 
7
- class LLMInputPatch
8
- attr_reader model_config_patch: Hash[untyped, untyped]?
9
- attr_reader segment_candidates: Array[untyped]?
10
-
11
- def initialize: (?model_config_patch: Hash[untyped, untyped]?, ?segment_candidates: Array[untyped]?) -> void
12
- def self.empty: () -> LLMInputPatch
13
+ class ScopeCleanupError < Phronomy::Error
14
+ attr_reader failures: Array[{ agent_id: String, error: Exception }]
15
+ attr_reader result: untyped
16
+ def initialize: (failures: Array[{ agent_id: String, error: Exception }], result: untyped) -> void
13
17
  end
14
18
 
15
- class LLMInputBuildContext
16
- attr_reader agent_id: String
17
- attr_reader agent_definition_id: String
18
- attr_reader agent_definition_version: Integer
19
- attr_reader config: Hash[untyped, untyped]
20
- attr_reader call_sequence: Integer
21
-
22
- def initialize: (agent_id: String, agent_definition_id: String, agent_definition_version: Integer, ?config: Hash[untyped, untyped], call_sequence: Integer) -> void
19
+ interface _BeforeLLMInputHook
20
+ def call: (Phronomy::Context::LLMInputBuildContext context) -> Phronomy::Context::LLMInputPatch?
23
21
  end
24
22
 
25
23
  class ToolApprovalRequest
@@ -67,118 +65,6 @@ module Phronomy
67
65
  def initialize: (agent_id: String, agent_definition_id: String, agent_definition_version: Integer, execution_id: String, tool_name: String, tool_schema: Hash[untyped, untyped], tool_invocation_id: String, tool_call_id: String?, arguments: Hash[untyped, untyped], ?facts: Hash[untyped, untyped], ?invocation_context: Hash[untyped, untyped], ?origin: Symbol, ?metadata: Hash[untyped, untyped], ?default_decision: Symbol?) -> void
68
66
  end
69
67
 
70
- class LLMInputManifest
71
- VERSION: String
72
- CALL_MODES: Array[Symbol]
73
- SEGMENT_DELIVERIES: Array[String]
74
-
75
- def self.from_h: (Hash[String, untyped] hash) -> LLMInputManifest
76
- def version: () -> String
77
- def to_h: () -> Hash[String, untyped]
78
- end
79
-
80
- class ContextPolicyInput
81
- class Provenance
82
- attr_reader origin: Symbol
83
- attr_reader content_ref: String?
84
- attr_reader record_id: String?
85
- attr_reader agent_id: String?
86
- attr_reader execution_id: String?
87
- attr_reader llm_call_id: String?
88
- def initialize: (origin: Symbol, ?content_ref: String?, ?record_id: String?, ?agent_id: String?, ?execution_id: String?, ?llm_call_id: String?) -> void
89
- end
90
-
91
- class InstructionItem
92
- attr_reader id: String
93
- attr_reader kind: Symbol
94
- attr_reader role: Symbol?
95
- attr_reader content: untyped
96
- attr_reader content_format: Symbol
97
- attr_reader estimated_tokens: Integer
98
- attr_reader required: bool
99
- attr_reader provenance: Provenance
100
- attr_reader metadata: Hash[untyped, untyped]
101
- def initialize: (id: String, kind: Symbol, ?role: Symbol?, content: untyped, ?content_format: Symbol?, ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?metadata: Hash[untyped, untyped]) -> void
102
- def required?: () -> bool
103
- end
104
-
105
- class KnowledgeItem
106
- attr_reader id: String
107
- attr_reader kind: Symbol
108
- attr_reader role: Symbol?
109
- attr_reader content: untyped
110
- attr_reader content_format: Symbol
111
- attr_reader estimated_tokens: Integer
112
- attr_reader required: bool
113
- attr_reader provenance: Provenance
114
- attr_reader metadata: Hash[untyped, untyped]
115
- def initialize: (id: String, kind: Symbol, ?role: Symbol?, content: untyped, ?content_format: Symbol?, ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?metadata: Hash[untyped, untyped]) -> void
116
- def required?: () -> bool
117
- end
118
-
119
- class ToolItem
120
- attr_reader id: String
121
- attr_reader definition: Hash[untyped, untyped]
122
- attr_reader estimated_tokens: Integer
123
- attr_reader required: bool
124
- attr_reader provenance: Provenance
125
- attr_reader metadata: Hash[untyped, untyped]
126
- def initialize: (id: String, definition: Hash[untyped, untyped], ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?metadata: Hash[untyped, untyped]) -> void
127
- def required?: () -> bool
128
- end
129
-
130
- class ConversationItem
131
- attr_reader id: String
132
- attr_reader kind: Symbol
133
- attr_reader role: Symbol?
134
- attr_reader content: untyped
135
- attr_reader content_format: Symbol
136
- attr_reader sequence: Integer?
137
- attr_reader estimated_tokens: Integer
138
- attr_reader required: bool
139
- attr_reader provenance: Provenance
140
- attr_reader tool_call_id: String?
141
- attr_reader tool_call_ids: Array[String]
142
- attr_reader delivery: Symbol
143
- attr_reader metadata: Hash[untyped, untyped]
144
- def initialize: (id: String, kind: Symbol, ?role: Symbol?, content: untyped, ?content_format: Symbol?, ?sequence: Integer?, ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?tool_call_id: String?, ?tool_call_ids: Array[String], ?delivery: Symbol, ?metadata: Hash[untyped, untyped]) -> void
145
- def required?: () -> bool
146
- def with_required: (bool required) -> ConversationItem
147
- end
148
-
149
- attr_reader agent_id: String
150
- attr_reader execution_id: String?
151
- attr_reader call_sequence: Integer
152
- attr_reader call_mode: Symbol
153
- attr_reader instruction: Array[InstructionItem]
154
- attr_reader knowledge: Array[KnowledgeItem]
155
- attr_reader tools: Array[ToolItem]
156
- attr_reader conversation: Array[Array[ConversationItem]]
157
- attr_reader token_budget: untyped
158
- attr_reader model_config: Hash[untyped, untyped]
159
- attr_reader previous_manifest: LLMInputManifest?
160
- attr_reader metadata: Hash[untyped, untyped]
161
- def initialize: (agent_id: String, ?execution_id: String?, call_sequence: Integer, call_mode: Symbol, ?instruction: Array[InstructionItem], ?knowledge: Array[KnowledgeItem], ?tools: Array[ToolItem], ?conversation: Array[Array[ConversationItem]], token_budget: untyped, ?model_config: Hash[untyped, untyped], previous_manifest: LLMInputManifest?, ?metadata: Hash[untyped, untyped]) -> void
162
- end
163
-
164
- class ContextPlan
165
- attr_reader instruction: Array[ContextPolicyInput::InstructionItem]
166
- attr_reader knowledge: Array[ContextPolicyInput::KnowledgeItem]
167
- attr_reader tools: Array[ContextPolicyInput::ToolItem]
168
- attr_reader conversation: Array[Array[ContextPolicyInput::ConversationItem]]
169
- attr_reader metadata: Hash[untyped, untyped]
170
- def initialize: (?instruction: Array[ContextPolicyInput::InstructionItem], ?knowledge: Array[ContextPolicyInput::KnowledgeItem], ?tools: Array[ContextPolicyInput::ToolItem], ?conversation: Array[Array[ContextPolicyInput::ConversationItem]], ?metadata: Hash[untyped, untyped]) -> void
171
- end
172
-
173
- class ContextPolicy
174
- def call: (ContextPolicyInput input) -> ContextPlan
175
-
176
- def instruction_item: (content: untyped, ?role: Symbol, ?kind: Symbol, ?content_format: Symbol?, ?required: bool, ?metadata: Hash[untyped, untyped]) -> ContextPolicyInput::InstructionItem
177
- def knowledge_item: (content: untyped, ?role: Symbol, ?kind: Symbol, ?content_format: Symbol?, ?required: bool, ?metadata: Hash[untyped, untyped]) -> ContextPolicyInput::KnowledgeItem
178
- def conversation_item: (content: untyped, role: Symbol, ?kind: Symbol, ?content_format: Symbol?, ?sequence: Integer?, ?required: bool, ?tool_call_id: String?, ?tool_call_ids: Array[String], ?delivery: Symbol, ?metadata: Hash[untyped, untyped]) -> ContextPolicyInput::ConversationItem
179
- def plan: (?instruction: Array[ContextPolicyInput::InstructionItem], ?knowledge: Array[ContextPolicyInput::KnowledgeItem], ?tools: Array[ContextPolicyInput::ToolItem], ?conversation: Array[Array[ContextPolicyInput::ConversationItem]], ?metadata: Hash[untyped, untyped]) -> ContextPlan
180
- end
181
-
182
68
  class Base
183
69
  def self.model: (?String name) -> String?
184
70
  def self.instructions: (?untyped text) { (untyped) -> untyped } -> untyped
@@ -190,23 +76,29 @@ module Phronomy
190
76
  def self.max_iterations: (?Integer value) -> Integer
191
77
  def self.cache_instructions: (?bool enabled) -> bool?
192
78
  def self.max_output_tokens: (?Integer value) -> Integer?
193
- def self.context_policy: () -> ContextPolicy
194
- | (ContextPolicy policy) -> ContextPolicy
79
+ def self.context_policy: () -> Phronomy::Context::ContextPolicy
80
+ | (Phronomy::Context::ContextPolicy policy) -> Phronomy::Context::ContextPolicy
195
81
  def self.agent_definition: () -> Hash[Symbol, untyped]
196
82
  | (version: Integer, ?id: String?) -> Hash[Symbol, untyped]
197
- def self.before_llm_input: (?_BeforeLLMInputHook callable) ?{ (LLMInputBuildContext context) -> LLMInputPatch? } -> _BeforeLLMInputHook?
83
+ def self.before_llm_input: (?_BeforeLLMInputHook callable) ?{ (Phronomy::Context::LLMInputBuildContext context) -> Phronomy::Context::LLMInputPatch? } -> _BeforeLLMInputHook?
198
84
 
199
85
  # on_event is bound once to the live Agent Runtime incarnation. The block
200
86
  # is an alternative spelling of on_event; supplying both is an error.
201
- def self.create: (?agent_id: String, ?context: untyped, ?knowledge: Array[untyped], ?persistence: Persistence?, ?metadata: Hash[untyped, untyped], ?on_event: ^(untyped) -> void) ?{ (untyped event) -> void } -> instance
202
- def self.load: (String agent_id, persistence: Persistence, ?on_event: ^(untyped) -> void) ?{ (untyped event) -> void } -> instance
87
+ def self.create: (?agent_id: String, ?context: untyped, ?knowledge: Array[KnowledgeItem], ?retention: Retention?, ?persistence: Store?, ?metadata: Hash[untyped, untyped], ?on_event: ^(untyped) -> void) ?{ (untyped event) -> void } -> instance
88
+ def self.load: (String agent_id, persistence: Store, ?execution_wiring: execution_wiring, ?on_event: ^(untyped) -> void) ?{ (untyped event) -> void } -> instance
203
89
  def self.get: (String agent_id) -> instance?
204
90
  def self.live_for_execution: (String execution_id) -> instance
205
91
 
206
- def initialize: (?agent_id: String?, ?context: untyped, ?knowledge: Array[untyped], ?persistence: Persistence?, ?metadata: Hash[untyped, untyped], ?on_event: ^(untyped) -> void) ?{ (untyped event) -> void } -> void
92
+ def initialize: (?agent_id: String?, ?context: untyped, ?knowledge: Array[KnowledgeItem], ?retention: Retention?, ?persistence: Store?, ?metadata: Hash[untyped, untyped], ?on_event: ^(untyped) -> void) ?{ (untyped event) -> void } -> void
207
93
 
208
94
  attr_reader agent_id: String
209
- attr_reader persistence: Persistence
95
+ attr_reader persistence: Store
96
+ def knowledge_snapshot: () -> Array[KnowledgeItem]
97
+ def event_listener: () -> (^(Object) -> void)?
98
+ def start_reserved_async: (reservation: ReservedExecution, input: String, ?config: Hash[Symbol, Object]) -> TaskResult[execution_result]
99
+ def resume_async: (String execution_id, ?config: Hash[Symbol, Object]) -> TaskResult[execution_result]
100
+ def resume: (String execution_id, ?config: Hash[Symbol, Object]) -> execution_result
101
+ def cancel_async: (String execution_id) -> TaskResult[ExecutionObservation]
210
102
  attr_accessor before_llm_input: _BeforeLLMInputHook?
211
103
 
212
104
  # Public operation methods no longer accept per-invocation event listeners
@@ -232,6 +124,8 @@ module Phronomy
232
124
  def reset_context!: () -> untyped
233
125
  def close!: () -> untyped
234
126
  def purge!: () -> bool
127
+ def unload_async: () -> Phronomy::TaskResult[bool]
128
+ def unload!: (?timeout: Numeric?) -> bool
235
129
  end
236
130
  end
237
131
  end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ type json_value = nil | bool | String | Integer | Float | Array[json_value] | Hash[String, json_value]
3
+ # Synchronous backends need only cooperative cancellation, not Runtime services.
4
+ interface _CancellationSignal
5
+ def raise_if_cancelled!: (?String message) -> nil
6
+ end
7
+ end
@@ -0,0 +1,13 @@
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
+ end
@@ -0,0 +1,152 @@
1
+ module Phronomy
2
+ module Context
3
+ class LLMInputPatch
4
+ attr_reader model_config_patch: Hash[untyped, untyped]?
5
+ attr_reader segment_candidates: Array[untyped]?
6
+
7
+ def initialize: (?model_config_patch: Hash[untyped, untyped]?, ?segment_candidates: Array[untyped]?) -> void
8
+ def self.empty: () -> LLMInputPatch
9
+ end
10
+
11
+ class LLMInputBuildContext
12
+ attr_reader agent_id: String
13
+ attr_reader agent_definition_id: String
14
+ attr_reader agent_definition_version: Integer
15
+ attr_reader config: Hash[untyped, untyped]
16
+ attr_reader call_sequence: Integer
17
+
18
+ def initialize: (agent_id: String, agent_definition_id: String, agent_definition_version: Integer, ?config: Hash[untyped, untyped], call_sequence: Integer) -> void
19
+ end
20
+
21
+ class LLMInputManifest
22
+ VERSION: String
23
+ CALL_MODES: Array[Symbol]
24
+ SEGMENT_DELIVERIES: Array[String]
25
+
26
+ def self.from_h: (Hash[String, untyped] hash) -> LLMInputManifest
27
+ def version: () -> String
28
+ def to_h: () -> Hash[String, untyped]
29
+ end
30
+
31
+ class ContextPolicyInput
32
+ class Provenance
33
+ attr_reader origin: Symbol
34
+ attr_reader content_ref: String?
35
+ attr_reader record_id: String?
36
+ attr_reader agent_id: String?
37
+ attr_reader execution_id: String?
38
+ attr_reader llm_call_id: String?
39
+ def initialize: (origin: Symbol, ?content_ref: String?, ?record_id: String?, ?agent_id: String?, ?execution_id: String?, ?llm_call_id: String?) -> void
40
+ end
41
+
42
+ class InstructionItem
43
+ attr_reader id: String
44
+ attr_reader kind: Symbol
45
+ attr_reader role: Symbol?
46
+ attr_reader content: untyped
47
+ attr_reader content_format: Symbol
48
+ attr_reader estimated_tokens: Integer
49
+ attr_reader required: bool
50
+ attr_reader provenance: Provenance
51
+ attr_reader metadata: Hash[untyped, untyped]
52
+ def initialize: (id: String, kind: Symbol, ?role: Symbol?, content: untyped, ?content_format: Symbol?, ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?metadata: Hash[untyped, untyped]) -> void
53
+ def required?: () -> bool
54
+ end
55
+
56
+ class KnowledgeItem
57
+ attr_reader id: String
58
+ attr_reader kind: Symbol
59
+ attr_reader role: Symbol?
60
+ attr_reader content: untyped
61
+ attr_reader content_format: Symbol
62
+ attr_reader estimated_tokens: Integer
63
+ attr_reader required: bool
64
+ attr_reader provenance: Provenance
65
+ attr_reader metadata: Hash[untyped, untyped]
66
+ def initialize: (id: String, kind: Symbol, ?role: Symbol?, content: untyped, ?content_format: Symbol?, ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?metadata: Hash[untyped, untyped]) -> void
67
+ def required?: () -> bool
68
+ end
69
+
70
+ class ToolItem
71
+ attr_reader id: String
72
+ attr_reader definition: Hash[untyped, untyped]
73
+ attr_reader estimated_tokens: Integer
74
+ attr_reader required: bool
75
+ attr_reader provenance: Provenance
76
+ attr_reader metadata: Hash[untyped, untyped]
77
+ def initialize: (id: String, definition: Hash[untyped, untyped], ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?metadata: Hash[untyped, untyped]) -> void
78
+ def required?: () -> bool
79
+ end
80
+
81
+ class ConversationItem
82
+ attr_reader id: String
83
+ attr_reader kind: Symbol
84
+ attr_reader role: Symbol?
85
+ attr_reader content: untyped
86
+ attr_reader content_format: Symbol
87
+ attr_reader sequence: Integer?
88
+ attr_reader estimated_tokens: Integer
89
+ attr_reader required: bool
90
+ attr_reader provenance: Provenance
91
+ attr_reader tool_call_id: String?
92
+ attr_reader tool_call_ids: Array[String]
93
+ attr_reader delivery: Symbol
94
+ attr_reader metadata: Hash[untyped, untyped]
95
+ def initialize: (id: String, kind: Symbol, ?role: Symbol?, content: untyped, ?content_format: Symbol?, ?sequence: Integer?, ?estimated_tokens: Integer?, ?required: bool?, ?provenance: Provenance?, ?tool_call_id: String?, ?tool_call_ids: Array[String], ?delivery: Symbol, ?metadata: Hash[untyped, untyped]) -> void
96
+ def required?: () -> bool
97
+ def with_required: (bool required) -> ConversationItem
98
+ end
99
+
100
+ attr_reader agent_id: String
101
+ attr_reader execution_id: String?
102
+ attr_reader call_sequence: Integer
103
+ attr_reader call_mode: Symbol
104
+ attr_reader instruction: Array[InstructionItem]
105
+ attr_reader knowledge: Array[KnowledgeItem]
106
+ attr_reader tools: Array[ToolItem]
107
+ attr_reader conversation: Array[Array[ConversationItem]]
108
+ attr_reader token_budget: untyped
109
+ attr_reader model_config: Hash[untyped, untyped]
110
+ attr_reader previous_manifest: LLMInputManifest?
111
+ attr_reader metadata: Hash[untyped, untyped]
112
+ def initialize: (agent_id: String, ?execution_id: String?, call_sequence: Integer, call_mode: Symbol, ?instruction: Array[InstructionItem], ?knowledge: Array[KnowledgeItem], ?tools: Array[ToolItem], ?conversation: Array[Array[ConversationItem]], token_budget: untyped, ?model_config: Hash[untyped, untyped], previous_manifest: LLMInputManifest?, ?metadata: Hash[untyped, untyped]) -> void
113
+ end
114
+
115
+ class ContextPlan
116
+ attr_reader instruction: Array[ContextPolicyInput::InstructionItem]
117
+ attr_reader knowledge: Array[ContextPolicyInput::KnowledgeItem]
118
+ attr_reader tools: Array[ContextPolicyInput::ToolItem]
119
+ attr_reader conversation: Array[Array[ContextPolicyInput::ConversationItem]]
120
+ attr_reader metadata: Hash[untyped, untyped]
121
+ def initialize: (?instruction: Array[ContextPolicyInput::InstructionItem], ?knowledge: Array[ContextPolicyInput::KnowledgeItem], ?tools: Array[ContextPolicyInput::ToolItem], ?conversation: Array[Array[ContextPolicyInput::ConversationItem]], ?metadata: Hash[untyped, untyped]) -> void
122
+ end
123
+
124
+ class ContextPolicy
125
+ def call: (ContextPolicyInput input) -> ContextPlan
126
+
127
+ def instruction_item: (content: untyped, ?role: Symbol, ?kind: Symbol, ?content_format: Symbol?, ?required: bool, ?metadata: Hash[untyped, untyped]) -> ContextPolicyInput::InstructionItem
128
+ def knowledge_item: (content: untyped, ?role: Symbol, ?kind: Symbol, ?content_format: Symbol?, ?required: bool, ?metadata: Hash[untyped, untyped]) -> ContextPolicyInput::KnowledgeItem
129
+ def conversation_item: (content: untyped, role: Symbol, ?kind: Symbol, ?content_format: Symbol?, ?sequence: Integer?, ?required: bool, ?tool_call_id: String?, ?tool_call_ids: Array[String], ?delivery: Symbol, ?metadata: Hash[untyped, untyped]) -> ContextPolicyInput::ConversationItem
130
+ def plan: (?instruction: Array[ContextPolicyInput::InstructionItem], ?knowledge: Array[ContextPolicyInput::KnowledgeItem], ?tools: Array[ContextPolicyInput::ToolItem], ?conversation: Array[Array[ContextPolicyInput::ConversationItem]], ?metadata: Hash[untyped, untyped]) -> ContextPlan
131
+ end
132
+
133
+ class BudgetExceededError < Phronomy::Error
134
+ end
135
+ class ManifestError < Phronomy::Error
136
+ end
137
+ class Assembly
138
+ @tracer: Phronomy::Tracing::Base
139
+ def initialize: (?tracer: Phronomy::Tracing::Base) -> void
140
+ class Prepared
141
+ attr_reader input: ContextPolicyInput
142
+ attr_reader plan: ContextPlan
143
+ attr_reader adapter_identity: Hash[String, String?]
144
+ end
145
+ def prepare: (input: ContextPolicyInput, policy: ContextPolicy, adapter_identity: Hash[String, String?]) -> Prepared
146
+ def store: (Prepared prepared, contents: Phronomy::_ContentRepository) -> [LLMInputManifest, String]
147
+ end
148
+ class DefaultPolicy < ContextPolicy
149
+ def self.instance: () -> DefaultPolicy
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,9 @@
1
+ module Phronomy
2
+ module Embeddings
3
+ class AsyncClient
4
+ def initialize: (adapter: Base, ?pool: untyped) -> void
5
+ def embed_async: (String text, ?Concurrency::CancellationToken? cancellation_token, ?timeout: Numeric?) -> TaskResult[Array[Float]]
6
+ end
7
+ end
8
+
9
+ end
@@ -0,0 +1,23 @@
1
+ module Phronomy
2
+ module Embeddings
3
+ class InvalidResultError < Phronomy::Error
4
+ end
5
+
6
+ class TransportError < Phronomy::Error
7
+ end
8
+
9
+ class AuthenticationError < TransportError
10
+ end
11
+
12
+ class RateLimitError < TransportError
13
+ end
14
+
15
+ class Base
16
+ def embed: (String text, ?_CancellationSignal? cancellation_token) -> Array[Float]
17
+
18
+ # Protected extension SPI at runtime; RBS has no protected visibility.
19
+ private
20
+ def perform_embed: (String text, ?_CancellationSignal? cancellation_token) -> Array[Numeric]
21
+ end
22
+ end
23
+ end