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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f097c81530a33bd631974866ff26a0d2ec8b4793286c6dfa0bb0facaac4fdd83
|
|
4
|
+
data.tar.gz: 80b9980737c80446f660d9a058aa1b898bdcdec452e517764261c386c32a1e78
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2cacf04ecea168021b36835f12901723380a7a908d0173f23b564e9bb67d4f85cf46bf958949fd4257043393234ef5acc7e8d9cecdcf68beac61b0c7ce454084
|
|
7
|
+
data.tar.gz: c7f7b1d9cbcd54d0d0d9bb7583e5587ecadfafa987788f44e8c8abc0f9fa75241092d63a543669b55a6837fc1c2c09c102cf514578b6c266b2c85ff17d2ba2cc
|
data/.mutant.yml
CHANGED
|
@@ -9,14 +9,14 @@ matcher:
|
|
|
9
9
|
subjects:
|
|
10
10
|
- Phronomy::WorkflowContext
|
|
11
11
|
- Phronomy::WorkflowRunner
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- Phronomy::Agent::Context::Capability::Base
|
|
12
|
+
- Phronomy::Tool::Base
|
|
13
|
+
- Phronomy::Tool::Schema
|
|
15
14
|
- Phronomy::LlmContextWindow::TokenBudget
|
|
16
|
-
- Phronomy::
|
|
17
|
-
- Phronomy::Agent::
|
|
18
|
-
- Phronomy::
|
|
19
|
-
- Phronomy::
|
|
20
|
-
- Phronomy::
|
|
21
|
-
- Phronomy::
|
|
15
|
+
- Phronomy::Context::Assembly
|
|
16
|
+
- Phronomy::Agent::ContextPreparation
|
|
17
|
+
- Phronomy::Context::DefaultPolicy
|
|
18
|
+
- Phronomy::Context::ContextPolicyInputBuilder
|
|
19
|
+
- Phronomy::Context::ContextPlanValidator
|
|
20
|
+
- Phronomy::MultiAgent::HandoffPolicy
|
|
21
|
+
- Phronomy::Agent::TransferProjection
|
|
22
22
|
- Phronomy::VectorStore::InMemory
|
data/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,98 @@ Release history for 0.14.0 and earlier is archived in
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
### r8 first implementation unit (breaking, unreleased)
|
|
16
|
+
|
|
17
|
+
- Move Context policy/plan/manifest/budget/prompt operations into `Phronomy::Context`.
|
|
18
|
+
Agent retains snapshot, journal and lifecycle ownership. Manifest and execution
|
|
19
|
+
references remain written within the same transaction.
|
|
20
|
+
- Make `Tool::Base` the actual implementation; move common definition and
|
|
21
|
+
authorization operations into Tool. Remove the old Agent Context namespace.
|
|
22
|
+
- Move chat construction and SDK failure translation into the LLM adapter.
|
|
23
|
+
Custom synchronous adapters must implement the expanded construction SPI.
|
|
24
|
+
- Unite execution contracts and services in `execution/`; move FSM values and
|
|
25
|
+
scheduling bindings to Engine, observation to Tracing. Keep result/control
|
|
26
|
+
rules independent of Engine startup. Update Ruby/RBS analysis and diagrams.
|
|
27
|
+
- Remove empty contract-only subdivisions and old API aliases. This unit does
|
|
28
|
+
not complete r8 Persistence, parent admission or all domain FSM separation.
|
|
29
|
+
See [the scope and migration report](docs/architecture/r8-unit1.md).
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- Add public Beta `Storage::AsyncClient#transaction_async` and route 16 existing
|
|
34
|
+
durable Agent/Workflow/coordination execution units through its private submit
|
|
35
|
+
boundary. Preserve transaction/savepoint, result reconciliation and admission
|
|
36
|
+
policy; do not add cancellation or timeout to existing terminal writes.
|
|
37
|
+
- Move StoredContents into `content_store/backends/` without changing its
|
|
38
|
+
constant or behavior. Complete P4; see the
|
|
39
|
+
[Storage client guide](docs/migrations/storage-async-client.md).
|
|
40
|
+
- Preserve transparent text panels and module outlines in generated diagrams.
|
|
41
|
+
Hide arrows into M33/M41/M44 as a display choice; keep their measured source
|
|
42
|
+
dependencies, evidence and complete matrix.
|
|
43
|
+
|
|
44
|
+
- **Beta API receiver migration:** move VectorStore `add_async`, `search_async`,
|
|
45
|
+
`remove_async`, `clear_async` and Embeddings `embed_async` onto the public
|
|
46
|
+
feature-specific `AsyncClient` objects. Synchronous backend methods and
|
|
47
|
+
concrete class names remain unchanged. Remove the inherited async methods
|
|
48
|
+
and `VectorStore::AsyncBackend`; see the
|
|
49
|
+
[migration guide](docs/migrations/vector-async-clients.md).
|
|
50
|
+
- Split VectorStore/Embeddings implementations into collapsed `backends/`
|
|
51
|
+
directories. Synchronous RBS uses structural cancellation; separate client
|
|
52
|
+
signatures retain TaskResult and the full execution token. Complete P3 and
|
|
53
|
+
remove the remaining backend-to-Engine edges from the measured graph.
|
|
54
|
+
|
|
55
|
+
- Separate the synchronous LLMAdapter SPI, RubyLLM implementation and internal
|
|
56
|
+
AsyncClient. Adapter authors implement only `complete` and `stream`; default
|
|
57
|
+
configuration, provider behavior, admission/cancellation and Agent event
|
|
58
|
+
delivery remain unchanged. See
|
|
59
|
+
[ADR-059](docs/decisions/059-backend-contracts-and-async-clients.md).
|
|
60
|
+
- Separate responsibility groups from the diagram's B1-B6 display layers. Add
|
|
61
|
+
the source-derived SVG/matrix generator and Architecture CI boundary gate;
|
|
62
|
+
retain individual module boxes, stable module IDs and the earlier horizontal
|
|
63
|
+
layer layout with topical columns. Separated Contracts belong in B5 beside
|
|
64
|
+
the independent Engine group; clients, implementations and pending mixed
|
|
65
|
+
backends are displayed in B4. Storage/ContentStore migration remains pending.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## [0.27.0] - 2026-09-24
|
|
70
|
+
|
|
71
|
+
### Changed
|
|
72
|
+
|
|
73
|
+
- Separate application Runtime reset and configuration replacement into
|
|
74
|
+
`runtime_composition/global_runtime.rb`. Configuration access no longer owns
|
|
75
|
+
Runtime lifecycle control; the reset API, shutdown ordering, timeout behavior,
|
|
76
|
+
and configuration defaults are unchanged. See
|
|
77
|
+
[ADR-039](docs/decisions/039-runtime-configuration-lifecycle-ownership.md).
|
|
78
|
+
- Group root implementations and entry-point exceptions by responsibility:
|
|
79
|
+
common definitions, Engine/FSM execution contracts, Recovery, Workflow,
|
|
80
|
+
Agent lifecycle contracts, LLM contracts, configuration, and feature APIs.
|
|
81
|
+
Preserve public constant names, API signatures, stored formats, and lifecycle
|
|
82
|
+
loading. Reserve the direct source root for version and namespace/loading
|
|
83
|
+
files; share the three equivalent immutable-copy helpers. See
|
|
84
|
+
[ADR-038](docs/decisions/038-responsibility-based-source-layout.md).
|
|
85
|
+
- Move the shared `Phronomy::Error` base exception to `common/error.rb` and
|
|
86
|
+
define ownership rules for general common definitions. The public constant,
|
|
87
|
+
subclass hierarchies, and rescue behavior are preserved. See
|
|
88
|
+
[ADR-037](docs/decisions/037-common-definition-ownership.md).
|
|
89
|
+
- Group Context Policy and hook contracts, values, Manifest representation,
|
|
90
|
+
and Plan validation under `agent/context_contract/`. Zeitwerk collapses the
|
|
91
|
+
directory so the existing `Phronomy::Agent` constant names, Policy/hook
|
|
92
|
+
protocols, and Manifest format remain unchanged. Agent execution and Context
|
|
93
|
+
assembly retain their existing responsibilities. See
|
|
94
|
+
[ADR-036](docs/decisions/036-context-contract-ownership.md).
|
|
95
|
+
- Move the internal `Phronomy::Agent::ToolExecutor` to
|
|
96
|
+
`Phronomy::Agent::Context::Capability::ToolExecutor`, alongside the default
|
|
97
|
+
Tool invocation contract, without an alias for the old internal constant.
|
|
98
|
+
Public Tool names, `call_async` arguments, execution modes, Runtime routing,
|
|
99
|
+
and Agent-owned authorization/result handling are preserved. See
|
|
100
|
+
[ADR-035](docs/decisions/035-tool-executor-capability-ownership.md).
|
|
101
|
+
- Move `Phronomy::Agent::HandoffRunner` to
|
|
102
|
+
`Phronomy::MultiAgent::HandoffRunner` without a compatibility alias on the
|
|
103
|
+
architecture refactoring branch. Handoff edges and Policy remain in Agent;
|
|
104
|
+
execution, persistence formats, cancellation and recovery behavior are unchanged.
|
|
105
|
+
See [the migration guide](docs/migrations/handoff-runner-multi-agent.md).
|
|
106
|
+
|
|
15
107
|
---
|
|
16
108
|
|
|
17
109
|
## [0.26.0] - 2026-09-14
|
data/CONTRIBUTING.md
CHANGED
|
@@ -219,14 +219,14 @@ The authoritative subject list is `.mutant.yml`. It currently includes:
|
|
|
219
219
|
|
|
220
220
|
- `Phronomy::WorkflowContext`
|
|
221
221
|
- `Phronomy::WorkflowRunner`
|
|
222
|
-
- `Phronomy::
|
|
222
|
+
- `Phronomy::Tool::Base`
|
|
223
223
|
- `Phronomy::LlmContextWindow::TokenBudget`
|
|
224
|
-
- `Phronomy::Agent::
|
|
225
|
-
- `Phronomy::
|
|
226
|
-
- `Phronomy::
|
|
227
|
-
- `Phronomy::
|
|
228
|
-
- `Phronomy::
|
|
229
|
-
- `Phronomy::Agent::
|
|
224
|
+
- `Phronomy::Agent::ContextPreparation`
|
|
225
|
+
- `Phronomy::Context::DefaultPolicy`
|
|
226
|
+
- `Phronomy::Context::ContextPolicyInputBuilder`
|
|
227
|
+
- `Phronomy::Context::ContextPlanValidator`
|
|
228
|
+
- `Phronomy::MultiAgent::HandoffPolicy`
|
|
229
|
+
- `Phronomy::Agent::TransferProjection`
|
|
230
230
|
- `Phronomy::VectorStore::InMemory`
|
|
231
231
|
|
|
232
232
|
The nightly mutation matrix mirrors this authoritative list so each subject can
|
|
@@ -235,7 +235,7 @@ configuration-consistency guard that fails if the nightly subject set diverges
|
|
|
235
235
|
from `.mutant.yml`.
|
|
236
236
|
|
|
237
237
|
The Tool mutation subject intentionally uses
|
|
238
|
-
`Phronomy::
|
|
238
|
+
`Phronomy::Tool::Base`, which is the implementation
|
|
239
239
|
canonical name returned by the single Class object's runtime `Class#name`.
|
|
240
240
|
`Phronomy::Tool::Base` is the public facade constant alias to that same Class
|
|
241
241
|
object; it is not a second Tool base class.
|
data/README.md
CHANGED
|
@@ -8,7 +8,11 @@
|
|
|
8
8
|
|
|
9
9
|
**Phronomy** is a Ruby AI agent framework for stateful Agents, Workflows, Tools,
|
|
10
10
|
context management, filtering, tracing, and multi-agent coordination. Large Language
|
|
11
|
-
Model (LLM)
|
|
11
|
+
Model (LLM) operations use `Phronomy::LLMAdapter`; the default backend uses
|
|
12
|
+
[RubyLLM](https://github.com/crmne/ruby_llm). Custom backends implement the
|
|
13
|
+
[SDK-independent LLM contract](docs/migrations/r8-unit6.md).
|
|
14
|
+
Tool declarations and argument validation belong to `Phronomy::Tool`, independently
|
|
15
|
+
of the selected LLM backend.
|
|
12
16
|
|
|
13
17
|
Phronomy is pre-1.0. Pin to a released gem version for production use rather than
|
|
14
18
|
tracking `main` directly.
|
|
@@ -16,7 +20,7 @@ tracking `main` directly.
|
|
|
16
20
|
## Core concepts
|
|
17
21
|
|
|
18
22
|
- **Agent** — stateful, persistence-backed LLM agent with canonical execution history.
|
|
19
|
-
- **Persistence** —
|
|
23
|
+
- **Persistence** — shared atomic scopes with domain-owned Agent/Team stores and Workflow checkpoints.
|
|
20
24
|
- **Workflow** — state-machine-driven application workflow with explicit events and wait states.
|
|
21
25
|
- **Tool / Capability** — callable application capability exposed to an Agent; application-defined Tools subclass `Phronomy::Tool::Base`.
|
|
22
26
|
- **Multi-Agent Handoff** — semantic Source-to-Target responsibility transfer with policy-bounded Context projection and persisted active responsibility and exact Target recovery within one Persistence domain.
|
|
@@ -45,6 +49,10 @@ Then run:
|
|
|
45
49
|
bundle install
|
|
46
50
|
```
|
|
47
51
|
|
|
52
|
+
This refactoring branch requires RubyLLM 2.0.x. See the
|
|
53
|
+
[RubyLLM 2 and token-ownership migration](docs/architecture/rubyllm-2-token-ownership.md)
|
|
54
|
+
for removed input-budget overrides and the in-flight Tool-manifest upgrade boundary.
|
|
55
|
+
|
|
48
56
|
Configure RubyLLM with the provider credentials and transport policy required by
|
|
49
57
|
your application. Phronomy does not add another LLM transport retry/timeout layer.
|
|
50
58
|
|
|
@@ -84,7 +92,7 @@ puts result[:output]
|
|
|
84
92
|
```
|
|
85
93
|
|
|
86
94
|
`Phronomy::Tool::Base` is the public authoring name for the existing Tool base
|
|
87
|
-
class. The legacy `Phronomy::
|
|
95
|
+
class. The legacy `Phronomy::Tool::Base` constant remains
|
|
88
96
|
valid for compatibility.
|
|
89
97
|
|
|
90
98
|
For non-blocking top-level use, call `invoke_async` and keep the returned
|
|
@@ -151,6 +159,8 @@ contracts, timeout/cancellation semantics, metrics, and callback rules.
|
|
|
151
159
|
- [MCP client](docs/mcp-client.md) — Model Context Protocol (MCP) integration and supported schema subset.
|
|
152
160
|
- [Migration from 0.15-era APIs](docs/migrations/0.15.md).
|
|
153
161
|
- [0.16 cleanup migration](docs/migrations/0.16.md).
|
|
162
|
+
- [r8 persistence boundary migration](docs/architecture/r8-unit3.md) — domain stores, shared scopes, and removed facade APIs.
|
|
163
|
+
- [Persistence failure contract migration](docs/migrations/persistence-failure-contracts.md) — domain rescue clauses and unchanged raw backend errors.
|
|
154
164
|
- [0.19 unified Persistence migration](docs/migrations/0.19.md).
|
|
155
165
|
- [0.22 semantic Multi-Agent Handoff migration](docs/migrations/0.22.md).
|
|
156
166
|
- [Architecture Decision Records](docs/decisions/) — design rationale and superseding decisions.
|
data/VERIFY.sh
CHANGED
|
@@ -21,9 +21,9 @@ required_files=(
|
|
|
21
21
|
docs/decisions/024-event-loop-single-writer-agent-runtime.md
|
|
22
22
|
docs/decisions/025-process-local-agent-ownership-and-runtime-admission.md
|
|
23
23
|
docs/decisions/026-workflow-runtime-admission-and-durable-terminal-barrier.md
|
|
24
|
-
lib/phronomy/workflow.rb
|
|
25
|
-
lib/phronomy/workflow_context.rb
|
|
26
|
-
lib/phronomy/workflow_runner.rb
|
|
24
|
+
lib/phronomy/workflow/execution/workflow.rb
|
|
25
|
+
lib/phronomy/workflow/execution/workflow_context.rb
|
|
26
|
+
lib/phronomy/workflow/execution/workflow_runner.rb
|
|
27
27
|
lib/phronomy/engine/event_loop.rb
|
|
28
28
|
lib/phronomy/engine/fsm_session.rb
|
|
29
29
|
lib/phronomy/persistence/in_memory.rb
|
|
@@ -38,16 +38,16 @@ required_files=(
|
|
|
38
38
|
spec/phronomy/persistence/initial_format_migration_spec.rb
|
|
39
39
|
lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb
|
|
40
40
|
spec/phronomy/workflow_identity_contract_spec.rb
|
|
41
|
-
lib/phronomy/invocation_context.rb
|
|
41
|
+
lib/phronomy/engine/invocation_context.rb
|
|
42
42
|
lib/phronomy/agent/async_event_api.rb
|
|
43
43
|
lib/phronomy/agent/execution_coordinator.rb
|
|
44
44
|
lib/phronomy/agent/journal_record.rb
|
|
45
45
|
lib/phronomy/agent/context_assembler.rb
|
|
46
|
-
lib/phronomy/agent/context_policy.rb
|
|
47
|
-
lib/phronomy/agent/context_policy_input.rb
|
|
46
|
+
lib/phronomy/agent/context_contract/context_policy.rb
|
|
47
|
+
lib/phronomy/agent/context_contract/context_policy_input.rb
|
|
48
48
|
lib/phronomy/agent/context_policy_input_builder.rb
|
|
49
|
-
lib/phronomy/agent/context_plan.rb
|
|
50
|
-
lib/phronomy/agent/context_plan_validator.rb
|
|
49
|
+
lib/phronomy/agent/context_contract/context_plan.rb
|
|
50
|
+
lib/phronomy/agent/context_contract/context_plan_validator.rb
|
|
51
51
|
lib/phronomy/agent/context_policies/default.rb
|
|
52
52
|
spec/phronomy/agent/context_policy_architecture_regression_spec.rb
|
|
53
53
|
lib/phronomy/agent/agent_invocation.rb
|
|
@@ -68,7 +68,7 @@ required_files=(
|
|
|
68
68
|
spec/phronomy/workflow/admission_spec.rb
|
|
69
69
|
spec/phronomy/workflow/live_signal_spec.rb
|
|
70
70
|
spec/phronomy/workflow/transition_action_spec.rb
|
|
71
|
-
lib/phronomy/generator_verifier.rb
|
|
71
|
+
lib/phronomy/generation/generator_verifier.rb
|
|
72
72
|
spec/phronomy/generator_verifier_spec.rb
|
|
73
73
|
spec/integration/subgraph_parallel_agent_tool_spec.rb
|
|
74
74
|
lib/phronomy/tracing/base.rb
|
|
@@ -87,11 +87,11 @@ required_files=(
|
|
|
87
87
|
spec/phronomy/fault_injection_advanced_spec.rb
|
|
88
88
|
spec/phronomy/persistence_architecture_regression_spec.rb
|
|
89
89
|
lib/phronomy/agent/base.rb
|
|
90
|
-
lib/phronomy/agent_already_exists_error.rb
|
|
91
|
-
lib/phronomy/agent_purged_error.rb
|
|
90
|
+
lib/phronomy/agent/lifecycle_contract/agent_already_exists_error.rb
|
|
91
|
+
lib/phronomy/agent/lifecycle_contract/agent_purged_error.rb
|
|
92
92
|
lib/phronomy/engine/runtime/agent_ownership_registry.rb
|
|
93
93
|
lib/phronomy/agent/agent_root.rb
|
|
94
|
-
lib/phronomy/agent/llm_input_build_context.rb
|
|
94
|
+
lib/phronomy/agent/context_contract/llm_input_build_context.rb
|
|
95
95
|
lib/phronomy/agent/shared_state.rb
|
|
96
96
|
spec/phronomy/agent/base_spec.rb
|
|
97
97
|
spec/phronomy/agent_spec.rb
|
|
@@ -119,9 +119,9 @@ done
|
|
|
119
119
|
|
|
120
120
|
syntax_files=(
|
|
121
121
|
spec/phronomy/architecture_governance_spec.rb
|
|
122
|
-
lib/phronomy/workflow.rb
|
|
123
|
-
lib/phronomy/workflow_context.rb
|
|
124
|
-
lib/phronomy/workflow_runner.rb
|
|
122
|
+
lib/phronomy/workflow/execution/workflow.rb
|
|
123
|
+
lib/phronomy/workflow/execution/workflow_context.rb
|
|
124
|
+
lib/phronomy/workflow/execution/workflow_runner.rb
|
|
125
125
|
lib/phronomy/engine/event_loop.rb
|
|
126
126
|
lib/phronomy/engine/fsm_session.rb
|
|
127
127
|
lib/phronomy/persistence/in_memory.rb
|
|
@@ -135,16 +135,16 @@ syntax_files=(
|
|
|
135
135
|
spec/phronomy/persistence/initial_format_migration_spec.rb
|
|
136
136
|
lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb
|
|
137
137
|
spec/phronomy/workflow_identity_contract_spec.rb
|
|
138
|
-
lib/phronomy/invocation_context.rb
|
|
138
|
+
lib/phronomy/engine/invocation_context.rb
|
|
139
139
|
lib/phronomy/agent/async_event_api.rb
|
|
140
140
|
lib/phronomy/agent/execution_coordinator.rb
|
|
141
141
|
lib/phronomy/agent/journal_record.rb
|
|
142
142
|
lib/phronomy/agent/context_assembler.rb
|
|
143
|
-
lib/phronomy/agent/context_policy.rb
|
|
144
|
-
lib/phronomy/agent/context_policy_input.rb
|
|
143
|
+
lib/phronomy/agent/context_contract/context_policy.rb
|
|
144
|
+
lib/phronomy/agent/context_contract/context_policy_input.rb
|
|
145
145
|
lib/phronomy/agent/context_policy_input_builder.rb
|
|
146
|
-
lib/phronomy/agent/context_plan.rb
|
|
147
|
-
lib/phronomy/agent/context_plan_validator.rb
|
|
146
|
+
lib/phronomy/agent/context_contract/context_plan.rb
|
|
147
|
+
lib/phronomy/agent/context_contract/context_plan_validator.rb
|
|
148
148
|
lib/phronomy/agent/context_policies/default.rb
|
|
149
149
|
spec/phronomy/agent/context_policy_architecture_regression_spec.rb
|
|
150
150
|
lib/phronomy/agent/agent_invocation.rb
|
|
@@ -177,7 +177,7 @@ syntax_files=(
|
|
|
177
177
|
spec/phronomy/workflow/admission_spec.rb
|
|
178
178
|
spec/phronomy/workflow/live_signal_spec.rb
|
|
179
179
|
spec/phronomy/workflow/fsm_session_spec.rb
|
|
180
|
-
lib/phronomy/generator_verifier.rb
|
|
180
|
+
lib/phronomy/generation/generator_verifier.rb
|
|
181
181
|
spec/phronomy/generator_verifier_spec.rb
|
|
182
182
|
spec/integration/subgraph_parallel_agent_tool_spec.rb
|
|
183
183
|
spec/phronomy/guarantee_model_spec.rb
|
|
@@ -197,11 +197,11 @@ syntax_files=(
|
|
|
197
197
|
spec/phronomy/fault_injection_advanced_spec.rb
|
|
198
198
|
spec/phronomy/persistence_architecture_regression_spec.rb
|
|
199
199
|
lib/phronomy/agent/base.rb
|
|
200
|
-
lib/phronomy/agent_already_exists_error.rb
|
|
201
|
-
lib/phronomy/agent_purged_error.rb
|
|
200
|
+
lib/phronomy/agent/lifecycle_contract/agent_already_exists_error.rb
|
|
201
|
+
lib/phronomy/agent/lifecycle_contract/agent_purged_error.rb
|
|
202
202
|
lib/phronomy/engine/runtime/agent_ownership_registry.rb
|
|
203
203
|
lib/phronomy/agent/agent_root.rb
|
|
204
|
-
lib/phronomy/agent/llm_input_build_context.rb
|
|
204
|
+
lib/phronomy/agent/context_contract/llm_input_build_context.rb
|
|
205
205
|
lib/phronomy/agent/shared_state.rb
|
|
206
206
|
lib/phronomy/agent/concerns/before_llm_input.rb
|
|
207
207
|
lib/phronomy/testing/persistence_contract/an_agent_repository.rb
|
|
@@ -322,7 +322,7 @@ bundle exec rspec \
|
|
|
322
322
|
spec/integration/multi_agent_handoff_followup_spec.rb
|
|
323
323
|
|
|
324
324
|
echo "== ACS-06 / CG-07 durable format / record-oriented Persistence SPI =="
|
|
325
|
-
ruby -c lib/phronomy/persistence.rb >/dev/null
|
|
325
|
+
ruby -c lib/phronomy/persistence/api/persistence.rb >/dev/null
|
|
326
326
|
ruby -c lib/phronomy/persistence/durable_record.rb >/dev/null
|
|
327
327
|
ruby -c lib/phronomy/persistence/durable_codec.rb >/dev/null
|
|
328
328
|
ruby -c lib/phronomy/persistence/repository_facades.rb >/dev/null
|
|
@@ -467,7 +467,7 @@ for rel in [
|
|
|
467
467
|
if fsm_new_has_id_kwarg(text):
|
|
468
468
|
raise SystemExit(f"FAIL: {rel} still injects a domain/context ID as FSMSession id")
|
|
469
469
|
|
|
470
|
-
workflow = pathlib.Path("lib/phronomy/workflow_runner.rb").read_text()
|
|
470
|
+
workflow = pathlib.Path("lib/phronomy/workflow/execution/workflow_runner.rb").read_text()
|
|
471
471
|
event_loop = pathlib.Path("lib/phronomy/engine/event_loop.rb").read_text()
|
|
472
472
|
fsm = pathlib.Path("lib/phronomy/engine/fsm_session.rb").read_text()
|
|
473
473
|
|
|
@@ -487,7 +487,7 @@ for required in ["workflow_terminal_persistence_result", ":persisting_terminal",
|
|
|
487
487
|
PY
|
|
488
488
|
|
|
489
489
|
echo "== ACS-13 Workflow admission / durable terminal barrier =="
|
|
490
|
-
ruby -c lib/phronomy/workflow_runner.rb >/dev/null
|
|
490
|
+
ruby -c lib/phronomy/workflow/execution/workflow_runner.rb >/dev/null
|
|
491
491
|
ruby -c lib/phronomy/engine/event_loop.rb >/dev/null
|
|
492
492
|
ruby -c lib/phronomy/engine/fsm_session.rb >/dev/null
|
|
493
493
|
ruby -c spec/phronomy/workflow/admission_spec.rb >/dev/null
|
|
@@ -5,11 +5,12 @@
|
|
|
5
5
|
# Measures the per-invoke cost of the Phronomy::Agent::Base framework path
|
|
6
6
|
# (context assembly, filter checks, before_llm_input hooks, response handling)
|
|
7
7
|
# with a fully stubbed LLM. No network calls are made.
|
|
8
|
+
# Each sample invokes a fresh Agent once. Agent construction is outside the
|
|
9
|
+
# measured block; growing conversation history is a different workload.
|
|
8
10
|
#
|
|
9
11
|
# Scenarios:
|
|
10
12
|
# 1. Minimal agent (no tools, no persistent Knowledge) — baseline framework overhead.
|
|
11
13
|
# 2. Tool-aware agent with a registered stub Tool.
|
|
12
|
-
# 3. Agent#stream setup latency (first-chunk time with stubbed stream).
|
|
13
14
|
|
|
14
15
|
require "benchmark"
|
|
15
16
|
require_relative "../lib/phronomy"
|
|
@@ -18,44 +19,21 @@ require_relative "../lib/phronomy"
|
|
|
18
19
|
# Shared stubs
|
|
19
20
|
# ---------------------------------------------------------------------------
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
new(:assistant, content, nil,
|
|
24
|
-
Struct.new(:input, :output, :cached, :cache_creation).new(5, 5, 0, 0))
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# A minimal stub Chat that returns a pre-built response immediately.
|
|
29
|
-
class BenchStubChat
|
|
30
|
-
attr_reader :messages
|
|
31
|
-
|
|
22
|
+
# A stub backend that preserves the adapter's validation/cancellation template.
|
|
23
|
+
class BenchStubLLMAdapter < Phronomy::LLMAdapter::Base
|
|
32
24
|
def initialize(response)
|
|
33
25
|
@response = response
|
|
34
|
-
@messages = []
|
|
35
26
|
end
|
|
36
27
|
|
|
37
|
-
|
|
38
|
-
def with_tool(_) = self
|
|
39
|
-
def with_temperature(_) = self
|
|
40
|
-
def with_cache_instructions(_) = self
|
|
41
|
-
def with_output_schema(_) = self
|
|
42
|
-
def on_tool_call(&) = self
|
|
43
|
-
def before_tool_call(&) = self
|
|
44
|
-
def last_message = @response
|
|
45
|
-
|
|
46
|
-
def ask(_)
|
|
47
|
-
@messages << @response
|
|
48
|
-
@response
|
|
49
|
-
end
|
|
28
|
+
protected
|
|
50
29
|
|
|
51
|
-
def
|
|
52
|
-
yield @response.content if block_given?
|
|
30
|
+
def perform_complete(request, cancellation_token:)
|
|
53
31
|
@response
|
|
54
32
|
end
|
|
55
33
|
end
|
|
56
34
|
|
|
57
35
|
# A stub tool that does nothing but conforms to the Tool::Base interface.
|
|
58
|
-
class BenchNullTool < Phronomy::
|
|
36
|
+
class BenchNullTool < Phronomy::Tool::Base
|
|
59
37
|
description "No-op benchmark tool"
|
|
60
38
|
param :x, type: :string, desc: "input"
|
|
61
39
|
|
|
@@ -68,40 +46,41 @@ end
|
|
|
68
46
|
# Agent classes
|
|
69
47
|
# ---------------------------------------------------------------------------
|
|
70
48
|
|
|
71
|
-
BENCH_RESP =
|
|
72
|
-
|
|
49
|
+
BENCH_RESP = Phronomy::LLMAdapter::Response.new(
|
|
50
|
+
content: "benchmark complete",
|
|
51
|
+
usage: Phronomy::LLMAdapter::TokenUsage.new(input: 5, output: 5, cached: 0, cache_creation: 0)
|
|
52
|
+
)
|
|
73
53
|
|
|
74
54
|
bench_minimal_class = Class.new(Phronomy::Agent::Base) do
|
|
75
55
|
agent_definition id: "bench-minimal", version: 1
|
|
76
56
|
model "stub-model"
|
|
77
|
-
|
|
78
|
-
define_method(:build_chat) { |*| BenchStubChat.new(BENCH_RESP) }
|
|
79
57
|
end
|
|
80
58
|
|
|
81
59
|
bench_tool_class = Class.new(Phronomy::Agent::Base) do
|
|
82
60
|
agent_definition id: "bench-tool", version: 1
|
|
83
61
|
model "stub-model"
|
|
84
62
|
tools(BenchNullTool => nil)
|
|
85
|
-
|
|
86
|
-
define_method(:build_chat) { |*| BenchStubChat.new(BENCH_RESP) }
|
|
87
63
|
end
|
|
88
64
|
|
|
89
|
-
BENCH_AGENT_MINIMAL = bench_minimal_class.new
|
|
90
|
-
BENCH_AGENT_TOOLS = bench_tool_class.new
|
|
91
|
-
|
|
92
65
|
AGENT_INVOKE_ITERATIONS = 200
|
|
93
66
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
67
|
+
Phronomy.with_configuration do |config|
|
|
68
|
+
config.llm_adapter = BenchStubLLMAdapter.new(BENCH_RESP)
|
|
69
|
+
bench_agents_minimal = Array.new(AGENT_INVOKE_ITERATIONS) { bench_minimal_class.new }.freeze
|
|
70
|
+
bench_agents_tools = Array.new(AGENT_INVOKE_ITERATIONS) { bench_tool_class.new }.freeze
|
|
71
|
+
|
|
72
|
+
puts "=== bench_agent_invoke ==="
|
|
73
|
+
Benchmark.bm(50) do |x|
|
|
74
|
+
x.report("Agent#invoke — fresh, no tools, #{AGENT_INVOKE_ITERATIONS} iters") do
|
|
75
|
+
bench_agents_minimal.each do |agent|
|
|
76
|
+
agent.invoke("ping")
|
|
77
|
+
end
|
|
99
78
|
end
|
|
100
|
-
end
|
|
101
79
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
80
|
+
x.report("Agent#invoke — fresh, tool-aware, #{AGENT_INVOKE_ITERATIONS} iters") do
|
|
81
|
+
bench_agents_tools.each do |agent|
|
|
82
|
+
agent.invoke("ping")
|
|
83
|
+
end
|
|
105
84
|
end
|
|
106
85
|
end
|
|
107
86
|
end
|
|
@@ -14,7 +14,7 @@ module BenchContextAssembler
|
|
|
14
14
|
module_function
|
|
15
15
|
|
|
16
16
|
def provenance
|
|
17
|
-
Phronomy::
|
|
17
|
+
Phronomy::Context::ContextPolicyInput::Provenance.new(origin: :journal)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def policy_input(item_count)
|
|
@@ -22,13 +22,13 @@ module BenchContextAssembler
|
|
|
22
22
|
conversation = []
|
|
23
23
|
item_count.times do |index|
|
|
24
24
|
if (index % 10).zero?
|
|
25
|
-
knowledge << Phronomy::
|
|
25
|
+
knowledge << Phronomy::Context::ContextPolicyInput::KnowledgeItem.new(
|
|
26
26
|
id: "knowledge-#{index}", kind: :knowledge, role: :user,
|
|
27
27
|
content: "knowledge #{index}", content_format: :text,
|
|
28
28
|
estimated_tokens: 8, required: false, provenance: provenance, metadata: {}
|
|
29
29
|
)
|
|
30
30
|
else
|
|
31
|
-
conversation << [Phronomy::
|
|
31
|
+
conversation << [Phronomy::Context::ContextPolicyInput::ConversationItem.new(
|
|
32
32
|
id: "message-#{index}", kind: :external_message, role: :user,
|
|
33
33
|
content: "message #{index}", content_format: :text,
|
|
34
34
|
sequence: index, estimated_tokens: 8, required: false,
|
|
@@ -38,24 +38,23 @@ module BenchContextAssembler
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
Phronomy::
|
|
41
|
+
Phronomy::Context::ContextPolicyInput.new(
|
|
42
42
|
agent_id: "bench-agent", execution_id: "bench-execution",
|
|
43
43
|
call_sequence: 2, call_mode: :complete,
|
|
44
44
|
instruction: [], knowledge: knowledge, tools: [], conversation: conversation,
|
|
45
45
|
token_budget: Phronomy::LlmContextWindow::TokenBudget.new(
|
|
46
|
-
|
|
47
|
-
max_output_tokens: 512
|
|
46
|
+
max_input_tokens: [item_count * 16, 4_096].max
|
|
48
47
|
),
|
|
49
48
|
model_config: {}, previous_manifest: nil, metadata: {}
|
|
50
49
|
)
|
|
51
50
|
end
|
|
52
51
|
|
|
53
52
|
def assembler_fixture
|
|
54
|
-
persistence = Phronomy::
|
|
53
|
+
persistence = Phronomy::PersistenceComposition.in_memory.agent
|
|
55
54
|
agent_class = Class.new(Phronomy::Agent::Base) do
|
|
56
55
|
agent_definition id: "bench-manifest-context-assembler", version: 1
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
# Resolve capabilities from RubyLLM's bundled registry; no provider call.
|
|
57
|
+
model "gpt-4o-mini"
|
|
59
58
|
max_output_tokens 1_024
|
|
60
59
|
instructions "Benchmark instruction"
|
|
61
60
|
end
|
|
@@ -87,9 +86,10 @@ module BenchContextAssembler
|
|
|
87
86
|
)
|
|
88
87
|
|
|
89
88
|
[
|
|
90
|
-
Phronomy::Agent::
|
|
89
|
+
Phronomy::Agent::ContextPreparation.new(agent: agent, persistence: persistence),
|
|
91
90
|
root,
|
|
92
|
-
execution
|
|
91
|
+
execution,
|
|
92
|
+
persistence
|
|
93
93
|
]
|
|
94
94
|
end
|
|
95
95
|
end
|
|
@@ -98,7 +98,7 @@ puts "Typed Context Policy benchmark"
|
|
|
98
98
|
puts "Ruby #{RUBY_VERSION} on #{RUBY_PLATFORM}"
|
|
99
99
|
puts "=" * 72
|
|
100
100
|
|
|
101
|
-
policy = Phronomy::
|
|
101
|
+
policy = Phronomy::Context::DefaultPolicy.instance
|
|
102
102
|
policy_inputs = [10, 100, 1_000].to_h do |count|
|
|
103
103
|
[count, BenchContextAssembler.policy_input(count)]
|
|
104
104
|
end
|
|
@@ -111,15 +111,17 @@ Benchmark.bm(46) do |x|
|
|
|
111
111
|
end
|
|
112
112
|
end
|
|
113
113
|
|
|
114
|
-
assembler, root, execution = BenchContextAssembler.assembler_fixture
|
|
115
|
-
x.report("
|
|
114
|
+
assembler, root, execution, persistence = BenchContextAssembler.assembler_fixture
|
|
115
|
+
x.report("Context prepare/store x500") do
|
|
116
116
|
500.times do
|
|
117
117
|
prepared = assembler.prepare_initial(
|
|
118
118
|
input: "benchmark input",
|
|
119
119
|
agent_root: root,
|
|
120
120
|
execution: execution
|
|
121
121
|
)
|
|
122
|
-
|
|
122
|
+
persistence.transaction do |tx|
|
|
123
|
+
Phronomy::Context::Assembly.new.store(prepared, contents: tx.contents)
|
|
124
|
+
end
|
|
123
125
|
end
|
|
124
126
|
end
|
|
125
127
|
end
|
|
@@ -69,7 +69,7 @@ end
|
|
|
69
69
|
# ---------------------------------------------------------------------------
|
|
70
70
|
# Target 3: Tool::Base#params_schema generation (10 params)
|
|
71
71
|
# ---------------------------------------------------------------------------
|
|
72
|
-
tool_class = Class.new(Phronomy::
|
|
72
|
+
tool_class = Class.new(Phronomy::Tool::Base) do
|
|
73
73
|
description "Test tool with 10 params"
|
|
74
74
|
param :p1, type: :string, desc: "param 1"
|
|
75
75
|
param :p2, type: :string, desc: "param 2"
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
require "benchmark"
|
|
8
8
|
require_relative "../lib/phronomy"
|
|
9
9
|
|
|
10
|
-
class BenchTool10Params < Phronomy::
|
|
10
|
+
class BenchTool10Params < Phronomy::Tool::Base
|
|
11
11
|
description "A tool with 10 parameters for benchmarking purposes"
|
|
12
12
|
param :param1, type: :string, desc: "First parameter"
|
|
13
13
|
param :param2, type: :integer, desc: "Second parameter"
|