AbstractRuntime 0.12.0__tar.gz → 0.13.1__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.1}/CHANGELOG.md +35 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/PKG-INFO +1 -1
- abstractruntime-0.13.1/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +74 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/README.md +2 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/api.md +2 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/README.md +3 -1
- abstractruntime-0.13.1/docs/backlog/completed/0851_per_account_voice_stores.md +51 -0
- abstractruntime-0.13.1/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +44 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/integrations/abstractcore.md +58 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/llms-full.txt +62 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/llms.txt +1 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/pyproject.toml +1 -1
- abstractruntime-0.13.1/release-notes.md +4 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/__init__.py +9 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +6 -2
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +24 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +26 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/email_facade.py +5 -2
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +73 -1
- abstractruntime-0.13.1/src/abstractruntime/integrations/abstractcore/voice_facade.py +154 -0
- abstractruntime-0.13.1/src/abstractruntime/integrations/abstractcore/voice_library.py +361 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_discovery_facade.py +1 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_review_fixes.py +4 -1
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_retry_classification.py +39 -0
- abstractruntime-0.13.1/tests/test_voice_library_facade.py +437 -0
- abstractruntime-0.12.0/release-notes.md +0 -52
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/.gitignore +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/LICENSE +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/ROADMAP.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/SECURITY.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/architecture.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/artifacts.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/automations.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/email.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/evidence.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/faq.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/getting-started.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/limits.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/manual_testing.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/proposal.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/provenance.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/snapshots.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/tool-approval.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/tools-comms.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/05_persistence.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/examples/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/mkdocs.yml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/pytest.ini +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/consumers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/samples.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/automations/wakes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/conversation_search.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/publish.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/run_origin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/mail_verbs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/change_ring.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/cloudevents.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/connection_events.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/connections.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/event_frame.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/feed.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/triggers/webhook.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/README.md +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/automation_harness.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/conftest.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/atom.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rss1.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/feeds/rss2.xml +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/fixtures/schedule_v1_corpus.json +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/media_endpoint_profile_probe.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_consumers_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_artifact_session_candidates.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_calendar_schedule.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_list_reads.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_named_policy_compiler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_code_node_imports.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_command_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_config_facade_voice_input_hint.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_conversation_search.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_model_warmup_switch.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_feeder_batched.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_feeder_flags.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_received_mailbox_id.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_stream_consumers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_media_in_process.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_event_index_cross_process.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mail_verbs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mailbox_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_host_endpoint_resolver.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_occurrence_named_inputs.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_occurrence_samples.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_offloading.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_publish_event.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_r12_workspace_sandbox.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_origin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_store_change_token.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_schedule_run.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_schedule_v1_corpus.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_schedule_v2_calendar.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_history.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_streamed_voice_namespace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_cloudevents.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_connection_listening.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_connections.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_feed.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trigger_webhook.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_trusted_run_index.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_loop_back_out_of_body.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_loop_limit_on_wire.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_reroute_lowering.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_set_vars_pins.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_voice_stream_is_not_a_wait.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.12.0 → abstractruntime-0.13.1}/tests/test_write_chart.py +0 -0
|
@@ -7,6 +7,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.13.1] - 2026-10-27
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `email_facade.resolve_srv_default` (AbstractCore's mailbox SRV lookup) is re-exported, so a host's mail code imports
|
|
15
|
+
it from the runtime facade like every other mail name.
|
|
16
|
+
|
|
17
|
+
## [0.13.0] - 2026-10-27
|
|
18
|
+
|
|
19
|
+
Requires AbstractCore 2.30.0 or newer. Personal voice stores need AbstractVoice 0.19.0.
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- The voice library runs on the capability registry the runtime's synthesis uses (same voice manager, settings and
|
|
24
|
+
stores); a model pool manages voices on its media host. `clone_voice(..., language=)` forwards the recording's language;
|
|
25
|
+
`clone_voice` answers the stored record, flat, with its `voice_id`, locally and remotely; a remote refusal keeps the
|
|
26
|
+
server's status (400, 401, 403, 404, 409, 413, 422, 429, 501, 503); an empty voice id is refused (422).
|
|
27
|
+
- **Per-runtime voice stores**: `voice_store_dir` and `voice_library_dirs` in a runtime's AbstractCore client settings give
|
|
28
|
+
it a personal voice store in front of read-only libraries; its synthesis, voice catalog and voice library use the same
|
|
29
|
+
stores. `deploy_voice_to_library(voice_id)` on the voice library facade (local runtimes). See
|
|
30
|
+
[Voice library](docs/integrations/abstractcore.md#voice-library).
|
|
31
|
+
|
|
32
|
+
- **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).
|
|
33
|
+
- **Voice catalog by language**: `get_voice_catalog(..., language=)` keeps the voices that can speak a language, native speakers first (local and remote).
|
|
34
|
+
- **`one_shot` on remote TTS**: a remote runtime forwards `one_shot` on buffered speech, as local runtimes already did.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- A voice request the voice plugin refuses (a plain `ValueError` or `KeyError` on a `modality: voice` output, such as
|
|
39
|
+
`one_shot` over an engine's length limit or an unknown voice id) and a missing capability
|
|
40
|
+
(`CapabilityUnavailableError`) fail the `LLM_CALL` effect at once instead of being retried: one engine call, the same
|
|
41
|
+
message. Other media lanes keep their retries.
|
|
42
|
+
- A remote AbstractCore server's 4xx refusal (other than 408, 409, 425, 429) is no longer retried: the status is read from
|
|
43
|
+
the HTTP error's response.
|
|
44
|
+
|
|
10
45
|
## [0.12.0] - 2026-10-27
|
|
11
46
|
|
|
12
47
|
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.1
|
|
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
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# ADR 0008: Runtime integration facades are the complete host surface for AbstractCore
|
|
2
|
+
|
|
3
|
+
Status: Accepted.
|
|
4
|
+
Date: 2026-10-27
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
Hosts (AbstractGateway first) depend on AbstractRuntime, and AbstractRuntime owns the
|
|
9
|
+
AbstractCore integration (ADR 0001, 0004-0007). The gateway enforces its side with a test that
|
|
10
|
+
fails on any direct `abstractcore` import. That rule only holds if every AbstractCore name a host
|
|
11
|
+
legitimately needs is reachable through a runtime facade. On 2026-10-27 the gateway's mailbox
|
|
12
|
+
code needed AbstractCore's SRV lookup (`resolve_srv_default`), the email facade did not re-export
|
|
13
|
+
it, and the host imported AbstractCore directly: the boundary test went red and stayed red
|
|
14
|
+
across a release line. The hole was not the import; it was a facade that lagged behind what the
|
|
15
|
+
host needed, with no rule saying whose job it was to close the gap.
|
|
16
|
+
|
|
17
|
+
## Decision
|
|
18
|
+
|
|
19
|
+
1. The modules under `abstractruntime.integrations.abstractcore` whose name ends in `_facade`
|
|
20
|
+
(discovery, host, config, run, email, structured, voice, telegram, comms, mcp, tool inventory,
|
|
21
|
+
server, data registry) are the ONLY surface through which a host reaches AbstractCore. They
|
|
22
|
+
are complete by contract: a name a host needs and cannot import from a facade is a runtime
|
|
23
|
+
defect, fixed by adding the re-export or method in the runtime and cutting a patch release.
|
|
24
|
+
2. A host never works around a missing name by importing `abstractcore` directly, vendoring the
|
|
25
|
+
code, or guessing a replacement. It raises the gap to the runtime (backlog item or PR) and
|
|
26
|
+
pins the runtime floor that carries the fix.
|
|
27
|
+
3. A re-export is unchanged in identity (`facade.name is abstractcore.module.name`) and listed in
|
|
28
|
+
the facade's `__all__`; the facade documents which AbstractCore version introduced the name.
|
|
29
|
+
4. The facades are additive within a minor line: a name, once exported, is not removed without
|
|
30
|
+
a deprecation note and a major or minor bump.
|
|
31
|
+
|
|
32
|
+
## Consequences
|
|
33
|
+
|
|
34
|
+
### Positive
|
|
35
|
+
- The host's boundary test is a true gate: green means every AbstractCore access is a runtime
|
|
36
|
+
facade, so a Core change breaks at most one package.
|
|
37
|
+
- Version floors stay layered: a host pins the runtime, the runtime pins Core.
|
|
38
|
+
|
|
39
|
+
### Negative
|
|
40
|
+
- A host feature that needs one new Core name waits for a runtime patch release (about 20
|
|
41
|
+
minutes with the release workflow), and the host's runtime floor moves with it.
|
|
42
|
+
- The runtime carries thin re-exports it does not use itself.
|
|
43
|
+
|
|
44
|
+
### Neutral
|
|
45
|
+
- Patch releases of the runtime for facade additions are normal, not exceptional.
|
|
46
|
+
|
|
47
|
+
## Enforcement
|
|
48
|
+
- Code review: a runtime PR that adds a host-facing Core name adds it to the facade's `__all__`
|
|
49
|
+
(and to a names list such as `email_facade.GATEWAY_NAMES` where one exists) with a one-line
|
|
50
|
+
comment naming the Core version and the host need.
|
|
51
|
+
- Hosts cite this ADR in their own boundary rule (AbstractGateway ADR 0001) and never add an
|
|
52
|
+
exemption to their import-boundary test for a name a facade could carry.
|
|
53
|
+
- A facade gap found during host work becomes a runtime backlog item or PR before the host
|
|
54
|
+
ships; the host's changelog names the runtime version that closes it.
|
|
55
|
+
|
|
56
|
+
## Validation
|
|
57
|
+
- `tests/test_email_review_fixes.py`: the email facade's export set equals Core's plus the
|
|
58
|
+
runtime's additions, every `GATEWAY_NAMES` entry imports, and re-exports keep identity.
|
|
59
|
+
- AbstractGateway `tests/test_gateway_import_boundary.py` stays green against the released
|
|
60
|
+
runtime floor the gateway pins.
|
|
61
|
+
- Release check: the runtime's docs list each facade's host-facing names
|
|
62
|
+
(`docs/integrations/abstractcore.md`, `docs/api.md`).
|
|
63
|
+
|
|
64
|
+
## Backlog links
|
|
65
|
+
- Originating: AbstractGateway backlog 1044 (mailbox Read and write access) needed
|
|
66
|
+
`resolve_srv_default`; closed by runtime 0.13.1 (`email_facade.resolve_srv_default`).
|
|
67
|
+
- Adoption: AbstractGateway `tests/test_gateway_import_boundary.py` (backlog 0059).
|
|
68
|
+
|
|
69
|
+
## Related
|
|
70
|
+
- ADR 0001 (layered coupling), 0004 (media execution), 0005 (discovery queries), 0006 (bloc
|
|
71
|
+
prompt cache): the per-area facades this ADR generalises.
|
|
72
|
+
- `src/abstractruntime/integrations/abstractcore/email_facade.py`, `voice_facade.py`,
|
|
73
|
+
`discovery_facade.py`.
|
|
74
|
+
- AbstractGateway ADR 0001: AbstractCore access goes through AbstractRuntime facades.
|
|
@@ -20,6 +20,7 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
|
|
|
20
20
|
| 0005 | [Runtime Owns AbstractCore Host Discovery Queries](0005_runtime_owns_abstractcore_host_discovery_queries.md) | Accepted | 2026-05-20 | Hosts should ask Runtime for Core discovery/catalog snapshots |
|
|
21
21
|
| 0006 | [Runtime Owns Durable AbstractCore Bloc Prompt-Cache Control](0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md) | Accepted | 2026-05-20 | Hosts should use Runtime for durable bloc/KV controls and binding-aware execution |
|
|
22
22
|
| 0007 | [Runtime Relays Core-Owned Model Residency Truth](0007_runtime_relays_core_owned_model_residency_truth.md) | Accepted | 2026-05-21 | Runtime reports loaded state only from AbstractCore residency truth |
|
|
23
|
+
| 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name a host needs is a runtime facade re-export; a gap is a runtime patch, never a host import |
|
|
23
24
|
|
|
24
25
|
## Relationship to Backlog
|
|
25
26
|
|
|
@@ -34,6 +35,7 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
|
|
|
34
35
|
| 0005 | `backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
|
|
35
36
|
| 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
|
|
36
37
|
| 0007 | `backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md`, `backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md` |
|
|
38
|
+
| 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
|
|
37
39
|
|
|
38
40
|
## Adding New ADRs
|
|
39
41
|
|
|
@@ -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.
|
|
@@ -6228,6 +6287,7 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
|
|
|
6228
6287
|
| 0005 | [Runtime Owns AbstractCore Host Discovery Queries](0005_runtime_owns_abstractcore_host_discovery_queries.md) | Accepted | 2026-05-20 | Hosts should ask Runtime for Core discovery/catalog snapshots |
|
|
6229
6288
|
| 0006 | [Runtime Owns Durable AbstractCore Bloc Prompt-Cache Control](0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md) | Accepted | 2026-05-20 | Hosts should use Runtime for durable bloc/KV controls and binding-aware execution |
|
|
6230
6289
|
| 0007 | [Runtime Relays Core-Owned Model Residency Truth](0007_runtime_relays_core_owned_model_residency_truth.md) | Accepted | 2026-05-21 | Runtime reports loaded state only from AbstractCore residency truth |
|
|
6290
|
+
| 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name a host needs is a runtime facade re-export; a gap is a runtime patch, never a host import |
|
|
6231
6291
|
|
|
6232
6292
|
## Relationship to Backlog
|
|
6233
6293
|
|
|
@@ -6242,6 +6302,7 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
|
|
|
6242
6302
|
| 0005 | `backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
|
|
6243
6303
|
| 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
|
|
6244
6304
|
| 0007 | `backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md`, `backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md` |
|
|
6305
|
+
| 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
|
|
6245
6306
|
|
|
6246
6307
|
## Adding New ADRs
|
|
6247
6308
|
|
|
@@ -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.
|
|
@@ -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
|
)
|