AbstractRuntime 0.12.0__tar.gz → 0.13.0__tar.gz
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.
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/CHANGELOG.md +28 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/PKG-INFO +1 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/api.md +2 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/README.md +3 -1
- abstractruntime-0.13.0/docs/backlog/completed/0851_per_account_voice_stores.md +51 -0
- abstractruntime-0.13.0/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +44 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/integrations/abstractcore.md +58 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/llms-full.txt +60 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/llms.txt +1 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/pyproject.toml +1 -1
- abstractruntime-0.13.0/release-notes.md +25 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/__init__.py +9 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +6 -2
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +24 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +26 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +73 -1
- abstractruntime-0.13.0/src/abstractruntime/integrations/abstractcore/voice_facade.py +154 -0
- abstractruntime-0.13.0/src/abstractruntime/integrations/abstractcore/voice_library.py +361 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_discovery_facade.py +1 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_retry_classification.py +39 -0
- abstractruntime-0.13.0/tests/test_voice_library_facade.py +437 -0
- abstractruntime-0.12.0/release-notes.md +0 -52
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/.gitignore +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/LICENSE +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/ROADMAP.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/SECURITY.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/adr/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/architecture.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/artifacts.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/automations.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/email.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/evidence.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/faq.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/getting-started.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/limits.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/manual_testing.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/proposal.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/provenance.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/snapshots.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/tool-approval.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/tools-comms.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/05_persistence.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/examples/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/mkdocs.yml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/pytest.ini +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/consumers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/samples.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/automations/wakes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/conversation_search.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/publish.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/run_origin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/mail_verbs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/change_ring.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/cloudevents.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/connection_events.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/connections.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/event_frame.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/feed.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/triggers/webhook.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/automation_harness.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/conftest.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/atom.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rss1.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/feeds/rss2.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/fixtures/schedule_v1_corpus.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/media_endpoint_profile_probe.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_consumers_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_artifact_session_candidates.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_calendar_schedule.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_list_reads.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_named_policy_compiler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_code_node_imports.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_command_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_config_facade_voice_input_hint.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_conversation_search.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_model_warmup_switch.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_feeder_batched.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_feeder_flags.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_received_mailbox_id.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_stream_consumers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_media_in_process.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_event_index_cross_process.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mail_verbs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mailbox_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_host_endpoint_resolver.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_occurrence_named_inputs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_occurrence_samples.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_offloading.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_publish_event.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_r12_workspace_sandbox.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_origin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_store_change_token.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_schedule_run.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_schedule_v1_corpus.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_schedule_v2_calendar.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_history.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_streamed_voice_namespace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_cloudevents.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_connection_listening.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_connections.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_feed.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trigger_webhook.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_trusted_run_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_loop_back_out_of_body.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_loop_limit_on_wire.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_reroute_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_set_vars_pins.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_voice_stream_is_not_a_wait.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.0}/tests/test_write_chart.py +0 -0
|
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.13.0] - 2026-10-27
|
|
11
|
+
|
|
12
|
+
Requires AbstractCore 2.30.0 or newer. Personal voice stores need AbstractVoice 0.19.0.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- The voice library runs on the capability registry the runtime's synthesis uses (same voice manager, settings and
|
|
17
|
+
stores); a model pool manages voices on its media host. `clone_voice(..., language=)` forwards the recording's language;
|
|
18
|
+
`clone_voice` answers the stored record, flat, with its `voice_id`, locally and remotely; a remote refusal keeps the
|
|
19
|
+
server's status (400, 401, 403, 404, 409, 413, 422, 429, 501, 503); an empty voice id is refused (422).
|
|
20
|
+
- **Per-runtime voice stores**: `voice_store_dir` and `voice_library_dirs` in a runtime's AbstractCore client settings give
|
|
21
|
+
it a personal voice store in front of read-only libraries; its synthesis, voice catalog and voice library use the same
|
|
22
|
+
stores. `deploy_voice_to_library(voice_id)` on the voice library facade (local runtimes). See
|
|
23
|
+
[Voice library](docs/integrations/abstractcore.md#voice-library).
|
|
24
|
+
|
|
25
|
+
- **Voice library facade**: `get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`, `VoiceLibraryError`) lists the languages each voice engine accepts, lists cloned voices (designed and built-in ones included, optionally by language), reads, renames, replaces the reference transcript of and deletes a cloned voice, creates a voice from a recording (`clone_voice`) or from a written description (`design_voice`), and returns the capability catalog (which engine and model supports `speed`, `one_shot`, design... and how). Local runtimes run it in process; remote runtimes call the AbstractCore server's `/v1` voice routes. Refusals carry an HTTP-like `status_code`. See [Voice library](docs/integrations/abstractcore.md#voice-library).
|
|
26
|
+
- **Voice catalog by language**: `get_voice_catalog(..., language=)` keeps the voices that can speak a language, native speakers first (local and remote).
|
|
27
|
+
- **`one_shot` on remote TTS**: a remote runtime forwards `one_shot` on buffered speech, as local runtimes already did.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- A voice request the voice plugin refuses (a plain `ValueError` or `KeyError` on a `modality: voice` output, such as
|
|
32
|
+
`one_shot` over an engine's length limit or an unknown voice id) and a missing capability
|
|
33
|
+
(`CapabilityUnavailableError`) fail the `LLM_CALL` effect at once instead of being retried: one engine call, the same
|
|
34
|
+
message. Other media lanes keep their retries.
|
|
35
|
+
- A remote AbstractCore server's 4xx refusal (other than 408, 409, 425, 429) is no longer retried: the status is read from
|
|
36
|
+
the HTTP error's response.
|
|
37
|
+
|
|
10
38
|
## [0.12.0] - 2026-10-27
|
|
11
39
|
|
|
12
40
|
Requires AbstractCore 2.30.0 or newer (`EmailClient` mailbox verbs; Gmail labels on message summaries) and AbstractMemory 0.3.2 or newer.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.0
|
|
4
4
|
Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
|
|
5
5
|
Project-URL: AbstractCore (website), https://www.abstractcore.ai/
|
|
6
6
|
Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
|
|
@@ -338,12 +338,13 @@ Entry points:
|
|
|
338
338
|
- `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
|
|
339
339
|
- public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
|
|
340
340
|
- public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
|
|
341
|
+
- public voice library facade: `AbstractCoreVoiceFacade`, `get_abstractcore_voice_facade(...)`, `VoiceLibraryError` (`src/abstractruntime/integrations/abstractcore/voice_facade.py`): languages, cloned voices (list by language, read, rename or replace the transcript, delete), cloning from a recording, voice design, the capability catalog; local in process, remote over the AbstractCore server's `/v1` voice routes (see [Voice library](integrations/abstractcore.md#voice-library))
|
|
341
342
|
- email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
|
|
342
343
|
- public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
|
|
343
344
|
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
|
|
344
345
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
345
346
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
346
|
-
- discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog
|
|
347
|
+
- discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog` (with `language=`), `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
|
|
347
348
|
- the host's OpenAI credential for AbstractVoice's `openai` engines, `voice_openai_api_key`, travels two ways. For discovery, pass it to `get_voice_catalog`, `list_tts_models` or `list_stt_models`; the local clients hand it to the voice plugin's config, and a remote client never sends it (a remote AbstractCore server uses its own voice configuration). For execution, put it in `create_local_runtime(llm_kwargs={"voice_openai_api_key": ...})`. Constructor kwargs become the provider's `config`, which is also the capability-plugin config. Providers read only the keys they name, so a `voice_*` key changes no text request (tests `tests/test_voice_openai_api_key_path.py`)
|
|
348
349
|
- host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`, `get_memory_snapshot`, `list_session_prompt_caches`, `clear_session_prompt_caches`, `lock_model_residency`, `unlock_model_residency`, `get_context_estimate`); the last six are optional in the client contract, and the facade returns `{"ok": false, "supported": false, ...}` when the configured client does not implement one
|
|
349
350
|
- `integrations.abstractcore.llm_client.set_default_model_warmup(enabled)` (process-wide, no environment variable): whether a new `MultiLocalAbstractCoreLLMClient` builds (for a local model: loads) its default model at construction and on a default switch. Default on. A process that serves no model turns it off once at boot (the gateway's `serve --no-runner`); the default client is then built at its first call. `default_model_warmup()` reads the setting (see `integrations/abstractcore.md#unloading-and-switching-models`)
|
|
@@ -14,7 +14,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
14
14
|
|
|
15
15
|
- Planned: 29
|
|
16
16
|
- Proposed: 14
|
|
17
|
-
- Completed:
|
|
17
|
+
- Completed: 37
|
|
18
18
|
- Deprecated: 13
|
|
19
19
|
- Recurrent: 0
|
|
20
20
|
|
|
@@ -93,6 +93,8 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
|
|
|
93
93
|
|
|
94
94
|
| ID | Item |
|
|
95
95
|
|----|------|
|
|
96
|
+
| 0851 | [Per-account voice stores](completed/0851_per_account_voice_stores.md): completed 2026-10-27 (0.13.0); the runtime's voice catalog and voice library use its `voice_store_dir` / `voice_library_dirs`; real-weights E2E 9/9. |
|
|
97
|
+
| 0852 | [Capability refusals are not retried](completed/0852_capability_refusals_are_not_retried.md): completed 2026-10-27 (0.13.0); one engine call for a refused request. |
|
|
96
98
|
| 0847 | [Automations v1: controller, contracts, occurrences, triggers](completed/0847_automations_v1_controller_contracts_occurrences_triggers.md): completed 2026-09-27, moved from planned; UNRELEASED; `79d9bf6`…`d02578a`, 2957 passed / 26 skipped; reviews GO after fixes; E2E 9/9. |
|
|
97
99
|
| 0846 | [Existing MLX instance scheduling and execution controls](completed/0846_mlx_instance_scheduling_and_execution_controls.md): completed 2026-09-20; moved from planned, 237 Runtime tests + 616 Core tests and four real-model integration cases; independent review approved, unreleased. |
|
|
98
100
|
| 001 | `completed/001_runtime_kernel.md` |
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 0851 — Per-account voice stores: the voice settings of each account's runtime, and the scope in the voice facade
|
|
2
|
+
|
|
3
|
+
**Status**: completed (2026-10-27, 0.13.0) · **Priority**: P1 · **Created**: 2026-10-27
|
|
4
|
+
**Cross-package**: AbstractVoice backlog 0065 (personal stores and a shared library), AbstractGateway backlog 0942 (personal voices per account, admin library, an AI's voice in its profile).
|
|
5
|
+
|
|
6
|
+
## Why
|
|
7
|
+
Operator, 2026-10-27: each person registers the voices they want (clone, design) and they are
|
|
8
|
+
personal, not shared by every account; an administrator can still deploy voices for everyone;
|
|
9
|
+
an AI (assistant, coder, entity) gets its voice as part of its profile. Today AbstractVoice keeps
|
|
10
|
+
one store per machine user, so every account of a gateway shares every cloned voice, and the
|
|
11
|
+
gateway's voice changes are admin-only until this lands.
|
|
12
|
+
|
|
13
|
+
## Current code reality (2026-10-27)
|
|
14
|
+
- `integrations/abstractcore/voice_facade.py` / `voice_library.py` (0.12.1): the voice library
|
|
15
|
+
facade; local clients build a capability registry from `discovery_queries._runtime_capability_registry`
|
|
16
|
+
(owner config: discovery settings only), remote clients call the AbstractCore server's `/v1` routes.
|
|
17
|
+
- Synthesis uses the LLM client's provider config (`create_local_runtime(llm_kwargs=...)` keys
|
|
18
|
+
become the capability-plugin config, see `voice_openai_api_key`).
|
|
19
|
+
- No setting names a voice store; AbstractVoice reads its machine-user folder.
|
|
20
|
+
|
|
21
|
+
## Scope
|
|
22
|
+
- In: accept AbstractVoice's `voice_store_dir` and `voice_library_dirs` (0065) in the runtime's
|
|
23
|
+
AbstractCore config so synthesis and the voice facade of one runtime use the same stores; the
|
|
24
|
+
facade passes them to the local registry; records carry `scope: personal|library`; a
|
|
25
|
+
`deploy_to_library` facade call for hosts that allow it; remote mode forwards nothing (a remote
|
|
26
|
+
AbstractCore server keeps its own stores) and says so.
|
|
27
|
+
- Out: who may deploy (the host's policy), the gateway routes (0942).
|
|
28
|
+
|
|
29
|
+
## Validation
|
|
30
|
+
Two runtimes with two store folders: a voice designed in one is spoken by it and not listed by the
|
|
31
|
+
other; both list and speak a library voice; the library refuses changes from a personal runtime.
|
|
32
|
+
|
|
33
|
+
## Report (completed 2026-10-27, 0.13.0)
|
|
34
|
+
`discovery_queries._runtime_capability_owner_config` / `_runtime_capability_registry` / `local_get_voice_catalog` take
|
|
35
|
+
`voice_store_dir` and `voice_library_dirs`; `voice_library.voice_store_settings(llm_kwargs)` reads them from the local
|
|
36
|
+
clients' `_llm_kwargs` (the settings their synthesis already hands the voice plugin), so the voice catalog and the voice
|
|
37
|
+
library facade use the runtime's own stores. `deploy_voice_to_library` op and facade method (local; 501 remote). Remote
|
|
38
|
+
mode forwards nothing: the AbstractCore server keeps its stores.
|
|
39
|
+
|
|
40
|
+
Validation: `tests/test_voice_library_facade.py` (settings reach the registry owner config for the library and the
|
|
41
|
+
catalog; absent when unset; deploy 501 remote). Real weights, two local runtimes with personal stores and one library,
|
|
42
|
+
9/9: design through the facade, listed by its runtime only (library and catalog), the other runtime cannot delete it
|
|
43
|
+
(404), deploy, library voice listed by both and read-only (422).
|
|
44
|
+
|
|
45
|
+
Adversarial review (2026-10-27), fixed before release: the voice library built its own registry from the discovery
|
|
46
|
+
settings (a second voice manager, weights loaded twice, a 5 s remote timeout): it now runs on the client's own
|
|
47
|
+
AbstractCore instance (`llm.capabilities`; a model pool on its media host), the registry synthesis uses. Also: one flat
|
|
48
|
+
record shape for `clone_voice` on both sides, `language` forwarded, remote statuses passed through, `voice_library_dirs`
|
|
49
|
+
as an `os.pathsep` string, empty voice ids refused (422), a created voice whose record cannot be read back is still
|
|
50
|
+
reported created. Real weights rerun with real local clients: 9/9 and 14/14.
|
|
51
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 0852 — A capability's refusal of the request is not retried and reaches the host as a refusal
|
|
2
|
+
|
|
3
|
+
**Status**: completed (2026-10-27, 0.13.0) · **Priority**: P2 · **Created**: 2026-10-27
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
Measured 2026-10-27 through the gateway (`POST /runs/{id}/voice/tts`, Qwen3-TTS, `one_shot: true`
|
|
7
|
+
with 2,399 characters): AbstractVoice refuses at once ("one_shot synthesis takes at most 1000
|
|
8
|
+
characters in a single generation"), the media effect retries it three times, and the host
|
|
9
|
+
answers HTTP 500 "Effect failed after 3 attempts". The refusal is the caller's input, not a
|
|
10
|
+
transient failure: retrying wastes three engine calls and the host cannot answer 422.
|
|
11
|
+
|
|
12
|
+
## Current code reality
|
|
13
|
+
- The LLM_CALL media path (`llm_client.py` `_run_multimodal_spec` → AbstractCore
|
|
14
|
+
`providers/base.py` → plugin) raises `ValueError` for refused input; the effect's retry policy
|
|
15
|
+
treats every exception alike.
|
|
16
|
+
- The voice library facade already maps `ValueError` to a 422 `VoiceLibraryError`
|
|
17
|
+
(`voice_library.py`), so the two surfaces disagree.
|
|
18
|
+
|
|
19
|
+
## Scope
|
|
20
|
+
- In: classify refused input (`ValueError`, AbstractCore `CapabilityUnavailableError`) as
|
|
21
|
+
non-retryable in the media effects; record it on the child run with a code (`invalid_request`,
|
|
22
|
+
`capability_unavailable`) the host maps to 422 / 501.
|
|
23
|
+
- Out: engine limits themselves (AbstractVoice).
|
|
24
|
+
|
|
25
|
+
## Validation
|
|
26
|
+
A one_shot request over the limit makes one engine call and the child run records
|
|
27
|
+
`invalid_request`; a transient error is still retried; mutants: drop the classification and the
|
|
28
|
+
test sees three calls.
|
|
29
|
+
|
|
30
|
+
## Report (completed 2026-10-27, 0.13.0)
|
|
31
|
+
`effect_handlers._llm_error_is_retryable`: a plain `ValueError`, a `KeyError` and AbstractCore's
|
|
32
|
+
`CapabilityUnavailableError` are non-retryable (one engine call). Subclasses of `ValueError` such as
|
|
33
|
+
`json.JSONDecodeError` keep the retryable default. Not done here: an error code on the child run for the host to map to
|
|
34
|
+
422/501 (the run failure record carries prose only); AbstractGateway backlog 0942 tracks the 422 answer of
|
|
35
|
+
`/voice/tts`.
|
|
36
|
+
|
|
37
|
+
Validation: `tests/test_llm_retry_classification.py::test_a_capability_refusal_is_not_retried` (refusals non-retryable;
|
|
38
|
+
a JSON decode error and a connection error still retried).
|
|
39
|
+
|
|
40
|
+
Adversarial review (2026-10-27): a plain ValueError is also how other media lanes report failures a retry can fix (a
|
|
41
|
+
failed remote image job, an empty or black image, non-finite music audio), so the rule was narrowed before release:
|
|
42
|
+
plain `ValueError` / `KeyError` are non-retryable only on a `modality: voice` output (`effect_handlers._is_voice_refusal`);
|
|
43
|
+
`CapabilityUnavailableError` stays non-retryable everywhere.
|
|
44
|
+
|
|
@@ -1024,6 +1024,64 @@ adapters = facade.list_vision_adapters(
|
|
|
1024
1024
|
)
|
|
1025
1025
|
```
|
|
1026
1026
|
|
|
1027
|
+
## Voice library
|
|
1028
|
+
|
|
1029
|
+
`get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`) manages the voices AbstractCore can speak with:
|
|
1030
|
+
|
|
1031
|
+
- `list_languages(kind=None, provider=None)`: `{"languages": {kind: {provider: {provider, languages, open, declared}}}}`
|
|
1032
|
+
for `tts`, `stt` and `cloning`, read without loading a model;
|
|
1033
|
+
- `list_cloned_voices(provider=None, model=None, language=None)`: `{"voices": [...], "count": n}`, designed and
|
|
1034
|
+
built-in voices included (`tags.designed`, `tags.builtin`); `language` keeps the voices that can speak it, native
|
|
1035
|
+
speakers first;
|
|
1036
|
+
- `get_cloned_voice(voice_id)`, `update_cloned_voice(voice_id, name=None, reference_text=None)` (both fields checked
|
|
1037
|
+
before either is applied) and `delete_cloned_voice(voice_id)`; built-in voices are read-only;
|
|
1038
|
+
- `clone_voice(audio_bytes, filename=None, content_type=None, name=None, reference_text=None, provider=None, model=None)`:
|
|
1039
|
+
a voice from a reference recording (`provider` = the cloning engine, e.g. `qwen3-tts`, `omnivoice`);
|
|
1040
|
+
- `design_voice(description, name=None, language=None, text=None)`: a voice from a written description, stored as a
|
|
1041
|
+
cloned voice (needs `abstractvoice[qwen3-tts]` and `abstractvoice[stt]` where the voice capability runs);
|
|
1042
|
+
- `deploy_voice_to_library(voice_id)`: copies one of the runtime's personal voices into its first library (see below);
|
|
1043
|
+
- `compatibility_catalog()`: per kind, provider, model and surface, the support level of each feature (`native`,
|
|
1044
|
+
`emulated`, `conditional`, `unsupported`), e.g. which engines honour `speed` or `one_shot`.
|
|
1045
|
+
|
|
1046
|
+
Local clients run these in process on the same AbstractCore capability registry their synthesis uses (same voice
|
|
1047
|
+
manager, settings and voice stores; a model pool uses its media host), AbstractCore 2.30.0+ and AbstractVoice 0.18.2+.
|
|
1048
|
+
`clone_voice` answers the stored record, flat, with its `voice_id`, on both sides; `clone_voice(..., language=)` records
|
|
1049
|
+
the recording's language in process (AbstractVoice 0.19.0). A remote AbstractCore 2.30.0 server does not take the
|
|
1050
|
+
language yet (its clone form has no such field), so a remotely cloned voice's language is identified from its transcript. The remote client calls the AbstractCore server's `/v1/audio/languages`, `/v1/voice/clones[/{id}]`
|
|
1051
|
+
(`GET`, `PATCH`, `DELETE`), `/v1/voice/clone` and `/v1/voice/design`, and reads the capability catalog from
|
|
1052
|
+
`/v1/audio/voices`; the server's changes need its operator token in the runtime's headers. Every refusal is a
|
|
1053
|
+
`VoiceLibraryError` with `status_code` (404 unknown voice, 422 refused input, 401 server token missing, 501 capability
|
|
1054
|
+
or engine runtime missing; a remote server's own 400, 403, 409, 413, 429 and 503 pass through; 502 for any other remote
|
|
1055
|
+
failure) and `detail`, so a host maps it to its own answer.
|
|
1056
|
+
|
|
1057
|
+
Cloned voices live in AbstractVoice's store. By default that is one store per machine user, shared by every account a
|
|
1058
|
+
host serves. A runtime can instead have its own personal voice store in front of read-only libraries: put
|
|
1059
|
+
`voice_store_dir` (and optionally `voice_library_dirs`, a list of folders) in its AbstractCore client settings, e.g.
|
|
1060
|
+
`create_local_runtime(llm_kwargs={"voice_store_dir": "/data/alice/voices", "voice_library_dirs": ["/data/voice-library"]})`.
|
|
1061
|
+
Synthesis, the voice catalog and the voice library facade of that runtime then use the same stores: voices cloned or
|
|
1062
|
+
designed go to the personal store, library voices (built-in ones included) are listed and spoken but read-only (422), and
|
|
1063
|
+
`deploy_voice_to_library(voice_id)` copies a personal voice into the first library (local runtimes; 501 remote, where the
|
|
1064
|
+
AbstractCore server keeps its own store). Who may deploy is the host's decision. Needs AbstractVoice 0.19.0; with an older
|
|
1065
|
+
AbstractVoice, these settings are not honoured. Records carry `meta.scope` (`personal` | `library`).
|
|
1066
|
+
|
|
1067
|
+
The voice catalog takes the same language filter: `get_abstractcore_discovery_facade(rt).get_voice_catalog(language="fr")`.
|
|
1068
|
+
A remote run's buffered TTS forwards `one_shot` (the whole text as one take, refused beyond an engine's limit); the
|
|
1069
|
+
streamed lane never sends it, as AbstractCore refuses `one_shot` on a stream.
|
|
1070
|
+
|
|
1071
|
+
```python
|
|
1072
|
+
from abstractruntime.integrations.abstractcore import VoiceLibraryError, get_abstractcore_voice_facade
|
|
1073
|
+
|
|
1074
|
+
voices = get_abstractcore_voice_facade(rt)
|
|
1075
|
+
french = voices.list_cloned_voices(language="fr")["voices"]
|
|
1076
|
+
designed = voices.design_voice("A calm, warm low female voice", name="Calm", language="en")
|
|
1077
|
+
voices.update_cloned_voice(designed["voice_id"], name="Calm narrator")
|
|
1078
|
+
voices.delete_cloned_voice(designed["voice_id"])
|
|
1079
|
+
try:
|
|
1080
|
+
voices.get_cloned_voice(designed["voice_id"])
|
|
1081
|
+
except VoiceLibraryError as err:
|
|
1082
|
+
print(err.status_code, err.detail) # 404: the voice is gone
|
|
1083
|
+
```
|
|
1084
|
+
|
|
1027
1085
|
## Durable run-scoped media and comms execution
|
|
1028
1086
|
|
|
1029
1087
|
Hosts sometimes need to trigger image/TTS/music/STT work or outbound comms sends for an existing run. That work should still execute through Runtime so the child run ledger, artifact ownership, and replay surface remain Runtime-authored.
|
|
@@ -1307,12 +1307,13 @@ Entry points:
|
|
|
1307
1307
|
- `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
|
|
1308
1308
|
- public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
|
|
1309
1309
|
- public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
|
|
1310
|
+
- public voice library facade: `AbstractCoreVoiceFacade`, `get_abstractcore_voice_facade(...)`, `VoiceLibraryError` (`src/abstractruntime/integrations/abstractcore/voice_facade.py`): languages, cloned voices (list by language, read, rename or replace the transcript, delete), cloning from a recording, voice design, the capability catalog; local in process, remote over the AbstractCore server's `/v1` voice routes (see [Voice library](integrations/abstractcore.md#voice-library))
|
|
1310
1311
|
- email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
|
|
1311
1312
|
- public Telegram host wrappers: `TelegramTdlibNotAvailable`, `bootstrap_telegram_auth_from_env(...)`, `get_global_telegram_client(...)`, `stop_global_telegram_client()`, `send_telegram_message(...)` (`src/abstractruntime/integrations/abstractcore/telegram_facade.py`)
|
|
1312
1313
|
- public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`); `inline_run_active(run_id)` is true while the facade executes a child run in this process (its workflow exists only inside that call), so a host runner that scans `RUNNING` runs skips it
|
|
1313
1314
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
1314
1315
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
1315
|
-
- discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog
|
|
1316
|
+
- discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog` (with `language=`), `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
|
|
1316
1317
|
- the host's OpenAI credential for AbstractVoice's `openai` engines, `voice_openai_api_key`, travels two ways. For discovery, pass it to `get_voice_catalog`, `list_tts_models` or `list_stt_models`; the local clients hand it to the voice plugin's config, and a remote client never sends it (a remote AbstractCore server uses its own voice configuration). For execution, put it in `create_local_runtime(llm_kwargs={"voice_openai_api_key": ...})`. Constructor kwargs become the provider's `config`, which is also the capability-plugin config. Providers read only the keys they name, so a `voice_*` key changes no text request (tests `tests/test_voice_openai_api_key_path.py`)
|
|
1317
1318
|
- host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`, `get_memory_snapshot`, `list_session_prompt_caches`, `clear_session_prompt_caches`, `lock_model_residency`, `unlock_model_residency`, `get_context_estimate`); the last six are optional in the client contract, and the facade returns `{"ok": false, "supported": false, ...}` when the configured client does not implement one
|
|
1318
1319
|
- `integrations.abstractcore.llm_client.set_default_model_warmup(enabled)` (process-wide, no environment variable): whether a new `MultiLocalAbstractCoreLLMClient` builds (for a local model: loads) its default model at construction and on a default switch. Default on. A process that serves no model turns it off once at boot (the gateway's `serve --no-runner`); the default client is then built at its first call. `default_model_warmup()` reads the setting (see `integrations/abstractcore.md#unloading-and-switching-models`)
|
|
@@ -3232,6 +3233,64 @@ adapters = facade.list_vision_adapters(
|
|
|
3232
3233
|
)
|
|
3233
3234
|
```
|
|
3234
3235
|
|
|
3236
|
+
## Voice library
|
|
3237
|
+
|
|
3238
|
+
`get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`) manages the voices AbstractCore can speak with:
|
|
3239
|
+
|
|
3240
|
+
- `list_languages(kind=None, provider=None)`: `{"languages": {kind: {provider: {provider, languages, open, declared}}}}`
|
|
3241
|
+
for `tts`, `stt` and `cloning`, read without loading a model;
|
|
3242
|
+
- `list_cloned_voices(provider=None, model=None, language=None)`: `{"voices": [...], "count": n}`, designed and
|
|
3243
|
+
built-in voices included (`tags.designed`, `tags.builtin`); `language` keeps the voices that can speak it, native
|
|
3244
|
+
speakers first;
|
|
3245
|
+
- `get_cloned_voice(voice_id)`, `update_cloned_voice(voice_id, name=None, reference_text=None)` (both fields checked
|
|
3246
|
+
before either is applied) and `delete_cloned_voice(voice_id)`; built-in voices are read-only;
|
|
3247
|
+
- `clone_voice(audio_bytes, filename=None, content_type=None, name=None, reference_text=None, provider=None, model=None)`:
|
|
3248
|
+
a voice from a reference recording (`provider` = the cloning engine, e.g. `qwen3-tts`, `omnivoice`);
|
|
3249
|
+
- `design_voice(description, name=None, language=None, text=None)`: a voice from a written description, stored as a
|
|
3250
|
+
cloned voice (needs `abstractvoice[qwen3-tts]` and `abstractvoice[stt]` where the voice capability runs);
|
|
3251
|
+
- `deploy_voice_to_library(voice_id)`: copies one of the runtime's personal voices into its first library (see below);
|
|
3252
|
+
- `compatibility_catalog()`: per kind, provider, model and surface, the support level of each feature (`native`,
|
|
3253
|
+
`emulated`, `conditional`, `unsupported`), e.g. which engines honour `speed` or `one_shot`.
|
|
3254
|
+
|
|
3255
|
+
Local clients run these in process on the same AbstractCore capability registry their synthesis uses (same voice
|
|
3256
|
+
manager, settings and voice stores; a model pool uses its media host), AbstractCore 2.30.0+ and AbstractVoice 0.18.2+.
|
|
3257
|
+
`clone_voice` answers the stored record, flat, with its `voice_id`, on both sides; `clone_voice(..., language=)` records
|
|
3258
|
+
the recording's language in process (AbstractVoice 0.19.0). A remote AbstractCore 2.30.0 server does not take the
|
|
3259
|
+
language yet (its clone form has no such field), so a remotely cloned voice's language is identified from its transcript. The remote client calls the AbstractCore server's `/v1/audio/languages`, `/v1/voice/clones[/{id}]`
|
|
3260
|
+
(`GET`, `PATCH`, `DELETE`), `/v1/voice/clone` and `/v1/voice/design`, and reads the capability catalog from
|
|
3261
|
+
`/v1/audio/voices`; the server's changes need its operator token in the runtime's headers. Every refusal is a
|
|
3262
|
+
`VoiceLibraryError` with `status_code` (404 unknown voice, 422 refused input, 401 server token missing, 501 capability
|
|
3263
|
+
or engine runtime missing; a remote server's own 400, 403, 409, 413, 429 and 503 pass through; 502 for any other remote
|
|
3264
|
+
failure) and `detail`, so a host maps it to its own answer.
|
|
3265
|
+
|
|
3266
|
+
Cloned voices live in AbstractVoice's store. By default that is one store per machine user, shared by every account a
|
|
3267
|
+
host serves. A runtime can instead have its own personal voice store in front of read-only libraries: put
|
|
3268
|
+
`voice_store_dir` (and optionally `voice_library_dirs`, a list of folders) in its AbstractCore client settings, e.g.
|
|
3269
|
+
`create_local_runtime(llm_kwargs={"voice_store_dir": "/data/alice/voices", "voice_library_dirs": ["/data/voice-library"]})`.
|
|
3270
|
+
Synthesis, the voice catalog and the voice library facade of that runtime then use the same stores: voices cloned or
|
|
3271
|
+
designed go to the personal store, library voices (built-in ones included) are listed and spoken but read-only (422), and
|
|
3272
|
+
`deploy_voice_to_library(voice_id)` copies a personal voice into the first library (local runtimes; 501 remote, where the
|
|
3273
|
+
AbstractCore server keeps its own store). Who may deploy is the host's decision. Needs AbstractVoice 0.19.0; with an older
|
|
3274
|
+
AbstractVoice, these settings are not honoured. Records carry `meta.scope` (`personal` | `library`).
|
|
3275
|
+
|
|
3276
|
+
The voice catalog takes the same language filter: `get_abstractcore_discovery_facade(rt).get_voice_catalog(language="fr")`.
|
|
3277
|
+
A remote run's buffered TTS forwards `one_shot` (the whole text as one take, refused beyond an engine's limit); the
|
|
3278
|
+
streamed lane never sends it, as AbstractCore refuses `one_shot` on a stream.
|
|
3279
|
+
|
|
3280
|
+
```python
|
|
3281
|
+
from abstractruntime.integrations.abstractcore import VoiceLibraryError, get_abstractcore_voice_facade
|
|
3282
|
+
|
|
3283
|
+
voices = get_abstractcore_voice_facade(rt)
|
|
3284
|
+
french = voices.list_cloned_voices(language="fr")["voices"]
|
|
3285
|
+
designed = voices.design_voice("A calm, warm low female voice", name="Calm", language="en")
|
|
3286
|
+
voices.update_cloned_voice(designed["voice_id"], name="Calm narrator")
|
|
3287
|
+
voices.delete_cloned_voice(designed["voice_id"])
|
|
3288
|
+
try:
|
|
3289
|
+
voices.get_cloned_voice(designed["voice_id"])
|
|
3290
|
+
except VoiceLibraryError as err:
|
|
3291
|
+
print(err.status_code, err.detail) # 404: the voice is gone
|
|
3292
|
+
```
|
|
3293
|
+
|
|
3235
3294
|
## Durable run-scoped media and comms execution
|
|
3236
3295
|
|
|
3237
3296
|
Hosts sometimes need to trigger image/TTS/music/STT work or outbound comms sends for an existing run. That work should still execute through Runtime so the child run ledger, artifact ownership, and replay surface remain Runtime-authored.
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
- VisualFlow LLM Call and Agent nodes forward Core generation controls such as `thinking`; Provider Models nodes can apply Core `capability_route` filters during runtime discovery.
|
|
48
48
|
- Prompt-cache tracks: use `LLM_CALL.params.prompt_cache_key`, `run.vars["_runtime"]["prompt_cache"]`, or `ABSTRACTRUNTIME_PROMPT_CACHE` for best-effort text/chat session reuse; use `LLM_CALL.params.prompt_cache_binding` for durable exact bloc-backed reuse; and use `get_abstractcore_host_facade(runtime).list_prompt_cache_exports(...)`, `prompt_cache_export(...)`, and `prompt_cache_import(...)` only for host-local operator/admin export-import workflows around live local provider caches. Runtime does not auto-derive prompt-cache keys for image/video/voice/music/STT output selectors. Derived session keys are stamped with session attribution after each generate so hosts can use `list_session_prompt_caches(...)` / `clear_session_prompt_caches(...)` per session; caller-owned keys are never stamped, and completing a run does not clear session caches. Local Runtime stores one content-addressed bloc per root plus provider/model-specific derived KV artifacts. Gateway prompt-cache env belongs in Gateway.
|
|
49
49
|
- Durable bloc lifecycle: Runtime exposes `list_blocs(...)`, `list_bloc_kv_artifacts(...)`, `delete_bloc_kv_artifact(...)`, `prune_bloc_kv_artifacts(...)`, and `delete_bloc(...)`, with `dry_run`, `clear_loaded`, and `force` safety controls on the host facade.
|
|
50
|
-
- Runtime-owned Core surfaces: `get_abstractcore_discovery_facade(...)`, `get_abstractcore_host_facade(...)`, and `get_abstractcore_run_facade(...)`
|
|
50
|
+
- Runtime-owned Core surfaces: `get_abstractcore_discovery_facade(...)`, `get_abstractcore_host_facade(...)`, `get_abstractcore_voice_facade(...)` ([voice library](docs/integrations/abstractcore.md#voice-library): languages, cloned voices, cloning, voice design, the capability catalog) and `get_abstractcore_run_facade(...)`
|
|
51
51
|
- Host-local operator wrappers: the host facade exposes single-user email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`), `abstractruntime.integrations.abstractcore.email_facade` re-exports AbstractCore's mail library for multi-user hosts, and `abstractruntime.integrations.abstractcore.telegram_facade` exposes Telegram bootstrap/global-client/send wrappers without requiring hosts to import AbstractCore directly.
|
|
52
52
|
- Durable outbound comms: when an email or Telegram send belongs to a run, use `get_abstractcore_run_facade(...).send_email(...)` or `send_telegram_message(...)` so Runtime records the request and outcome in a child run; replay should show the recorded result, not resend the message. If the child run waits for approval or passthrough execution, resume it through `resume_tool_calls(...)`.
|
|
53
53
|
- [Artifacts](docs/artifacts.md): Runtime artifact identity, JSON-safe refs, canonical descriptors, generated-media provenance, tool-output offload thresholds, catalog search/stats, access counters, and Gateway/Observer retrieval boundaries.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Requires AbstractCore 2.30.0 or newer. Personal voice stores need AbstractVoice 0.19.0.
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
|
|
5
|
+
- The voice library runs on the capability registry the runtime's synthesis uses (same voice manager, settings and
|
|
6
|
+
stores); a model pool manages voices on its media host. `clone_voice(..., language=)` forwards the recording's language;
|
|
7
|
+
`clone_voice` answers the stored record, flat, with its `voice_id`, locally and remotely; a remote refusal keeps the
|
|
8
|
+
server's status (400, 401, 403, 404, 409, 413, 422, 429, 501, 503); an empty voice id is refused (422).
|
|
9
|
+
- **Per-runtime voice stores**: `voice_store_dir` and `voice_library_dirs` in a runtime's AbstractCore client settings give
|
|
10
|
+
it a personal voice store in front of read-only libraries; its synthesis, voice catalog and voice library use the same
|
|
11
|
+
stores. `deploy_voice_to_library(voice_id)` on the voice library facade (local runtimes). See
|
|
12
|
+
[Voice library](docs/integrations/abstractcore.md#voice-library).
|
|
13
|
+
|
|
14
|
+
- **Voice library facade**: `get_abstractcore_voice_facade(runtime)` (`AbstractCoreVoiceFacade`, `VoiceLibraryError`) lists the languages each voice engine accepts, lists cloned voices (designed and built-in ones included, optionally by language), reads, renames, replaces the reference transcript of and deletes a cloned voice, creates a voice from a recording (`clone_voice`) or from a written description (`design_voice`), and returns the capability catalog (which engine and model supports `speed`, `one_shot`, design... and how). Local runtimes run it in process; remote runtimes call the AbstractCore server's `/v1` voice routes. Refusals carry an HTTP-like `status_code`. See [Voice library](docs/integrations/abstractcore.md#voice-library).
|
|
15
|
+
- **Voice catalog by language**: `get_voice_catalog(..., language=)` keeps the voices that can speak a language, native speakers first (local and remote).
|
|
16
|
+
- **`one_shot` on remote TTS**: a remote runtime forwards `one_shot` on buffered speech, as local runtimes already did.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- A voice request the voice plugin refuses (a plain `ValueError` or `KeyError` on a `modality: voice` output, such as
|
|
21
|
+
`one_shot` over an engine's length limit or an unknown voice id) and a missing capability
|
|
22
|
+
(`CapabilityUnavailableError`) fail the `LLM_CALL` effect at once instead of being retried: one engine call, the same
|
|
23
|
+
message. Other media lanes keep their retries.
|
|
24
|
+
- A remote AbstractCore server's 4xx refusal (other than 408, 409, 425, 429) is no longer retried: the status is read from
|
|
25
|
+
the HTTP error's response.
|
|
@@ -8,6 +8,7 @@ Provides:
|
|
|
8
8
|
- Effect handlers wiring
|
|
9
9
|
- Convenience runtime factories for local/remote/hybrid modes
|
|
10
10
|
- Public discovery facade for provider/media/catalog snapshot queries
|
|
11
|
+
- Public voice library facade (`voice_facade`): languages, cloned voices, voice design and cloning, the capability catalog
|
|
11
12
|
- Public host facade for prompt-cache, durable bloc/KV, and model-residency control operations
|
|
12
13
|
- Public config facade for AbstractCore capability-default routes and config API keys
|
|
13
14
|
- Public structured-output facade (`structured_facade`): `parse_response_format` / `ResponseFormatError` for hosts
|
|
@@ -45,6 +46,11 @@ from .discovery_facade import (
|
|
|
45
46
|
AbstractCoreDiscoveryFacade,
|
|
46
47
|
get_abstractcore_discovery_facade,
|
|
47
48
|
)
|
|
49
|
+
from .voice_facade import (
|
|
50
|
+
AbstractCoreVoiceFacade,
|
|
51
|
+
VoiceLibraryError,
|
|
52
|
+
get_abstractcore_voice_facade,
|
|
53
|
+
)
|
|
48
54
|
from .run_facade import (
|
|
49
55
|
LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX,
|
|
50
56
|
AbstractCoreRunFacade,
|
|
@@ -82,6 +88,8 @@ __all__ = [
|
|
|
82
88
|
"AbstractCoreDiscoveryFacade",
|
|
83
89
|
"AbstractCoreHostFacade",
|
|
84
90
|
"AbstractCoreRunFacade",
|
|
91
|
+
"AbstractCoreVoiceFacade",
|
|
92
|
+
"VoiceLibraryError",
|
|
85
93
|
"LocalAbstractCoreLLMClient",
|
|
86
94
|
"MultiLocalAbstractCoreLLMClient",
|
|
87
95
|
"RemoteAbstractCoreLLMClient",
|
|
@@ -100,6 +108,7 @@ __all__ = [
|
|
|
100
108
|
"bootstrap_telegram_auth_from_env",
|
|
101
109
|
"get_abstractcore_discovery_facade",
|
|
102
110
|
"get_abstractcore_host_facade",
|
|
111
|
+
"get_abstractcore_voice_facade",
|
|
103
112
|
"capability_default_config_file",
|
|
104
113
|
"capability_default_specs",
|
|
105
114
|
"clear_capability_default",
|
|
@@ -7,7 +7,7 @@ Scope:
|
|
|
7
7
|
- provider discovery
|
|
8
8
|
- provider model discovery
|
|
9
9
|
- model capability lookup
|
|
10
|
-
- audio/voice/TTS/STT catalogs
|
|
10
|
+
- audio/voice/TTS/STT catalogs (voice library changes: `voice_facade.AbstractCoreVoiceFacade`)
|
|
11
11
|
- music provider/model catalogs
|
|
12
12
|
- vision provider catalogs
|
|
13
13
|
- vision adapter catalogs
|
|
@@ -287,10 +287,14 @@ class AbstractCoreDiscoveryFacade:
|
|
|
287
287
|
model: Optional[str] = None,
|
|
288
288
|
providers_only: bool = False,
|
|
289
289
|
voice_openai_api_key: Optional[str] = None,
|
|
290
|
+
language: Optional[str] = None,
|
|
290
291
|
**kwargs: Any,
|
|
291
292
|
) -> Dict[str, Any]:
|
|
292
293
|
"""Voice catalog. `voice_openai_api_key` is the host's OpenAI credential for
|
|
293
|
-
AbstractVoice's `openai` engines (plugin setting of the same name).
|
|
294
|
+
AbstractVoice's `openai` engines (plugin setting of the same name). `language` keeps
|
|
295
|
+
the voices that can speak it, native speakers first (AbstractCore 2.30.0+)."""
|
|
296
|
+
if language is not None:
|
|
297
|
+
kwargs["language"] = language
|
|
294
298
|
return self._client.get_voice_catalog(
|
|
295
299
|
base_url=base_url,
|
|
296
300
|
provider_api_key=provider_api_key,
|
|
@@ -624,8 +624,17 @@ def _runtime_capability_owner_config(
|
|
|
624
624
|
vision_api_key: Optional[str] = None,
|
|
625
625
|
music_base_url: Optional[str] = None,
|
|
626
626
|
music_api_key: Optional[str] = None,
|
|
627
|
+
voice_store_dir: Optional[str] = None,
|
|
628
|
+
voice_library_dirs: Optional[list] = None,
|
|
627
629
|
) -> Dict[str, Any]:
|
|
628
630
|
cfg: Dict[str, Any] = {}
|
|
631
|
+
# The runtime's voice stores (AbstractVoice 0.19.0 plugin settings; runtime backlog 0851):
|
|
632
|
+
# a personal store in front of read-only libraries, so this runtime lists and manages the
|
|
633
|
+
# voices its own synthesis speaks with.
|
|
634
|
+
if isinstance(voice_store_dir, str) and voice_store_dir.strip():
|
|
635
|
+
cfg["voice_store_dir"] = voice_store_dir.strip()
|
|
636
|
+
if voice_library_dirs:
|
|
637
|
+
cfg["voice_library_dirs"] = [str(d) for d in voice_library_dirs if str(d or "").strip()]
|
|
629
638
|
if isinstance(voice_base_url, str) and voice_base_url.strip():
|
|
630
639
|
cfg["voice_remote_base_url"] = voice_base_url.strip()
|
|
631
640
|
if isinstance(voice_api_key, str) and voice_api_key.strip():
|
|
@@ -715,6 +724,8 @@ def _runtime_capability_registry(
|
|
|
715
724
|
vision_api_key: Optional[str] = None,
|
|
716
725
|
music_base_url: Optional[str] = None,
|
|
717
726
|
music_api_key: Optional[str] = None,
|
|
727
|
+
voice_store_dir: Optional[str] = None,
|
|
728
|
+
voice_library_dirs: Optional[list] = None,
|
|
718
729
|
) -> Any:
|
|
719
730
|
from abstractcore.capabilities import CapabilityRegistry
|
|
720
731
|
|
|
@@ -735,6 +746,8 @@ def _runtime_capability_registry(
|
|
|
735
746
|
vision_api_key=vision_api_key,
|
|
736
747
|
music_base_url=music_base_url,
|
|
737
748
|
music_api_key=music_api_key,
|
|
749
|
+
voice_store_dir=voice_store_dir,
|
|
750
|
+
voice_library_dirs=voice_library_dirs,
|
|
738
751
|
)
|
|
739
752
|
},
|
|
740
753
|
)()
|
|
@@ -1074,15 +1087,25 @@ def local_get_voice_catalog(
|
|
|
1074
1087
|
provider: Optional[str] = None,
|
|
1075
1088
|
model: Optional[str] = None,
|
|
1076
1089
|
providers_only: bool = False,
|
|
1090
|
+
language: Optional[str] = None,
|
|
1091
|
+
voice_store_dir: Optional[str] = None,
|
|
1092
|
+
voice_library_dirs: Optional[list] = None,
|
|
1077
1093
|
) -> Dict[str, Any]:
|
|
1078
1094
|
try:
|
|
1079
1095
|
voice = _runtime_capability_registry(
|
|
1080
1096
|
voice_base_url=base_url,
|
|
1081
1097
|
voice_api_key=provider_api_key,
|
|
1082
1098
|
voice_openai_api_key=voice_openai_api_key,
|
|
1099
|
+
voice_store_dir=voice_store_dir,
|
|
1100
|
+
voice_library_dirs=voice_library_dirs,
|
|
1083
1101
|
).voice
|
|
1102
|
+
# `language` (AbstractCore 2.30.0+) keeps the voices that speak it, natives first; it is
|
|
1103
|
+
# passed only when asked, and AbstractCore raises if its backend cannot filter.
|
|
1104
|
+
lang = str(language or "").strip() or None
|
|
1084
1105
|
catalog = (
|
|
1085
|
-
voice.voice_catalog(
|
|
1106
|
+
voice.voice_catalog(
|
|
1107
|
+
provider=provider, model=model, providers_only=providers_only, **({"language": lang} if lang else {})
|
|
1108
|
+
)
|
|
1086
1109
|
if hasattr(voice, "voice_catalog")
|
|
1087
1110
|
else {}
|
|
1088
1111
|
)
|
|
@@ -2542,6 +2542,8 @@ def make_llm_call_handler(*, llm: AbstractCoreLLMClient, artifact_store: Optiona
|
|
|
2542
2542
|
logger.info("LLM_CALL stopped by cancel", detail=str(e))
|
|
2543
2543
|
return EffectOutcome.failed(str(e), retryable=False)
|
|
2544
2544
|
logger.error("LLM_CALL failed", error=str(e))
|
|
2545
|
+
if _is_voice_refusal(e, params.get("output") if isinstance(params, dict) else None):
|
|
2546
|
+
return EffectOutcome.failed(str(e), retryable=False)
|
|
2545
2547
|
return EffectOutcome.failed(str(e), retryable=_llm_error_is_retryable(e))
|
|
2546
2548
|
|
|
2547
2549
|
return _handler
|
|
@@ -2558,6 +2560,17 @@ _HARMONY_ARTIFACT_RE = re.compile(
|
|
|
2558
2560
|
)
|
|
2559
2561
|
|
|
2560
2562
|
|
|
2563
|
+
def _is_voice_refusal(exc: Exception, output: Any) -> bool:
|
|
2564
|
+
"""A voice request the voice plugin refused (runtime backlog 0852): AbstractVoice raises a plain
|
|
2565
|
+
ValueError for input it cannot honour (`one_shot` over an engine's limit, an unsupported
|
|
2566
|
+
option) and KeyError for an unknown voice id; both answer the same on every attempt. Other
|
|
2567
|
+
media lanes keep their retries (a failed remote job or an empty image can succeed again)."""
|
|
2568
|
+
if not (type(exc) is ValueError or type(exc) is KeyError):
|
|
2569
|
+
return False
|
|
2570
|
+
specs = output if isinstance(output, list) else [output]
|
|
2571
|
+
return any(isinstance(spec, dict) and str(spec.get("modality") or "").strip().lower() == "voice" for spec in specs)
|
|
2572
|
+
|
|
2573
|
+
|
|
2561
2574
|
def _llm_error_is_retryable(exc: Exception) -> bool:
|
|
2562
2575
|
"""Classify LLM provider failures for the retry policy.
|
|
2563
2576
|
|
|
@@ -2620,11 +2633,24 @@ def _llm_error_is_retryable(exc: Exception) -> bool:
|
|
|
2620
2633
|
pass
|
|
2621
2634
|
|
|
2622
2635
|
status = getattr(exc, "status_code", None)
|
|
2636
|
+
if not isinstance(status, int):
|
|
2637
|
+
# An HTTP client error (httpx.HTTPStatusError from a remote AbstractCore server) carries
|
|
2638
|
+
# the status on its response: a server's 4xx refusal is not retried either.
|
|
2639
|
+
status = getattr(getattr(exc, "response", None), "status_code", None)
|
|
2623
2640
|
if isinstance(status, int):
|
|
2624
2641
|
if 400 <= status < 500 and status not in _TRANSIENT_4XX:
|
|
2625
2642
|
return False
|
|
2626
2643
|
return True
|
|
2627
2644
|
|
|
2645
|
+
# A capability that is not installed answers the same on every attempt.
|
|
2646
|
+
try:
|
|
2647
|
+
from abstractcore.capabilities.errors import CapabilityUnavailableError # type: ignore
|
|
2648
|
+
|
|
2649
|
+
if isinstance(exc, CapabilityUnavailableError):
|
|
2650
|
+
return False
|
|
2651
|
+
except ImportError:
|
|
2652
|
+
pass
|
|
2653
|
+
|
|
2628
2654
|
try:
|
|
2629
2655
|
from abstractcore.exceptions import ( # type: ignore
|
|
2630
2656
|
AuthenticationError,
|