phronomy 0.26.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.
- checksums.yaml +4 -4
- data/.mutant.yml +9 -9
- data/CHANGELOG.md +92 -0
- data/CONTRIBUTING.md +8 -8
- data/README.md +13 -3
- data/VERIFY.sh +27 -27
- data/benchmark/bench_agent_invoke.rb +26 -47
- data/benchmark/bench_context_assembler.rb +17 -15
- data/benchmark/bench_regression.rb +1 -1
- data/benchmark/bench_tool_schema.rb +1 -1
- data/docs/architecture/agent-chat-and-state-ownership.md +153 -0
- data/docs/architecture/agent-configuration-and-tool-binding.md +139 -0
- data/docs/architecture/agent-context.md +4 -2
- data/docs/architecture/agent-transition-ownership.md +13 -0
- data/docs/architecture/backend-groups.md +152 -0
- data/docs/architecture/before-llm-input.md +9 -3
- data/docs/architecture/context-management.md +31 -1
- data/docs/architecture/context-preparation-steps.md +90 -0
- data/docs/architecture/entry-action-and-team-wording.md +72 -0
- data/docs/architecture/execution-abstraction-review.md +88 -0
- data/docs/architecture/execution-boundaries.md +28 -0
- data/docs/architecture/execution-metadata-and-values.md +86 -0
- data/docs/architecture/generator-verifier-ownership.md +111 -0
- data/docs/architecture/multi-agent-handoff.md +11 -4
- data/docs/architecture/persistence-refactoring-plan.md +50 -0
- data/docs/architecture/persistence.md +45 -4
- data/docs/architecture/r8-unit1.md +104 -0
- data/docs/architecture/r8-unit10.md +72 -0
- data/docs/architecture/r8-unit11.md +71 -0
- data/docs/architecture/r8-unit12.md +67 -0
- data/docs/architecture/r8-unit13.md +61 -0
- data/docs/architecture/r8-unit14.md +72 -0
- data/docs/architecture/r8-unit15.md +65 -0
- data/docs/architecture/r8-unit16.md +54 -0
- data/docs/architecture/r8-unit17.md +73 -0
- data/docs/architecture/r8-unit18.md +92 -0
- data/docs/architecture/r8-unit19.md +61 -0
- data/docs/architecture/r8-unit2.md +55 -0
- data/docs/architecture/r8-unit20.md +51 -0
- data/docs/architecture/r8-unit21.md +79 -0
- data/docs/architecture/r8-unit22.md +74 -0
- data/docs/architecture/r8-unit23.md +81 -0
- data/docs/architecture/r8-unit3.md +130 -0
- data/docs/architecture/r8-unit4.md +79 -0
- data/docs/architecture/r8-unit5.md +115 -0
- data/docs/architecture/r8-unit6.md +71 -0
- data/docs/architecture/r8-unit7.md +70 -0
- data/docs/architecture/r8-unit8.md +78 -0
- data/docs/architecture/r8-unit9.md +73 -0
- data/docs/architecture/refactoring-closure.md +343 -0
- data/docs/architecture/remaining-refactoring-plan.md +390 -0
- data/docs/architecture/rubyllm-2-token-ownership.md +82 -0
- data/docs/architecture/storage-execution-boundaries.md +54 -0
- data/docs/architecture/tool-schema-recording-gap.md +56 -0
- data/docs/architecture/tracing.md +2 -2
- data/docs/architecture/workflow-terminal-ownership-design.md +104 -0
- data/docs/architecture.md +222 -0
- data/docs/decisions/014-unified-persistence-durable-state.md +11 -0
- data/docs/decisions/015-tool-public-facade-and-rbs-boundary.md +3 -3
- data/docs/decisions/024-event-loop-single-writer-agent-runtime.md +5 -1
- data/docs/decisions/025-process-local-agent-ownership-and-runtime-admission.md +13 -3
- data/docs/decisions/026-workflow-runtime-admission-and-durable-terminal-barrier.md +5 -1
- data/docs/decisions/027-llm-adapter-provider-boundary.md +2 -0
- data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +7 -0
- data/docs/decisions/031-durable-multi-agent-coordination.md +7 -0
- data/docs/decisions/032-storage-backend-composition.md +85 -0
- data/docs/decisions/033-domain-persistence-ownership.md +79 -0
- data/docs/decisions/034-handoff-runner-coordination-ownership.md +78 -0
- data/docs/decisions/035-tool-executor-capability-ownership.md +68 -0
- data/docs/decisions/036-context-contract-ownership.md +86 -0
- data/docs/decisions/037-common-definition-ownership.md +62 -0
- data/docs/decisions/038-responsibility-based-source-layout.md +145 -0
- data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +82 -0
- data/docs/decisions/040-configuration-default-composition.md +105 -0
- data/docs/decisions/041-feature-owned-identity-registries.md +100 -0
- data/docs/decisions/042-feature-owned-execution-state.md +106 -0
- data/docs/decisions/043-storage-execution-constraint-notifications.md +75 -0
- data/docs/decisions/044-agent-default-and-one-shot-composition.md +106 -0
- data/docs/decisions/045-worker-input-restriction-ownership.md +104 -0
- data/docs/decisions/046-agent-responsibility-layout-and-shared-records.md +110 -0
- data/docs/decisions/047-recovered-execution-continuation-contract.md +116 -0
- data/docs/decisions/048-dispatch-preparation-worker-ownership.md +120 -0
- data/docs/decisions/049-initial-preparation-worker-ownership.md +111 -0
- data/docs/decisions/050-approval-resume-snapshot-and-commit-ownership.md +98 -0
- data/docs/decisions/051-execution-outcome-worker-ownership.md +153 -0
- data/docs/decisions/052-tool-invocation-restoration-ownership.md +92 -0
- data/docs/decisions/053-shared-state-coordination-ownership.md +71 -0
- data/docs/decisions/054-workflow-terminal-save-single-owner.md +76 -0
- data/docs/decisions/055-terminal-observer-failure-settlement.md +60 -0
- data/docs/decisions/056-workflow-terminal-policy-ownership.md +87 -0
- data/docs/decisions/057-storage-transaction-boundaries.md +73 -0
- data/docs/decisions/058-neutral-storage-primitives.md +83 -0
- data/docs/decisions/059-backend-contracts-and-async-clients.md +74 -0
- data/docs/decisions/060-runtime-settings-and-application-configuration.md +86 -0
- data/docs/decisions/061-persistence-failure-contracts.md +89 -0
- data/docs/decisions/062-content-store-service.md +52 -0
- data/docs/decisions/063-execution-contracts-and-services.md +88 -0
- data/docs/decisions/064-agent-execution-and-multi-agent-responsibility.md +36 -0
- data/docs/decisions/065-vector-and-embeddings-common-operations.md +38 -0
- data/docs/decisions/066-llm-and-tool-operation-contracts.md +20 -0
- data/docs/decisions/067-agent-progress-and-engine-connection.md +29 -0
- data/docs/decisions/068-agent-tool-child-progress-and-tool-operation.md +36 -0
- data/docs/decisions/README.md +52 -6
- data/docs/design/durable-semantic-coordination/IMPLEMENTATION_DESIGN_V2.md +6 -0
- data/docs/design/durable-semantic-coordination/IMPLEMENTATION_REPORT.md +6 -0
- data/docs/execution-boundaries-preview.md +45 -0
- data/docs/features.md +16 -5
- data/docs/getting-started.md +11 -8
- data/docs/migrations/0.15.md +5 -0
- data/docs/migrations/0.22.md +2 -2
- data/docs/migrations/durable-semantic-coordination-v2.md +8 -0
- data/docs/migrations/handoff-runner-multi-agent.md +37 -0
- data/docs/migrations/neutral-storage-spi.md +43 -0
- data/docs/migrations/parallel-tool-chat-removal.md +49 -0
- data/docs/migrations/persistence-failure-contracts.md +67 -0
- data/docs/migrations/r8-unit10.md +36 -0
- data/docs/migrations/r8-unit11.md +33 -0
- data/docs/migrations/r8-unit12.md +31 -0
- data/docs/migrations/r8-unit13.md +36 -0
- data/docs/migrations/r8-unit14.md +31 -0
- data/docs/migrations/r8-unit15.md +31 -0
- data/docs/migrations/r8-unit16.md +26 -0
- data/docs/migrations/r8-unit17.md +28 -0
- data/docs/migrations/r8-unit18.md +29 -0
- data/docs/migrations/r8-unit19.md +28 -0
- data/docs/migrations/r8-unit20.md +24 -0
- data/docs/migrations/r8-unit21.md +28 -0
- data/docs/migrations/r8-unit22.md +29 -0
- data/docs/migrations/r8-unit23.md +20 -0
- data/docs/migrations/r8-unit4.md +67 -0
- data/docs/migrations/r8-unit5.md +75 -0
- data/docs/migrations/r8-unit6.md +109 -0
- data/docs/migrations/r8-unit7.md +31 -0
- data/docs/migrations/r8-unit8.md +33 -0
- data/docs/migrations/r8-unit9.md +28 -0
- data/docs/migrations/shared-state-multi-agent.md +44 -0
- data/docs/migrations/storage-async-client.md +103 -0
- data/docs/migrations/storage-backend-composition.md +117 -0
- data/docs/migrations/storage-transaction-boundaries.md +74 -0
- data/docs/migrations/vector-async-clients.md +110 -0
- data/docs/persistence-backends.md +190 -215
- data/docs/runtime-and-concurrency.md +142 -32
- data/lib/phronomy/agent/admission.rb +78 -0
- data/lib/phronomy/{agent_already_exists_error.rb → agent/agent_already_exists_error.rb} +2 -0
- data/lib/phronomy/{agent_busy_error.rb → agent/agent_busy_error.rb} +2 -0
- data/lib/phronomy/{agent_purged_error.rb → agent/agent_purged_error.rb} +2 -0
- data/lib/phronomy/agent/api/agent.rb +17 -0
- data/lib/phronomy/{execution_rehydration_required_error.rb → agent/api/execution_rehydration_required_error.rb} +2 -0
- data/lib/phronomy/agent/async_event_api.rb +38 -33
- data/lib/phronomy/agent/base.rb +106 -294
- data/lib/phronomy/agent/before_llm_input.rb +64 -0
- data/lib/phronomy/{agent.rb → agent/composition/run_once.rb} +4 -13
- data/lib/phronomy/agent/context_candidate_resolver.rb +2 -2
- data/lib/phronomy/agent/context_importer.rb +2 -2
- data/lib/phronomy/agent/{context_assembler.rb → context_preparation.rb} +157 -288
- data/lib/phronomy/agent/control_request.rb +21 -0
- data/lib/phronomy/agent/{agent_execution.rb → execution/agent_execution.rb} +8 -4
- data/lib/phronomy/agent/{agent_invocation.rb → execution/agent_invocation.rb} +32 -63
- data/lib/phronomy/agent/execution/approval_resume_commit.rb +108 -0
- data/lib/phronomy/agent/execution/dispatch_preparation.rb +195 -0
- data/lib/phronomy/agent/{exact_execution.rb → execution/exact_execution.rb} +43 -23
- data/lib/phronomy/agent/{execution_cancellation.rb → execution/execution_cancellation.rb} +8 -5
- data/lib/phronomy/agent/execution/execution_coordinator.rb +1744 -0
- data/lib/phronomy/agent/execution/execution_failure.rb +30 -0
- data/lib/phronomy/agent/execution/execution_metadata.rb +54 -0
- data/lib/phronomy/agent/execution/execution_outcome_committer.rb +288 -0
- data/lib/phronomy/agent/execution/execution_registry.rb +463 -0
- data/lib/phronomy/agent/execution/execution_session_runner.rb +113 -0
- data/lib/phronomy/agent/execution/initial_preparation.rb +323 -0
- data/lib/phronomy/agent/execution/invocation_actions.rb +368 -0
- data/lib/phronomy/agent/execution/invocation_transitions.rb +124 -0
- data/lib/phronomy/agent/execution/runtime_record_encoder.rb +210 -0
- data/lib/phronomy/agent/execution_change.rb +161 -0
- data/lib/phronomy/agent/execution_environment.rb +36 -0
- data/lib/phronomy/agent/execution_extension_state.rb +21 -0
- data/lib/phronomy/agent/execution_observation.rb +35 -0
- data/lib/phronomy/agent/filterable.rb +182 -0
- data/lib/phronomy/agent/{handoff_context.rb → handoff/transfer_context.rb} +6 -6
- data/lib/phronomy/agent/{handoff_projection.rb → handoff/transfer_projection.rb} +14 -33
- data/lib/phronomy/agent/handoff_error.rb +7 -0
- data/lib/phronomy/agent/{journal_projection.rb → journal/journal_projection.rb} +4 -0
- data/lib/phronomy/agent/{journal_record.rb → journal/journal_record.rb} +3 -3
- data/lib/phronomy/agent/{llm_call_record.rb → journal/llm_call_record.rb} +2 -2
- data/lib/phronomy/agent/knowledge_item.rb +13 -0
- data/lib/phronomy/agent/{agent_root.rb → lifecycle/agent_root.rb} +6 -2
- data/lib/phronomy/agent/lifecycle/default_persistence.rb +29 -0
- data/lib/phronomy/{engine/runtime/agent_ownership_registry.rb → agent/lifecycle/ownership_registry.rb} +24 -15
- data/lib/phronomy/agent/persistence/agent_repository.rb +69 -0
- data/lib/phronomy/agent/persistence/cancellation_repository.rb +51 -0
- data/lib/phronomy/agent/persistence/codec.rb +338 -0
- data/lib/phronomy/agent/persistence/execution_repository.rb +124 -0
- data/lib/phronomy/agent/persistence/journal_repository.rb +63 -0
- data/lib/phronomy/agent/persistence/records.rb +33 -0
- data/lib/phronomy/agent/persistence/retention_repository.rb +70 -0
- data/lib/phronomy/agent/persistence/storage_schema.rb +29 -0
- data/lib/phronomy/agent/persistence/watermark.rb +29 -0
- data/lib/phronomy/agent/recovery/invocation_restorer.rb +124 -0
- data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/continuation.rb +28 -51
- data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/installation.rb +50 -55
- data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/resolution.rb +38 -43
- data/lib/phronomy/agent/{recovery_coordinator.rb → recovery/recovery_coordinator.rb} +26 -23
- data/lib/phronomy/agent/recovery/recovery_rules.rb +119 -0
- data/lib/phronomy/agent/recovery/recovery_support.rb +224 -0
- data/lib/phronomy/agent/reserved_execution.rb +16 -0
- data/lib/phronomy/agent/retention.rb +17 -0
- data/lib/phronomy/agent/runtime_binding/engine_environment.rb +60 -0
- data/lib/phronomy/agent/runtime_binding/engine_session_builder.rb +34 -0
- data/lib/phronomy/agent/runtime_binding/phase_machine_builder.rb +64 -0
- data/lib/phronomy/agent/runtime_binding/tool_session_builder.rb +34 -0
- data/lib/phronomy/agent/{ruby_llm_materializer.rb → runtime_input.rb} +19 -39
- data/lib/phronomy/agent/saved_context_reader.rb +55 -0
- data/lib/phronomy/agent/settings.rb +47 -0
- data/lib/phronomy/agent/state_writer.rb +166 -0
- data/lib/phronomy/agent/store.rb +253 -0
- data/lib/phronomy/{stream_callback_error.rb → agent/stream_callback_error.rb} +2 -0
- data/lib/phronomy/agent/{approval_evaluation_request.rb → tool_execution/approval_evaluation_request.rb} +1 -12
- data/lib/phronomy/agent/{tool_approval_request.rb → tool_execution/tool_approval_request.rb} +1 -10
- data/lib/phronomy/agent/tool_execution/tool_binding.rb +30 -0
- data/lib/phronomy/agent/{tool_invocation.rb → tool_execution/tool_invocation.rb} +114 -248
- data/lib/phronomy/agent/tool_execution/tool_invocation_actions.rb +107 -0
- data/lib/phronomy/agent/tool_execution/tool_invocation_transitions.rb +70 -0
- data/lib/phronomy/common/configuration_error.rb +7 -0
- data/lib/phronomy/common/error.rb +5 -0
- data/lib/phronomy/{agent → common/values}/immutable.rb +9 -1
- data/lib/phronomy/common/values/serializable.rb +32 -0
- data/lib/phronomy/configuration/runtime_settings.rb +49 -0
- data/lib/phronomy/content_store/storage_schema.rb +12 -0
- data/lib/phronomy/content_store/stored_contents.rb +44 -0
- data/lib/phronomy/context/assembly.rb +202 -0
- data/lib/phronomy/{context_budget_exceeded_error.rb → context/budget_exceeded_error.rb} +5 -1
- data/lib/phronomy/context/candidate.rb +51 -0
- data/lib/phronomy/context/constraint.rb +47 -0
- data/lib/phronomy/{agent → context}/context_plan.rb +2 -2
- data/lib/phronomy/{agent → context}/context_plan_validator.rb +3 -3
- data/lib/phronomy/{agent → context}/context_policy.rb +1 -1
- data/lib/phronomy/{agent → context}/context_policy_input.rb +7 -7
- data/lib/phronomy/{agent → context}/context_policy_input_builder.rb +1 -1
- data/lib/phronomy/context/default_policy.rb +140 -0
- data/lib/phronomy/context/final_budget_validator.rb +33 -0
- data/lib/phronomy/{agent → context}/llm_input_build_context.rb +2 -2
- data/lib/phronomy/{agent → context}/llm_input_manifest.rb +21 -21
- data/lib/phronomy/{agent → context}/llm_input_patch.rb +3 -3
- data/lib/phronomy/context/manifest_error.rb +10 -0
- data/lib/phronomy/context/prompt_template.rb +98 -0
- data/lib/phronomy/{vector_store → documents}/loader/base.rb +1 -1
- data/lib/phronomy/{vector_store → documents}/loader/csv_loader.rb +2 -2
- data/lib/phronomy/{vector_store → documents}/loader/markdown_loader.rb +3 -3
- data/lib/phronomy/{vector_store → documents}/loader/plain_text_loader.rb +2 -2
- data/lib/phronomy/{vector_store → documents}/splitter/base.rb +1 -1
- data/lib/phronomy/{vector_store → documents}/splitter/fixed_size_splitter.rb +2 -2
- data/lib/phronomy/{vector_store → documents}/splitter/recursive_splitter.rb +2 -2
- data/lib/phronomy/embeddings/async/async_client.rb +44 -0
- data/lib/phronomy/embeddings/backends/ruby_llm_embeddings.rb +48 -0
- data/lib/phronomy/embeddings/base.rb +43 -0
- data/lib/phronomy/embeddings/invalid_result_error.rb +11 -0
- data/lib/phronomy/embeddings/transport_error.rb +11 -0
- data/lib/phronomy/engine/concurrency/offload_pool.rb +39 -20
- data/lib/phronomy/engine/concurrency/pool_registry.rb +47 -12
- data/lib/phronomy/{diagnostics.rb → engine/diagnostics.rb} +1 -1
- data/lib/phronomy/engine/event_loop.rb +164 -630
- data/lib/phronomy/engine/execution_binding.rb +23 -0
- data/lib/phronomy/engine/execution_receiver_binding.rb +43 -0
- data/lib/phronomy/engine/fsm_protocol.rb +9 -0
- data/lib/phronomy/engine/fsm_session.rb +37 -30
- data/lib/phronomy/engine/metrics.rb +28 -0
- data/lib/phronomy/engine/runtime/timer_queue.rb +1 -1
- data/lib/phronomy/engine/runtime.rb +104 -95
- data/lib/phronomy/engine/terminal_decision.rb +7 -0
- data/lib/phronomy/execution/async_operation.rb +41 -0
- data/lib/phronomy/execution/backpressure_error.rb +7 -0
- data/lib/phronomy/{blocking.rb → execution/blocking.rb} +2 -2
- data/lib/phronomy/execution/cancellation_error.rb +7 -0
- data/lib/phronomy/{engine → execution}/concurrency/cancellation_token.rb +5 -1
- data/lib/phronomy/{engine → execution}/concurrency/deadline.rb +0 -17
- data/lib/phronomy/{engine → execution}/concurrency/physical_completion_task.rb +1 -1
- data/lib/phronomy/{engine → execution}/concurrency/result_collector.rb +1 -1
- data/lib/phronomy/{engine → execution}/concurrency/result_composition.rb +33 -12
- data/lib/phronomy/{engine/concurrency/subscriptions.rb → execution/concurrency/result_subscriptions.rb} +14 -18
- data/lib/phronomy/execution/concurrency/subscriptions.rb +25 -0
- data/lib/phronomy/execution/concurrency/worker_input_restricted.rb +14 -0
- data/lib/phronomy/execution/event_loop_reentrancy_error.rb +8 -0
- data/lib/phronomy/{execution.rb → execution/execution.rb} +57 -30
- data/lib/phronomy/{execution_cancellation_error.rb → execution/execution_cancellation_error.rb} +2 -0
- data/lib/phronomy/execution/execution_receiver.rb +78 -0
- data/lib/phronomy/execution/execution_scope_state.rb +35 -0
- data/lib/phronomy/{execution_timeout_error.rb → execution/execution_timeout_error.rb} +2 -0
- data/lib/phronomy/{invalid_async_entry_action_error.rb → execution/invalid_async_entry_action_error.rb} +2 -0
- data/lib/phronomy/{invalid_async_transition_action_error.rb → execution/invalid_async_transition_action_error.rb} +2 -0
- data/lib/phronomy/{invalid_async_workflow_action_error.rb → execution/invalid_async_workflow_action_error.rb} +2 -0
- data/lib/phronomy/{invocation_context.rb → execution/invocation_context.rb} +0 -15
- data/lib/phronomy/execution/invocation_controls.rb +73 -0
- data/lib/phronomy/execution/pool_shutdown_error.rb +7 -0
- data/lib/phronomy/execution/recursion_limit_error.rb +7 -0
- data/lib/phronomy/execution/runnable.rb +24 -0
- data/lib/phronomy/execution/runtime_shutdown_error.rb +7 -0
- data/lib/phronomy/execution/runtime_shutdown_reentrancy_error.rb +7 -0
- data/lib/phronomy/execution/scheduler_reentrancy_error.rb +9 -0
- data/lib/phronomy/{engine → execution}/task_result.rb +7 -3
- data/lib/phronomy/execution/timeout_error.rb +7 -0
- data/lib/phronomy/execution/wait_policy.rb +24 -0
- data/lib/phronomy/filter/filter_block_error.rb +14 -0
- data/lib/phronomy/generation/generator_verifier/agent_operation.rb +65 -0
- data/lib/phronomy/generation/generator_verifier/agent_result_receiver.rb +89 -0
- data/lib/phronomy/generation/generator_verifier/default_parser.rb +27 -0
- data/lib/phronomy/generation/generator_verifier/pipeline_state.rb +57 -0
- data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +112 -0
- data/lib/phronomy/generation/generator_verifier.rb +118 -0
- data/lib/phronomy/generation/low_confidence_error.rb +14 -0
- data/lib/phronomy/llm_adapter/async/async_client.rb +47 -0
- data/lib/phronomy/llm_adapter/authentication_error.rb +9 -0
- data/lib/phronomy/llm_adapter/backends/ruby_llm.rb +183 -0
- data/lib/phronomy/llm_adapter/base.rb +49 -68
- data/lib/phronomy/llm_adapter/context_length_error.rb +9 -0
- data/lib/phronomy/llm_adapter/invalid_result_error.rb +10 -0
- data/lib/phronomy/llm_adapter/message.rb +62 -0
- data/lib/phronomy/llm_adapter/rate_limit_error.rb +9 -0
- data/lib/phronomy/llm_adapter/request.rb +79 -0
- data/lib/phronomy/llm_adapter/response.rb +36 -0
- data/lib/phronomy/llm_adapter/stream_chunk.rb +18 -0
- data/lib/phronomy/llm_adapter/token_usage.rb +64 -0
- data/lib/phronomy/llm_adapter/transport_error.rb +9 -0
- data/lib/phronomy/llm_adapter.rb +3 -16
- data/lib/phronomy/llm_context_window/token_budget.rb +6 -7
- data/lib/phronomy/multi_agent/admission_registry.rb +15 -2
- data/lib/phronomy/multi_agent/durable_subagent_coordinator.rb +108 -84
- data/lib/phronomy/multi_agent/execution_environment.rb +29 -0
- data/lib/phronomy/{agent → multi_agent}/handoff.rb +2 -2
- data/lib/phronomy/{agent → multi_agent}/handoff_capability_factory.rb +21 -2
- data/lib/phronomy/multi_agent/handoff_participant.rb +79 -0
- data/lib/phronomy/{agent → multi_agent}/handoff_policy.rb +1 -1
- data/lib/phronomy/multi_agent/handoff_runner.rb +156 -0
- data/lib/phronomy/{agent → multi_agent}/handoff_state.rb +2 -2
- data/lib/phronomy/multi_agent/orchestrator.rb +61 -75
- data/lib/phronomy/multi_agent/persistence/codec.rb +75 -0
- data/lib/phronomy/multi_agent/persistence/handoff_state_repository.rb +77 -0
- data/lib/phronomy/multi_agent/persistence/records.rb +27 -0
- data/lib/phronomy/multi_agent/persistence/storage_schema.rb +21 -0
- data/lib/phronomy/multi_agent/persistence/team_execution_repository.rb +124 -0
- data/lib/phronomy/multi_agent/persistence/team_repository.rb +69 -0
- data/lib/phronomy/multi_agent/reserved_child_admission.rb +88 -0
- data/lib/phronomy/multi_agent/runtime_binding/engine_environment.rb +35 -0
- data/lib/phronomy/{agent → multi_agent}/shared_state.rb +56 -39
- data/lib/phronomy/multi_agent/store.rb +156 -0
- data/lib/phronomy/multi_agent/team_coordinator.rb +87 -75
- data/lib/phronomy/multi_agent/team_execution.rb +1 -1
- data/lib/phronomy/{engine/runtime → multi_agent}/team_ownership_registry.rb +5 -5
- data/lib/phronomy/multi_agent/team_root.rb +1 -1
- data/lib/phronomy/output_parser/parse_error.rb +7 -0
- data/lib/phronomy/persistence/content_repository.rb +26 -0
- data/lib/phronomy/persistence/errors.rb +16 -0
- data/lib/phronomy/persistence/migration/initial_format_migration.rb +21 -21
- data/lib/phronomy/persistence/persistence.rb +23 -0
- data/lib/phronomy/persistence/save_outcome.rb +24 -0
- data/lib/phronomy/persistence/snapshot_comparison.rb +81 -0
- data/lib/phronomy/persistence/storage_boundary.rb +32 -0
- data/lib/phronomy/persistence/transaction.rb +86 -0
- data/lib/phronomy/persistence_composition/storage_schema.rb +29 -0
- data/lib/phronomy/persistence_composition/stores.rb +34 -0
- data/lib/phronomy/persistence_composition/unit4_migration.rb +276 -0
- data/lib/phronomy/runtime_composition/agent_defaults.rb +11 -0
- data/lib/phronomy/runtime_composition/configuration.rb +146 -0
- data/lib/phronomy/runtime_composition/configuration_defaults.rb +9 -0
- data/lib/phronomy/runtime_composition/evaluation_defaults.rb +7 -0
- data/lib/phronomy/runtime_composition/execution_defaults.rb +5 -0
- data/lib/phronomy/runtime_composition/generation_defaults.rb +6 -0
- data/lib/phronomy/runtime_composition/global_configuration.rb +38 -0
- data/lib/phronomy/runtime_composition/global_runtime.rb +19 -0
- data/lib/phronomy/runtime_composition/multi_agent_defaults.rb +9 -0
- data/lib/phronomy/runtime_composition/workflow_defaults.rb +4 -0
- data/lib/phronomy/storage/async/async_client.rb +60 -0
- data/lib/phronomy/storage/backend.rb +107 -0
- data/lib/phronomy/storage/backends/in_memory.rb +157 -0
- data/lib/phronomy/storage/blob_conflict_error.rb +10 -0
- data/lib/phronomy/storage/blobs.rb +31 -0
- data/lib/phronomy/storage/condition.rb +25 -0
- data/lib/phronomy/storage/condition_failed_error.rb +16 -0
- data/lib/phronomy/storage/conflict_error.rb +9 -0
- data/lib/phronomy/{persistence → storage}/durable_record.rb +12 -12
- data/lib/phronomy/storage/entry.rb +33 -0
- data/lib/phronomy/storage/guard_ref.rb +13 -0
- data/lib/phronomy/storage/not_found_error.rb +9 -0
- data/lib/phronomy/storage/record_codec.rb +177 -0
- data/lib/phronomy/storage/records.rb +61 -0
- data/lib/phronomy/storage/resource.rb +126 -0
- data/lib/phronomy/storage/scope.rb +25 -0
- data/lib/phronomy/storage/serialization_error.rb +9 -0
- data/lib/phronomy/storage/streams.rb +44 -0
- data/lib/phronomy/storage/transaction_error.rb +10 -0
- data/lib/phronomy/storage/unique_constraint_error.rb +17 -0
- data/lib/phronomy/storage/unsupported_backend_error.rb +9 -0
- data/lib/phronomy/storage/validation.rb +53 -0
- data/lib/phronomy/storage/view.rb +131 -0
- data/lib/phronomy/testing/eval/metrics.rb +1 -1
- data/lib/phronomy/testing/eval/scorer/llm_judge.rb +19 -3
- data/lib/phronomy/testing/persistence_contract/a_content_store.rb +1 -1
- data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +2 -2
- data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +54 -48
- data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +1 -1
- data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +1 -1
- data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +5 -5
- data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +52 -46
- data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +263 -0
- data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +124 -0
- data/lib/phronomy/testing/persistence_contract.rb +4 -0
- data/lib/phronomy/tool/authorization.rb +77 -0
- data/lib/phronomy/tool/base.rb +549 -9
- data/lib/phronomy/tool/call_request.rb +40 -0
- data/lib/phronomy/{agent/tool_definition_set.rb → tool/definition_set.rb} +16 -12
- data/lib/phronomy/tool/operation.rb +88 -0
- data/lib/phronomy/tool/schema.rb +214 -0
- data/lib/phronomy/tool/settings.rb +31 -0
- data/lib/phronomy/tool/tool_error.rb +7 -0
- data/lib/phronomy/{agent → tool}/tool_executor.rb +10 -7
- data/lib/phronomy/tools/agent.rb +22 -90
- data/lib/phronomy/tools/mcp.rb +21 -14
- data/lib/phronomy/tools/vector_search.rb +4 -4
- data/lib/phronomy/tracing/automatic.rb +11 -6
- data/lib/phronomy/tracing/base.rb +1 -1
- data/lib/phronomy/tracing/observation.rb +37 -0
- data/lib/phronomy/tracing/settings.rb +36 -0
- data/lib/phronomy/vector_store/{async_backend.rb → async/async_client.rb} +35 -29
- data/lib/phronomy/vector_store/{in_memory.rb → backends/in_memory.rb} +12 -10
- data/lib/phronomy/vector_store/{pgvector.rb → backends/pgvector.rb} +44 -16
- data/lib/phronomy/vector_store/{redis_search.rb → backends/redis_search.rb} +74 -37
- data/lib/phronomy/vector_store/base.rb +118 -49
- data/lib/phronomy/vector_store/invalid_result_error.rb +12 -0
- data/lib/phronomy/vector_store.rb +2 -17
- data/lib/phronomy/version.rb +1 -1
- data/lib/phronomy/workflow/completion.rb +11 -0
- data/lib/phronomy/{workflow.rb → workflow/execution/workflow.rb} +10 -8
- data/lib/phronomy/workflow/execution/workflow_action_rules.rb +67 -0
- data/lib/phronomy/{workflow_context.rb → workflow/execution/workflow_context.rb} +5 -1
- data/lib/phronomy/workflow/execution/workflow_context_ownership_error.rb +7 -0
- data/lib/phronomy/workflow/execution/workflow_execution_environment.rb +27 -0
- data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +186 -0
- data/lib/phronomy/{workflow_runner.rb → workflow/execution/workflow_runner.rb} +145 -115
- data/lib/phronomy/workflow/execution/workflow_settings.rb +28 -0
- data/lib/phronomy/workflow/persistence/codec.rb +153 -0
- data/lib/phronomy/workflow/persistence/state_repository.rb +63 -0
- data/lib/phronomy/workflow/persistence/storage_schema.rb +13 -0
- data/lib/phronomy/workflow/runtime_binding/workflow_engine_environment.rb +38 -0
- data/lib/phronomy/workflow/runtime_binding/workflow_phase_machine_builder.rb +156 -0
- data/lib/phronomy/workflow/runtime_binding/workflow_terminal_policy.rb +40 -0
- data/lib/phronomy.rb +97 -98
- data/scripts/api_snapshot.rb +36 -16
- data/scripts/storage_spi_snapshot.rb +36 -0
- data/sig/_private/phronomy/agent/settings.rbs +19 -0
- data/sig/_private/phronomy/configuration/runtime_settings.rbs +20 -0
- data/sig/_private/phronomy/llm_adapter/async/async_client.rbs +10 -0
- data/sig/_private/phronomy/multi_agent/store.rbs +8 -0
- data/sig/_private/phronomy/persistence/storage_boundary.rbs +7 -0
- data/sig/_private/phronomy/tool/settings.rbs +13 -0
- data/sig/_private/phronomy/tracing/settings.rbs +15 -0
- data/sig/_private/phronomy/workflow/execution/workflow_settings.rbs +13 -0
- data/sig/phronomy/agent/admission.rbs +19 -0
- data/sig/phronomy/agent/execution_contract.rbs +132 -0
- data/sig/phronomy/agent/execution_environment.rbs +20 -0
- data/sig/phronomy/agent/store.rbs +73 -0
- data/sig/phronomy/agent.rbs +14 -139
- data/sig/phronomy/common.rbs +7 -0
- data/sig/phronomy/content_store/contracts.rbs +13 -0
- data/sig/phronomy/context.rbs +152 -0
- data/sig/phronomy/embeddings/async/async_client.rbs +9 -0
- data/sig/phronomy/embeddings/base.rbs +17 -0
- data/sig/phronomy/engine/concurrency/timer_bindings.rbs +22 -0
- data/sig/phronomy/engine/control_bindings.rbs +11 -0
- data/sig/phronomy/engine/control_protocols.rbs +23 -0
- data/sig/phronomy/engine/execution_binding.rbs +6 -0
- data/sig/phronomy/engine/execution_receiver.rbs +15 -0
- data/sig/phronomy/engine/observability.rbs +13 -0
- data/sig/phronomy/execution/async_operation.rbs +7 -0
- data/sig/phronomy/execution/blocking.rbs +5 -0
- data/sig/phronomy/execution/concurrency/cancellation_token.rbs +13 -0
- data/sig/phronomy/execution/concurrency/deadline.rbs +10 -0
- data/sig/phronomy/execution/concurrency/result_composition.rbs +7 -0
- data/sig/phronomy/execution/control_protocols.rbs +18 -0
- data/sig/phronomy/execution/errors.rbs +7 -0
- data/sig/phronomy/execution/execution.rbs +41 -0
- data/sig/phronomy/execution/execution_receiver.rbs +40 -0
- data/sig/phronomy/execution/execution_scope_state.rbs +9 -0
- data/sig/phronomy/execution/invocation_context.rbs +18 -0
- data/sig/phronomy/execution/invocation_controls.rbs +13 -0
- data/sig/phronomy/execution/task_result.rbs +29 -0
- data/sig/phronomy/extensions.rbs +0 -21
- data/sig/phronomy/handoff.rbs +12 -4
- data/sig/phronomy/llm_adapter/backends/ruby_llm.rbs +6 -0
- data/sig/phronomy/llm_adapter/base.rbs +14 -0
- data/sig/phronomy/llm_adapter/usage.rbs +14 -0
- data/sig/phronomy/llm_adapter/values.rbs +43 -0
- data/sig/phronomy/llm_context_window.rbs +10 -0
- data/sig/phronomy/multi_agent/reserved_child_admission.rbs +8 -0
- data/sig/phronomy/multi_agent/store.rbs +54 -0
- data/sig/phronomy/multi_agent.rbs +24 -3
- data/sig/phronomy/persistence/errors.rbs +18 -0
- data/sig/phronomy/persistence/migration.rbs +13 -0
- data/sig/phronomy/persistence/transaction.rbs +19 -0
- data/sig/phronomy/persistence.rbs +3 -185
- data/sig/phronomy/persistence_composition.rbs +19 -0
- data/sig/phronomy/runtime_composition/configuration.rbs +36 -0
- data/sig/phronomy/storage/async/async_client.rbs +8 -0
- data/sig/phronomy/storage/backends/in_memory.rbs +9 -0
- data/sig/phronomy/storage/contracts.rbs +160 -0
- data/sig/phronomy/tool.rbs +58 -5
- data/sig/phronomy/tracing/observation.rbs +7 -0
- data/sig/phronomy/vector_store/async/async_client.rbs +13 -0
- data/sig/phronomy/vector_store/base.rbs +23 -0
- data/sig/phronomy/workflow/execution/workflow_execution_environment.rbs +14 -0
- data/sig/phronomy/workflow/runtime_binding/workflow_terminal_policy.rbs +7 -0
- data/sig/phronomy/workflow/store.rbs +8 -0
- data/sig/phronomy/workflow.rbs +1 -1
- data/sig/phronomy.rbs +0 -49
- metadata +462 -130
- data/lib/phronomy/agent/agent_invocation_session_builder.rb +0 -584
- data/lib/phronomy/agent/concerns/before_llm_input.rb +0 -66
- data/lib/phronomy/agent/concerns/error_translation.rb +0 -45
- data/lib/phronomy/agent/concerns/filterable.rb +0 -184
- data/lib/phronomy/agent/context/capability/base.rb +0 -507
- data/lib/phronomy/agent/context/instruction/prompt_template.rb +0 -102
- data/lib/phronomy/agent/context_parts/validators/final_budget_validator.rb +0 -37
- data/lib/phronomy/agent/context_policies/default.rb +0 -142
- data/lib/phronomy/agent/execution_coordinator.rb +0 -3151
- data/lib/phronomy/agent/handoff_execution_coordinator.rb +0 -143
- data/lib/phronomy/agent/handoff_request.rb +0 -45
- data/lib/phronomy/agent/handoff_runner.rb +0 -178
- data/lib/phronomy/agent/phase_machine_builder.rb +0 -152
- data/lib/phronomy/agent/provider_call_outcome.rb +0 -106
- data/lib/phronomy/agent/recovery_support.rb +0 -504
- data/lib/phronomy/agent/selection/candidate.rb +0 -53
- data/lib/phronomy/agent/selection/constraint.rb +0 -49
- data/lib/phronomy/agent/token_budget_resolver.rb +0 -70
- data/lib/phronomy/agent/tool_call_intercepted.rb +0 -29
- data/lib/phronomy/agent/tool_invocation_session_builder.rb +0 -276
- data/lib/phronomy/configuration.rb +0 -59
- data/lib/phronomy/engine/concurrency/cancellation_scope.rb +0 -124
- data/lib/phronomy/engine/concurrency/operation_binding.rb +0 -43
- data/lib/phronomy/generator_verifier.rb +0 -369
- data/lib/phronomy/invalid_context_budget_configuration_error.rb +0 -8
- data/lib/phronomy/llm_adapter/ruby_llm.rb +0 -47
- data/lib/phronomy/metrics.rb +0 -26
- data/lib/phronomy/multi_agent/parallel_tool_chat.rb +0 -116
- data/lib/phronomy/persistence/durable_codec.rb +0 -706
- data/lib/phronomy/persistence/in_memory.rb +0 -690
- data/lib/phronomy/persistence/repository_facades.rb +0 -535
- data/lib/phronomy/persistence.rb +0 -276
- data/lib/phronomy/recovery.rb +0 -186
- data/lib/phronomy/ruby_llm_patches.rb +0 -24
- data/lib/phronomy/runnable.rb +0 -54
- data/lib/phronomy/token_usage.rb +0 -85
- data/lib/phronomy/vector_store/embeddings/base.rb +0 -44
- data/lib/phronomy/vector_store/embeddings/ruby_llm_embeddings.rb +0 -47
- data/lib/phronomy/workflow/phase_machine_builder.rb +0 -205
- data/lib/phronomy/workflow_recovery.rb +0 -123
- data/sig/phronomy/llm_adapter.rbs +0 -11
- data/sig/phronomy/runtime.rbs +0 -76
- /data/lib/phronomy/agent/{llm_operation_result.rb → execution/llm_operation_result.rb} +0 -0
- /data/lib/phronomy/{canonical_json.rb → common/canonical_json.rb} +0 -0
- /data/lib/phronomy/{event.rb → engine/event.rb} +0 -0
data/lib/phronomy.rb
CHANGED
|
@@ -2,120 +2,119 @@
|
|
|
2
2
|
|
|
3
3
|
require "zeitwerk"
|
|
4
4
|
require "ruby_llm"
|
|
5
|
-
require_relative "phronomy/
|
|
5
|
+
require_relative "phronomy/version"
|
|
6
6
|
|
|
7
7
|
loader = Zeitwerk::Loader.for_gem
|
|
8
8
|
loader.inflector.inflect("ruby_llm_embeddings" => "RubyLLMEmbeddings")
|
|
9
9
|
loader.inflector.inflect("rag" => "RAG")
|
|
10
10
|
loader.inflector.inflect("fsm_session" => "FSMSession")
|
|
11
|
+
loader.inflector.inflect("fsm_protocol" => "FSMProtocol")
|
|
11
12
|
loader.inflector.inflect("llm_adapter" => "LLMAdapter")
|
|
12
13
|
loader.inflector.inflect("llm_operation_result" => "LLMOperationResult")
|
|
13
14
|
loader.inflector.inflect("ruby_llm" => "RubyLLM")
|
|
14
15
|
loader.inflector.inflect("canonical_json" => "CanonicalJSON")
|
|
15
|
-
loader.inflector.inflect("ruby_llm_materializer" => "RubyLLMMaterializer")
|
|
16
16
|
loader.inflector.inflect("llm_call_record" => "LLMCallRecord")
|
|
17
17
|
loader.inflector.inflect("llm_input_manifest" => "LLMInputManifest")
|
|
18
18
|
loader.inflector.inflect("llm_input_build_context" => "LLMInputBuildContext")
|
|
19
19
|
loader.inflector.inflect("llm_input_patch" => "LLMInputPatch")
|
|
20
20
|
loader.inflector.inflect("before_llm_input" => "BeforeLLMInput")
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
loader.
|
|
24
|
-
|
|
25
|
-
#
|
|
21
|
+
# These responsibility directories do not add a public Ruby namespace.
|
|
22
|
+
%w[common configuration engine execution generation runtime_composition].each do |directory|
|
|
23
|
+
loader.collapse("#{__dir__}/phronomy/#{directory}")
|
|
24
|
+
end
|
|
25
|
+
# Backend contracts, execution clients and implementations have separate source
|
|
26
|
+
# directories, while keeping their existing feature namespace.
|
|
27
|
+
%w[
|
|
28
|
+
llm_adapter/async llm_adapter/backends
|
|
29
|
+
vector_store/async vector_store/backends
|
|
30
|
+
embeddings/async embeddings/backends
|
|
31
|
+
storage/async
|
|
32
|
+
multi_agent/runtime_binding
|
|
33
|
+
].each do |directory|
|
|
34
|
+
loader.collapse("#{__dir__}/phronomy/#{directory}")
|
|
35
|
+
end
|
|
36
|
+
# Agent responsibility directories retain the existing Agent constant names.
|
|
37
|
+
%w[
|
|
38
|
+
lifecycle execution tool_execution runtime_binding
|
|
39
|
+
journal handoff recovery
|
|
40
|
+
].each do |directory|
|
|
41
|
+
loader.collapse("#{__dir__}/phronomy/agent/#{directory}")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# A nested root is independent of its enclosing Ruby namespace. Keep existing
|
|
45
|
+
# Phronomy::Workflow, Phronomy::WorkflowContext, and other canonical constants
|
|
46
|
+
# beside the feature they belong to, without aliases or a new partial-load API.
|
|
47
|
+
%w[
|
|
48
|
+
agent/api
|
|
49
|
+
workflow/execution
|
|
50
|
+
workflow/runtime_binding
|
|
51
|
+
].each do |directory|
|
|
52
|
+
loader.push_dir("#{__dir__}/phronomy/#{directory}", namespace: Phronomy)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# These files wire composition, reopen namespaces, or patch a dependency.
|
|
56
|
+
loader.ignore(
|
|
57
|
+
"#{__dir__}/phronomy/persistence/persistence.rb",
|
|
58
|
+
"#{__dir__}/phronomy/persistence/errors.rb",
|
|
59
|
+
"#{__dir__}/phronomy/persistence_composition/stores.rb",
|
|
60
|
+
"#{__dir__}/phronomy/runtime_composition/global_configuration.rb",
|
|
61
|
+
"#{__dir__}/phronomy/agent/composition",
|
|
62
|
+
"#{__dir__}/phronomy/runtime_composition/agent_defaults.rb",
|
|
63
|
+
"#{__dir__}/phronomy/runtime_composition/generation_defaults.rb",
|
|
64
|
+
"#{__dir__}/phronomy/runtime_composition/evaluation_defaults.rb",
|
|
65
|
+
"#{__dir__}/phronomy/runtime_composition/workflow_defaults.rb",
|
|
66
|
+
"#{__dir__}/phronomy/runtime_composition/multi_agent_defaults.rb",
|
|
67
|
+
"#{__dir__}/phronomy/runtime_composition/configuration_defaults.rb",
|
|
68
|
+
"#{__dir__}/phronomy/runtime_composition/global_runtime.rb",
|
|
69
|
+
"#{__dir__}/phronomy/runtime_composition/execution_defaults.rb"
|
|
70
|
+
)
|
|
71
|
+
# Persistence conformance support must never make production loading require RSpec.
|
|
26
72
|
loader.ignore(
|
|
27
73
|
"#{__dir__}/phronomy/testing/persistence_contract.rb",
|
|
28
74
|
"#{__dir__}/phronomy/testing/persistence_contract"
|
|
29
75
|
)
|
|
76
|
+
# Failure contracts can define Persistence before ordinary framework loading.
|
|
77
|
+
# Explicitly install its service methods without constructing a backend/Runtime.
|
|
78
|
+
require_relative "phronomy/persistence/persistence"
|
|
79
|
+
require_relative "phronomy/persistence/errors"
|
|
80
|
+
loader.ignore("#{__dir__}/phronomy/tool/tool_error.rb")
|
|
81
|
+
loader.ignore("#{__dir__}/phronomy/filter/filter_block_error.rb")
|
|
82
|
+
loader.ignore("#{__dir__}/phronomy/output_parser/parse_error.rb")
|
|
83
|
+
loader.ignore("#{__dir__}/phronomy/agent/agent_busy_error.rb")
|
|
84
|
+
loader.ignore("#{__dir__}/phronomy/agent/agent_purged_error.rb")
|
|
85
|
+
loader.ignore("#{__dir__}/phronomy/agent/stream_callback_error.rb")
|
|
86
|
+
loader.ignore("#{__dir__}/phronomy/agent/handoff_error.rb")
|
|
87
|
+
loader.ignore("#{__dir__}/phronomy/agent/agent_already_exists_error.rb")
|
|
30
88
|
loader.setup
|
|
31
|
-
|
|
32
|
-
require_relative "phronomy/
|
|
33
|
-
require_relative "phronomy/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def initialize(result)
|
|
64
|
-
@result = result
|
|
65
|
-
super("Answer confidence #{result.confidence} is below the required threshold")
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
class FilterBlockError < Error
|
|
70
|
-
attr_reader :filter
|
|
71
|
-
|
|
72
|
-
def initialize(message, filter: nil)
|
|
73
|
-
super(message)
|
|
74
|
-
@filter = filter
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
class PoolShutdownError < Error; end
|
|
79
|
-
class BackpressureError < Error; end
|
|
80
|
-
|
|
81
|
-
class WorkflowContextOwnershipError < Error; end
|
|
82
|
-
|
|
83
|
-
class << self
|
|
84
|
-
def configuration
|
|
85
|
-
@configuration ||= Configuration.new
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def configure
|
|
89
|
-
yield configuration
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def reset_configuration!
|
|
93
|
-
@configuration = Configuration.new
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def with_configuration
|
|
97
|
-
original = @configuration&.dup
|
|
98
|
-
yield configuration
|
|
99
|
-
ensure
|
|
100
|
-
@configuration = original
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def reset_runtime!(timeout: configuration.event_loop_stop_grace_seconds)
|
|
104
|
-
previous_grace = @configuration&.event_loop_stop_grace_seconds
|
|
105
|
-
result = Runtime.reset_default!(timeout: timeout)
|
|
106
|
-
|
|
107
|
-
new_configuration = Configuration.new
|
|
108
|
-
if previous_grace
|
|
109
|
-
new_configuration.event_loop_stop_grace_seconds = previous_grace
|
|
110
|
-
end
|
|
111
|
-
@configuration = new_configuration
|
|
112
|
-
result
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Shared Recovery primitives and Workflow Persistence F1 reconciliation.
|
|
118
|
-
# Entity-specific Agent Recovery is loaded from lib/phronomy/agent.rb when the
|
|
119
|
-
# Agent namespace is materialized.
|
|
120
|
-
require_relative "phronomy/recovery"
|
|
121
|
-
require_relative "phronomy/workflow_recovery"
|
|
89
|
+
require_relative "phronomy/persistence/transaction"
|
|
90
|
+
require_relative "phronomy/persistence_composition/stores"
|
|
91
|
+
require_relative "phronomy/tool/tool_error"
|
|
92
|
+
require_relative "phronomy/filter/filter_block_error"
|
|
93
|
+
require_relative "phronomy/output_parser/parse_error"
|
|
94
|
+
require_relative "phronomy/agent/agent_busy_error"
|
|
95
|
+
require_relative "phronomy/agent/agent_purged_error"
|
|
96
|
+
require_relative "phronomy/agent/stream_callback_error"
|
|
97
|
+
require_relative "phronomy/agent/handoff_error"
|
|
98
|
+
require_relative "phronomy/agent/agent_already_exists_error"
|
|
99
|
+
|
|
100
|
+
require_relative "phronomy/runtime_composition/configuration_defaults"
|
|
101
|
+
require_relative "phronomy/llm_adapter/token_usage"
|
|
102
|
+
require_relative "phronomy/runtime_composition/global_configuration"
|
|
103
|
+
require_relative "phronomy/runtime_composition/global_runtime"
|
|
104
|
+
require_relative "phronomy/runtime_composition/execution_defaults"
|
|
105
|
+
|
|
106
|
+
# Explicitly install the Agent namespace extensions even if its factory
|
|
107
|
+
# contract was loaded first. Composition owns both concrete binding and the
|
|
108
|
+
# run_once method definition; neither is required from Agent execution files.
|
|
109
|
+
require_relative "phronomy/agent/api/agent"
|
|
110
|
+
require_relative "phronomy/runtime_composition/agent_defaults"
|
|
111
|
+
require_relative "phronomy/runtime_composition/multi_agent_defaults"
|
|
112
|
+
require_relative "phronomy/runtime_composition/workflow_defaults"
|
|
113
|
+
require_relative "phronomy/runtime_composition/generation_defaults"
|
|
114
|
+
require_relative "phronomy/runtime_composition/evaluation_defaults"
|
|
115
|
+
require_relative "phronomy/agent/composition/run_once"
|
|
116
|
+
|
|
117
|
+
# Preserve ordinary boot loading of the existing recovery rules and comparisons
|
|
118
|
+
# while giving each definition its owning domain.
|
|
119
|
+
require_relative "phronomy/agent/recovery/recovery_rules"
|
|
120
|
+
require_relative "phronomy/persistence/snapshot_comparison"
|
data/scripts/api_snapshot.rb
CHANGED
|
@@ -19,31 +19,49 @@ require_relative "../lib/phronomy"
|
|
|
19
19
|
PUBLIC_API_ENTRIES = [
|
|
20
20
|
# Stable
|
|
21
21
|
Phronomy::Agent::Base,
|
|
22
|
-
Phronomy::Agent::
|
|
23
|
-
Phronomy::Agent::
|
|
24
|
-
Phronomy::Agent::
|
|
25
|
-
Phronomy::Agent::
|
|
26
|
-
Phronomy::Agent::
|
|
27
|
-
Phronomy::Agent::
|
|
28
|
-
Phronomy::
|
|
29
|
-
Phronomy::
|
|
22
|
+
Phronomy::Agent::ReservedExecution,
|
|
23
|
+
Phronomy::Agent::ExecutionObservation,
|
|
24
|
+
Phronomy::Agent::KnowledgeItem,
|
|
25
|
+
Phronomy::Agent::Retention,
|
|
26
|
+
Phronomy::Agent::ExecutionExtensionState,
|
|
27
|
+
Phronomy::Agent::ControlRequest,
|
|
28
|
+
Phronomy::Context::ContextPolicy,
|
|
29
|
+
Phronomy::Context::ContextPolicyInput,
|
|
30
|
+
Phronomy::Context::ContextPolicyInput::Provenance,
|
|
31
|
+
Phronomy::Context::ContextPolicyInput::InstructionItem,
|
|
32
|
+
Phronomy::Context::ContextPolicyInput::KnowledgeItem,
|
|
33
|
+
Phronomy::Context::ContextPolicyInput::ToolItem,
|
|
34
|
+
Phronomy::Context::ContextPolicyInput::ConversationItem,
|
|
35
|
+
Phronomy::Context::ContextPlan,
|
|
30
36
|
Phronomy::InvocationContext,
|
|
31
|
-
Phronomy::
|
|
37
|
+
Phronomy::Tool::Base,
|
|
32
38
|
Phronomy::Workflow,
|
|
33
39
|
Phronomy::WorkflowContext,
|
|
34
40
|
Phronomy::Runnable,
|
|
35
|
-
Phronomy::
|
|
41
|
+
Phronomy::Context::PromptTemplate,
|
|
36
42
|
# Beta
|
|
37
|
-
Phronomy::
|
|
38
|
-
Phronomy::
|
|
39
|
-
Phronomy::
|
|
43
|
+
Phronomy::Tool::Schema,
|
|
44
|
+
Phronomy::Tool::CallRequest,
|
|
45
|
+
Phronomy::Tool::Operation,
|
|
46
|
+
Phronomy::LLMAdapter::Base,
|
|
47
|
+
Phronomy::LLMAdapter::Request,
|
|
48
|
+
Phronomy::LLMAdapter::Message,
|
|
49
|
+
Phronomy::LLMAdapter::Response,
|
|
50
|
+
Phronomy::LLMAdapter::StreamChunk,
|
|
51
|
+
Phronomy::LLMAdapter::TokenUsage,
|
|
52
|
+
Phronomy::MultiAgent::Handoff,
|
|
53
|
+
Phronomy::MultiAgent::HandoffPolicy,
|
|
54
|
+
Phronomy::MultiAgent::HandoffRunner,
|
|
40
55
|
Phronomy::MultiAgent::Orchestrator,
|
|
41
56
|
Phronomy::MultiAgent::TeamCoordinator,
|
|
42
57
|
Phronomy::Filter::Base,
|
|
43
58
|
Phronomy::Filter::PromptInjectionFilter,
|
|
59
|
+
Phronomy::Storage::AsyncClient,
|
|
44
60
|
Phronomy::VectorStore::Base,
|
|
61
|
+
Phronomy::VectorStore::AsyncClient,
|
|
45
62
|
Phronomy::VectorStore::InMemory,
|
|
46
|
-
Phronomy::
|
|
63
|
+
Phronomy::Embeddings::Base,
|
|
64
|
+
Phronomy::Embeddings::AsyncClient,
|
|
47
65
|
Phronomy::Tracing::Base,
|
|
48
66
|
Phronomy::Tracing::NullTracer,
|
|
49
67
|
Phronomy::Tools::Mcp,
|
|
@@ -67,13 +85,15 @@ def snapshot_entry(klass)
|
|
|
67
85
|
{
|
|
68
86
|
"name" => klass.name,
|
|
69
87
|
"type" => "module",
|
|
70
|
-
"public_instance_methods" => own_methods
|
|
88
|
+
"public_instance_methods" => own_methods,
|
|
89
|
+
"public_class_methods" => (klass.public_methods(false) - BASELINE_CLASS_METHODS).sort
|
|
71
90
|
}
|
|
72
91
|
else
|
|
73
92
|
internal_context_methods = (klass == Phronomy::InvocationContext) ?
|
|
74
93
|
%i[__bind_execution __execution_scope] : []
|
|
75
94
|
instance_methods = (klass.public_instance_methods - BASELINE_INSTANCE_METHODS - internal_context_methods).sort
|
|
76
|
-
|
|
95
|
+
internal_class_methods = (klass == Phronomy::Storage::AsyncClient) ? %i[submit] : []
|
|
96
|
+
class_methods = (klass.public_methods(false) - BASELINE_CLASS_METHODS - internal_class_methods).sort
|
|
77
97
|
{
|
|
78
98
|
"name" => klass.name,
|
|
79
99
|
"type" => "class",
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "json"
|
|
5
|
+
require_relative "../lib/phronomy"
|
|
6
|
+
|
|
7
|
+
# Explicit SPI 2 scope, independent of the Stable/Beta product API snapshot.
|
|
8
|
+
# Private dispatch and domain composition helpers are deliberately excluded.
|
|
9
|
+
surfaces = {
|
|
10
|
+
Phronomy::Persistence => Phronomy::Persistence.public_instance_methods(false).sort,
|
|
11
|
+
Phronomy::Storage::Backend => %i[initialize capabilities transaction resources view],
|
|
12
|
+
Phronomy::Storage::Backends::InMemory => %i[initialize capabilities],
|
|
13
|
+
Phronomy::Storage::View => %i[records streams blobs check!],
|
|
14
|
+
Phronomy::Storage::Resource => %i[initialize id kind attributes immutable_attributes indexes unique guard validate_attributes index_values],
|
|
15
|
+
Phronomy::Storage::Records => %i[resource insert read fetch replace delete scan delete_matching],
|
|
16
|
+
Phronomy::Storage::Streams => %i[resource append read head delete],
|
|
17
|
+
Phronomy::Storage::Blobs => %i[resource put_if_absent fetch exist?],
|
|
18
|
+
Phronomy::Storage::GuardRef => %i[initialize resource key],
|
|
19
|
+
Phronomy::Storage::Condition::RevisionIs => %i[initialize resource key expected],
|
|
20
|
+
Phronomy::Storage::Condition::StreamHeadIs => %i[initialize resource stream expected],
|
|
21
|
+
Phronomy::Storage::Condition::NoRows => %i[initialize resource index equals],
|
|
22
|
+
Phronomy::Storage::Entry::Record => %i[initialize key revision attributes record],
|
|
23
|
+
Phronomy::Storage::Entry::Stream => %i[initialize position id record],
|
|
24
|
+
Phronomy::Storage::Entry::Append => %i[initialize id record],
|
|
25
|
+
Phronomy::Storage::Entry::Blob => %i[initialize key bytes attributes],
|
|
26
|
+
Phronomy::Storage::UniqueConstraintError => %i[initialize resource constraint],
|
|
27
|
+
Phronomy::Storage::ConditionFailedError => %i[initialize condition]
|
|
28
|
+
}
|
|
29
|
+
snapshot = {spi_version: 2, capabilities: Phronomy::Storage::Backend::REQUIRED_CAPABILITIES,
|
|
30
|
+
surfaces: surfaces.to_h { |type, names| [type.name, names.sort.to_h { |name| [name, type.instance_method(name).parameters] }] }}
|
|
31
|
+
json = JSON.pretty_generate(snapshot) + "\n"
|
|
32
|
+
if ARGV.include?("--write")
|
|
33
|
+
File.write(File.expand_path("../spec/fixtures/storage_spi_v2_snapshot.json", __dir__), json)
|
|
34
|
+
else
|
|
35
|
+
puts json
|
|
36
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module Agent
|
|
3
|
+
class Settings
|
|
4
|
+
def self.install_provider: () { () -> Settings } -> void
|
|
5
|
+
def self.current: () -> Settings
|
|
6
|
+
def initialize: (llm_adapter: LLMAdapter::Base?, authorization_timeout: Numeric?, stream_callback_error_policy: Symbol) -> void
|
|
7
|
+
attr_accessor default_model: String?
|
|
8
|
+
attr_accessor before_llm_input: _BeforeLLMInputHook?
|
|
9
|
+
attr_accessor agent_store: Store?
|
|
10
|
+
attr_accessor llm_adapter: LLMAdapter::Base?
|
|
11
|
+
attr_accessor authorization_timeout: Numeric?
|
|
12
|
+
attr_accessor stream_callback_error_policy: Symbol
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class Configuration
|
|
17
|
+
attr_reader __agent_settings: Agent::Settings
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
# Internal Engine-facing settings; application-specific types do not belong here.
|
|
3
|
+
class RuntimeSettings
|
|
4
|
+
def self.install_provider: () { () -> RuntimeSettings } -> void
|
|
5
|
+
def self.current: () -> RuntimeSettings
|
|
6
|
+
def initialize: () -> void
|
|
7
|
+
attr_accessor logger: untyped
|
|
8
|
+
attr_accessor event_loop_stop_grace_seconds: Numeric
|
|
9
|
+
attr_accessor event_loop_starvation_threshold_seconds: Numeric?
|
|
10
|
+
attr_accessor event_loop_dispatch_threshold_seconds: Numeric?
|
|
11
|
+
attr_accessor offload_pool_size: Integer
|
|
12
|
+
attr_accessor offload_queue_size: Integer
|
|
13
|
+
attr_accessor authorization_pool_size: Integer
|
|
14
|
+
attr_accessor authorization_queue_size: Integer
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class Configuration
|
|
18
|
+
attr_reader __runtime_settings: RuntimeSettings
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Framework-internal API. Loaded by -I sig; not exported by gem library loading.
|
|
2
|
+
module Phronomy
|
|
3
|
+
module LLMAdapter
|
|
4
|
+
class AsyncClient
|
|
5
|
+
def initialize: (adapter: Base, ?pool: untyped, ?submitter: _ExecutionSubmitter) -> void
|
|
6
|
+
def complete_async: (Request request, ?cancellation_token: Concurrency::CancellationToken?, ?pool: untyped) -> TaskResult[Response]
|
|
7
|
+
def stream_async: (Request request, ?cancellation_token: Concurrency::CancellationToken?, ?pool: untyped) { (StreamChunk chunk) -> void } -> TaskResult[Response]
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module Tool
|
|
3
|
+
class Settings
|
|
4
|
+
def self.install_provider: () { () -> Settings } -> void
|
|
5
|
+
def self.current: () -> Settings
|
|
6
|
+
attr_accessor max_result_size: Integer?
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Configuration
|
|
11
|
+
attr_reader __tool_settings: Tool::Settings
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module Tracing
|
|
3
|
+
class Settings
|
|
4
|
+
def self.install_provider: () { () -> Settings } -> void
|
|
5
|
+
def self.current: () -> Settings
|
|
6
|
+
def initialize: (tracer: Tracing::Base?) -> void
|
|
7
|
+
attr_accessor tracer: Tracing::Base?
|
|
8
|
+
attr_accessor trace_pii: bool
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Configuration
|
|
13
|
+
attr_reader __tracing_settings: Tracing::Settings
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
class WorkflowSettings
|
|
3
|
+
def self.install_provider: () { () -> WorkflowSettings } -> void
|
|
4
|
+
def self.current: () -> WorkflowSettings
|
|
5
|
+
def initialize: (recursion_limit: Integer) -> void
|
|
6
|
+
attr_accessor recursion_limit: Integer
|
|
7
|
+
attr_accessor workflow_store: _WorkflowStateRepository?
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Configuration
|
|
11
|
+
attr_reader __workflow_settings: WorkflowSettings
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module Agent
|
|
3
|
+
# Coordination owns reservation semantics; Agent owns the acceptance operation.
|
|
4
|
+
interface _AdmissionOwner
|
|
5
|
+
def admit: (Admission admission) -> void
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class Admission
|
|
9
|
+
attr_reader agent_id: String
|
|
10
|
+
attr_reader execution_id: String
|
|
11
|
+
attr_reader correlation: Hash[String, json_value]?
|
|
12
|
+
def initialize: (persistence: Store, root: untyped, input: String,
|
|
13
|
+
config: Hash[Symbol, untyped], preparation_metadata: Hash[String, untyped]) -> void
|
|
14
|
+
def accept: () -> nil
|
|
15
|
+
def accept_in: (::Phronomy::Persistence::Transaction scope) -> nil
|
|
16
|
+
def result: () -> [untyped, untyped]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -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
|