phronomy 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.mutant.yml +9 -9
- data/CHANGELOG.md +52 -0
- data/CONTRIBUTING.md +8 -8
- data/README.md +28 -7
- 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/application-recipes.md +229 -0
- 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/dx05-agent-scope.md +119 -0
- data/docs/architecture/dx05-workflow-task-state.md +134 -0
- data/docs/architecture/error-api-review.md +245 -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 +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/failure-reason-codes.md +45 -0
- data/docs/features.md +12 -4
- data/docs/getting-started.md +52 -48
- 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/ordered-event-delivery.md +54 -0
- data/docs/persistence-backends.md +38 -21
- data/docs/runtime-and-concurrency.md +26 -1
- data/docs/workflow-completion.md +92 -0
- data/gemfiles/http_minimum.gemfile +5 -0
- 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/agent_not_found_error.rb +16 -0
- data/lib/phronomy/agent/{lifecycle_contract/agent_purged_error.rb → agent_purged_error.rb} +1 -1
- data/lib/phronomy/agent/agent_unloaded_error.rb +14 -0
- data/lib/phronomy/agent/api/agent.rb +13 -0
- data/lib/phronomy/{recovery → agent/api}/execution_rehydration_required_error.rb +1 -1
- data/lib/phronomy/agent/async_event_api.rb +132 -103
- data/lib/phronomy/agent/base.rb +146 -113
- data/lib/phronomy/agent/before_llm_input.rb +70 -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 +55 -32
- data/lib/phronomy/agent/execution/execution_cancellation.rb +8 -4
- data/lib/phronomy/agent/execution/execution_coordinator.rb +229 -407
- data/lib/phronomy/agent/execution/execution_metadata.rb +1 -0
- data/lib/phronomy/agent/execution/execution_outcome_committer.rb +71 -127
- 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 +19 -120
- 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 +8 -11
- 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 +188 -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/lifetime_api.rb +76 -0
- data/lib/phronomy/agent/lifecycle/operation_lease.rb +33 -0
- data/lib/phronomy/agent/lifecycle/operation_result.rb +53 -0
- data/lib/phronomy/agent/lifecycle/ownership_registry.rb +117 -31
- data/lib/phronomy/agent/lifecycle/scope.rb +198 -0
- data/lib/phronomy/agent/lifecycle/scope_cleanup_error.rb +19 -0
- data/lib/phronomy/agent/lifecycle/unload_transition.rb +78 -0
- 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 +13 -12
- data/lib/phronomy/agent/recovery/recovery_coordinator/installation.rb +34 -34
- data/lib/phronomy/agent/recovery/recovery_coordinator/resolution.rb +33 -39
- data/lib/phronomy/agent/recovery/recovery_coordinator.rb +28 -25
- data/lib/phronomy/agent/recovery/recovery_rules.rb +119 -0
- data/lib/phronomy/agent/recovery/recovery_support.rb +10 -19
- 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} +3 -3
- 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/common/error.rb +65 -1
- data/lib/phronomy/configuration/runtime_settings.rb +49 -0
- data/lib/phronomy/content_store/base.rb +7 -2
- 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 +195 -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/authentication_error.rb +11 -0
- data/lib/phronomy/embeddings/backends/ruby_llm_embeddings.rb +52 -0
- data/lib/phronomy/embeddings/base.rb +43 -0
- data/lib/phronomy/embeddings/invalid_result_error.rb +11 -0
- data/lib/phronomy/embeddings/rate_limit_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/{engine → execution}/execution_cancellation_error.rb +2 -2
- data/lib/phronomy/execution/execution_receiver.rb +78 -0
- data/lib/phronomy/execution/execution_scope_state.rb +35 -0
- data/lib/phronomy/{engine → execution}/execution_timeout_error.rb +2 -2
- 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 +9 -4
- data/lib/phronomy/execution/wait_policy.rb +24 -0
- data/lib/phronomy/filter/{contract/filter_block_error.rb → filter_block_error.rb} +3 -3
- 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/generation/low_confidence_error.rb +2 -2
- data/lib/phronomy/integrations/ordered_event_delivery.rb +208 -0
- 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 +60 -44
- 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_busy_error.rb +18 -0
- data/lib/phronomy/multi_agent/team_coordinator.rb +99 -77
- data/lib/phronomy/multi_agent/team_not_found_error.rb +18 -0
- 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/storage/condition_failed_error.rb +2 -2
- data/lib/phronomy/storage/unique_constraint_error.rb +2 -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 +551 -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 +36 -7
- data/lib/phronomy/tracing/observation.rb +37 -0
- data/lib/phronomy/tracing/open_telemetry_tracer.rb +4 -29
- 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 +37 -9
- 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 +28 -0
- data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +77 -8
- data/lib/phronomy/workflow/execution/workflow_runner.rb +105 -92
- data/lib/phronomy/workflow/execution/workflow_settings.rb +28 -0
- data/lib/phronomy/workflow/execution/workflow_task_execution.rb +153 -0
- data/lib/phronomy/workflow/execution/workflow_task_reception.rb +72 -0
- data/lib/phronomy/workflow/execution/workflow_task_resume_error.rb +14 -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 +61 -0
- data/lib/phronomy/workflow/runtime_binding/workflow_phase_machine_builder.rb +158 -0
- data/lib/phronomy/workflow/runtime_binding/workflow_task_session.rb +76 -0
- data/lib/phronomy/workflow/{execution → runtime_binding}/workflow_terminal_policy.rb +4 -4
- data/lib/phronomy.rb +63 -16
- data/scripts/api_snapshot.rb +47 -15
- data/scripts/check_readme_ruby.rb +24 -29
- data/scripts/check_readme_runnable.rb +92 -81
- 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/agent_not_found_error.rbs +6 -0
- data/sig/phronomy/agent/agent_unloaded_error.rbs +6 -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/stream_callback_error.rbs +8 -0
- data/sig/phronomy/agent.rbs +29 -135
- 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 +23 -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 +1 -21
- data/sig/phronomy/filter/filter_block_error.rbs +6 -0
- data/sig/phronomy/generation/low_confidence_error.rbs +6 -0
- data/sig/phronomy/handoff.rbs +10 -4
- data/sig/phronomy/integrations.rbs +14 -0
- 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/team_busy_error.rbs +8 -0
- data/sig/phronomy/multi_agent/team_not_found_error.rbs +8 -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} +4 -18
- 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 +15 -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 +5 -1
- data/sig/phronomy.rbs +4 -49
- metadata +365 -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}/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,22 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
interface _TimerQueue
|
|
3
|
+
def schedule: (seconds: Numeric) { () -> void } -> self
|
|
4
|
+
def cancel: (^() -> void callback) -> bool
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module Concurrency
|
|
8
|
+
class OffloadPool
|
|
9
|
+
@timer_queue_provider: (^() -> _TimerQueue)?
|
|
10
|
+
def initialize: (?pool_size: Integer, ?queue_size: Integer, ?name: (String | Symbol)?, ?logger: untyped, ?timer_queue_provider: (^() -> _TimerQueue)?) -> void
|
|
11
|
+
def begin_shutdown: () -> self
|
|
12
|
+
def terminated?: () -> bool
|
|
13
|
+
def shutdown: (?drain_timeout: Numeric, ?deadline: Numeric?) -> self
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class PoolRegistry
|
|
17
|
+
@timer_queue_provider: (^() -> _TimerQueue)?
|
|
18
|
+
def initialize: (?timer_queue_provider: (^() -> _TimerQueue)?) -> void
|
|
19
|
+
def shutdown: (?deadline: Numeric) -> bool
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
interface _FSMEventSink
|
|
3
|
+
def post: (Symbol type, ?untyped payload) -> untyped
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
interface _TerminalPolicy
|
|
7
|
+
def start: (terminal_type: Symbol, context: untyped, event_sink: _FSMEventSink) -> untyped
|
|
8
|
+
def handles?: (Event event) -> bool
|
|
9
|
+
def decision_for: (Event event) -> TerminalDecision
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Event
|
|
13
|
+
attr_reader type: Symbol
|
|
14
|
+
attr_reader payload: untyped
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class TerminalDecision < Data
|
|
18
|
+
attr_reader action: (:complete | :fail | :retire)
|
|
19
|
+
attr_reader error: Exception?
|
|
20
|
+
def self.new: (action: (:complete | :fail | :retire), error: Exception?) -> instance
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module ExecutionBinding
|
|
3
|
+
def self.submit: [V] (?pool: _ExecutionPool?, ?runtime: _ExecutionRuntime?, ?pool_name: Symbol?, ?size: Integer, ?queue_size: Integer, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
|
|
4
|
+
def self.after: (Numeric seconds) { () -> void } -> ^() -> untyped
|
|
5
|
+
end
|
|
6
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
class EventLoop
|
|
3
|
+
def __execution_receiver: (key: untyped) -> ExecutionReceiver?
|
|
4
|
+
def __register_execution_receiver: (key: untyped, receiver: ExecutionReceiver) -> ExecutionReceiver
|
|
5
|
+
def __synchronize_execution_state: [V] () { () -> V } -> V
|
|
6
|
+
def __admit_execution: [V] (ExecutionReceiver receiver) { () -> V } -> V
|
|
7
|
+
def __post_execution: (ExecutionReceiver receiver, untyped message, ?admission: bool, ?completion: TaskResult[untyped]?) -> bool
|
|
8
|
+
def __route_execution_event: (ExecutionReceiver receiver) { () -> untyped } -> bool
|
|
9
|
+
def __receiver_cleanup_complete?: () -> bool
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Runtime
|
|
13
|
+
def __event_loop_if_initialized: () -> EventLoop?
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Internal lookup operations. None of these methods initializes a resource.
|
|
2
|
+
module Phronomy
|
|
3
|
+
class Runtime
|
|
4
|
+
def self.__default_if_initialized: () -> Runtime?
|
|
5
|
+
def __offload_if_initialized: () -> Concurrency::OffloadPool?
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module Concurrency
|
|
9
|
+
class PoolRegistry
|
|
10
|
+
def default_pool_if_initialized: () -> OffloadPool?
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module AsyncOperation
|
|
3
|
+
def self.map: [A, B] (_CompletionHandle[A] source, name: String, ?on_error: (^(Exception) -> B)?) { (A) -> B } -> TaskResult[B]
|
|
4
|
+
def self.call: [A, B] (name: String, ?on_error: (^(Exception) -> B)?, ?transform: ^(A) -> B) { () -> _CompletionHandle[A] } -> TaskResult[B]
|
|
5
|
+
def self.capture: [V] (name: String, ?on_error: (^(Exception) -> V)?) { () -> V } -> TaskResult[V]
|
|
6
|
+
end
|
|
7
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module Concurrency
|
|
3
|
+
class CancellationToken
|
|
4
|
+
def self.timeout_after: (Numeric seconds) -> CancellationToken
|
|
5
|
+
def initialize: (?monotonic_deadline: Float?) -> void
|
|
6
|
+
def remaining_monotonic_seconds: () -> Float?
|
|
7
|
+
def on_cancel: () { () -> void } -> self
|
|
8
|
+
def cancel!: () -> self
|
|
9
|
+
def cancelled?: () -> bool
|
|
10
|
+
def raise_if_cancelled!: (?String message) -> nil
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
# Only the operations used across the execution boundary; no concrete runtime.
|
|
3
|
+
interface _CompletionHandle[A]
|
|
4
|
+
def on_complete: () { (A?, Exception?) -> void } -> untyped
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
interface _ExecutionScope
|
|
8
|
+
def __while_open: [V] () { () -> V } -> V?
|
|
9
|
+
def __open?: () -> bool
|
|
10
|
+
def __cancellation_token: () -> Concurrency::CancellationToken
|
|
11
|
+
def __cancellation_error: () -> Exception
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module WaitPolicy
|
|
15
|
+
def self.blocking_forbidden?: () -> bool
|
|
16
|
+
def self.without_blocking: [V] () { () -> V } -> V
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
interface _ExecutionSubmitter
|
|
3
|
+
def submit: [V] (?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
interface _ExecutionPool
|
|
7
|
+
def submit: [V] (?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
interface _ExecutionRuntime
|
|
11
|
+
def offload: () -> _ExecutionPool
|
|
12
|
+
def pool: (Symbol name, size: Integer, queue_size: Integer) -> _ExecutionPool
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
interface _ExecutionBackend
|
|
16
|
+
def submit: [V] (?pool: _ExecutionPool?, ?runtime: _ExecutionRuntime?, ?pool_name: Symbol?, ?size: Integer, ?queue_size: Integer, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
|
|
17
|
+
def after: (Numeric seconds) { () -> void } -> ^() -> untyped
|
|
18
|
+
end
|
|
19
|
+
class Execution
|
|
20
|
+
def self.backend_provider=: (^() -> _ExecutionBackend provider) -> ^() -> _ExecutionBackend
|
|
21
|
+
def self.submit: [V] (?pool: _ExecutionPool?, ?runtime: _ExecutionRuntime?, ?pool_name: Symbol?, ?size: Integer, ?queue_size: Integer, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?on_full: Symbol) { () -> V } -> TaskResult[V]
|
|
22
|
+
def self.after: (Numeric seconds) { () -> void } -> ^() -> untyped
|
|
23
|
+
attr_reader invocation_context: InvocationContext
|
|
24
|
+
|
|
25
|
+
def self.run_async: [I, V] (Array[I] inputs, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?invocation_context: InvocationContext?, ?max_concurrency: Integer?) { (I, Execution) -> TaskResult[V] } -> TaskResult[Array[TaskResult::Outcome[V]]]
|
|
26
|
+
def self.run: [I, V] (Array[I] inputs, ?timeout: Numeric?, ?cancellation_token: Concurrency::CancellationToken?, ?invocation_context: InvocationContext?, ?max_concurrency: Integer?) { (I, Execution) -> TaskResult[V] } -> Array[TaskResult::Outcome[V]]
|
|
27
|
+
def start_child: [V] (?invocation_context: InvocationContext?, ?cancellation_token: Concurrency::CancellationToken?, ?parent_task_id: String?) { (InvocationContext, Concurrency::CancellationToken) -> TaskResult[V] } -> TaskResult[V]
|
|
28
|
+
def observe: [V] (TaskResult[V] source_result) -> TaskResult[V]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class ExecutionTimeoutError < TimeoutError
|
|
32
|
+
attr_reader outcomes: Array[TaskResult::Outcome[untyped]]
|
|
33
|
+
def initialize: (?String message, outcomes: Array[TaskResult::Outcome[untyped]], ?code: String?) -> void
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class ExecutionCancellationError < CancellationError
|
|
37
|
+
attr_reader outcomes: Array[TaskResult::Outcome[untyped]]
|
|
38
|
+
def initialize: (?String message, outcomes: Array[TaskResult::Outcome[untyped]], ?code: String?) -> void
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
interface _ExecutionReceiver
|
|
3
|
+
def idle?: () -> bool
|
|
4
|
+
def deliver: (untyped message) -> untyped
|
|
5
|
+
def shutdown: (error: Exception?) -> untyped
|
|
6
|
+
def session_retired: (String session_id, reason: Symbol) -> untyped
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
interface _ExecutionChannel
|
|
10
|
+
def bound_to?: (untyped owner) -> bool
|
|
11
|
+
def current?: () -> bool
|
|
12
|
+
def synchronize: [V] () { () -> V } -> V
|
|
13
|
+
def admit: [V] (ExecutionReceiver receiver) { () -> V } -> V
|
|
14
|
+
def post: (ExecutionReceiver receiver, untyped message, admission: bool, completion: TaskResult[untyped]?) -> bool
|
|
15
|
+
def route: (ExecutionReceiver receiver, type: Symbol, payload: untyped) { () -> String? } -> bool
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Internal serial-owner contract; composition supplies the transport.
|
|
19
|
+
class ExecutionReceiver
|
|
20
|
+
def self.install_binding: (^() -> untyped provider) -> untyped
|
|
21
|
+
def self.binding: () -> untyped
|
|
22
|
+
def self.for: (untyped owner) -> instance
|
|
23
|
+
def self.existing_for: (untyped owner) -> instance?
|
|
24
|
+
def initialize: (channel: _ExecutionChannel) -> void
|
|
25
|
+
def __bound_to?: (untyped owner) -> bool
|
|
26
|
+
def idle?: () -> bool
|
|
27
|
+
def deliver: (untyped message) -> untyped
|
|
28
|
+
def shutdown: (error: Exception?) -> untyped
|
|
29
|
+
def session_retired: (String fsm_session_id, reason: Symbol) -> untyped
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def synchronize: [V] () { () -> V } -> V
|
|
34
|
+
def admit: [V] () { () -> V } -> V
|
|
35
|
+
def post_message: (untyped message, ?admission: bool, ?completion: TaskResult[untyped]?) -> bool
|
|
36
|
+
def route_event: (type: Symbol, ?payload: untyped) { () -> String? } -> bool
|
|
37
|
+
def assert_event_loop_thread!: () -> void
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
class ExecutionScopeState
|
|
3
|
+
def __while_open: [V] () { () -> V } -> V?
|
|
4
|
+
def __open?: () -> bool
|
|
5
|
+
def __cancellation_token: () -> Concurrency::CancellationToken
|
|
6
|
+
def __cancellation_error: () -> Exception
|
|
7
|
+
def __set_cancellation_error: (Exception error) -> Exception
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
class InvocationContext
|
|
3
|
+
@execution_scope: _ExecutionScope?
|
|
4
|
+
def __bind_execution: (_ExecutionScope? scope) -> self
|
|
5
|
+
def __execution_scope: () -> _ExecutionScope?
|
|
6
|
+
|
|
7
|
+
attr_reader user_id: String?
|
|
8
|
+
attr_reader cancellation_token: Concurrency::CancellationToken?
|
|
9
|
+
attr_reader deadline: Concurrency::Deadline?
|
|
10
|
+
attr_reader token_budget: Integer?
|
|
11
|
+
attr_reader approval_policy: untyped
|
|
12
|
+
attr_reader redaction_policy: untyped
|
|
13
|
+
attr_reader task_id: String?
|
|
14
|
+
attr_reader parent_task_id: String?
|
|
15
|
+
|
|
16
|
+
def initialize: (?user_id: String?, ?cancellation_token: Concurrency::CancellationToken?, ?deadline: Concurrency::Deadline?, ?token_budget: Integer?, ?approval_policy: untyped, ?redaction_policy: untyped, ?task_id: String?, ?parent_task_id: String?) -> void
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
class InvocationControls
|
|
3
|
+
@scope: _ExecutionScope?
|
|
4
|
+
attr_reader token: Concurrency::CancellationToken?
|
|
5
|
+
def self.attach: [V] (TaskResult[V] result, invocation_context: InvocationContext?, cancellation_token: Concurrency::CancellationToken?) -> instance
|
|
6
|
+
def initialize: (invocation_context: InvocationContext?, cancellation_token: Concurrency::CancellationToken?) -> void
|
|
7
|
+
def check_start!: () -> nil
|
|
8
|
+
def bind: [V] (TaskResult[V] result) -> TaskResult[V]
|
|
9
|
+
def track: [V] (TaskResult[V] result) -> TaskResult[V]
|
|
10
|
+
def close: () -> untyped
|
|
11
|
+
def self.effective_timeout_token: (InvocationContext context) -> Concurrency::CancellationToken?
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
class TaskResult[A]
|
|
3
|
+
@execution_scope: _ExecutionScope?
|
|
4
|
+
def __bind_execution: (_ExecutionScope? scope) -> self
|
|
5
|
+
def __execution_scope: () -> _ExecutionScope?
|
|
6
|
+
class Outcome[V]
|
|
7
|
+
attr_reader index: Integer
|
|
8
|
+
attr_reader status: (:completed | :failed | :cancelled | :unfinished)
|
|
9
|
+
attr_reader value: V?
|
|
10
|
+
attr_reader error: Exception?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.completed: [V] (V value, ?name: String?) -> TaskResult[V]
|
|
14
|
+
| (?name: String?) -> TaskResult[nil]
|
|
15
|
+
def self.failed: (Exception error, ?name: String?) -> TaskResult[untyped]
|
|
16
|
+
def self.all_settled: [V] (Array[TaskResult[V]] results) -> TaskResult[Array[Outcome[V]]]
|
|
17
|
+
attr_reader name: String?
|
|
18
|
+
attr_reader parent: TaskResult[untyped]?
|
|
19
|
+
|
|
20
|
+
def status: () -> (:pending | :completed | :failed | :cancelled)
|
|
21
|
+
def done?: () -> bool
|
|
22
|
+
def alive?: () -> bool
|
|
23
|
+
def wait_result: (?timeout: Numeric?) -> A
|
|
24
|
+
def on_complete: () { (A?, Exception?) -> void } -> self
|
|
25
|
+
def map: [B] () { (A) -> B } -> TaskResult[B]
|
|
26
|
+
def flat_map: [B] () { (A) -> TaskResult[B] } -> TaskResult[B]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
data/sig/phronomy/extensions.rbs
CHANGED
|
@@ -14,33 +14,13 @@ module Phronomy
|
|
|
14
14
|
|
|
15
15
|
module Tracing
|
|
16
16
|
class Base
|
|
17
|
+
def self.trace_with: [A] (untyped tracer, String name, ?record_output: bool, ?attributes: Hash[Symbol, untyped]) { (untyped span) -> [A, untyped] } -> A
|
|
17
18
|
def start_span: (String name, **untyped attributes) -> untyped
|
|
18
19
|
def finish_span: (untyped span, ?output: untyped, ?usage: untyped, ?error: Exception?) -> untyped
|
|
19
20
|
def trace: [A] (String name, ?input: untyped, **untyped meta) { (untyped span) -> [A, untyped] } -> A
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
|
|
23
|
-
module VectorStore
|
|
24
|
-
class Base
|
|
25
|
-
def add: (id: String, embedding: Array[Float], ?metadata: Hash[untyped, untyped], ?cancellation_token: Concurrency::CancellationToken?) -> untyped
|
|
26
|
-
def search: (query_embedding: Array[Float], ?k: Integer, ?cancellation_token: Concurrency::CancellationToken?) -> Array[Hash[Symbol, untyped]]
|
|
27
|
-
def remove: (id: String) -> untyped
|
|
28
|
-
def clear: () -> untyped
|
|
29
|
-
def size: () -> Integer
|
|
30
|
-
|
|
31
|
-
def add_async: (id: String, embedding: Array[Float], ?metadata: Hash[untyped, untyped], ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
|
|
32
|
-
def search_async: (query_embedding: Array[Float], ?k: Integer, ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[Array[Hash[Symbol, untyped]]]
|
|
33
|
-
def remove_async: (id: String, ?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
|
|
34
|
-
def clear_async: (?cancellation_token: Concurrency::CancellationToken?, ?timeout: Numeric?) -> TaskResult[untyped]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
module Embeddings
|
|
38
|
-
class Base
|
|
39
|
-
def embed: (String text, ?Concurrency::CancellationToken? cancellation_token) -> Array[Float]
|
|
40
|
-
def embed_async: (String text, ?Concurrency::CancellationToken? cancellation_token, ?timeout: Numeric?) -> TaskResult[Array[Float]]
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
24
|
module Testing
|
|
45
25
|
module PersistenceContract
|
|
46
26
|
SHARED_EXAMPLES: Array[String]
|
data/sig/phronomy/handoff.rbs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Phronomy
|
|
2
|
-
module
|
|
2
|
+
module MultiAgent
|
|
3
3
|
class Handoff
|
|
4
4
|
attr_reader source_agent: ::Phronomy::Agent::Base
|
|
5
5
|
attr_reader target_agent: ::Phronomy::Agent::Base
|
|
@@ -10,6 +10,12 @@ module Phronomy
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
class HandoffPolicy
|
|
13
|
+
class Rule < Data
|
|
14
|
+
attr_reader category: Symbol
|
|
15
|
+
attr_reader mode: Symbol
|
|
16
|
+
attr_reader default: Symbol?
|
|
17
|
+
end
|
|
18
|
+
|
|
13
19
|
CATEGORIES: Array[Symbol]
|
|
14
20
|
MODES: Array[Symbol]
|
|
15
21
|
DEFAULTS: Array[Symbol]
|
|
@@ -17,7 +23,7 @@ module Phronomy
|
|
|
17
23
|
def self.define: () { () -> void } -> HandoffPolicy
|
|
18
24
|
def self.default: () -> HandoffPolicy
|
|
19
25
|
|
|
20
|
-
def rule: (Symbol | String) ->
|
|
26
|
+
def rule: (Symbol | String) -> Rule
|
|
21
27
|
def required?: (Symbol | String) -> bool
|
|
22
28
|
def forbidden?: (Symbol | String) -> bool
|
|
23
29
|
def selectable?: (Symbol | String) -> bool
|
|
@@ -32,9 +38,9 @@ module Phronomy
|
|
|
32
38
|
MAX_HANDOFFS: Integer
|
|
33
39
|
|
|
34
40
|
attr_reader main_agent: ::Phronomy::Agent::Base
|
|
35
|
-
attr_reader handoffs: Array[::Phronomy::
|
|
41
|
+
attr_reader handoffs: Array[::Phronomy::MultiAgent::Handoff]
|
|
36
42
|
|
|
37
|
-
def initialize: (main_agent: ::Phronomy::Agent::Base, ?handoffs: Array[::Phronomy::
|
|
43
|
+
def initialize: (main_agent: ::Phronomy::Agent::Base, ?handoffs: Array[::Phronomy::MultiAgent::Handoff], persistence: Store) -> void
|
|
38
44
|
def invoke: (untyped input, ?config: Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
39
45
|
def result: (String execution_id) -> Hash[Symbol, untyped]
|
|
40
46
|
def cancel: (String execution_id) -> Hash[Symbol, untyped]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module Integrations
|
|
3
|
+
class OrderedEventDelivery
|
|
4
|
+
class ClosedError < Phronomy::Error
|
|
5
|
+
end
|
|
6
|
+
class OverflowError < Phronomy::Error
|
|
7
|
+
end
|
|
8
|
+
def self.open: [T] (?capacity: Integer, ?batch_size: Integer, ?flush_timeout: Numeric?, deliver: ^(untyped) -> untyped, ?prepare_batch: (^(Array[untyped]) -> Array[untyped])?) { (OrderedEventDelivery) -> T } -> T
|
|
9
|
+
def initialize: (?capacity: Integer, ?batch_size: Integer, ?prepare_batch: (^(Array[untyped]) -> Array[untyped])?) { (untyped) -> untyped } -> void
|
|
10
|
+
def publish: (untyped) -> self
|
|
11
|
+
def close_and_wait: (?timeout: Numeric?) -> self
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module LLMAdapter
|
|
3
|
+
class Base
|
|
4
|
+
def identity: () -> Hash[String, String?]
|
|
5
|
+
def input_budget: (Hash[String, untyped] model_config) -> LlmContextWindow::TokenBudget?
|
|
6
|
+
def complete: (Request request, ?cancellation_token: _CancellationSignal?) -> Response
|
|
7
|
+
def stream: (Request request, ?cancellation_token: _CancellationSignal?) { (StreamChunk chunk) -> void } -> Response
|
|
8
|
+
# Protected extension SPI at runtime; RBS has no protected visibility.
|
|
9
|
+
private
|
|
10
|
+
def perform_complete: (Request request, cancellation_token: _CancellationSignal?) -> Response
|
|
11
|
+
def perform_stream: (Request request, cancellation_token: _CancellationSignal?) { (StreamChunk chunk) -> void } -> Response
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module LLMAdapter
|
|
3
|
+
class TokenUsage
|
|
4
|
+
attr_reader input: Integer?
|
|
5
|
+
attr_reader output: Integer?
|
|
6
|
+
attr_reader cached: Integer?
|
|
7
|
+
attr_reader cache_creation: Integer?
|
|
8
|
+
def initialize: (?input: Integer?, ?output: Integer?, ?cached: Integer?, ?cache_creation: Integer?) -> void
|
|
9
|
+
def self.zero: () -> TokenUsage
|
|
10
|
+
def +: (TokenUsage? other) -> TokenUsage
|
|
11
|
+
def to_h: () -> Hash[Symbol, Integer?]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module LLMAdapter
|
|
3
|
+
class Request
|
|
4
|
+
attr_reader model_config: Hash[String, untyped]
|
|
5
|
+
attr_reader system: String?
|
|
6
|
+
attr_reader messages: Array[Message]
|
|
7
|
+
attr_reader tools: Array[Hash[String, untyped]]
|
|
8
|
+
attr_reader message: String?
|
|
9
|
+
def initialize: (?model_config: Hash[String | Symbol, untyped], ?system: String?, ?messages: Array[Message], ?tools: Array[Hash[String, untyped]], ?message: String?) -> void
|
|
10
|
+
end
|
|
11
|
+
class Message
|
|
12
|
+
attr_reader role: Symbol
|
|
13
|
+
attr_reader content: json_value
|
|
14
|
+
attr_reader tool_calls: Array[Tool::CallRequest]
|
|
15
|
+
attr_reader tool_call_id: String?
|
|
16
|
+
attr_reader metadata: Hash[String, json_value]
|
|
17
|
+
def initialize: (role: String | Symbol, ?content: json_value, ?tool_calls: Array[Tool::CallRequest], ?tool_call_id: String?, ?metadata: Hash[String, json_value]) -> void
|
|
18
|
+
def tool_call?: () -> bool
|
|
19
|
+
def content_present?: () -> bool
|
|
20
|
+
def to_h: () -> Hash[String, untyped]
|
|
21
|
+
end
|
|
22
|
+
class Response < Message
|
|
23
|
+
attr_reader usage: TokenUsage
|
|
24
|
+
def initialize: (?content: json_value, ?tool_calls: Array[Tool::CallRequest], ?usage: TokenUsage, ?metadata: Hash[String, json_value], ?role: String | Symbol) -> void
|
|
25
|
+
def self.from_h: (Hash[String | Symbol, untyped] value) -> Response
|
|
26
|
+
def to_h: () -> Hash[String, untyped]
|
|
27
|
+
end
|
|
28
|
+
class StreamChunk
|
|
29
|
+
attr_reader content: String?
|
|
30
|
+
def initialize: (content: String?) -> void
|
|
31
|
+
end
|
|
32
|
+
class InvalidResultError < Error
|
|
33
|
+
end
|
|
34
|
+
class TransportError < Error
|
|
35
|
+
end
|
|
36
|
+
class RateLimitError < TransportError
|
|
37
|
+
end
|
|
38
|
+
class AuthenticationError < TransportError
|
|
39
|
+
end
|
|
40
|
+
class ContextLengthError < Error
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
module LlmContextWindow
|
|
3
|
+
class TokenBudget
|
|
4
|
+
attr_reader max_input_tokens: Integer
|
|
5
|
+
def initialize: (max_input_tokens: Integer) -> void
|
|
6
|
+
def effective_input_limit: () -> Integer
|
|
7
|
+
def available: (?used: Integer) -> Integer
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
interface _HandoffStateRepository
|
|
3
|
+
def load: (String main_agent_id) -> untyped
|
|
4
|
+
def load_locked: (String main_agent_id) -> untyped
|
|
5
|
+
def save: (String main_agent_id, expected_revision: Integer?, state: untyped) -> untyped
|
|
6
|
+
def delete: (String main_agent_id, expected_revision: Integer) -> untyped
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
interface _TeamRepository
|
|
10
|
+
def create: (untyped root) -> untyped
|
|
11
|
+
def load: (String team_id) -> untyped
|
|
12
|
+
def save: (String team_id, expected_revision: Integer, root: untyped) -> untyped
|
|
13
|
+
def delete: (String team_id) -> untyped
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
interface _TeamExecutionRepository
|
|
17
|
+
def create_active: (untyped execution) -> untyped
|
|
18
|
+
def load: (String team_execution_id) -> untyped
|
|
19
|
+
def save: (String team_execution_id, expected_revision: Integer, execution: untyped) -> untyped
|
|
20
|
+
def list_active: (String team_id) -> Array[untyped]
|
|
21
|
+
def list: (String team_id, ?after: String?, ?limit: Integer) -> Array[untyped]
|
|
22
|
+
def delete: (String team_execution_id) -> untyped
|
|
23
|
+
def delete_for_team: (String team_id) -> untyped
|
|
24
|
+
def assert_idle!: (String team_id) -> untyped
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module MultiAgent
|
|
28
|
+
interface _Records
|
|
29
|
+
def contents: () -> _ContentRepository
|
|
30
|
+
def handoff_states: () -> _HandoffStateRepository
|
|
31
|
+
def teams: () -> _TeamRepository
|
|
32
|
+
def team_executions: () -> _TeamExecutionRepository
|
|
33
|
+
def guard_team!: (String team_id) -> untyped
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Store
|
|
37
|
+
attr_reader coordinator: ::Phronomy::Persistence
|
|
38
|
+
attr_reader contents: _ContentRepository
|
|
39
|
+
attr_reader handoff_states: _HandoffStateRepository
|
|
40
|
+
attr_reader teams: _TeamRepository
|
|
41
|
+
attr_reader team_executions: _TeamExecutionRepository
|
|
42
|
+
attr_reader agent_store: Agent::Store
|
|
43
|
+
def initialize: (coordinator: ::Phronomy::Persistence, records: ::Phronomy::Persistence::_Participant[_Records], agent_store: Agent::Store) -> void
|
|
44
|
+
def transaction: [R] () { (_Records, ::Phronomy::Persistence::Transaction) -> R } -> R
|
|
45
|
+
def participate: [R] (::Phronomy::Persistence::Transaction scope) { (_Records) -> R } -> R
|
|
46
|
+
def handoff_leaf: (String execution_id, main_agent_id: String, ?scope: ::Phronomy::Persistence::Transaction?) -> Agent::ExecutionObservation
|
|
47
|
+
def handoff_result: (String execution_id, main_agent_id: String) -> Agent::execution_result
|
|
48
|
+
def forget_handoff: (String main_agent_id) -> bool
|
|
49
|
+
def forget_subagents: (agent_id: String, execution_id: String) -> bool
|
|
50
|
+
def result: (String execution_id) -> Hash[Symbol, untyped]
|
|
51
|
+
def runs: (String owner_id, ?after: String?, ?limit: Integer) -> Array[untyped]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|