phronomy 0.27.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.mutant.yml +9 -9
- data/CHANGELOG.md +52 -0
- data/CONTRIBUTING.md +8 -8
- data/README.md +9 -3
- data/benchmark/bench_agent_invoke.rb +25 -50
- data/benchmark/bench_context_assembler.rb +14 -11
- data/benchmark/bench_regression.rb +1 -1
- data/benchmark/bench_tool_schema.rb +1 -1
- data/docs/architecture/agent-chat-and-state-ownership.md +7 -1
- data/docs/architecture/agent-transition-ownership.md +13 -89
- data/docs/architecture/backend-groups.md +152 -0
- data/docs/architecture/before-llm-input.md +3 -3
- data/docs/architecture/context-management.md +1 -1
- 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 +6 -0
- data/docs/architecture/multi-agent-handoff.md +6 -5
- data/docs/architecture/persistence.md +27 -9
- 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 +10 -1
- data/docs/architecture/remaining-refactoring-plan.md +16 -0
- data/docs/architecture/storage-execution-boundaries.md +54 -0
- data/docs/architecture/tool-schema-recording-gap.md +6 -0
- data/docs/architecture/tracing.md +1 -1
- data/docs/architecture/workflow-terminal-ownership-design.md +2 -2
- data/docs/architecture.md +24 -11
- data/docs/decisions/015-tool-public-facade-and-rbs-boundary.md +3 -3
- data/docs/decisions/027-llm-adapter-provider-boundary.md +2 -0
- data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +2 -0
- data/docs/decisions/031-durable-multi-agent-coordination.md +2 -0
- data/docs/decisions/032-storage-backend-composition.md +5 -0
- data/docs/decisions/034-handoff-runner-coordination-ownership.md +2 -0
- data/docs/decisions/035-tool-executor-capability-ownership.md +1 -1
- data/docs/decisions/038-responsibility-based-source-layout.md +14 -0
- data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +8 -0
- data/docs/decisions/040-configuration-default-composition.md +12 -1
- data/docs/decisions/045-worker-input-restriction-ownership.md +4 -0
- data/docs/decisions/051-execution-outcome-worker-ownership.md +2 -0
- data/docs/decisions/056-workflow-terminal-policy-ownership.md +1 -1
- data/docs/decisions/058-neutral-storage-primitives.md +5 -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 +18 -1
- data/docs/execution-boundaries-preview.md +45 -0
- data/docs/features.md +8 -3
- data/docs/getting-started.md +9 -6
- data/docs/migrations/0.22.md +2 -2
- data/docs/migrations/durable-semantic-coordination-v2.md +2 -0
- data/docs/migrations/handoff-runner-multi-agent.md +2 -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/storage-async-client.md +103 -0
- data/docs/migrations/vector-async-clients.md +110 -0
- data/docs/persistence-backends.md +38 -21
- data/docs/runtime-and-concurrency.md +26 -1
- data/lib/phronomy/agent/admission.rb +78 -0
- data/lib/phronomy/agent/{lifecycle_contract/agent_already_exists_error.rb → agent_already_exists_error.rb} +1 -1
- data/lib/phronomy/agent/{lifecycle_contract/agent_busy_error.rb → agent_busy_error.rb} +1 -1
- data/lib/phronomy/agent/{lifecycle_contract/agent_purged_error.rb → agent_purged_error.rb} +1 -1
- data/lib/phronomy/{recovery → agent/api}/execution_rehydration_required_error.rb +1 -1
- data/lib/phronomy/agent/async_event_api.rb +37 -32
- data/lib/phronomy/agent/base.rb +74 -72
- data/lib/phronomy/agent/before_llm_input.rb +64 -0
- data/lib/phronomy/agent/composition/run_once.rb +1 -1
- data/lib/phronomy/agent/{context_assembly/context_candidate_resolver.rb → context_candidate_resolver.rb} +2 -2
- data/lib/phronomy/agent/{context_assembly/context_assembler.rb → context_preparation.rb} +35 -221
- data/lib/phronomy/agent/control_request.rb +21 -0
- data/lib/phronomy/agent/execution/agent_execution.rb +1 -1
- data/lib/phronomy/agent/execution/agent_invocation.rb +27 -53
- data/lib/phronomy/agent/execution/approval_resume_commit.rb +1 -1
- data/lib/phronomy/agent/execution/dispatch_preparation.rb +17 -127
- data/lib/phronomy/agent/execution/exact_execution.rb +44 -23
- data/lib/phronomy/agent/execution/execution_cancellation.rb +8 -4
- data/lib/phronomy/agent/execution/execution_coordinator.rb +214 -395
- data/lib/phronomy/agent/execution/execution_metadata.rb +1 -0
- data/lib/phronomy/agent/execution/execution_outcome_committer.rb +70 -126
- data/lib/phronomy/agent/execution/execution_registry.rb +6 -2
- data/lib/phronomy/agent/execution/execution_session_runner.rb +22 -27
- data/lib/phronomy/agent/execution/initial_preparation.rb +18 -116
- data/lib/phronomy/agent/execution/{agent_invocation_session_builder.rb → invocation_actions.rb} +54 -194
- data/lib/phronomy/agent/execution/invocation_transitions.rb +39 -1
- data/lib/phronomy/agent/execution/runtime_record_encoder.rb +7 -7
- 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/{handoff_context.rb → transfer_context.rb} +4 -4
- data/lib/phronomy/agent/handoff/{handoff_projection.rb → transfer_projection.rb} +14 -33
- data/lib/phronomy/{llm_contract/transport_error.rb → agent/handoff_error.rb} +1 -1
- data/lib/phronomy/agent/journal/journal_projection.rb +1 -1
- data/lib/phronomy/agent/knowledge_item.rb +13 -0
- data/lib/phronomy/agent/lifecycle/agent_root.rb +1 -1
- data/lib/phronomy/agent/lifecycle/ownership_registry.rb +18 -23
- data/lib/phronomy/agent/persistence/agent_repository.rb +29 -21
- data/lib/phronomy/agent/persistence/cancellation_repository.rb +51 -0
- data/lib/phronomy/agent/persistence/codec.rb +1 -21
- data/lib/phronomy/agent/persistence/execution_repository.rb +57 -41
- data/lib/phronomy/agent/persistence/journal_repository.rb +27 -18
- 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 +7 -2
- data/lib/phronomy/agent/persistence/watermark.rb +13 -11
- data/lib/phronomy/agent/recovery/invocation_restorer.rb +13 -21
- data/lib/phronomy/agent/recovery/recovery_coordinator/continuation.rb +10 -9
- data/lib/phronomy/agent/recovery/recovery_coordinator/installation.rb +27 -27
- data/lib/phronomy/agent/recovery/recovery_coordinator/resolution.rb +19 -21
- data/lib/phronomy/agent/recovery/recovery_coordinator.rb +23 -16
- data/lib/phronomy/agent/recovery/recovery_rules.rb +119 -0
- data/lib/phronomy/agent/recovery/recovery_support.rb +8 -11
- 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/{context_assembly/ruby_llm_materializer.rb → runtime_input.rb} +18 -35
- data/lib/phronomy/agent/{context_assembly/saved_context_reader.rb → saved_context_reader.rb} +6 -4
- data/lib/phronomy/agent/settings.rb +47 -0
- data/lib/phronomy/agent/{context_assembly/state_writer.rb → state_writer.rb} +4 -3
- data/lib/phronomy/agent/store.rb +253 -0
- data/lib/phronomy/agent/{lifecycle_contract/stream_callback_error.rb → stream_callback_error.rb} +1 -1
- data/lib/phronomy/agent/tool_execution/tool_binding.rb +4 -64
- data/lib/phronomy/agent/tool_execution/tool_invocation.rb +50 -219
- 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/configuration/runtime_settings.rb +49 -0
- data/lib/phronomy/content_store/storage_schema.rb +1 -0
- data/lib/phronomy/content_store/stored_contents.rb +2 -1
- data/lib/phronomy/context/assembly.rb +202 -0
- data/lib/phronomy/{llm_contract/context_budget_exceeded_error.rb → context/budget_exceeded_error.rb} +3 -1
- data/lib/phronomy/context/candidate.rb +51 -0
- data/lib/phronomy/context/constraint.rb +47 -0
- data/lib/phronomy/{agent/context_contract → context}/context_plan.rb +1 -1
- data/lib/phronomy/{agent/context_contract → context}/context_plan_validator.rb +3 -3
- data/lib/phronomy/{agent/context_contract → context}/context_policy.rb +1 -1
- data/lib/phronomy/{agent/context_contract → context}/context_policy_input.rb +1 -1
- data/lib/phronomy/{agent/context_assembly → 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_contract → context}/llm_input_build_context.rb +1 -1
- data/lib/phronomy/{agent/context_contract → context}/llm_input_manifest.rb +19 -19
- data/lib/phronomy/{agent/context_contract → context}/llm_input_patch.rb +1 -1
- 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 +36 -21
- data/lib/phronomy/engine/concurrency/pool_registry.rb +47 -12
- data/lib/phronomy/engine/diagnostics.rb +1 -1
- data/lib/phronomy/engine/event_loop.rb +7 -7
- 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 +1 -6
- data/lib/phronomy/engine/fsm_session.rb +3 -3
- data/lib/phronomy/engine/metrics.rb +16 -14
- data/lib/phronomy/engine/runtime/timer_queue.rb +1 -1
- data/lib/phronomy/engine/runtime.rb +25 -12
- data/lib/phronomy/engine/terminal_decision.rb +7 -0
- data/lib/phronomy/execution/async_operation.rb +41 -0
- data/lib/phronomy/{engine → execution}/blocking.rb +2 -2
- data/lib/phronomy/{engine → execution}/concurrency/cancellation_token.rb +1 -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/{engine → execution}/execution.rb +61 -27
- data/lib/phronomy/execution/execution_receiver.rb +78 -0
- data/lib/phronomy/execution/execution_scope_state.rb +35 -0
- data/lib/phronomy/{engine → execution}/invocation_context.rb +0 -15
- data/lib/phronomy/execution/invocation_controls.rb +73 -0
- data/lib/phronomy/execution/runnable.rb +24 -0
- data/lib/phronomy/{engine → execution}/task_result.rb +3 -3
- data/lib/phronomy/execution/wait_policy.rb +24 -0
- data/lib/phronomy/filter/{contract/filter_block_error.rb → filter_block_error.rb} +1 -1
- data/lib/phronomy/generation/generator_verifier/agent_operation.rb +65 -0
- data/lib/phronomy/generation/generator_verifier/default_parser.rb +27 -0
- data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +2 -2
- data/lib/phronomy/generation/generator_verifier.rb +7 -7
- data/lib/phronomy/llm_adapter/async/async_client.rb +47 -0
- data/lib/phronomy/{llm_contract → llm_adapter}/authentication_error.rb +3 -1
- data/lib/phronomy/llm_adapter/backends/ruby_llm.rb +183 -0
- data/lib/phronomy/llm_adapter/base.rb +49 -68
- data/lib/phronomy/{llm_contract → llm_adapter}/context_length_error.rb +3 -1
- data/lib/phronomy/llm_adapter/invalid_result_error.rb +10 -0
- data/lib/phronomy/llm_adapter/message.rb +62 -0
- data/lib/phronomy/{llm_contract → llm_adapter}/rate_limit_error.rb +3 -1
- 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/multi_agent/admission_registry.rb +1 -8
- 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/handoff → multi_agent}/handoff.rb +2 -2
- data/lib/phronomy/{agent/handoff → multi_agent}/handoff_capability_factory.rb +21 -2
- data/lib/phronomy/multi_agent/handoff_participant.rb +79 -0
- data/lib/phronomy/{agent/handoff → multi_agent}/handoff_policy.rb +1 -1
- data/lib/phronomy/multi_agent/handoff_runner.rb +77 -100
- data/lib/phronomy/{agent/handoff → multi_agent}/handoff_state.rb +1 -1
- data/lib/phronomy/multi_agent/orchestrator.rb +61 -75
- data/lib/phronomy/multi_agent/persistence/codec.rb +20 -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 +58 -42
- data/lib/phronomy/multi_agent/persistence/team_repository.rb +29 -21
- 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/multi_agent/shared_state.rb +2 -2
- data/lib/phronomy/multi_agent/store.rb +156 -0
- data/lib/phronomy/multi_agent/team_coordinator.rb +83 -74
- data/lib/phronomy/multi_agent/team_ownership_registry.rb +2 -12
- 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 +2 -2
- 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 +9 -4
- 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 +5 -1
- data/lib/phronomy/runtime_composition/configuration.rb +146 -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/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 +8 -2
- 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 +2 -2
- data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +6 -6
- data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +55 -52
- data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +3 -3
- data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +7 -7
- data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +11 -11
- data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +57 -51
- data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +1 -1
- data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +23 -22
- 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_execution/tool_definition_set.rb → tool/definition_set.rb} +7 -8
- 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/tool/tool_executor.rb +58 -0
- 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/execution/workflow.rb +7 -7
- data/lib/phronomy/workflow/execution/workflow_action_rules.rb +67 -0
- data/lib/phronomy/workflow/execution/workflow_context.rb +2 -2
- data/lib/phronomy/workflow/execution/workflow_execution_environment.rb +27 -0
- data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +3 -5
- data/lib/phronomy/workflow/execution/workflow_runner.rb +58 -79
- data/lib/phronomy/workflow/execution/workflow_settings.rb +28 -0
- data/lib/phronomy/workflow/persistence/state_repository.rb +28 -22
- 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/{execution → runtime_binding}/workflow_terminal_policy.rb +4 -4
- data/lib/phronomy.rb +57 -16
- data/scripts/api_snapshot.rb +35 -15
- 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 -138
- 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 +10 -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 +6 -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 +1 -99
- 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.rbs → storage/contracts.rbs} +2 -16
- data/sig/phronomy/tool.rbs +48 -4
- 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 +318 -117
- 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 -548
- data/lib/phronomy/agent/context/capability/tool_executor.rb +0 -62
- data/lib/phronomy/agent/context/instruction/prompt_template.rb +0 -102
- data/lib/phronomy/agent/context_assembly/runtime_chat_builder.rb +0 -36
- data/lib/phronomy/agent/context_assembly/token_budget_resolver.rb +0 -22
- 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/phase_machine_builder.rb +0 -101
- data/lib/phronomy/agent/execution/provider_call_outcome.rb +0 -106
- data/lib/phronomy/agent/handoff/handoff_execution_coordinator.rb +0 -15
- data/lib/phronomy/agent/handoff/handoff_outcome_committer.rb +0 -131
- data/lib/phronomy/agent/handoff/handoff_request.rb +0 -45
- data/lib/phronomy/agent/lifecycle_contract/handoff_error.rb +0 -7
- data/lib/phronomy/agent/persistence/handoff_state_repository.rb +0 -58
- data/lib/phronomy/agent/persistence/queries.rb +0 -61
- data/lib/phronomy/agent/selection/candidate.rb +0 -53
- data/lib/phronomy/agent/selection/constraint.rb +0 -49
- data/lib/phronomy/agent/tool_execution/tool_call_intercepted.rb +0 -29
- data/lib/phronomy/agent/tool_execution/tool_invocation_session_builder.rb +0 -276
- data/lib/phronomy/configuration/configuration.rb +0 -68
- data/lib/phronomy/configuration/global_configuration.rb +0 -26
- data/lib/phronomy/engine/concurrency/cancellation_scope.rb +0 -124
- data/lib/phronomy/engine/concurrency/operation_binding.rb +0 -43
- data/lib/phronomy/engine/execution_receiver.rb +0 -65
- data/lib/phronomy/engine/runnable.rb +0 -54
- data/lib/phronomy/llm_adapter/ruby_llm.rb +0 -47
- data/lib/phronomy/llm_contract/token_usage.rb +0 -85
- data/lib/phronomy/multi_agent/persistence/queries.rb +0 -30
- data/lib/phronomy/multi_agent/storage_contract/team_storage_schema.rb +0 -15
- data/lib/phronomy/output_parser/contract/parse_error.rb +0 -7
- data/lib/phronomy/persistence/api/persistence.rb +0 -140
- data/lib/phronomy/persistence_composition/repositories.rb +0 -77
- data/lib/phronomy/recovery/recovery.rb +0 -186
- data/lib/phronomy/tool/contract/tool_error.rb +0 -7
- 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/storage_contract/workflow_storage_schema.rb +0 -9
- data/sig/phronomy/execution_receiver.rbs +0 -34
- data/sig/phronomy/llm_adapter.rbs +0 -11
- data/sig/phronomy/runtime.rbs +0 -76
- /data/lib/phronomy/agent/{context_assembly/context_importer.rb → context_importer.rb} +0 -0
- /data/lib/phronomy/{engine → execution}/backpressure_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/cancellation_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/concurrency/worker_input_restricted.rb +0 -0
- /data/lib/phronomy/{engine → execution}/event_loop_reentrancy_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/execution_cancellation_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/execution_timeout_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/invalid_async_entry_action_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/invalid_async_transition_action_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/invalid_async_workflow_action_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/pool_shutdown_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/recursion_limit_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/runtime_shutdown_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/runtime_shutdown_reentrancy_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/scheduler_reentrancy_error.rb +0 -0
- /data/lib/phronomy/{engine → execution}/timeout_error.rb +0 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "state_machines"
|
|
4
|
+
require_relative "../execution/workflow_action_rules"
|
|
5
|
+
|
|
6
|
+
module Phronomy
|
|
7
|
+
# Builds the anonymous state-machine Class used by WorkflowRunner.
|
|
8
|
+
#
|
|
9
|
+
# This class compiles Workflow topology into state_machines declarations.
|
|
10
|
+
# It intentionally does not await Tasks, register completion callbacks,
|
|
11
|
+
# cancel external work, or interpret application event payloads.
|
|
12
|
+
#
|
|
13
|
+
# @api private
|
|
14
|
+
class WorkflowPhaseMachineBuilder
|
|
15
|
+
def initialize(
|
|
16
|
+
entry_point:,
|
|
17
|
+
declared_states:,
|
|
18
|
+
wait_state_names:,
|
|
19
|
+
external_events:,
|
|
20
|
+
entry_actions:,
|
|
21
|
+
auto_transitions:,
|
|
22
|
+
exit_actions:
|
|
23
|
+
)
|
|
24
|
+
@entry_point = entry_point
|
|
25
|
+
@declared_states = declared_states
|
|
26
|
+
@wait_state_names = wait_state_names
|
|
27
|
+
@external_events = external_events.transform_values { |items| items.map { |transition| convert_transition(transition) } }
|
|
28
|
+
@entry_actions = entry_actions
|
|
29
|
+
@auto_transitions = auto_transitions.map { |transition| convert_transition(transition) }
|
|
30
|
+
@exit_actions = exit_actions
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def build
|
|
34
|
+
entry = @entry_point
|
|
35
|
+
all_states = (@declared_states + @wait_state_names + [FSMProtocol::FINISH]).uniq
|
|
36
|
+
auto_transitions = @auto_transitions
|
|
37
|
+
external_events = @external_events
|
|
38
|
+
entry_actions = @entry_actions
|
|
39
|
+
exit_actions = @exit_actions
|
|
40
|
+
condition_builder = method(:build_transition_condition)
|
|
41
|
+
entry_callback_builder = method(:build_entry_callback)
|
|
42
|
+
exit_callback_builder = method(:build_exit_callback)
|
|
43
|
+
transition_callback = build_transition_action_callback
|
|
44
|
+
|
|
45
|
+
Class.new do
|
|
46
|
+
attr_accessor(
|
|
47
|
+
:context,
|
|
48
|
+
:current_event,
|
|
49
|
+
:selected_transition_action,
|
|
50
|
+
:selected_transition_metadata
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
state_machine :phase, initial: entry do
|
|
54
|
+
all_states.each { |state_name| state state_name }
|
|
55
|
+
|
|
56
|
+
event :state_completed do
|
|
57
|
+
auto_transitions.each do |transition_definition|
|
|
58
|
+
transition(
|
|
59
|
+
transition_definition[:from] => transition_definition[:to],
|
|
60
|
+
:if => condition_builder.call(transition_definition)
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
external_events.each do |event_name, transitions|
|
|
66
|
+
event event_name do
|
|
67
|
+
transitions.each do |transition_definition|
|
|
68
|
+
transition(
|
|
69
|
+
transition_definition[:from] => transition_definition[:to],
|
|
70
|
+
:if => condition_builder.call(transition_definition)
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
entry_actions.each do |state_name, callables|
|
|
77
|
+
callables.each do |callable|
|
|
78
|
+
after_transition(
|
|
79
|
+
to: state_name,
|
|
80
|
+
&entry_callback_builder.call(callable, state_name)
|
|
81
|
+
)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Both source exit callbacks and the transition action are
|
|
86
|
+
# before_transition callbacks. Register exits first to preserve the
|
|
87
|
+
# required exit -> transition action -> entry ordering.
|
|
88
|
+
exit_actions.each do |state_name, callables|
|
|
89
|
+
callables.each do |callable|
|
|
90
|
+
before_transition(
|
|
91
|
+
from: state_name,
|
|
92
|
+
&exit_callback_builder.call(callable, state_name)
|
|
93
|
+
)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
before_transition(&transition_callback)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
rescue => error
|
|
101
|
+
raise ArgumentError, "Failed to build phase machine: #{error.message}"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
private
|
|
105
|
+
|
|
106
|
+
def convert_transition(transition)
|
|
107
|
+
destination = transition[:to]
|
|
108
|
+
destination = FSMProtocol::FINISH if destination == Workflow::Completion::FINISH
|
|
109
|
+
transition.merge(to: destination)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def build_transition_condition(transition_definition)
|
|
113
|
+
guard = transition_definition[:guard]
|
|
114
|
+
action = transition_definition[:action]
|
|
115
|
+
metadata = {
|
|
116
|
+
from: transition_definition[:from],
|
|
117
|
+
event: transition_definition[:event],
|
|
118
|
+
to: public_destination(transition_definition[:to])
|
|
119
|
+
}.freeze
|
|
120
|
+
|
|
121
|
+
->(machine) {
|
|
122
|
+
matched = WorkflowActionRules.allowed?(guard, machine.context, machine.current_event)
|
|
123
|
+
if matched
|
|
124
|
+
machine.selected_transition_action = action
|
|
125
|
+
machine.selected_transition_metadata = metadata
|
|
126
|
+
end
|
|
127
|
+
matched
|
|
128
|
+
}
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def build_transition_action_callback
|
|
132
|
+
->(machine) {
|
|
133
|
+
machine.context = WorkflowActionRules.transition(
|
|
134
|
+
machine.selected_transition_action, machine.context, machine.current_event,
|
|
135
|
+
metadata: machine.selected_transition_metadata || {}
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def build_entry_callback(callable, state_name)
|
|
141
|
+
->(machine) {
|
|
142
|
+
machine.context = WorkflowActionRules.apply_entry(callable, machine.context, state_name)
|
|
143
|
+
}
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def build_exit_callback(callable, state_name)
|
|
147
|
+
->(machine) { WorkflowActionRules.exit(callable, machine.context, state_name) }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def public_destination(destination)
|
|
151
|
+
return Workflow::Completion::FINISH if destination == FSMProtocol::FINISH
|
|
152
|
+
|
|
153
|
+
destination
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Phronomy
|
|
4
|
-
#
|
|
4
|
+
# Translates classified Workflow outcomes into shared FSM terminal decisions.
|
|
5
5
|
# The session owns pending state; Runner owns persistence and reconciliation.
|
|
6
6
|
# @api private
|
|
7
7
|
class WorkflowTerminalPolicy
|
|
@@ -23,14 +23,14 @@ module Phronomy
|
|
|
23
23
|
result = event.payload
|
|
24
24
|
case result.outcome
|
|
25
25
|
when :success
|
|
26
|
-
|
|
26
|
+
Phronomy::TerminalDecision.new(action: :complete, error: nil)
|
|
27
27
|
when :known_failure
|
|
28
|
-
|
|
28
|
+
Phronomy::TerminalDecision.new(
|
|
29
29
|
action: :fail,
|
|
30
30
|
error: result.error || Phronomy::Error.new("Workflow terminal persistence failed")
|
|
31
31
|
)
|
|
32
32
|
when :outcome_unknown
|
|
33
|
-
|
|
33
|
+
Phronomy::TerminalDecision.new(action: :retire, error: result.error)
|
|
34
34
|
else
|
|
35
35
|
raise Phronomy::Error,
|
|
36
36
|
"unknown Workflow terminal persistence outcome: #{result.outcome.inspect}"
|
data/lib/phronomy.rb
CHANGED
|
@@ -13,19 +13,29 @@ loader.inflector.inflect("llm_adapter" => "LLMAdapter")
|
|
|
13
13
|
loader.inflector.inflect("llm_operation_result" => "LLMOperationResult")
|
|
14
14
|
loader.inflector.inflect("ruby_llm" => "RubyLLM")
|
|
15
15
|
loader.inflector.inflect("canonical_json" => "CanonicalJSON")
|
|
16
|
-
loader.inflector.inflect("ruby_llm_materializer" => "RubyLLMMaterializer")
|
|
17
16
|
loader.inflector.inflect("llm_call_record" => "LLMCallRecord")
|
|
18
17
|
loader.inflector.inflect("llm_input_manifest" => "LLMInputManifest")
|
|
19
18
|
loader.inflector.inflect("llm_input_build_context" => "LLMInputBuildContext")
|
|
20
19
|
loader.inflector.inflect("llm_input_patch" => "LLMInputPatch")
|
|
21
20
|
loader.inflector.inflect("before_llm_input" => "BeforeLLMInput")
|
|
22
21
|
# These responsibility directories do not add a public Ruby namespace.
|
|
23
|
-
%w[common configuration engine generation
|
|
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|
|
|
24
34
|
loader.collapse("#{__dir__}/phronomy/#{directory}")
|
|
25
35
|
end
|
|
26
36
|
# Agent responsibility directories retain the existing Agent constant names.
|
|
27
37
|
%w[
|
|
28
|
-
|
|
38
|
+
lifecycle execution tool_execution runtime_binding
|
|
29
39
|
journal handoff recovery
|
|
30
40
|
].each do |directory|
|
|
31
41
|
loader.collapse("#{__dir__}/phronomy/agent/#{directory}")
|
|
@@ -36,44 +46,75 @@ end
|
|
|
36
46
|
# beside the feature they belong to, without aliases or a new partial-load API.
|
|
37
47
|
%w[
|
|
38
48
|
agent/api
|
|
39
|
-
agent/lifecycle_contract
|
|
40
|
-
filter/contract
|
|
41
|
-
output_parser/contract
|
|
42
|
-
persistence/api
|
|
43
|
-
tool/contract
|
|
44
49
|
workflow/execution
|
|
45
|
-
workflow/
|
|
46
|
-
multi_agent/storage_contract
|
|
50
|
+
workflow/runtime_binding
|
|
47
51
|
].each do |directory|
|
|
48
52
|
loader.push_dir("#{__dir__}/phronomy/#{directory}", namespace: Phronomy)
|
|
49
53
|
end
|
|
50
54
|
|
|
51
55
|
# These files wire composition, reopen namespaces, or patch a dependency.
|
|
52
56
|
loader.ignore(
|
|
53
|
-
"#{__dir__}/phronomy/
|
|
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",
|
|
54
61
|
"#{__dir__}/phronomy/agent/composition",
|
|
55
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",
|
|
56
67
|
"#{__dir__}/phronomy/runtime_composition/configuration_defaults.rb",
|
|
57
|
-
"#{__dir__}/phronomy/runtime_composition/global_runtime.rb"
|
|
68
|
+
"#{__dir__}/phronomy/runtime_composition/global_runtime.rb",
|
|
69
|
+
"#{__dir__}/phronomy/runtime_composition/execution_defaults.rb"
|
|
58
70
|
)
|
|
59
71
|
# Persistence conformance support must never make production loading require RSpec.
|
|
60
72
|
loader.ignore(
|
|
61
73
|
"#{__dir__}/phronomy/testing/persistence_contract.rb",
|
|
62
74
|
"#{__dir__}/phronomy/testing/persistence_contract"
|
|
63
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")
|
|
64
88
|
loader.setup
|
|
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"
|
|
65
99
|
|
|
66
100
|
require_relative "phronomy/runtime_composition/configuration_defaults"
|
|
67
|
-
require_relative "phronomy/
|
|
68
|
-
require_relative "phronomy/
|
|
101
|
+
require_relative "phronomy/llm_adapter/token_usage"
|
|
102
|
+
require_relative "phronomy/runtime_composition/global_configuration"
|
|
69
103
|
require_relative "phronomy/runtime_composition/global_runtime"
|
|
104
|
+
require_relative "phronomy/runtime_composition/execution_defaults"
|
|
70
105
|
|
|
71
106
|
# Explicitly install the Agent namespace extensions even if its factory
|
|
72
107
|
# contract was loaded first. Composition owns both concrete binding and the
|
|
73
108
|
# run_once method definition; neither is required from Agent execution files.
|
|
74
109
|
require_relative "phronomy/agent/api/agent"
|
|
75
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"
|
|
76
115
|
require_relative "phronomy/agent/composition/run_once"
|
|
77
116
|
|
|
78
|
-
#
|
|
79
|
-
|
|
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::
|
|
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,
|
|
39
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,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
|