phronomy 0.27.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. checksums.yaml +4 -4
  2. data/.mutant.yml +9 -9
  3. data/CHANGELOG.md +52 -0
  4. data/CONTRIBUTING.md +8 -8
  5. data/README.md +9 -3
  6. data/benchmark/bench_agent_invoke.rb +25 -50
  7. data/benchmark/bench_context_assembler.rb +14 -11
  8. data/benchmark/bench_regression.rb +1 -1
  9. data/benchmark/bench_tool_schema.rb +1 -1
  10. data/docs/architecture/agent-chat-and-state-ownership.md +7 -1
  11. data/docs/architecture/agent-transition-ownership.md +13 -89
  12. data/docs/architecture/backend-groups.md +152 -0
  13. data/docs/architecture/before-llm-input.md +3 -3
  14. data/docs/architecture/context-management.md +1 -1
  15. data/docs/architecture/execution-abstraction-review.md +88 -0
  16. data/docs/architecture/execution-boundaries.md +28 -0
  17. data/docs/architecture/execution-metadata-and-values.md +6 -0
  18. data/docs/architecture/multi-agent-handoff.md +6 -5
  19. data/docs/architecture/persistence.md +27 -9
  20. data/docs/architecture/r8-unit1.md +104 -0
  21. data/docs/architecture/r8-unit10.md +72 -0
  22. data/docs/architecture/r8-unit11.md +71 -0
  23. data/docs/architecture/r8-unit12.md +67 -0
  24. data/docs/architecture/r8-unit13.md +61 -0
  25. data/docs/architecture/r8-unit14.md +72 -0
  26. data/docs/architecture/r8-unit15.md +65 -0
  27. data/docs/architecture/r8-unit16.md +54 -0
  28. data/docs/architecture/r8-unit17.md +73 -0
  29. data/docs/architecture/r8-unit18.md +92 -0
  30. data/docs/architecture/r8-unit19.md +61 -0
  31. data/docs/architecture/r8-unit2.md +55 -0
  32. data/docs/architecture/r8-unit20.md +51 -0
  33. data/docs/architecture/r8-unit21.md +79 -0
  34. data/docs/architecture/r8-unit22.md +74 -0
  35. data/docs/architecture/r8-unit23.md +81 -0
  36. data/docs/architecture/r8-unit3.md +130 -0
  37. data/docs/architecture/r8-unit4.md +79 -0
  38. data/docs/architecture/r8-unit5.md +115 -0
  39. data/docs/architecture/r8-unit6.md +71 -0
  40. data/docs/architecture/r8-unit7.md +70 -0
  41. data/docs/architecture/r8-unit8.md +78 -0
  42. data/docs/architecture/r8-unit9.md +73 -0
  43. data/docs/architecture/refactoring-closure.md +10 -1
  44. data/docs/architecture/remaining-refactoring-plan.md +16 -0
  45. data/docs/architecture/storage-execution-boundaries.md +54 -0
  46. data/docs/architecture/tool-schema-recording-gap.md +6 -0
  47. data/docs/architecture/tracing.md +1 -1
  48. data/docs/architecture/workflow-terminal-ownership-design.md +2 -2
  49. data/docs/architecture.md +24 -11
  50. data/docs/decisions/015-tool-public-facade-and-rbs-boundary.md +3 -3
  51. data/docs/decisions/027-llm-adapter-provider-boundary.md +2 -0
  52. data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +2 -0
  53. data/docs/decisions/031-durable-multi-agent-coordination.md +2 -0
  54. data/docs/decisions/032-storage-backend-composition.md +5 -0
  55. data/docs/decisions/034-handoff-runner-coordination-ownership.md +2 -0
  56. data/docs/decisions/035-tool-executor-capability-ownership.md +1 -1
  57. data/docs/decisions/038-responsibility-based-source-layout.md +14 -0
  58. data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +8 -0
  59. data/docs/decisions/040-configuration-default-composition.md +12 -1
  60. data/docs/decisions/045-worker-input-restriction-ownership.md +4 -0
  61. data/docs/decisions/051-execution-outcome-worker-ownership.md +2 -0
  62. data/docs/decisions/056-workflow-terminal-policy-ownership.md +1 -1
  63. data/docs/decisions/058-neutral-storage-primitives.md +5 -0
  64. data/docs/decisions/059-backend-contracts-and-async-clients.md +74 -0
  65. data/docs/decisions/060-runtime-settings-and-application-configuration.md +86 -0
  66. data/docs/decisions/061-persistence-failure-contracts.md +89 -0
  67. data/docs/decisions/062-content-store-service.md +52 -0
  68. data/docs/decisions/063-execution-contracts-and-services.md +88 -0
  69. data/docs/decisions/064-agent-execution-and-multi-agent-responsibility.md +36 -0
  70. data/docs/decisions/065-vector-and-embeddings-common-operations.md +38 -0
  71. data/docs/decisions/066-llm-and-tool-operation-contracts.md +20 -0
  72. data/docs/decisions/067-agent-progress-and-engine-connection.md +29 -0
  73. data/docs/decisions/068-agent-tool-child-progress-and-tool-operation.md +36 -0
  74. data/docs/decisions/README.md +18 -1
  75. data/docs/execution-boundaries-preview.md +45 -0
  76. data/docs/features.md +8 -3
  77. data/docs/getting-started.md +9 -6
  78. data/docs/migrations/0.22.md +2 -2
  79. data/docs/migrations/durable-semantic-coordination-v2.md +2 -0
  80. data/docs/migrations/handoff-runner-multi-agent.md +2 -0
  81. data/docs/migrations/persistence-failure-contracts.md +67 -0
  82. data/docs/migrations/r8-unit10.md +36 -0
  83. data/docs/migrations/r8-unit11.md +33 -0
  84. data/docs/migrations/r8-unit12.md +31 -0
  85. data/docs/migrations/r8-unit13.md +36 -0
  86. data/docs/migrations/r8-unit14.md +31 -0
  87. data/docs/migrations/r8-unit15.md +31 -0
  88. data/docs/migrations/r8-unit16.md +26 -0
  89. data/docs/migrations/r8-unit17.md +28 -0
  90. data/docs/migrations/r8-unit18.md +29 -0
  91. data/docs/migrations/r8-unit19.md +28 -0
  92. data/docs/migrations/r8-unit20.md +24 -0
  93. data/docs/migrations/r8-unit21.md +28 -0
  94. data/docs/migrations/r8-unit22.md +29 -0
  95. data/docs/migrations/r8-unit23.md +20 -0
  96. data/docs/migrations/r8-unit4.md +67 -0
  97. data/docs/migrations/r8-unit5.md +75 -0
  98. data/docs/migrations/r8-unit6.md +109 -0
  99. data/docs/migrations/r8-unit7.md +31 -0
  100. data/docs/migrations/r8-unit8.md +33 -0
  101. data/docs/migrations/r8-unit9.md +28 -0
  102. data/docs/migrations/storage-async-client.md +103 -0
  103. data/docs/migrations/vector-async-clients.md +110 -0
  104. data/docs/persistence-backends.md +38 -21
  105. data/docs/runtime-and-concurrency.md +26 -1
  106. data/lib/phronomy/agent/admission.rb +78 -0
  107. data/lib/phronomy/agent/{lifecycle_contract/agent_already_exists_error.rb → agent_already_exists_error.rb} +1 -1
  108. data/lib/phronomy/agent/{lifecycle_contract/agent_busy_error.rb → agent_busy_error.rb} +1 -1
  109. data/lib/phronomy/agent/{lifecycle_contract/agent_purged_error.rb → agent_purged_error.rb} +1 -1
  110. data/lib/phronomy/{recovery → agent/api}/execution_rehydration_required_error.rb +1 -1
  111. data/lib/phronomy/agent/async_event_api.rb +37 -32
  112. data/lib/phronomy/agent/base.rb +74 -72
  113. data/lib/phronomy/agent/before_llm_input.rb +64 -0
  114. data/lib/phronomy/agent/composition/run_once.rb +1 -1
  115. data/lib/phronomy/agent/{context_assembly/context_candidate_resolver.rb → context_candidate_resolver.rb} +2 -2
  116. data/lib/phronomy/agent/{context_assembly/context_assembler.rb → context_preparation.rb} +35 -221
  117. data/lib/phronomy/agent/control_request.rb +21 -0
  118. data/lib/phronomy/agent/execution/agent_execution.rb +1 -1
  119. data/lib/phronomy/agent/execution/agent_invocation.rb +27 -53
  120. data/lib/phronomy/agent/execution/approval_resume_commit.rb +1 -1
  121. data/lib/phronomy/agent/execution/dispatch_preparation.rb +17 -127
  122. data/lib/phronomy/agent/execution/exact_execution.rb +44 -23
  123. data/lib/phronomy/agent/execution/execution_cancellation.rb +8 -4
  124. data/lib/phronomy/agent/execution/execution_coordinator.rb +214 -395
  125. data/lib/phronomy/agent/execution/execution_metadata.rb +1 -0
  126. data/lib/phronomy/agent/execution/execution_outcome_committer.rb +70 -126
  127. data/lib/phronomy/agent/execution/execution_registry.rb +6 -2
  128. data/lib/phronomy/agent/execution/execution_session_runner.rb +22 -27
  129. data/lib/phronomy/agent/execution/initial_preparation.rb +18 -116
  130. data/lib/phronomy/agent/execution/{agent_invocation_session_builder.rb → invocation_actions.rb} +54 -194
  131. data/lib/phronomy/agent/execution/invocation_transitions.rb +39 -1
  132. data/lib/phronomy/agent/execution/runtime_record_encoder.rb +7 -7
  133. data/lib/phronomy/agent/execution_change.rb +161 -0
  134. data/lib/phronomy/agent/execution_environment.rb +36 -0
  135. data/lib/phronomy/agent/execution_extension_state.rb +21 -0
  136. data/lib/phronomy/agent/execution_observation.rb +35 -0
  137. data/lib/phronomy/agent/filterable.rb +182 -0
  138. data/lib/phronomy/agent/handoff/{handoff_context.rb → transfer_context.rb} +4 -4
  139. data/lib/phronomy/agent/handoff/{handoff_projection.rb → transfer_projection.rb} +14 -33
  140. data/lib/phronomy/{llm_contract/transport_error.rb → agent/handoff_error.rb} +1 -1
  141. data/lib/phronomy/agent/journal/journal_projection.rb +1 -1
  142. data/lib/phronomy/agent/knowledge_item.rb +13 -0
  143. data/lib/phronomy/agent/lifecycle/agent_root.rb +1 -1
  144. data/lib/phronomy/agent/lifecycle/ownership_registry.rb +18 -23
  145. data/lib/phronomy/agent/persistence/agent_repository.rb +29 -21
  146. data/lib/phronomy/agent/persistence/cancellation_repository.rb +51 -0
  147. data/lib/phronomy/agent/persistence/codec.rb +1 -21
  148. data/lib/phronomy/agent/persistence/execution_repository.rb +57 -41
  149. data/lib/phronomy/agent/persistence/journal_repository.rb +27 -18
  150. data/lib/phronomy/agent/persistence/records.rb +33 -0
  151. data/lib/phronomy/agent/persistence/retention_repository.rb +70 -0
  152. data/lib/phronomy/agent/persistence/storage_schema.rb +7 -2
  153. data/lib/phronomy/agent/persistence/watermark.rb +13 -11
  154. data/lib/phronomy/agent/recovery/invocation_restorer.rb +13 -21
  155. data/lib/phronomy/agent/recovery/recovery_coordinator/continuation.rb +10 -9
  156. data/lib/phronomy/agent/recovery/recovery_coordinator/installation.rb +27 -27
  157. data/lib/phronomy/agent/recovery/recovery_coordinator/resolution.rb +19 -21
  158. data/lib/phronomy/agent/recovery/recovery_coordinator.rb +23 -16
  159. data/lib/phronomy/agent/recovery/recovery_rules.rb +119 -0
  160. data/lib/phronomy/agent/recovery/recovery_support.rb +8 -11
  161. data/lib/phronomy/agent/reserved_execution.rb +16 -0
  162. data/lib/phronomy/agent/retention.rb +17 -0
  163. data/lib/phronomy/agent/runtime_binding/engine_environment.rb +60 -0
  164. data/lib/phronomy/agent/runtime_binding/engine_session_builder.rb +34 -0
  165. data/lib/phronomy/agent/runtime_binding/phase_machine_builder.rb +64 -0
  166. data/lib/phronomy/agent/runtime_binding/tool_session_builder.rb +34 -0
  167. data/lib/phronomy/agent/{context_assembly/ruby_llm_materializer.rb → runtime_input.rb} +18 -35
  168. data/lib/phronomy/agent/{context_assembly/saved_context_reader.rb → saved_context_reader.rb} +6 -4
  169. data/lib/phronomy/agent/settings.rb +47 -0
  170. data/lib/phronomy/agent/{context_assembly/state_writer.rb → state_writer.rb} +4 -3
  171. data/lib/phronomy/agent/store.rb +253 -0
  172. data/lib/phronomy/agent/{lifecycle_contract/stream_callback_error.rb → stream_callback_error.rb} +1 -1
  173. data/lib/phronomy/agent/tool_execution/tool_binding.rb +4 -64
  174. data/lib/phronomy/agent/tool_execution/tool_invocation.rb +50 -219
  175. data/lib/phronomy/agent/tool_execution/tool_invocation_actions.rb +107 -0
  176. data/lib/phronomy/agent/tool_execution/tool_invocation_transitions.rb +70 -0
  177. data/lib/phronomy/configuration/runtime_settings.rb +49 -0
  178. data/lib/phronomy/content_store/storage_schema.rb +1 -0
  179. data/lib/phronomy/content_store/stored_contents.rb +2 -1
  180. data/lib/phronomy/context/assembly.rb +202 -0
  181. data/lib/phronomy/{llm_contract/context_budget_exceeded_error.rb → context/budget_exceeded_error.rb} +3 -1
  182. data/lib/phronomy/context/candidate.rb +51 -0
  183. data/lib/phronomy/context/constraint.rb +47 -0
  184. data/lib/phronomy/{agent/context_contract → context}/context_plan.rb +1 -1
  185. data/lib/phronomy/{agent/context_contract → context}/context_plan_validator.rb +3 -3
  186. data/lib/phronomy/{agent/context_contract → context}/context_policy.rb +1 -1
  187. data/lib/phronomy/{agent/context_contract → context}/context_policy_input.rb +1 -1
  188. data/lib/phronomy/{agent/context_assembly → context}/context_policy_input_builder.rb +1 -1
  189. data/lib/phronomy/context/default_policy.rb +140 -0
  190. data/lib/phronomy/context/final_budget_validator.rb +33 -0
  191. data/lib/phronomy/{agent/context_contract → context}/llm_input_build_context.rb +1 -1
  192. data/lib/phronomy/{agent/context_contract → context}/llm_input_manifest.rb +19 -19
  193. data/lib/phronomy/{agent/context_contract → context}/llm_input_patch.rb +1 -1
  194. data/lib/phronomy/context/manifest_error.rb +10 -0
  195. data/lib/phronomy/context/prompt_template.rb +98 -0
  196. data/lib/phronomy/{vector_store → documents}/loader/base.rb +1 -1
  197. data/lib/phronomy/{vector_store → documents}/loader/csv_loader.rb +2 -2
  198. data/lib/phronomy/{vector_store → documents}/loader/markdown_loader.rb +3 -3
  199. data/lib/phronomy/{vector_store → documents}/loader/plain_text_loader.rb +2 -2
  200. data/lib/phronomy/{vector_store → documents}/splitter/base.rb +1 -1
  201. data/lib/phronomy/{vector_store → documents}/splitter/fixed_size_splitter.rb +2 -2
  202. data/lib/phronomy/{vector_store → documents}/splitter/recursive_splitter.rb +2 -2
  203. data/lib/phronomy/embeddings/async/async_client.rb +44 -0
  204. data/lib/phronomy/embeddings/backends/ruby_llm_embeddings.rb +48 -0
  205. data/lib/phronomy/embeddings/base.rb +43 -0
  206. data/lib/phronomy/embeddings/invalid_result_error.rb +11 -0
  207. data/lib/phronomy/embeddings/transport_error.rb +11 -0
  208. data/lib/phronomy/engine/concurrency/offload_pool.rb +36 -21
  209. data/lib/phronomy/engine/concurrency/pool_registry.rb +47 -12
  210. data/lib/phronomy/engine/diagnostics.rb +1 -1
  211. data/lib/phronomy/engine/event_loop.rb +7 -7
  212. data/lib/phronomy/engine/execution_binding.rb +23 -0
  213. data/lib/phronomy/engine/execution_receiver_binding.rb +43 -0
  214. data/lib/phronomy/engine/fsm_protocol.rb +1 -6
  215. data/lib/phronomy/engine/fsm_session.rb +3 -3
  216. data/lib/phronomy/engine/metrics.rb +16 -14
  217. data/lib/phronomy/engine/runtime/timer_queue.rb +1 -1
  218. data/lib/phronomy/engine/runtime.rb +25 -12
  219. data/lib/phronomy/engine/terminal_decision.rb +7 -0
  220. data/lib/phronomy/execution/async_operation.rb +41 -0
  221. data/lib/phronomy/{engine → execution}/blocking.rb +2 -2
  222. data/lib/phronomy/{engine → execution}/concurrency/cancellation_token.rb +1 -1
  223. data/lib/phronomy/{engine → execution}/concurrency/deadline.rb +0 -17
  224. data/lib/phronomy/{engine → execution}/concurrency/physical_completion_task.rb +1 -1
  225. data/lib/phronomy/{engine → execution}/concurrency/result_collector.rb +1 -1
  226. data/lib/phronomy/{engine → execution}/concurrency/result_composition.rb +33 -12
  227. data/lib/phronomy/{engine/concurrency/subscriptions.rb → execution/concurrency/result_subscriptions.rb} +14 -18
  228. data/lib/phronomy/execution/concurrency/subscriptions.rb +25 -0
  229. data/lib/phronomy/{engine → execution}/execution.rb +61 -27
  230. data/lib/phronomy/execution/execution_receiver.rb +78 -0
  231. data/lib/phronomy/execution/execution_scope_state.rb +35 -0
  232. data/lib/phronomy/{engine → execution}/invocation_context.rb +0 -15
  233. data/lib/phronomy/execution/invocation_controls.rb +73 -0
  234. data/lib/phronomy/execution/runnable.rb +24 -0
  235. data/lib/phronomy/{engine → execution}/task_result.rb +3 -3
  236. data/lib/phronomy/execution/wait_policy.rb +24 -0
  237. data/lib/phronomy/filter/{contract/filter_block_error.rb → filter_block_error.rb} +1 -1
  238. data/lib/phronomy/generation/generator_verifier/agent_operation.rb +65 -0
  239. data/lib/phronomy/generation/generator_verifier/default_parser.rb +27 -0
  240. data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +2 -2
  241. data/lib/phronomy/generation/generator_verifier.rb +7 -7
  242. data/lib/phronomy/llm_adapter/async/async_client.rb +47 -0
  243. data/lib/phronomy/{llm_contract → llm_adapter}/authentication_error.rb +3 -1
  244. data/lib/phronomy/llm_adapter/backends/ruby_llm.rb +183 -0
  245. data/lib/phronomy/llm_adapter/base.rb +49 -68
  246. data/lib/phronomy/{llm_contract → llm_adapter}/context_length_error.rb +3 -1
  247. data/lib/phronomy/llm_adapter/invalid_result_error.rb +10 -0
  248. data/lib/phronomy/llm_adapter/message.rb +62 -0
  249. data/lib/phronomy/{llm_contract → llm_adapter}/rate_limit_error.rb +3 -1
  250. data/lib/phronomy/llm_adapter/request.rb +79 -0
  251. data/lib/phronomy/llm_adapter/response.rb +36 -0
  252. data/lib/phronomy/llm_adapter/stream_chunk.rb +18 -0
  253. data/lib/phronomy/llm_adapter/token_usage.rb +64 -0
  254. data/lib/phronomy/llm_adapter/transport_error.rb +9 -0
  255. data/lib/phronomy/llm_adapter.rb +3 -16
  256. data/lib/phronomy/multi_agent/admission_registry.rb +1 -8
  257. data/lib/phronomy/multi_agent/durable_subagent_coordinator.rb +108 -84
  258. data/lib/phronomy/multi_agent/execution_environment.rb +29 -0
  259. data/lib/phronomy/{agent/handoff → multi_agent}/handoff.rb +2 -2
  260. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_capability_factory.rb +21 -2
  261. data/lib/phronomy/multi_agent/handoff_participant.rb +79 -0
  262. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_policy.rb +1 -1
  263. data/lib/phronomy/multi_agent/handoff_runner.rb +77 -100
  264. data/lib/phronomy/{agent/handoff → multi_agent}/handoff_state.rb +1 -1
  265. data/lib/phronomy/multi_agent/orchestrator.rb +61 -75
  266. data/lib/phronomy/multi_agent/persistence/codec.rb +20 -0
  267. data/lib/phronomy/multi_agent/persistence/handoff_state_repository.rb +77 -0
  268. data/lib/phronomy/multi_agent/persistence/records.rb +27 -0
  269. data/lib/phronomy/multi_agent/persistence/storage_schema.rb +21 -0
  270. data/lib/phronomy/multi_agent/persistence/team_execution_repository.rb +58 -42
  271. data/lib/phronomy/multi_agent/persistence/team_repository.rb +29 -21
  272. data/lib/phronomy/multi_agent/reserved_child_admission.rb +88 -0
  273. data/lib/phronomy/multi_agent/runtime_binding/engine_environment.rb +35 -0
  274. data/lib/phronomy/multi_agent/shared_state.rb +2 -2
  275. data/lib/phronomy/multi_agent/store.rb +156 -0
  276. data/lib/phronomy/multi_agent/team_coordinator.rb +83 -74
  277. data/lib/phronomy/multi_agent/team_ownership_registry.rb +2 -12
  278. data/lib/phronomy/output_parser/parse_error.rb +7 -0
  279. data/lib/phronomy/persistence/content_repository.rb +26 -0
  280. data/lib/phronomy/persistence/errors.rb +16 -0
  281. data/lib/phronomy/persistence/migration/initial_format_migration.rb +2 -2
  282. data/lib/phronomy/persistence/persistence.rb +23 -0
  283. data/lib/phronomy/persistence/save_outcome.rb +24 -0
  284. data/lib/phronomy/persistence/snapshot_comparison.rb +81 -0
  285. data/lib/phronomy/persistence/storage_boundary.rb +32 -0
  286. data/lib/phronomy/persistence/transaction.rb +86 -0
  287. data/lib/phronomy/persistence_composition/storage_schema.rb +9 -4
  288. data/lib/phronomy/persistence_composition/stores.rb +34 -0
  289. data/lib/phronomy/persistence_composition/unit4_migration.rb +276 -0
  290. data/lib/phronomy/runtime_composition/agent_defaults.rb +5 -1
  291. data/lib/phronomy/runtime_composition/configuration.rb +146 -0
  292. data/lib/phronomy/runtime_composition/evaluation_defaults.rb +7 -0
  293. data/lib/phronomy/runtime_composition/execution_defaults.rb +5 -0
  294. data/lib/phronomy/runtime_composition/generation_defaults.rb +6 -0
  295. data/lib/phronomy/runtime_composition/global_configuration.rb +38 -0
  296. data/lib/phronomy/runtime_composition/multi_agent_defaults.rb +9 -0
  297. data/lib/phronomy/runtime_composition/workflow_defaults.rb +4 -0
  298. data/lib/phronomy/storage/async/async_client.rb +60 -0
  299. data/lib/phronomy/storage/backend.rb +8 -2
  300. data/lib/phronomy/testing/eval/metrics.rb +1 -1
  301. data/lib/phronomy/testing/eval/scorer/llm_judge.rb +19 -3
  302. data/lib/phronomy/testing/persistence_contract/a_content_store.rb +2 -2
  303. data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +6 -6
  304. data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +55 -52
  305. data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +3 -3
  306. data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +7 -7
  307. data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +11 -11
  308. data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +57 -51
  309. data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +1 -1
  310. data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +23 -22
  311. data/lib/phronomy/tool/authorization.rb +77 -0
  312. data/lib/phronomy/tool/base.rb +549 -9
  313. data/lib/phronomy/tool/call_request.rb +40 -0
  314. data/lib/phronomy/{agent/tool_execution/tool_definition_set.rb → tool/definition_set.rb} +7 -8
  315. data/lib/phronomy/tool/operation.rb +88 -0
  316. data/lib/phronomy/tool/schema.rb +214 -0
  317. data/lib/phronomy/tool/settings.rb +31 -0
  318. data/lib/phronomy/tool/tool_error.rb +7 -0
  319. data/lib/phronomy/tool/tool_executor.rb +58 -0
  320. data/lib/phronomy/tools/agent.rb +22 -90
  321. data/lib/phronomy/tools/mcp.rb +21 -14
  322. data/lib/phronomy/tools/vector_search.rb +4 -4
  323. data/lib/phronomy/tracing/automatic.rb +11 -6
  324. data/lib/phronomy/tracing/base.rb +1 -1
  325. data/lib/phronomy/tracing/observation.rb +37 -0
  326. data/lib/phronomy/tracing/settings.rb +36 -0
  327. data/lib/phronomy/vector_store/{async_backend.rb → async/async_client.rb} +35 -29
  328. data/lib/phronomy/vector_store/{in_memory.rb → backends/in_memory.rb} +12 -10
  329. data/lib/phronomy/vector_store/{pgvector.rb → backends/pgvector.rb} +44 -16
  330. data/lib/phronomy/vector_store/{redis_search.rb → backends/redis_search.rb} +74 -37
  331. data/lib/phronomy/vector_store/base.rb +118 -49
  332. data/lib/phronomy/vector_store/invalid_result_error.rb +12 -0
  333. data/lib/phronomy/vector_store.rb +2 -17
  334. data/lib/phronomy/version.rb +1 -1
  335. data/lib/phronomy/workflow/completion.rb +11 -0
  336. data/lib/phronomy/workflow/execution/workflow.rb +7 -7
  337. data/lib/phronomy/workflow/execution/workflow_action_rules.rb +67 -0
  338. data/lib/phronomy/workflow/execution/workflow_context.rb +2 -2
  339. data/lib/phronomy/workflow/execution/workflow_execution_environment.rb +27 -0
  340. data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +3 -5
  341. data/lib/phronomy/workflow/execution/workflow_runner.rb +58 -79
  342. data/lib/phronomy/workflow/execution/workflow_settings.rb +28 -0
  343. data/lib/phronomy/workflow/persistence/state_repository.rb +28 -22
  344. data/lib/phronomy/workflow/persistence/storage_schema.rb +13 -0
  345. data/lib/phronomy/workflow/runtime_binding/workflow_engine_environment.rb +38 -0
  346. data/lib/phronomy/workflow/runtime_binding/workflow_phase_machine_builder.rb +156 -0
  347. data/lib/phronomy/workflow/{execution → runtime_binding}/workflow_terminal_policy.rb +4 -4
  348. data/lib/phronomy.rb +57 -16
  349. data/scripts/api_snapshot.rb +35 -15
  350. data/sig/_private/phronomy/agent/settings.rbs +19 -0
  351. data/sig/_private/phronomy/configuration/runtime_settings.rbs +20 -0
  352. data/sig/_private/phronomy/llm_adapter/async/async_client.rbs +10 -0
  353. data/sig/_private/phronomy/multi_agent/store.rbs +8 -0
  354. data/sig/_private/phronomy/persistence/storage_boundary.rbs +7 -0
  355. data/sig/_private/phronomy/tool/settings.rbs +13 -0
  356. data/sig/_private/phronomy/tracing/settings.rbs +15 -0
  357. data/sig/_private/phronomy/workflow/execution/workflow_settings.rbs +13 -0
  358. data/sig/phronomy/agent/admission.rbs +19 -0
  359. data/sig/phronomy/agent/execution_contract.rbs +132 -0
  360. data/sig/phronomy/agent/execution_environment.rbs +20 -0
  361. data/sig/phronomy/agent/store.rbs +73 -0
  362. data/sig/phronomy/agent.rbs +14 -138
  363. data/sig/phronomy/common.rbs +7 -0
  364. data/sig/phronomy/content_store/contracts.rbs +13 -0
  365. data/sig/phronomy/context.rbs +152 -0
  366. data/sig/phronomy/embeddings/async/async_client.rbs +9 -0
  367. data/sig/phronomy/embeddings/base.rbs +17 -0
  368. data/sig/phronomy/engine/concurrency/timer_bindings.rbs +22 -0
  369. data/sig/phronomy/engine/control_bindings.rbs +11 -0
  370. data/sig/phronomy/engine/control_protocols.rbs +23 -0
  371. data/sig/phronomy/engine/execution_binding.rbs +6 -0
  372. data/sig/phronomy/engine/execution_receiver.rbs +15 -0
  373. data/sig/phronomy/engine/observability.rbs +13 -0
  374. data/sig/phronomy/execution/async_operation.rbs +7 -0
  375. data/sig/phronomy/execution/blocking.rbs +5 -0
  376. data/sig/phronomy/execution/concurrency/cancellation_token.rbs +13 -0
  377. data/sig/phronomy/execution/concurrency/deadline.rbs +10 -0
  378. data/sig/phronomy/execution/concurrency/result_composition.rbs +7 -0
  379. data/sig/phronomy/execution/control_protocols.rbs +18 -0
  380. data/sig/phronomy/execution/errors.rbs +7 -0
  381. data/sig/phronomy/execution/execution.rbs +41 -0
  382. data/sig/phronomy/execution/execution_receiver.rbs +40 -0
  383. data/sig/phronomy/execution/execution_scope_state.rbs +9 -0
  384. data/sig/phronomy/execution/invocation_context.rbs +18 -0
  385. data/sig/phronomy/execution/invocation_controls.rbs +13 -0
  386. data/sig/phronomy/execution/task_result.rbs +29 -0
  387. data/sig/phronomy/extensions.rbs +0 -21
  388. data/sig/phronomy/handoff.rbs +10 -4
  389. data/sig/phronomy/llm_adapter/backends/ruby_llm.rbs +6 -0
  390. data/sig/phronomy/llm_adapter/base.rbs +14 -0
  391. data/sig/phronomy/llm_adapter/usage.rbs +14 -0
  392. data/sig/phronomy/llm_adapter/values.rbs +43 -0
  393. data/sig/phronomy/llm_context_window.rbs +10 -0
  394. data/sig/phronomy/multi_agent/reserved_child_admission.rbs +8 -0
  395. data/sig/phronomy/multi_agent/store.rbs +54 -0
  396. data/sig/phronomy/multi_agent.rbs +6 -3
  397. data/sig/phronomy/persistence/errors.rbs +18 -0
  398. data/sig/phronomy/persistence/migration.rbs +13 -0
  399. data/sig/phronomy/persistence/transaction.rbs +19 -0
  400. data/sig/phronomy/persistence.rbs +1 -99
  401. data/sig/phronomy/persistence_composition.rbs +19 -0
  402. data/sig/phronomy/runtime_composition/configuration.rbs +36 -0
  403. data/sig/phronomy/storage/async/async_client.rbs +8 -0
  404. data/sig/phronomy/storage/backends/in_memory.rbs +9 -0
  405. data/sig/phronomy/{storage.rbs → storage/contracts.rbs} +2 -16
  406. data/sig/phronomy/tool.rbs +48 -4
  407. data/sig/phronomy/tracing/observation.rbs +7 -0
  408. data/sig/phronomy/vector_store/async/async_client.rbs +13 -0
  409. data/sig/phronomy/vector_store/base.rbs +23 -0
  410. data/sig/phronomy/workflow/execution/workflow_execution_environment.rbs +14 -0
  411. data/sig/phronomy/workflow/runtime_binding/workflow_terminal_policy.rbs +7 -0
  412. data/sig/phronomy/workflow/store.rbs +8 -0
  413. data/sig/phronomy/workflow.rbs +1 -1
  414. data/sig/phronomy.rbs +0 -49
  415. metadata +318 -117
  416. data/lib/phronomy/agent/concerns/before_llm_input.rb +0 -66
  417. data/lib/phronomy/agent/concerns/error_translation.rb +0 -45
  418. data/lib/phronomy/agent/concerns/filterable.rb +0 -184
  419. data/lib/phronomy/agent/context/capability/base.rb +0 -548
  420. data/lib/phronomy/agent/context/capability/tool_executor.rb +0 -62
  421. data/lib/phronomy/agent/context/instruction/prompt_template.rb +0 -102
  422. data/lib/phronomy/agent/context_assembly/runtime_chat_builder.rb +0 -36
  423. data/lib/phronomy/agent/context_assembly/token_budget_resolver.rb +0 -22
  424. data/lib/phronomy/agent/context_parts/validators/final_budget_validator.rb +0 -37
  425. data/lib/phronomy/agent/context_policies/default.rb +0 -142
  426. data/lib/phronomy/agent/execution/phase_machine_builder.rb +0 -101
  427. data/lib/phronomy/agent/execution/provider_call_outcome.rb +0 -106
  428. data/lib/phronomy/agent/handoff/handoff_execution_coordinator.rb +0 -15
  429. data/lib/phronomy/agent/handoff/handoff_outcome_committer.rb +0 -131
  430. data/lib/phronomy/agent/handoff/handoff_request.rb +0 -45
  431. data/lib/phronomy/agent/lifecycle_contract/handoff_error.rb +0 -7
  432. data/lib/phronomy/agent/persistence/handoff_state_repository.rb +0 -58
  433. data/lib/phronomy/agent/persistence/queries.rb +0 -61
  434. data/lib/phronomy/agent/selection/candidate.rb +0 -53
  435. data/lib/phronomy/agent/selection/constraint.rb +0 -49
  436. data/lib/phronomy/agent/tool_execution/tool_call_intercepted.rb +0 -29
  437. data/lib/phronomy/agent/tool_execution/tool_invocation_session_builder.rb +0 -276
  438. data/lib/phronomy/configuration/configuration.rb +0 -68
  439. data/lib/phronomy/configuration/global_configuration.rb +0 -26
  440. data/lib/phronomy/engine/concurrency/cancellation_scope.rb +0 -124
  441. data/lib/phronomy/engine/concurrency/operation_binding.rb +0 -43
  442. data/lib/phronomy/engine/execution_receiver.rb +0 -65
  443. data/lib/phronomy/engine/runnable.rb +0 -54
  444. data/lib/phronomy/llm_adapter/ruby_llm.rb +0 -47
  445. data/lib/phronomy/llm_contract/token_usage.rb +0 -85
  446. data/lib/phronomy/multi_agent/persistence/queries.rb +0 -30
  447. data/lib/phronomy/multi_agent/storage_contract/team_storage_schema.rb +0 -15
  448. data/lib/phronomy/output_parser/contract/parse_error.rb +0 -7
  449. data/lib/phronomy/persistence/api/persistence.rb +0 -140
  450. data/lib/phronomy/persistence_composition/repositories.rb +0 -77
  451. data/lib/phronomy/recovery/recovery.rb +0 -186
  452. data/lib/phronomy/tool/contract/tool_error.rb +0 -7
  453. data/lib/phronomy/vector_store/embeddings/base.rb +0 -44
  454. data/lib/phronomy/vector_store/embeddings/ruby_llm_embeddings.rb +0 -47
  455. data/lib/phronomy/workflow/phase_machine_builder.rb +0 -205
  456. data/lib/phronomy/workflow/storage_contract/workflow_storage_schema.rb +0 -9
  457. data/sig/phronomy/execution_receiver.rbs +0 -34
  458. data/sig/phronomy/llm_adapter.rbs +0 -11
  459. data/sig/phronomy/runtime.rbs +0 -76
  460. /data/lib/phronomy/agent/{context_assembly/context_importer.rb → context_importer.rb} +0 -0
  461. /data/lib/phronomy/{engine → execution}/backpressure_error.rb +0 -0
  462. /data/lib/phronomy/{engine → execution}/cancellation_error.rb +0 -0
  463. /data/lib/phronomy/{engine → execution}/concurrency/worker_input_restricted.rb +0 -0
  464. /data/lib/phronomy/{engine → execution}/event_loop_reentrancy_error.rb +0 -0
  465. /data/lib/phronomy/{engine → execution}/execution_cancellation_error.rb +0 -0
  466. /data/lib/phronomy/{engine → execution}/execution_timeout_error.rb +0 -0
  467. /data/lib/phronomy/{engine → execution}/invalid_async_entry_action_error.rb +0 -0
  468. /data/lib/phronomy/{engine → execution}/invalid_async_transition_action_error.rb +0 -0
  469. /data/lib/phronomy/{engine → execution}/invalid_async_workflow_action_error.rb +0 -0
  470. /data/lib/phronomy/{engine → execution}/pool_shutdown_error.rb +0 -0
  471. /data/lib/phronomy/{engine → execution}/recursion_limit_error.rb +0 -0
  472. /data/lib/phronomy/{engine → execution}/runtime_shutdown_error.rb +0 -0
  473. /data/lib/phronomy/{engine → execution}/runtime_shutdown_reentrancy_error.rb +0 -0
  474. /data/lib/phronomy/{engine → execution}/scheduler_reentrancy_error.rb +0 -0
  475. /data/lib/phronomy/{engine → execution}/timeout_error.rb +0 -0
@@ -0,0 +1,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
@@ -1,25 +1,7 @@
1
1
  module Phronomy
2
2
  module Agent
3
3
  interface _BeforeLLMInputHook
4
- def call: (LLMInputBuildContext context) -> LLMInputPatch?
5
- end
6
-
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
- end
14
-
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
4
+ def call: (Phronomy::Context::LLMInputBuildContext context) -> Phronomy::Context::LLMInputPatch?
23
5
  end
24
6
 
25
7
  class ToolApprovalRequest
@@ -67,118 +49,6 @@ module Phronomy
67
49
  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
50
  end
69
51
 
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
52
  class Base
183
53
  def self.model: (?String name) -> String?
184
54
  def self.instructions: (?untyped text) { (untyped) -> untyped } -> untyped
@@ -190,23 +60,29 @@ module Phronomy
190
60
  def self.max_iterations: (?Integer value) -> Integer
191
61
  def self.cache_instructions: (?bool enabled) -> bool?
192
62
  def self.max_output_tokens: (?Integer value) -> Integer?
193
- def self.context_policy: () -> ContextPolicy
194
- | (ContextPolicy policy) -> ContextPolicy
63
+ def self.context_policy: () -> Phronomy::Context::ContextPolicy
64
+ | (Phronomy::Context::ContextPolicy policy) -> Phronomy::Context::ContextPolicy
195
65
  def self.agent_definition: () -> Hash[Symbol, untyped]
196
66
  | (version: Integer, ?id: String?) -> Hash[Symbol, untyped]
197
- def self.before_llm_input: (?_BeforeLLMInputHook callable) ?{ (LLMInputBuildContext context) -> LLMInputPatch? } -> _BeforeLLMInputHook?
67
+ def self.before_llm_input: (?_BeforeLLMInputHook callable) ?{ (Phronomy::Context::LLMInputBuildContext context) -> Phronomy::Context::LLMInputPatch? } -> _BeforeLLMInputHook?
198
68
 
199
69
  # on_event is bound once to the live Agent Runtime incarnation. The block
200
70
  # 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
71
+ 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
72
+ def self.load: (String agent_id, persistence: Store, ?execution_wiring: execution_wiring, ?on_event: ^(untyped) -> void) ?{ (untyped event) -> void } -> instance
203
73
  def self.get: (String agent_id) -> instance?
204
74
  def self.live_for_execution: (String execution_id) -> instance
205
75
 
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
76
+ 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
77
 
208
78
  attr_reader agent_id: String
209
- attr_reader persistence: Persistence
79
+ attr_reader persistence: Store
80
+ def knowledge_snapshot: () -> Array[KnowledgeItem]
81
+ def event_listener: () -> (^(Object) -> void)?
82
+ def start_reserved_async: (reservation: ReservedExecution, input: String, ?config: Hash[Symbol, Object]) -> TaskResult[execution_result]
83
+ def resume_async: (String execution_id, ?config: Hash[Symbol, Object]) -> TaskResult[execution_result]
84
+ def resume: (String execution_id, ?config: Hash[Symbol, Object]) -> execution_result
85
+ def cancel_async: (String execution_id) -> TaskResult[ExecutionObservation]
210
86
  attr_accessor before_llm_input: _BeforeLLMInputHook?
211
87
 
212
88
  # Public operation methods no longer accept per-invocation event listeners
@@ -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,17 @@
1
+ module Phronomy
2
+ module Embeddings
3
+ class InvalidResultError < Phronomy::Error
4
+ end
5
+
6
+ class TransportError < Phronomy::Error
7
+ end
8
+
9
+ class Base
10
+ def embed: (String text, ?_CancellationSignal? cancellation_token) -> Array[Float]
11
+
12
+ # Protected extension SPI at runtime; RBS has no protected visibility.
13
+ private
14
+ def perform_embed: (String text, ?_CancellationSignal? cancellation_token) -> Array[Numeric]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ module Phronomy
2
+ interface _TimerQueue
3
+ def schedule: (seconds: Numeric) { () -> void } -> self
4
+ def cancel: (^() -> void callback) -> bool
5
+ end
6
+
7
+ module Concurrency
8
+ class OffloadPool
9
+ @timer_queue_provider: (^() -> _TimerQueue)?
10
+ def initialize: (?pool_size: Integer, ?queue_size: Integer, ?name: (String | Symbol)?, ?logger: untyped, ?timer_queue_provider: (^() -> _TimerQueue)?) -> void
11
+ def begin_shutdown: () -> self
12
+ def terminated?: () -> bool
13
+ def shutdown: (?drain_timeout: Numeric, ?deadline: Numeric?) -> self
14
+ end
15
+
16
+ class PoolRegistry
17
+ @timer_queue_provider: (^() -> _TimerQueue)?
18
+ def initialize: (?timer_queue_provider: (^() -> _TimerQueue)?) -> void
19
+ def shutdown: (?deadline: Numeric) -> bool
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ module Phronomy
2
+ class FSMSession
3
+ @terminal_policy: _TerminalPolicy?
4
+ @event_sink: _FSMEventSink
5
+ end
6
+
7
+ class EventLoop
8
+ @execution_receivers: Hash[untyped, _ExecutionReceiver]
9
+ @session_receivers: Hash[String, _ExecutionReceiver]
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ module Phronomy
2
+ interface _FSMEventSink
3
+ def post: (Symbol type, ?untyped payload) -> untyped
4
+ end
5
+
6
+ interface _TerminalPolicy
7
+ def start: (terminal_type: Symbol, context: untyped, event_sink: _FSMEventSink) -> untyped
8
+ def handles?: (Event event) -> bool
9
+ def decision_for: (Event event) -> TerminalDecision
10
+ end
11
+
12
+ class Event
13
+ attr_reader type: Symbol
14
+ attr_reader payload: untyped
15
+ end
16
+
17
+ class TerminalDecision < Data
18
+ attr_reader action: (:complete | :fail | :retire)
19
+ attr_reader error: Exception?
20
+ def self.new: (action: (:complete | :fail | :retire), error: Exception?) -> instance
21
+ end
22
+
23
+ end
@@ -0,0 +1,6 @@
1
+ module Phronomy
2
+ module ExecutionBinding
3
+ def self.submit: [V] (?pool: _ExecutionPool?, ?runtime: _ExecutionRuntime?, ?pool_name: Symbol?, ?size: Integer, ?queue_size: Integer, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
4
+ def self.after: (Numeric seconds) { () -> void } -> ^() -> untyped
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ module Phronomy
2
+ class EventLoop
3
+ def __execution_receiver: (key: untyped) -> ExecutionReceiver?
4
+ def __register_execution_receiver: (key: untyped, receiver: ExecutionReceiver) -> ExecutionReceiver
5
+ def __synchronize_execution_state: [V] () { () -> V } -> V
6
+ def __admit_execution: [V] (ExecutionReceiver receiver) { () -> V } -> V
7
+ def __post_execution: (ExecutionReceiver receiver, untyped message, ?admission: bool, ?completion: TaskResult[untyped]?) -> bool
8
+ def __route_execution_event: (ExecutionReceiver receiver) { () -> untyped } -> bool
9
+ def __receiver_cleanup_complete?: () -> bool
10
+ end
11
+
12
+ class Runtime
13
+ def __event_loop_if_initialized: () -> EventLoop?
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # Internal lookup operations. None of these methods initializes a resource.
2
+ module Phronomy
3
+ class Runtime
4
+ def self.__default_if_initialized: () -> Runtime?
5
+ def __offload_if_initialized: () -> Concurrency::OffloadPool?
6
+ end
7
+
8
+ module Concurrency
9
+ class PoolRegistry
10
+ def default_pool_if_initialized: () -> OffloadPool?
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ module AsyncOperation
3
+ def self.map: [A, B] (_CompletionHandle[A] source, name: String, ?on_error: (^(Exception) -> B)?) { (A) -> B } -> TaskResult[B]
4
+ def self.call: [A, B] (name: String, ?on_error: (^(Exception) -> B)?, ?transform: ^(A) -> B) { () -> _CompletionHandle[A] } -> TaskResult[B]
5
+ def self.capture: [V] (name: String, ?on_error: (^(Exception) -> V)?) { () -> V } -> TaskResult[V]
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Phronomy
2
+ module Blocking
3
+ def self.call_async: [V] (?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?invocation_context: InvocationContext?) { () -> V } -> TaskResult[V]
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ module Phronomy
2
+ module Concurrency
3
+ class CancellationToken
4
+ def self.timeout_after: (Numeric seconds) -> CancellationToken
5
+ def initialize: (?monotonic_deadline: Float?) -> void
6
+ def remaining_monotonic_seconds: () -> Float?
7
+ def on_cancel: () { () -> void } -> self
8
+ def cancel!: () -> self
9
+ def cancelled?: () -> bool
10
+ def raise_if_cancelled!: (?String message) -> nil
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ module Phronomy
2
+ module Concurrency
3
+ class Deadline
4
+ def self.in: (Numeric seconds) -> instance
5
+ def initialize: (Numeric monotonic_at) -> void
6
+ def expired?: () -> bool
7
+ def remaining_seconds: () -> Float
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Phronomy
2
+ module Concurrency
3
+ class ResultComposition
4
+ @scope: _ExecutionScope?
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module Phronomy
2
+ # Only the operations used across the execution boundary; no concrete runtime.
3
+ interface _CompletionHandle[A]
4
+ def on_complete: () { (A?, Exception?) -> void } -> untyped
5
+ end
6
+
7
+ interface _ExecutionScope
8
+ def __while_open: [V] () { () -> V } -> V?
9
+ def __open?: () -> bool
10
+ def __cancellation_token: () -> Concurrency::CancellationToken
11
+ def __cancellation_error: () -> Exception
12
+ end
13
+
14
+ module WaitPolicy
15
+ def self.blocking_forbidden?: () -> bool
16
+ def self.without_blocking: [V] () { () -> V } -> V
17
+ end
18
+ end