phronomy 0.26.0 → 0.27.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/CHANGELOG.md +40 -0
- data/README.md +4 -0
- data/VERIFY.sh +27 -27
- data/benchmark/bench_agent_invoke.rb +26 -22
- data/benchmark/bench_context_assembler.rb +4 -5
- data/docs/architecture/agent-chat-and-state-ownership.md +147 -0
- data/docs/architecture/agent-configuration-and-tool-binding.md +139 -0
- data/docs/architecture/agent-context.md +4 -2
- data/docs/architecture/agent-transition-ownership.md +89 -0
- data/docs/architecture/before-llm-input.md +6 -0
- data/docs/architecture/context-management.md +30 -0
- data/docs/architecture/context-preparation-steps.md +90 -0
- data/docs/architecture/entry-action-and-team-wording.md +72 -0
- data/docs/architecture/execution-metadata-and-values.md +80 -0
- data/docs/architecture/generator-verifier-ownership.md +111 -0
- data/docs/architecture/multi-agent-handoff.md +8 -2
- data/docs/architecture/persistence-refactoring-plan.md +50 -0
- data/docs/architecture/persistence.md +27 -4
- data/docs/architecture/refactoring-closure.md +334 -0
- data/docs/architecture/remaining-refactoring-plan.md +374 -0
- data/docs/architecture/rubyllm-2-token-ownership.md +82 -0
- data/docs/architecture/tool-schema-recording-gap.md +50 -0
- data/docs/architecture/tracing.md +1 -1
- data/docs/architecture/workflow-terminal-ownership-design.md +104 -0
- data/docs/architecture.md +209 -0
- data/docs/decisions/014-unified-persistence-durable-state.md +11 -0
- data/docs/decisions/024-event-loop-single-writer-agent-runtime.md +5 -1
- data/docs/decisions/025-process-local-agent-ownership-and-runtime-admission.md +13 -3
- data/docs/decisions/026-workflow-runtime-admission-and-durable-terminal-barrier.md +5 -1
- data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +5 -0
- data/docs/decisions/031-durable-multi-agent-coordination.md +5 -0
- data/docs/decisions/032-storage-backend-composition.md +80 -0
- data/docs/decisions/033-domain-persistence-ownership.md +79 -0
- data/docs/decisions/034-handoff-runner-coordination-ownership.md +76 -0
- data/docs/decisions/035-tool-executor-capability-ownership.md +68 -0
- data/docs/decisions/036-context-contract-ownership.md +86 -0
- data/docs/decisions/037-common-definition-ownership.md +62 -0
- data/docs/decisions/038-responsibility-based-source-layout.md +131 -0
- data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +74 -0
- data/docs/decisions/040-configuration-default-composition.md +94 -0
- data/docs/decisions/041-feature-owned-identity-registries.md +100 -0
- data/docs/decisions/042-feature-owned-execution-state.md +106 -0
- data/docs/decisions/043-storage-execution-constraint-notifications.md +75 -0
- data/docs/decisions/044-agent-default-and-one-shot-composition.md +106 -0
- data/docs/decisions/045-worker-input-restriction-ownership.md +100 -0
- data/docs/decisions/046-agent-responsibility-layout-and-shared-records.md +110 -0
- data/docs/decisions/047-recovered-execution-continuation-contract.md +116 -0
- data/docs/decisions/048-dispatch-preparation-worker-ownership.md +120 -0
- data/docs/decisions/049-initial-preparation-worker-ownership.md +111 -0
- data/docs/decisions/050-approval-resume-snapshot-and-commit-ownership.md +98 -0
- data/docs/decisions/051-execution-outcome-worker-ownership.md +151 -0
- data/docs/decisions/052-tool-invocation-restoration-ownership.md +92 -0
- data/docs/decisions/053-shared-state-coordination-ownership.md +71 -0
- data/docs/decisions/054-workflow-terminal-save-single-owner.md +76 -0
- data/docs/decisions/055-terminal-observer-failure-settlement.md +60 -0
- data/docs/decisions/056-workflow-terminal-policy-ownership.md +87 -0
- data/docs/decisions/057-storage-transaction-boundaries.md +73 -0
- data/docs/decisions/058-neutral-storage-primitives.md +78 -0
- data/docs/decisions/README.md +35 -6
- data/docs/design/durable-semantic-coordination/IMPLEMENTATION_DESIGN_V2.md +6 -0
- data/docs/design/durable-semantic-coordination/IMPLEMENTATION_REPORT.md +6 -0
- data/docs/features.md +9 -3
- data/docs/getting-started.md +4 -4
- data/docs/migrations/0.15.md +5 -0
- data/docs/migrations/durable-semantic-coordination-v2.md +6 -0
- data/docs/migrations/handoff-runner-multi-agent.md +35 -0
- data/docs/migrations/neutral-storage-spi.md +43 -0
- data/docs/migrations/parallel-tool-chat-removal.md +49 -0
- data/docs/migrations/shared-state-multi-agent.md +44 -0
- data/docs/migrations/storage-backend-composition.md +117 -0
- data/docs/migrations/storage-transaction-boundaries.md +74 -0
- data/docs/persistence-backends.md +162 -204
- data/docs/runtime-and-concurrency.md +117 -32
- data/lib/phronomy/agent/api/agent.rb +17 -0
- data/lib/phronomy/agent/async_event_api.rb +2 -2
- data/lib/phronomy/agent/base.rb +51 -241
- data/lib/phronomy/{agent.rb → agent/composition/run_once.rb} +4 -13
- data/lib/phronomy/agent/context/capability/base.rb +67 -26
- data/lib/phronomy/agent/context/capability/tool_executor.rb +62 -0
- data/lib/phronomy/agent/{context_assembler.rb → context_assembly/context_assembler.rb} +143 -88
- data/lib/phronomy/agent/{context_importer.rb → context_assembly/context_importer.rb} +2 -2
- data/lib/phronomy/agent/{ruby_llm_materializer.rb → context_assembly/ruby_llm_materializer.rb} +4 -7
- data/lib/phronomy/agent/context_assembly/runtime_chat_builder.rb +36 -0
- data/lib/phronomy/agent/context_assembly/saved_context_reader.rb +53 -0
- data/lib/phronomy/agent/context_assembly/state_writer.rb +165 -0
- data/lib/phronomy/agent/context_assembly/token_budget_resolver.rb +22 -0
- data/lib/phronomy/agent/{context_plan.rb → context_contract/context_plan.rb} +1 -1
- data/lib/phronomy/agent/{context_policy_input.rb → context_contract/context_policy_input.rb} +6 -6
- data/lib/phronomy/agent/{llm_input_build_context.rb → context_contract/llm_input_build_context.rb} +1 -1
- data/lib/phronomy/agent/{llm_input_manifest.rb → context_contract/llm_input_manifest.rb} +20 -20
- data/lib/phronomy/agent/{llm_input_patch.rb → context_contract/llm_input_patch.rb} +2 -2
- data/lib/phronomy/agent/{agent_execution.rb → execution/agent_execution.rb} +8 -4
- data/lib/phronomy/agent/{agent_invocation.rb → execution/agent_invocation.rb} +8 -13
- data/lib/phronomy/agent/{agent_invocation_session_builder.rb → execution/agent_invocation_session_builder.rb} +19 -95
- data/lib/phronomy/agent/execution/approval_resume_commit.rb +108 -0
- data/lib/phronomy/agent/execution/dispatch_preparation.rb +305 -0
- data/lib/phronomy/agent/{exact_execution.rb → execution/exact_execution.rb} +9 -10
- data/lib/phronomy/agent/{execution_cancellation.rb → execution/execution_cancellation.rb} +2 -3
- data/lib/phronomy/agent/execution/execution_coordinator.rb +1925 -0
- data/lib/phronomy/agent/execution/execution_failure.rb +30 -0
- data/lib/phronomy/agent/execution/execution_metadata.rb +53 -0
- data/lib/phronomy/agent/execution/execution_outcome_committer.rb +344 -0
- data/lib/phronomy/agent/execution/execution_registry.rb +459 -0
- data/lib/phronomy/agent/execution/execution_session_runner.rb +118 -0
- data/lib/phronomy/agent/execution/initial_preparation.rb +421 -0
- data/lib/phronomy/agent/execution/invocation_transitions.rb +86 -0
- data/lib/phronomy/agent/{phase_machine_builder.rb → execution/phase_machine_builder.rb} +20 -71
- data/lib/phronomy/agent/{provider_call_outcome.rb → execution/provider_call_outcome.rb} +9 -9
- data/lib/phronomy/agent/execution/runtime_record_encoder.rb +210 -0
- data/lib/phronomy/agent/{handoff_context.rb → handoff/handoff_context.rb} +2 -2
- data/lib/phronomy/agent/handoff/handoff_execution_coordinator.rb +15 -0
- data/lib/phronomy/agent/handoff/handoff_outcome_committer.rb +131 -0
- data/lib/phronomy/agent/{handoff_state.rb → handoff/handoff_state.rb} +1 -1
- data/lib/phronomy/agent/{journal_projection.rb → journal/journal_projection.rb} +4 -0
- data/lib/phronomy/agent/{journal_record.rb → journal/journal_record.rb} +3 -3
- data/lib/phronomy/agent/{llm_call_record.rb → journal/llm_call_record.rb} +2 -2
- data/lib/phronomy/agent/{agent_root.rb → lifecycle/agent_root.rb} +6 -2
- data/lib/phronomy/agent/lifecycle/default_persistence.rb +29 -0
- data/lib/phronomy/{engine/runtime/agent_ownership_registry.rb → agent/lifecycle/ownership_registry.rb} +24 -10
- data/lib/phronomy/{agent_already_exists_error.rb → agent/lifecycle_contract/agent_already_exists_error.rb} +2 -0
- data/lib/phronomy/{agent_busy_error.rb → agent/lifecycle_contract/agent_busy_error.rb} +2 -0
- data/lib/phronomy/{agent_purged_error.rb → agent/lifecycle_contract/agent_purged_error.rb} +2 -0
- data/lib/phronomy/agent/lifecycle_contract/handoff_error.rb +7 -0
- data/lib/phronomy/{stream_callback_error.rb → agent/lifecycle_contract/stream_callback_error.rb} +2 -0
- data/lib/phronomy/agent/persistence/agent_repository.rb +61 -0
- data/lib/phronomy/agent/persistence/codec.rb +358 -0
- data/lib/phronomy/agent/persistence/execution_repository.rb +108 -0
- data/lib/phronomy/agent/persistence/handoff_state_repository.rb +58 -0
- data/lib/phronomy/agent/persistence/journal_repository.rb +54 -0
- data/lib/phronomy/agent/persistence/queries.rb +61 -0
- data/lib/phronomy/agent/persistence/storage_schema.rb +24 -0
- data/lib/phronomy/agent/persistence/watermark.rb +27 -0
- data/lib/phronomy/agent/recovery/invocation_restorer.rb +132 -0
- data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/continuation.rb +21 -45
- data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/installation.rb +32 -37
- data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/resolution.rb +37 -40
- data/lib/phronomy/agent/{recovery_coordinator.rb → recovery/recovery_coordinator.rb} +6 -10
- data/lib/phronomy/agent/recovery/recovery_support.rb +227 -0
- data/lib/phronomy/agent/selection/candidate.rb +1 -1
- data/lib/phronomy/agent/{approval_evaluation_request.rb → tool_execution/approval_evaluation_request.rb} +1 -12
- data/lib/phronomy/agent/{tool_approval_request.rb → tool_execution/tool_approval_request.rb} +1 -10
- data/lib/phronomy/agent/tool_execution/tool_binding.rb +90 -0
- data/lib/phronomy/agent/{tool_call_intercepted.rb → tool_execution/tool_call_intercepted.rb} +2 -2
- data/lib/phronomy/agent/{tool_definition_set.rb → tool_execution/tool_definition_set.rb} +9 -4
- data/lib/phronomy/agent/{tool_invocation.rb → tool_execution/tool_invocation.rb} +69 -34
- data/lib/phronomy/common/configuration_error.rb +7 -0
- data/lib/phronomy/common/error.rb +5 -0
- data/lib/phronomy/{agent → common/values}/immutable.rb +9 -1
- data/lib/phronomy/common/values/serializable.rb +32 -0
- data/lib/phronomy/{configuration.rb → configuration/configuration.rb} +14 -5
- data/lib/phronomy/configuration/global_configuration.rb +26 -0
- data/lib/phronomy/content_store/storage_schema.rb +11 -0
- data/lib/phronomy/content_store/stored_contents.rb +43 -0
- data/lib/phronomy/engine/backpressure_error.rb +7 -0
- data/lib/phronomy/{blocking.rb → engine/blocking.rb} +1 -1
- data/lib/phronomy/engine/cancellation_error.rb +7 -0
- data/lib/phronomy/engine/concurrency/cancellation_token.rb +4 -0
- data/lib/phronomy/engine/concurrency/offload_pool.rb +4 -0
- data/lib/phronomy/engine/concurrency/operation_binding.rb +1 -1
- data/lib/phronomy/engine/concurrency/worker_input_restricted.rb +14 -0
- data/lib/phronomy/engine/event_loop.rb +158 -624
- data/lib/phronomy/engine/event_loop_reentrancy_error.rb +8 -0
- data/lib/phronomy/{execution.rb → engine/execution.rb} +0 -7
- data/lib/phronomy/{execution_cancellation_error.rb → engine/execution_cancellation_error.rb} +2 -0
- data/lib/phronomy/engine/execution_receiver.rb +65 -0
- data/lib/phronomy/{execution_timeout_error.rb → engine/execution_timeout_error.rb} +2 -0
- data/lib/phronomy/engine/fsm_protocol.rb +14 -0
- data/lib/phronomy/engine/fsm_session.rb +35 -28
- data/lib/phronomy/{invalid_async_entry_action_error.rb → engine/invalid_async_entry_action_error.rb} +2 -0
- data/lib/phronomy/{invalid_async_transition_action_error.rb → engine/invalid_async_transition_action_error.rb} +2 -0
- data/lib/phronomy/{invalid_async_workflow_action_error.rb → engine/invalid_async_workflow_action_error.rb} +2 -0
- data/lib/phronomy/engine/pool_shutdown_error.rb +7 -0
- data/lib/phronomy/engine/recursion_limit_error.rb +7 -0
- data/lib/phronomy/engine/runtime.rb +80 -84
- data/lib/phronomy/engine/runtime_shutdown_error.rb +7 -0
- data/lib/phronomy/engine/runtime_shutdown_reentrancy_error.rb +7 -0
- data/lib/phronomy/engine/scheduler_reentrancy_error.rb +9 -0
- data/lib/phronomy/engine/task_result.rb +4 -0
- data/lib/phronomy/engine/timeout_error.rb +7 -0
- data/lib/phronomy/filter/contract/filter_block_error.rb +14 -0
- data/lib/phronomy/generation/generator_verifier/agent_result_receiver.rb +89 -0
- data/lib/phronomy/generation/generator_verifier/pipeline_state.rb +57 -0
- data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +112 -0
- data/lib/phronomy/generation/generator_verifier.rb +118 -0
- data/lib/phronomy/generation/low_confidence_error.rb +14 -0
- data/lib/phronomy/llm_context_window/token_budget.rb +6 -7
- data/lib/phronomy/llm_contract/authentication_error.rb +7 -0
- data/lib/phronomy/{context_budget_exceeded_error.rb → llm_contract/context_budget_exceeded_error.rb} +2 -0
- data/lib/phronomy/llm_contract/context_length_error.rb +7 -0
- data/lib/phronomy/llm_contract/rate_limit_error.rb +7 -0
- data/lib/phronomy/{token_usage.rb → llm_contract/token_usage.rb} +2 -2
- data/lib/phronomy/llm_contract/transport_error.rb +7 -0
- data/lib/phronomy/multi_agent/admission_registry.rb +22 -2
- data/lib/phronomy/multi_agent/durable_subagent_coordinator.rb +5 -5
- data/lib/phronomy/{agent → multi_agent}/handoff_runner.rb +18 -17
- data/lib/phronomy/multi_agent/orchestrator.rb +2 -2
- data/lib/phronomy/multi_agent/persistence/codec.rb +55 -0
- data/lib/phronomy/multi_agent/persistence/queries.rb +30 -0
- data/lib/phronomy/multi_agent/persistence/team_execution_repository.rb +108 -0
- data/lib/phronomy/multi_agent/persistence/team_repository.rb +61 -0
- data/lib/phronomy/{agent → multi_agent}/shared_state.rb +56 -39
- data/lib/phronomy/multi_agent/storage_contract/team_storage_schema.rb +15 -0
- data/lib/phronomy/multi_agent/team_coordinator.rb +21 -18
- data/lib/phronomy/multi_agent/team_execution.rb +1 -1
- data/lib/phronomy/{engine/runtime → multi_agent}/team_ownership_registry.rb +14 -4
- data/lib/phronomy/multi_agent/team_root.rb +1 -1
- data/lib/phronomy/output_parser/contract/parse_error.rb +7 -0
- data/lib/phronomy/persistence/api/persistence.rb +140 -0
- data/lib/phronomy/persistence/migration/initial_format_migration.rb +19 -19
- data/lib/phronomy/persistence_composition/repositories.rb +77 -0
- data/lib/phronomy/persistence_composition/storage_schema.rb +24 -0
- data/lib/phronomy/{execution_rehydration_required_error.rb → recovery/execution_rehydration_required_error.rb} +2 -0
- data/lib/phronomy/{recovery.rb → recovery/recovery.rb} +1 -1
- data/lib/phronomy/runtime_composition/agent_defaults.rb +7 -0
- data/lib/phronomy/runtime_composition/configuration_defaults.rb +9 -0
- data/lib/phronomy/runtime_composition/global_runtime.rb +19 -0
- data/lib/phronomy/storage/backend.rb +101 -0
- data/lib/phronomy/storage/backends/in_memory.rb +157 -0
- data/lib/phronomy/storage/blob_conflict_error.rb +10 -0
- data/lib/phronomy/storage/blobs.rb +31 -0
- data/lib/phronomy/storage/condition.rb +25 -0
- data/lib/phronomy/storage/condition_failed_error.rb +16 -0
- data/lib/phronomy/storage/conflict_error.rb +9 -0
- data/lib/phronomy/{persistence → storage}/durable_record.rb +12 -12
- data/lib/phronomy/storage/entry.rb +33 -0
- data/lib/phronomy/storage/guard_ref.rb +13 -0
- data/lib/phronomy/storage/not_found_error.rb +9 -0
- data/lib/phronomy/storage/record_codec.rb +177 -0
- data/lib/phronomy/storage/records.rb +61 -0
- data/lib/phronomy/storage/resource.rb +126 -0
- data/lib/phronomy/storage/scope.rb +25 -0
- data/lib/phronomy/storage/serialization_error.rb +9 -0
- data/lib/phronomy/storage/streams.rb +44 -0
- data/lib/phronomy/storage/transaction_error.rb +10 -0
- data/lib/phronomy/storage/unique_constraint_error.rb +17 -0
- data/lib/phronomy/storage/unsupported_backend_error.rb +9 -0
- data/lib/phronomy/storage/validation.rb +53 -0
- data/lib/phronomy/storage/view.rb +131 -0
- data/lib/phronomy/testing/persistence_contract/a_content_store.rb +1 -1
- data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +4 -4
- data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +10 -7
- data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +2 -2
- data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +6 -6
- data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +6 -6
- data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +8 -8
- data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +263 -0
- data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +123 -0
- data/lib/phronomy/testing/persistence_contract.rb +4 -0
- data/lib/phronomy/tool/contract/tool_error.rb +7 -0
- data/lib/phronomy/tools/agent.rb +1 -1
- data/lib/phronomy/version.rb +1 -1
- data/lib/phronomy/{workflow.rb → workflow/execution/workflow.rb} +8 -6
- data/lib/phronomy/{workflow_context.rb → workflow/execution/workflow_context.rb} +4 -0
- data/lib/phronomy/workflow/execution/workflow_context_ownership_error.rb +7 -0
- data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +188 -0
- data/lib/phronomy/{workflow_runner.rb → workflow/execution/workflow_runner.rb} +122 -71
- data/lib/phronomy/workflow/execution/workflow_terminal_policy.rb +40 -0
- data/lib/phronomy/workflow/persistence/codec.rb +153 -0
- data/lib/phronomy/workflow/persistence/state_repository.rb +57 -0
- data/lib/phronomy/workflow/phase_machine_builder.rb +2 -2
- data/lib/phronomy/workflow/storage_contract/workflow_storage_schema.rb +9 -0
- data/lib/phronomy.rb +52 -94
- data/scripts/api_snapshot.rb +1 -1
- data/scripts/storage_spi_snapshot.rb +36 -0
- data/sig/phronomy/agent.rbs +0 -1
- data/sig/phronomy/execution_receiver.rbs +34 -0
- data/sig/phronomy/handoff.rbs +4 -2
- data/sig/phronomy/multi_agent.rbs +18 -0
- data/sig/phronomy/persistence.rbs +7 -91
- data/sig/phronomy/storage.rbs +174 -0
- data/sig/phronomy/tool.rbs +10 -1
- metadata +230 -99
- data/lib/phronomy/agent/execution_coordinator.rb +0 -3151
- data/lib/phronomy/agent/handoff_execution_coordinator.rb +0 -143
- data/lib/phronomy/agent/recovery_support.rb +0 -504
- data/lib/phronomy/agent/token_budget_resolver.rb +0 -70
- data/lib/phronomy/agent/tool_executor.rb +0 -55
- data/lib/phronomy/generator_verifier.rb +0 -369
- data/lib/phronomy/invalid_context_budget_configuration_error.rb +0 -8
- data/lib/phronomy/multi_agent/parallel_tool_chat.rb +0 -116
- data/lib/phronomy/persistence/durable_codec.rb +0 -706
- data/lib/phronomy/persistence/in_memory.rb +0 -690
- data/lib/phronomy/persistence/repository_facades.rb +0 -535
- data/lib/phronomy/persistence.rb +0 -276
- data/lib/phronomy/ruby_llm_patches.rb +0 -24
- data/lib/phronomy/workflow_recovery.rb +0 -123
- /data/lib/phronomy/agent/{context_candidate_resolver.rb → context_assembly/context_candidate_resolver.rb} +0 -0
- /data/lib/phronomy/agent/{context_policy_input_builder.rb → context_assembly/context_policy_input_builder.rb} +0 -0
- /data/lib/phronomy/agent/{context_plan_validator.rb → context_contract/context_plan_validator.rb} +0 -0
- /data/lib/phronomy/agent/{context_policy.rb → context_contract/context_policy.rb} +0 -0
- /data/lib/phronomy/agent/{llm_operation_result.rb → execution/llm_operation_result.rb} +0 -0
- /data/lib/phronomy/agent/{handoff.rb → handoff/handoff.rb} +0 -0
- /data/lib/phronomy/agent/{handoff_capability_factory.rb → handoff/handoff_capability_factory.rb} +0 -0
- /data/lib/phronomy/agent/{handoff_policy.rb → handoff/handoff_policy.rb} +0 -0
- /data/lib/phronomy/agent/{handoff_projection.rb → handoff/handoff_projection.rb} +0 -0
- /data/lib/phronomy/agent/{handoff_request.rb → handoff/handoff_request.rb} +0 -0
- /data/lib/phronomy/agent/{tool_invocation_session_builder.rb → tool_execution/tool_invocation_session_builder.rb} +0 -0
- /data/lib/phronomy/{canonical_json.rb → common/canonical_json.rb} +0 -0
- /data/lib/phronomy/{diagnostics.rb → engine/diagnostics.rb} +0 -0
- /data/lib/phronomy/{event.rb → engine/event.rb} +0 -0
- /data/lib/phronomy/{invocation_context.rb → engine/invocation_context.rb} +0 -0
- /data/lib/phronomy/{metrics.rb → engine/metrics.rb} +0 -0
- /data/lib/phronomy/{runnable.rb → engine/runnable.rb} +0 -0
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
module Phronomy
|
|
2
|
-
interface _ContentRepository
|
|
3
|
-
def put: (String bytes, canonicalization_version: untyped) -> String
|
|
4
|
-
def fetch: (String content_id) -> String
|
|
5
|
-
def exist?: (String content_id) -> bool
|
|
6
|
-
end
|
|
7
|
-
|
|
8
2
|
# Runtime/domain-facing repository interfaces.
|
|
9
3
|
interface _AgentRepository
|
|
10
4
|
def create: (untyped root) -> untyped
|
|
@@ -40,37 +34,6 @@ module Phronomy
|
|
|
40
34
|
# Backend-side record repository interfaces. DurableRecord is the opaque data
|
|
41
35
|
# carrier. Identity/revision/index metadata is passed separately so backends do
|
|
42
36
|
# not need to interpret DurableRecord#payload.
|
|
43
|
-
interface _BackendAgentRecordRepository
|
|
44
|
-
def create: (agent_id: String, agent_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
45
|
-
def load: (String agent_id) -> Persistence::DurableRecord
|
|
46
|
-
def save: (String agent_id, expected_revision: Integer, next_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
47
|
-
def delete: (String agent_id) -> untyped
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
interface _BackendJournalRecordRepository
|
|
51
|
-
def append: (String agent_id, expected_position: Integer, records: Array[Persistence::DurableRecord], record_ids: Array[String]) -> Array[Persistence::DurableRecord]
|
|
52
|
-
def read: (String agent_id, ?after: Integer?, ?limit: Integer?) -> Array[Persistence::DurableRecord]
|
|
53
|
-
def head: (String agent_id) -> Integer
|
|
54
|
-
def delete: (String agent_id) -> untyped
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
interface _BackendExecutionRecordRepository
|
|
58
|
-
def create_active: (execution_id: String, agent_id: String, execution_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
59
|
-
def load: (String execution_id) -> Persistence::DurableRecord
|
|
60
|
-
def save: (String execution_id, expected_revision: Integer, next_revision: Integer, agent_id: String, active: bool, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
61
|
-
def list_active: (String agent_id) -> Array[Persistence::DurableRecord]
|
|
62
|
-
def list: (String agent_id, ?after: String?, ?limit: Integer) -> Array[Persistence::DurableRecord]
|
|
63
|
-
def delete: (String execution_id) -> untyped
|
|
64
|
-
def delete_for_agent: (String agent_id) -> untyped
|
|
65
|
-
def assert_idle!: (String agent_id) -> untyped
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
interface _BackendWorkflowStateRecordRepository
|
|
69
|
-
def load: (String workflow_instance_id) -> Persistence::DurableRecord?
|
|
70
|
-
def save: (String workflow_instance_id, expected_revision: Integer?, next_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
71
|
-
def delete: (String workflow_instance_id, expected_revision: Integer) -> untyped
|
|
72
|
-
end
|
|
73
|
-
|
|
74
37
|
interface _HandoffStateRepository
|
|
75
38
|
def load: (String main_agent_id) -> untyped
|
|
76
39
|
def save: (String main_agent_id, expected_revision: Integer?, state: untyped) -> untyped
|
|
@@ -95,34 +58,6 @@ module Phronomy
|
|
|
95
58
|
def assert_idle!: (String team_id) -> untyped
|
|
96
59
|
end
|
|
97
60
|
|
|
98
|
-
interface _BackendHandoffStateRecordRepository
|
|
99
|
-
def load: (String main_agent_id) -> Persistence::DurableRecord?
|
|
100
|
-
def save: (String main_agent_id, expected_revision: Integer?, next_revision: Integer, active_agent_id: String, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
101
|
-
def delete: (String main_agent_id, expected_revision: Integer) -> untyped
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
interface _BackendTeamRecordRepository
|
|
105
|
-
def create: (team_id: String, team_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
106
|
-
def load: (String team_id) -> Persistence::DurableRecord
|
|
107
|
-
def save: (String team_id, expected_revision: Integer, next_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
108
|
-
def delete: (String team_id) -> untyped
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
interface _BackendTeamExecutionRecordRepository
|
|
112
|
-
def create_active: (team_execution_id: String, team_id: String, execution_revision: Integer, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
113
|
-
def load: (String team_execution_id) -> Persistence::DurableRecord
|
|
114
|
-
def save: (String team_execution_id, expected_revision: Integer, next_revision: Integer, team_id: String, active: bool, record: Persistence::DurableRecord) -> Persistence::DurableRecord
|
|
115
|
-
def list_active: (String team_id) -> Array[Persistence::DurableRecord]
|
|
116
|
-
def list: (String team_id, ?after: String?, ?limit: Integer) -> Array[Persistence::DurableRecord]
|
|
117
|
-
def delete: (String team_execution_id) -> untyped
|
|
118
|
-
def delete_for_team: (String team_id) -> untyped
|
|
119
|
-
def assert_idle!: (String team_id) -> untyped
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
interface _BackendWatermark
|
|
123
|
-
def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
|
|
124
|
-
end
|
|
125
|
-
|
|
126
61
|
interface _PersistenceTransactionView
|
|
127
62
|
def contents: () -> _ContentRepository
|
|
128
63
|
def agents: () -> _AgentRepository
|
|
@@ -136,36 +71,16 @@ module Phronomy
|
|
|
136
71
|
end
|
|
137
72
|
|
|
138
73
|
class Persistence
|
|
139
|
-
class ConflictError < Phronomy::Error
|
|
140
|
-
end
|
|
141
|
-
class NotFoundError < Phronomy::Error
|
|
142
|
-
end
|
|
143
|
-
class UnsupportedBackendError < Phronomy::Error
|
|
144
|
-
end
|
|
145
|
-
class SerializationError < Phronomy::Error
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
class DurableRecord
|
|
149
|
-
FORMAT_VERSION_PATTERN: Regexp
|
|
150
|
-
attr_reader record_type: String
|
|
151
|
-
attr_reader format_version: String
|
|
152
|
-
attr_reader payload: Hash[String, untyped]
|
|
153
|
-
def initialize: (record_type: String, format_version: String, payload: Hash[String, untyped]) -> void
|
|
154
|
-
def copy: () -> DurableRecord
|
|
155
|
-
end
|
|
156
|
-
|
|
157
74
|
module Migration
|
|
158
75
|
module InitialFormatMigration
|
|
159
|
-
def self.agent_root: (Hash[untyped, untyped] hash) -> DurableRecord
|
|
160
|
-
def self.agent_execution: (Hash[untyped, untyped] hash) -> DurableRecord
|
|
161
|
-
def self.journal_record: (Hash[untyped, untyped] hash) -> DurableRecord
|
|
162
|
-
def self.workflow_state: (workflow_instance_id: String, revision: Integer, snapshot: Hash[untyped, untyped]) -> DurableRecord
|
|
76
|
+
def self.agent_root: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
|
|
77
|
+
def self.agent_execution: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
|
|
78
|
+
def self.journal_record: (Hash[untyped, untyped] hash) -> Storage::DurableRecord
|
|
79
|
+
def self.workflow_state: (workflow_instance_id: String, revision: Integer, snapshot: Hash[untyped, untyped]) -> Storage::DurableRecord
|
|
163
80
|
def self.llm_input_manifest: (Hash[untyped, untyped] hash) -> Hash[String, untyped]
|
|
164
81
|
end
|
|
165
82
|
end
|
|
166
83
|
|
|
167
|
-
REQUIRED_CAPABILITIES: Hash[Symbol, bool]
|
|
168
|
-
|
|
169
84
|
attr_reader contents: _ContentRepository
|
|
170
85
|
attr_reader agents: _AgentRepository
|
|
171
86
|
attr_reader journals: _JournalRepository
|
|
@@ -180,10 +95,11 @@ module Phronomy
|
|
|
180
95
|
def team_execution_result: (String team_execution_id) -> Hash[Symbol, untyped]
|
|
181
96
|
def list_team_executions: (String team_id, ?after: String?, ?limit: Integer) -> Array[untyped]
|
|
182
97
|
|
|
183
|
-
|
|
98
|
+
attr_reader backend: _StorageBackend
|
|
99
|
+
def initialize: (backend: _StorageBackend) -> void
|
|
100
|
+
def self.in_memory: () -> Persistence
|
|
184
101
|
def capabilities: () -> Hash[Symbol, bool]
|
|
185
102
|
def transaction: () { (_PersistenceTransactionView) -> untyped } -> untyped
|
|
186
|
-
def build_transaction_view: (contents: _ContentRepository, agents: _BackendAgentRecordRepository, journals: _BackendJournalRecordRepository, executions: _BackendExecutionRecordRepository, workflow_states: _BackendWorkflowStateRecordRepository, handoff_states: _BackendHandoffStateRecordRepository, teams: _BackendTeamRecordRepository, team_executions: _BackendTeamExecutionRecordRepository, watermark: _BackendWatermark) -> _PersistenceTransactionView
|
|
187
103
|
def assert_agent_watermark!: (agent_id: String, agent_revision: Integer, journal_position: Integer) -> true
|
|
188
104
|
end
|
|
189
105
|
end
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
module Phronomy
|
|
2
|
+
interface _ContentRepository
|
|
3
|
+
def put: (String bytes, canonicalization_version: untyped) -> String
|
|
4
|
+
def fetch: (String content_id) -> String
|
|
5
|
+
def exist?: (String content_id) -> bool
|
|
6
|
+
def put_text: (String text) -> String
|
|
7
|
+
def put_json: (untyped value) -> String
|
|
8
|
+
def fetch_text: (String content_id) -> String
|
|
9
|
+
def fetch_json: (String content_id) -> untyped
|
|
10
|
+
def fetch_many: (Array[String] content_ids) -> Hash[String, String]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
interface _StorageBackend
|
|
14
|
+
def view: () -> Storage::View
|
|
15
|
+
def capabilities: () -> Hash[Symbol, bool | Integer]
|
|
16
|
+
def transaction: [T] () { (Storage::View) -> T } -> T
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module Storage
|
|
20
|
+
type attributes = Hash[Symbol, String | Integer | bool | nil]
|
|
21
|
+
type resource_ref = Resource | String
|
|
22
|
+
type condition = Condition::RevisionIs | Condition::StreamHeadIs | Condition::NoRows
|
|
23
|
+
|
|
24
|
+
class ConflictError < Phronomy::Error
|
|
25
|
+
end
|
|
26
|
+
class UniqueConstraintError < ConflictError
|
|
27
|
+
attr_reader resource: String
|
|
28
|
+
attr_reader constraint: Symbol
|
|
29
|
+
def initialize: (resource: Resource, constraint: Symbol) -> void
|
|
30
|
+
end
|
|
31
|
+
class ConditionFailedError < ConflictError
|
|
32
|
+
attr_reader condition: condition
|
|
33
|
+
def initialize: (condition) -> void
|
|
34
|
+
end
|
|
35
|
+
class BlobConflictError < ConflictError
|
|
36
|
+
end
|
|
37
|
+
class TransactionError < Phronomy::Error
|
|
38
|
+
end
|
|
39
|
+
class NotFoundError < Phronomy::Error
|
|
40
|
+
end
|
|
41
|
+
class UnsupportedBackendError < Phronomy::Error
|
|
42
|
+
end
|
|
43
|
+
class SerializationError < Phronomy::Error
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class DurableRecord
|
|
47
|
+
FORMAT_VERSION_PATTERN: Regexp
|
|
48
|
+
attr_reader record_type: String
|
|
49
|
+
attr_reader format_version: String
|
|
50
|
+
attr_reader payload: Hash[String, untyped]
|
|
51
|
+
def initialize: (record_type: String, format_version: String, payload: Hash[String, untyped]) -> void
|
|
52
|
+
def copy: () -> DurableRecord
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class Resource
|
|
56
|
+
attr_reader id: String
|
|
57
|
+
attr_reader kind: Symbol
|
|
58
|
+
attr_reader attributes: Hash[Symbol, Symbol]
|
|
59
|
+
attr_reader immutable_attributes: Array[Symbol]
|
|
60
|
+
attr_reader indexes: Hash[Symbol, Array[Symbol]]
|
|
61
|
+
attr_reader unique: Array[Hash[Symbol, untyped]]
|
|
62
|
+
attr_reader guard: Hash[Symbol, untyped]?
|
|
63
|
+
def initialize: (id: String, kind: Symbol, ?attributes: Hash[Symbol, Symbol], ?immutable_attributes: Array[Symbol], ?indexes: Hash[Symbol, Array[Symbol]], ?unique: Array[Hash[Symbol, untyped]], ?guard: Hash[Symbol, untyped]?) -> void
|
|
64
|
+
def validate_attributes: (attributes, ?partial: bool) -> attributes
|
|
65
|
+
def index_values: (Symbol, attributes) -> attributes
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
module Entry
|
|
69
|
+
class Record
|
|
70
|
+
attr_reader key: String
|
|
71
|
+
attr_reader revision: Integer
|
|
72
|
+
attr_reader attributes: attributes
|
|
73
|
+
attr_reader record: DurableRecord
|
|
74
|
+
def initialize: (key: String, revision: Integer, attributes: attributes, record: DurableRecord) -> void
|
|
75
|
+
def to_h: () -> Hash[Symbol, untyped]
|
|
76
|
+
end
|
|
77
|
+
class Append
|
|
78
|
+
attr_reader id: String
|
|
79
|
+
attr_reader record: DurableRecord
|
|
80
|
+
def initialize: (id: String, record: DurableRecord) -> void
|
|
81
|
+
def to_h: () -> Hash[Symbol, untyped]
|
|
82
|
+
end
|
|
83
|
+
class Stream
|
|
84
|
+
attr_reader position: Integer
|
|
85
|
+
attr_reader id: String
|
|
86
|
+
attr_reader record: DurableRecord
|
|
87
|
+
def initialize: (position: Integer, id: String, record: DurableRecord) -> void
|
|
88
|
+
def to_h: () -> Hash[Symbol, untyped]
|
|
89
|
+
end
|
|
90
|
+
class Blob
|
|
91
|
+
attr_reader key: String
|
|
92
|
+
attr_reader bytes: String
|
|
93
|
+
attr_reader attributes: attributes
|
|
94
|
+
def initialize: (key: String, bytes: String, attributes: attributes) -> void
|
|
95
|
+
def to_h: () -> Hash[Symbol, untyped]
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
class GuardRef
|
|
100
|
+
attr_reader resource: resource_ref
|
|
101
|
+
attr_reader key: String
|
|
102
|
+
def initialize: (resource: resource_ref, key: String) -> void
|
|
103
|
+
end
|
|
104
|
+
module Condition
|
|
105
|
+
class RevisionIs
|
|
106
|
+
attr_reader resource: resource_ref
|
|
107
|
+
attr_reader key: String
|
|
108
|
+
attr_reader expected: Integer
|
|
109
|
+
def initialize: (resource: resource_ref, key: String, expected: Integer) -> void
|
|
110
|
+
end
|
|
111
|
+
class StreamHeadIs
|
|
112
|
+
attr_reader resource: resource_ref
|
|
113
|
+
attr_reader stream: String
|
|
114
|
+
attr_reader expected: Integer
|
|
115
|
+
def initialize: (resource: resource_ref, stream: String, expected: Integer) -> void
|
|
116
|
+
end
|
|
117
|
+
class NoRows
|
|
118
|
+
attr_reader resource: resource_ref
|
|
119
|
+
attr_reader index: Symbol
|
|
120
|
+
attr_reader equals: attributes
|
|
121
|
+
def initialize: (resource: resource_ref, index: Symbol, equals: attributes) -> void
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
class Records
|
|
126
|
+
UNCHECKED: Object
|
|
127
|
+
attr_reader resource: Resource
|
|
128
|
+
def initialize: (View, Resource) -> void
|
|
129
|
+
def insert: (key: String, revision: Integer, attributes: attributes, record: DurableRecord) -> Entry::Record
|
|
130
|
+
def read: (String) -> Entry::Record?
|
|
131
|
+
def fetch: (String) -> Entry::Record
|
|
132
|
+
def replace: (key: String, expected_revision: Integer, next_revision: Integer, attributes: attributes, record: DurableRecord, ?expected_attributes: attributes) -> Entry::Record
|
|
133
|
+
def delete: (key: String, ?expected_revision: Integer | Object) -> nil
|
|
134
|
+
def scan: (index: Symbol, equals: attributes, ?after: String?, ?limit: Integer?) -> Array[Entry::Record]
|
|
135
|
+
def delete_matching: (index: Symbol, equals: attributes) -> nil
|
|
136
|
+
end
|
|
137
|
+
class Streams
|
|
138
|
+
attr_reader resource: Resource
|
|
139
|
+
def initialize: (View, Resource) -> void
|
|
140
|
+
def append: (stream: String, expected_head: Integer, entries: Array[Entry::Append]) -> Array[Entry::Stream]
|
|
141
|
+
def read: (stream: String, ?after: Integer, ?limit: Integer?) -> Array[Entry::Stream]
|
|
142
|
+
def head: (stream: String) -> Integer
|
|
143
|
+
def delete: (stream: String) -> nil
|
|
144
|
+
end
|
|
145
|
+
class Blobs
|
|
146
|
+
attr_reader resource: Resource
|
|
147
|
+
def initialize: (View, Resource) -> void
|
|
148
|
+
def put_if_absent: (key: String, bytes: String, attributes: attributes) -> Entry::Blob
|
|
149
|
+
def fetch: (String) -> Entry::Blob
|
|
150
|
+
def exist?: (String) -> bool
|
|
151
|
+
end
|
|
152
|
+
class View
|
|
153
|
+
def records: (resource_ref) -> Records
|
|
154
|
+
def streams: (resource_ref) -> Streams
|
|
155
|
+
def blobs: (resource_ref) -> Blobs
|
|
156
|
+
def check!: (guards: Array[GuardRef], conditions: Array[condition]) -> true
|
|
157
|
+
def atomic: [T] () { (View) -> T } -> T
|
|
158
|
+
end
|
|
159
|
+
class Backend
|
|
160
|
+
REQUIRED_CAPABILITIES: Hash[Symbol, bool | Integer]
|
|
161
|
+
attr_reader resources: Hash[String, Resource]
|
|
162
|
+
attr_reader view: View
|
|
163
|
+
def initialize: (resources: Array[Resource]) -> void
|
|
164
|
+
def self.validate_capabilities!: (_StorageBackend backend) -> void
|
|
165
|
+
def capabilities: () -> Hash[Symbol, bool | Integer]
|
|
166
|
+
def transaction: [T] () { (View) -> T } -> T
|
|
167
|
+
end
|
|
168
|
+
module Backends
|
|
169
|
+
class InMemory < Backend
|
|
170
|
+
def initialize: (?resources: Array[Resource]) -> void
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
data/sig/phronomy/tool.rbs
CHANGED
|
@@ -4,7 +4,12 @@ module Phronomy
|
|
|
4
4
|
def self.tool_name: (?untyped value) -> String?
|
|
5
5
|
def self.description: (?String text) -> String?
|
|
6
6
|
def self.desc: (?String text) -> String?
|
|
7
|
-
def self.parameters: () ->
|
|
7
|
+
def self.parameters: (?untyped schema) ?{ () -> untyped } -> untyped
|
|
8
|
+
def self.declared_parameters: () -> Hash[untyped, untyped]
|
|
9
|
+
def self.parameters_schema_definition: () -> untyped
|
|
10
|
+
def self.params: (?untyped schema) ?{ () -> untyped } -> untyped
|
|
11
|
+
def self.provider_options: (?untyped options) -> Hash[untyped, untyped]
|
|
12
|
+
def self.with_params: (**untyped options) -> untyped
|
|
8
13
|
def self.params_schema_definition: () -> untyped
|
|
9
14
|
def self.provider_params: () -> Hash[untyped, untyped]
|
|
10
15
|
def self.param: (untyped name, ?enum: untyped, ?properties: untyped, **untyped options) -> untyped
|
|
@@ -19,6 +24,10 @@ module Phronomy
|
|
|
19
24
|
def self.max_result_size: (?untyped value) -> untyped
|
|
20
25
|
|
|
21
26
|
def name: () -> String
|
|
27
|
+
def parameters_schema: () -> untyped
|
|
28
|
+
def parameters: () -> Hash[untyped, untyped]
|
|
29
|
+
def provider_options: () -> Hash[untyped, untyped]
|
|
30
|
+
def provider_params: () -> Hash[untyped, untyped]
|
|
22
31
|
def params_schema: () -> untyped
|
|
23
32
|
def call: (Hash[untyped, untyped] args, ?cancellation_token: Concurrency::CancellationToken?) -> untyped
|
|
24
33
|
def call_async: (Hash[untyped, untyped] args, ?cancellation_token: Concurrency::CancellationToken?, ?config: Hash[untyped, untyped]) -> TaskResult[untyped]
|