AbstractRuntime 0.9.0__tar.gz → 0.9.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.9.0 → abstractruntime-0.9.1}/CHANGELOG.md +15 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/PKG-INFO +4 -4
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/integrations/abstractcore.md +9 -2
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/llms-full.txt +9 -2
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/llms.txt +1 -1
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/pyproject.toml +6 -4
- abstractruntime-0.9.1/release-notes.md +12 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/__init__.py +4 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +117 -114
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +7 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_browser_probe_target_walling.py +15 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_packaging_extras.py +3 -3
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_r12_workspace_sandbox.py +36 -2
- abstractruntime-0.9.1/tests/test_voice_stream_is_not_a_wait.py +256 -0
- abstractruntime-0.9.0/release-notes.md +0 -23
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/.gitignore +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/LICENSE +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/ROADMAP.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/SECURITY.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/adr/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/api.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/architecture.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/artifacts.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/automations.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/email.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/evidence.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/faq.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/getting-started.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/limits.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/manual_testing.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/proposal.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/provenance.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/snapshots.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/tool-approval.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/tools-comms.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/05_persistence.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/examples/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/mkdocs.yml +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/pytest.ini +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/README.md +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/automation_harness.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/conftest.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_command_store.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_offloading.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_history.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.9.0 → abstractruntime-0.9.1}/tests/test_write_chart.py +0 -0
|
@@ -5,6 +5,21 @@ All notable changes to AbstractRuntime will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.9.1] - 2026-10-08
|
|
9
|
+
|
|
10
|
+
### Security
|
|
11
|
+
|
|
12
|
+
- `browser_probe`: a local target (path or `file://` URL) now carries the run's `_sandbox` stamp, the same scope the commands get. AbstractCore 2.25.1 serves the page from a loopback origin limited to that scope instead of `file://`, so a page cannot load refused files as subresources. Needs AbstractCore 2.25.1 (an older `browser_probe` refuses the unknown argument and runs nothing). Test: `tests/test_browser_probe_target_walling.py`.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- `stream_voice(...)` is never a wait. It used to start the child run parked on `WAIT_EVENT abstractcore.voice.tts.stream:<uuid>` for the whole stream: hosts folded that waiting record into the CALLER'S run (a Read aloud during a live turn read as "Waiting for an event"), and a host that died mid-stream left the child waiting forever. Now nothing durable exists while audio streams; when the stream ends (done, error, cancel or the consumer closing it) the child run is created already COMPLETED with the outcome. Its id is allocated up front: `runtime_start` carries it as `child_run_id` (schema `abstractruntime.tts_stream.start.v2`, no `wait_key`), as does the trace metadata. A stream cut by a crash leaves no run.
|
|
17
|
+
- `AbstractCoreRunFacade.close_interrupted_voice_stream(child_run_id, *, reason)` finishes a legacy streamed-speech wait left by an older process (completed, `errors[0] = {"code": "interrupted", "message": reason}`); `is_interrupted_voice_stream_wait(waiting)` and `LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX` recognise one (exported from `integrations.abstractcore`). AbstractGateway calls it at startup.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Requires AbstractCore 2.25.1 or newer (`abstractcore>=2.25.1` in the base install and the `[apple]`/`[gpu]` extras): the Linux command sandbox reaches an allowed folder inside a refused one, and `browser_probe` accepts the run's `_sandbox` stamp.
|
|
22
|
+
|
|
8
23
|
## [0.9.0] - 2026-10-05
|
|
9
24
|
|
|
10
25
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.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
|
|
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
|
-
Requires-Dist: abstractcore>=2.25.
|
|
23
|
+
Requires-Dist: abstractcore>=2.25.1
|
|
24
24
|
Requires-Dist: abstractmemory>=0.3.0
|
|
25
25
|
Requires-Dist: abstractsemantics>=0.0.5
|
|
26
26
|
Requires-Dist: anyio<5.0.0,>=4.12.1
|
|
@@ -35,14 +35,14 @@ Requires-Dist: reportlab<5.0.0,>=4.0.0
|
|
|
35
35
|
Requires-Dist: restrictedpython>=7.0
|
|
36
36
|
Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<0.19.0,>=0.18.32
|
|
37
37
|
Provides-Extra: apple
|
|
38
|
-
Requires-Dist: abstractcore[apple]>=2.25.
|
|
38
|
+
Requires-Dist: abstractcore[apple]>=2.25.1; extra == 'apple'
|
|
39
39
|
Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
|
|
40
40
|
Provides-Extra: docs
|
|
41
41
|
Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
|
|
42
42
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
43
43
|
Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
|
|
44
44
|
Provides-Extra: gpu
|
|
45
|
-
Requires-Dist: abstractcore[gpu]>=2.25.
|
|
45
|
+
Requires-Dist: abstractcore[gpu]>=2.25.1; extra == 'gpu'
|
|
46
46
|
Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
|
|
47
47
|
Provides-Extra: test
|
|
48
48
|
Requires-Dist: aiosmtpd<2.0.0,>=1.4.4; extra == 'test'
|
|
@@ -506,6 +506,7 @@ Lists accept a JSON array, a JSON array pasted as a string, or newline-separated
|
|
|
506
506
|
- Child runs (subworkflows and agent delegation) inherit the workspace vars unless they set their own; VisualFlow file and document nodes (`read_file`, `write_file`, `read_pdf`, `write_pdf`, `write_docx`, `write_chart`) apply the same scope.
|
|
507
507
|
- **Nesting (most specific row wins).** For a path P (symlinks resolved), the candidates are `workspace_root` (read & write), `workspace_allowed_paths` (not under `workspace_only`) and `workspace_ignored_paths`. The longest candidate that contains P decides: a refused entry refuses, the root or an allowed entry allows; a tie between a refused entry and an allowed one (or the root) at the same path refuses; no candidate falls back to the access mode (`all_except_ignored` allows, the others refuse). The host's built-in protection is absolute: under a `workspace_builtin_deny_prefixes` entry and not under a `workspace_builtin_allow` entry is refused whatever the rows say. So refusing `/Users/me` and allowing `/Users/me/project` makes the project reachable and the rest of `/Users/me` refused; a refused folder inside an allowed one refuses that subtree. AbstractGateway applies the same rule when it validates and computes a run's workspaces.
|
|
508
508
|
- **Command sandbox.** `execute_command`, `shell_exec` (the whole persistent session), `local_helper_start` and AbstractAgent's `execute_python` (0.3.18 or newer) start in the workspace and run inside an OS sandbox built from the SAME scope (`sandbox_stamp(scope)`, stamped on every call as the hidden `_sandbox` argument; a model- or payload-supplied value is always replaced). AbstractCore (`abstractcore.tools.sandbox`) applies it: macOS `sandbox-exec`, Linux `bwrap`, or Linux Landlock for "Deny everything, allow listed workspaces". Mapping: `all_except_ignored` → "Allow everything, refuse listed workspaces" (`any_except_denied`), otherwise "Deny everything, allow listed workspaces" (`allowed_only`); a `"/"` read-only root → read-only default; each allowed workspace with its mode; refused paths and the built-in protection as they are. The command string is never parsed — `cd ..`, absolute paths, `$(…)`, symlinks and scripts are stopped by the kernel. With no sandbox on the host, or an AbstractCore without `abstractcore.tools.sandbox`, the command is refused with one sentence and the run continues. The entity exec tool runs inside a sandbox limited to the entity's workspace and its whitelisted mounts. The tool result carries `sandbox: {kind, …}` and a `Sandbox: …` line; the stamp rides the tool call in the run's evidence. Hosts set the host policy (the scrubbed environment commands start from, and whether unsandboxed commands are allowed on a host with no sandbox) once at boot through `abstractruntime.integrations.abstractcore.command_sandbox_host` (`configure_host`, `host_policy`, `host_sandbox_kind`), never by importing AbstractCore.
|
|
509
|
+
- **Browser probe.** A local `browser_probe` target (a path or a `file://` URL) is walled like `read_file`'s path and carries the same `_sandbox` stamp: AbstractCore 2.25.1 serves the page to the browser from a loopback origin that answers only for files this scope can read (never `file://`). Remote `http(s)://` targets carry no stamp.
|
|
509
510
|
|
|
510
511
|
## Prompt-cache control plane and durable blocs
|
|
511
512
|
|
|
@@ -1048,8 +1049,14 @@ Public durable entry points:
|
|
|
1048
1049
|
These helpers create child runs under an existing parent run and execute the real
|
|
1049
1050
|
`LLM_CALL`, `TOOL_CALLS`, or stream finalization through Runtime rather than
|
|
1050
1051
|
doing external work in host/controller code. `stream_voice(...)` yields TTS
|
|
1051
|
-
stream events for progressive playback
|
|
1052
|
-
|
|
1052
|
+
stream events for progressive playback; it is never a wait: nothing durable
|
|
1053
|
+
exists while audio streams, and when the stream ends (done, error, cancel or
|
|
1054
|
+
the consumer closing it) the child run is created already completed with the
|
|
1055
|
+
outcome (the final audio artifact on success). The child's id is announced up
|
|
1056
|
+
front in the `runtime_start` event (`child_run_id`). A host that finds a
|
|
1057
|
+
streamed-speech wait left by a runtime before this behaviour
|
|
1058
|
+
(`is_interrupted_voice_stream_wait`) closes it with
|
|
1059
|
+
`close_interrupted_voice_stream(child_run_id, reason=...)`.
|
|
1053
1060
|
|
|
1054
1061
|
Example:
|
|
1055
1062
|
|
|
@@ -2480,6 +2480,7 @@ Lists accept a JSON array, a JSON array pasted as a string, or newline-separated
|
|
|
2480
2480
|
- Child runs (subworkflows and agent delegation) inherit the workspace vars unless they set their own; VisualFlow file and document nodes (`read_file`, `write_file`, `read_pdf`, `write_pdf`, `write_docx`, `write_chart`) apply the same scope.
|
|
2481
2481
|
- **Nesting (most specific row wins).** For a path P (symlinks resolved), the candidates are `workspace_root` (read & write), `workspace_allowed_paths` (not under `workspace_only`) and `workspace_ignored_paths`. The longest candidate that contains P decides: a refused entry refuses, the root or an allowed entry allows; a tie between a refused entry and an allowed one (or the root) at the same path refuses; no candidate falls back to the access mode (`all_except_ignored` allows, the others refuse). The host's built-in protection is absolute: under a `workspace_builtin_deny_prefixes` entry and not under a `workspace_builtin_allow` entry is refused whatever the rows say. So refusing `/Users/me` and allowing `/Users/me/project` makes the project reachable and the rest of `/Users/me` refused; a refused folder inside an allowed one refuses that subtree. AbstractGateway applies the same rule when it validates and computes a run's workspaces.
|
|
2482
2482
|
- **Command sandbox.** `execute_command`, `shell_exec` (the whole persistent session), `local_helper_start` and AbstractAgent's `execute_python` (0.3.18 or newer) start in the workspace and run inside an OS sandbox built from the SAME scope (`sandbox_stamp(scope)`, stamped on every call as the hidden `_sandbox` argument; a model- or payload-supplied value is always replaced). AbstractCore (`abstractcore.tools.sandbox`) applies it: macOS `sandbox-exec`, Linux `bwrap`, or Linux Landlock for "Deny everything, allow listed workspaces". Mapping: `all_except_ignored` → "Allow everything, refuse listed workspaces" (`any_except_denied`), otherwise "Deny everything, allow listed workspaces" (`allowed_only`); a `"/"` read-only root → read-only default; each allowed workspace with its mode; refused paths and the built-in protection as they are. The command string is never parsed — `cd ..`, absolute paths, `$(…)`, symlinks and scripts are stopped by the kernel. With no sandbox on the host, or an AbstractCore without `abstractcore.tools.sandbox`, the command is refused with one sentence and the run continues. The entity exec tool runs inside a sandbox limited to the entity's workspace and its whitelisted mounts. The tool result carries `sandbox: {kind, …}` and a `Sandbox: …` line; the stamp rides the tool call in the run's evidence. Hosts set the host policy (the scrubbed environment commands start from, and whether unsandboxed commands are allowed on a host with no sandbox) once at boot through `abstractruntime.integrations.abstractcore.command_sandbox_host` (`configure_host`, `host_policy`, `host_sandbox_kind`), never by importing AbstractCore.
|
|
2483
|
+
- **Browser probe.** A local `browser_probe` target (a path or a `file://` URL) is walled like `read_file`'s path and carries the same `_sandbox` stamp: AbstractCore 2.25.1 serves the page to the browser from a loopback origin that answers only for files this scope can read (never `file://`). Remote `http(s)://` targets carry no stamp.
|
|
2483
2484
|
|
|
2484
2485
|
## Prompt-cache control plane and durable blocs
|
|
2485
2486
|
|
|
@@ -3022,8 +3023,14 @@ Public durable entry points:
|
|
|
3022
3023
|
These helpers create child runs under an existing parent run and execute the real
|
|
3023
3024
|
`LLM_CALL`, `TOOL_CALLS`, or stream finalization through Runtime rather than
|
|
3024
3025
|
doing external work in host/controller code. `stream_voice(...)` yields TTS
|
|
3025
|
-
stream events for progressive playback
|
|
3026
|
-
|
|
3026
|
+
stream events for progressive playback; it is never a wait: nothing durable
|
|
3027
|
+
exists while audio streams, and when the stream ends (done, error, cancel or
|
|
3028
|
+
the consumer closing it) the child run is created already completed with the
|
|
3029
|
+
outcome (the final audio artifact on success). The child's id is announced up
|
|
3030
|
+
front in the `runtime_start` event (`child_run_id`). A host that finds a
|
|
3031
|
+
streamed-speech wait left by a runtime before this behaviour
|
|
3032
|
+
(`is_interrupted_voice_stream_wait`) closes it with
|
|
3033
|
+
`close_interrupted_voice_stream(child_run_id, reason=...)`.
|
|
3027
3034
|
|
|
3028
3035
|
Example:
|
|
3029
3036
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
|
|
4
4
|
|
|
5
5
|
- Python: 3.10+ (see `pyproject.toml`)
|
|
6
|
-
- Version: 0.9.
|
|
6
|
+
- Version: 0.9.1
|
|
7
7
|
- Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
|
|
8
8
|
- Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
|
|
9
9
|
- Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.24.0 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "AbstractRuntime"
|
|
7
|
-
version = "0.9.
|
|
7
|
+
version = "0.9.1"
|
|
8
8
|
description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -53,7 +53,9 @@ dependencies = [
|
|
|
53
53
|
# plugins) without selecting local inference engines. 2.19.2 floors
|
|
54
54
|
# abstractvision>=0.3.33, whose resident loads report `loaded_new` and whose
|
|
55
55
|
# unload frees the pipeline (the resident media path relies on both).
|
|
56
|
-
|
|
56
|
+
# 2.25.1: the Linux bwrap profile binds an allowed child of a refused folder,
|
|
57
|
+
# and browser_probe takes the _sandbox stamp (scoped loopback origin).
|
|
58
|
+
"abstractcore>=2.25.1",
|
|
57
59
|
"openai<3.0.0,>=1.109.1",
|
|
58
60
|
"httpx<1.0.0,>=0.28.1",
|
|
59
61
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -70,12 +72,12 @@ dependencies = [
|
|
|
70
72
|
|
|
71
73
|
[project.optional-dependencies]
|
|
72
74
|
apple = [
|
|
73
|
-
"abstractcore[apple]>=2.25.
|
|
75
|
+
"abstractcore[apple]>=2.25.1",
|
|
74
76
|
"setuptools<82.0.0,>=80.10.2",
|
|
75
77
|
]
|
|
76
78
|
|
|
77
79
|
gpu = [
|
|
78
|
-
"abstractcore[gpu]>=2.25.
|
|
80
|
+
"abstractcore[gpu]>=2.25.1",
|
|
79
81
|
# vLLM 0.9-0.19 caps setuptools below 80; 77.0.3 is still a modern floor.
|
|
80
82
|
"setuptools<82.0.0,>=77.0.3",
|
|
81
83
|
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
### Security
|
|
2
|
+
|
|
3
|
+
- `browser_probe`: a local target (path or `file://` URL) now carries the run's `_sandbox` stamp, the same scope the commands get. AbstractCore 2.25.1 serves the page from a loopback origin limited to that scope instead of `file://`, so a page cannot load refused files as subresources. Needs AbstractCore 2.25.1 (an older `browser_probe` refuses the unknown argument and runs nothing). Test: `tests/test_browser_probe_target_walling.py`.
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- `stream_voice(...)` is never a wait. It used to start the child run parked on `WAIT_EVENT abstractcore.voice.tts.stream:<uuid>` for the whole stream: hosts folded that waiting record into the CALLER'S run (a Read aloud during a live turn read as "Waiting for an event"), and a host that died mid-stream left the child waiting forever. Now nothing durable exists while audio streams; when the stream ends (done, error, cancel or the consumer closing it) the child run is created already COMPLETED with the outcome. Its id is allocated up front: `runtime_start` carries it as `child_run_id` (schema `abstractruntime.tts_stream.start.v2`, no `wait_key`), as does the trace metadata. A stream cut by a crash leaves no run.
|
|
8
|
+
- `AbstractCoreRunFacade.close_interrupted_voice_stream(child_run_id, *, reason)` finishes a legacy streamed-speech wait left by an older process (completed, `errors[0] = {"code": "interrupted", "message": reason}`); `is_interrupted_voice_stream_wait(waiting)` and `LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX` recognise one (exported from `integrations.abstractcore`). AbstractGateway calls it at startup.
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Requires AbstractCore 2.25.1 or newer (`abstractcore>=2.25.1` in the base install and the `[apple]`/`[gpu]` extras): the Linux command sandbox reaches an allowed folder inside a refused one, and `browser_probe` accepts the run's `_sandbox` stamp.
|
|
@@ -46,8 +46,10 @@ from .discovery_facade import (
|
|
|
46
46
|
get_abstractcore_discovery_facade,
|
|
47
47
|
)
|
|
48
48
|
from .run_facade import (
|
|
49
|
+
LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX,
|
|
49
50
|
AbstractCoreRunFacade,
|
|
50
51
|
get_abstractcore_run_facade,
|
|
52
|
+
is_interrupted_voice_stream_wait,
|
|
51
53
|
)
|
|
52
54
|
from .telegram_facade import (
|
|
53
55
|
TelegramTdlibNotAvailable,
|
|
@@ -108,6 +110,8 @@ __all__ = [
|
|
|
108
110
|
"ResponseFormatError",
|
|
109
111
|
"get_global_telegram_client",
|
|
110
112
|
"get_abstractcore_run_facade",
|
|
113
|
+
"is_interrupted_voice_stream_wait",
|
|
114
|
+
"LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX",
|
|
111
115
|
"create_local_runtime",
|
|
112
116
|
"create_remote_runtime",
|
|
113
117
|
"create_hybrid_runtime",
|
|
@@ -191,30 +191,26 @@ def _build_tool_calls_resume_workflow(
|
|
|
191
191
|
)
|
|
192
192
|
|
|
193
193
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
) ->
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
result_key=result_key,
|
|
215
|
-
),
|
|
216
|
-
next_node="done",
|
|
217
|
-
)
|
|
194
|
+
# Legacy (runtimes before R13.1): the streamed-speech child run waited on this
|
|
195
|
+
# key prefix for the whole stream. No new run waits on it; hosts finish the
|
|
196
|
+
# ones a dead process left behind (`close_interrupted_voice_stream`).
|
|
197
|
+
LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX = "abstractcore.voice.tts.stream:"
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def is_interrupted_voice_stream_wait(waiting: Any) -> bool:
|
|
201
|
+
"""True for a legacy streamed-speech wait (by key prefix or the stream's details mode)."""
|
|
202
|
+
|
|
203
|
+
key = str(getattr(waiting, "wait_key", "") or "")
|
|
204
|
+
details = getattr(waiting, "details", None)
|
|
205
|
+
mode = details.get("mode") if isinstance(details, dict) else None
|
|
206
|
+
return key.startswith(LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX) or mode == "abstractcore_voice_stream"
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _build_stream_record_workflow(*, workflow_id: str, result_key: str) -> WorkflowSpec:
|
|
210
|
+
"""One node that completes with ``vars[result_key]`` (the stream's outcome).
|
|
211
|
+
|
|
212
|
+
Also the resume target for a legacy stream wait (its resume node was
|
|
213
|
+
``done``)."""
|
|
218
214
|
|
|
219
215
|
def done(run: RunState, ctx: Any) -> StepPlan:
|
|
220
216
|
_ = ctx
|
|
@@ -225,8 +221,8 @@ def _build_stream_wait_workflow(
|
|
|
225
221
|
|
|
226
222
|
return WorkflowSpec(
|
|
227
223
|
workflow_id=workflow_id,
|
|
228
|
-
entry_node="
|
|
229
|
-
nodes={"
|
|
224
|
+
entry_node="done",
|
|
225
|
+
nodes={"done": done},
|
|
230
226
|
)
|
|
231
227
|
|
|
232
228
|
|
|
@@ -572,7 +568,19 @@ class AbstractCoreRunFacade:
|
|
|
572
568
|
params: Optional[Dict[str, Any]] = None,
|
|
573
569
|
child_vars: Optional[Dict[str, Any]] = None,
|
|
574
570
|
):
|
|
575
|
-
"""
|
|
571
|
+
"""Yield Runtime-owned TTS stream events; record a durable child run when the stream ends.
|
|
572
|
+
|
|
573
|
+
The stream is NOT a wait (R13.1, 2026-10-04). It used to start a child
|
|
574
|
+
run parked on ``WAIT_EVENT abstractcore.voice.tts.stream:<uuid>`` for
|
|
575
|
+
the whole stream: clients folded that waiting record into the parent
|
|
576
|
+
run (a Read aloud during a live turn showed "Waiting for an event"),
|
|
577
|
+
and a gateway restart mid-stream left the child WAITING forever with
|
|
578
|
+
nothing able to resume it. Now nothing durable exists while audio is
|
|
579
|
+
produced; when the stream ends (done, error, cancel or disconnect) the
|
|
580
|
+
child run is created already COMPLETED with the outcome — the id is
|
|
581
|
+
allocated up front and announced in the ``runtime_start`` event and
|
|
582
|
+
the trace metadata. A crash mid-stream leaves no run behind.
|
|
583
|
+
"""
|
|
576
584
|
|
|
577
585
|
client = getattr(self._runtime, "_abstractcore_llm_client", None)
|
|
578
586
|
stream_fn = getattr(client, "stream_tts", None)
|
|
@@ -584,40 +592,39 @@ class AbstractCoreRunFacade:
|
|
|
584
592
|
if isinstance(output, dict):
|
|
585
593
|
spec.update(copy.deepcopy(output))
|
|
586
594
|
stream_params = copy.deepcopy(params) if isinstance(params, dict) else {}
|
|
587
|
-
wait_key = f"abstractcore.voice.tts.stream:{uuid.uuid4()}"
|
|
588
595
|
result_key = _RESULT_KEY
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
"text": str(text or ""),
|
|
592
|
-
"output": copy.deepcopy(spec),
|
|
593
|
-
"params": copy.deepcopy(stream_params),
|
|
594
|
-
}
|
|
595
|
-
workflow = _build_stream_wait_workflow(
|
|
596
|
+
child_run_id = str(uuid.uuid4())
|
|
597
|
+
workflow = _build_stream_record_workflow(
|
|
596
598
|
workflow_id=f"{_workflow_id_for_output(spec)}_stream",
|
|
597
|
-
wait_key=wait_key,
|
|
598
|
-
payload=payload,
|
|
599
599
|
result_key=result_key,
|
|
600
600
|
)
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
601
|
+
recorded: Dict[str, Any] = {"state": None}
|
|
602
|
+
|
|
603
|
+
def _record(final_result: Dict[str, Any]) -> RunState:
|
|
604
|
+
if recorded["state"] is not None:
|
|
605
|
+
return recorded["state"]
|
|
606
|
+
record_vars = _build_child_vars(parent=parent, child_vars=child_vars)
|
|
607
|
+
record_vars[result_key] = copy.deepcopy(final_result)
|
|
608
|
+
started = self._runtime.start(
|
|
609
|
+
workflow=workflow,
|
|
610
|
+
vars=record_vars,
|
|
611
|
+
actor_id=parent.actor_id,
|
|
612
|
+
session_id=parent.session_id,
|
|
613
|
+
parent_run_id=parent.run_id,
|
|
614
|
+
run_id=child_run_id,
|
|
615
|
+
)
|
|
616
|
+
recorded["state"] = self._tick(workflow=workflow, run_id=started)
|
|
617
|
+
return recorded["state"]
|
|
611
618
|
|
|
612
619
|
cancel_event = threading.Event()
|
|
613
620
|
trace_metadata = dict(stream_params.get("trace_metadata") or {}) if isinstance(stream_params.get("trace_metadata"), dict) else {}
|
|
614
|
-
trace_metadata.setdefault("run_id",
|
|
621
|
+
trace_metadata.setdefault("run_id", child_run_id)
|
|
615
622
|
trace_metadata.setdefault("parent_run_id", parent.run_id)
|
|
616
623
|
if parent.session_id is not None:
|
|
617
624
|
trace_metadata.setdefault("session_id", parent.session_id)
|
|
618
625
|
if parent.actor_id is not None:
|
|
619
626
|
trace_metadata.setdefault("actor_id", parent.actor_id)
|
|
620
|
-
trace_metadata.setdefault("workflow_id",
|
|
627
|
+
trace_metadata.setdefault("workflow_id", workflow.workflow_id)
|
|
621
628
|
stream_params["trace_metadata"] = trace_metadata
|
|
622
629
|
stream_params["output"] = copy.deepcopy(spec)
|
|
623
630
|
stream_params["cancel_event"] = cancel_event
|
|
@@ -649,82 +656,43 @@ class AbstractCoreRunFacade:
|
|
|
649
656
|
"metadata": {"streaming": True, "terminal_event": copy.deepcopy(event)},
|
|
650
657
|
}
|
|
651
658
|
|
|
652
|
-
def
|
|
653
|
-
|
|
654
|
-
"type": "cancelled",
|
|
655
|
-
"ok": False,
|
|
656
|
-
"cancelled": True,
|
|
657
|
-
"error": str(reason or "TTS stream was cancelled."),
|
|
658
|
-
"child_run_id": child.run_id,
|
|
659
|
-
"run_id": parent.run_id,
|
|
660
|
-
}
|
|
661
|
-
try:
|
|
662
|
-
self._resume(
|
|
663
|
-
workflow=workflow,
|
|
664
|
-
run_id=child.run_id,
|
|
665
|
-
wait_key=wait_key,
|
|
666
|
-
payload=_final_result_for_event(event),
|
|
667
|
-
max_steps=100,
|
|
668
|
-
)
|
|
669
|
-
return
|
|
670
|
-
except Exception:
|
|
671
|
-
pass
|
|
672
|
-
cancel_run = getattr(self._runtime, "cancel_run", None)
|
|
673
|
-
if callable(cancel_run):
|
|
674
|
-
try:
|
|
675
|
-
cancel_run(child.run_id, reason=str(reason or "TTS stream was cancelled."))
|
|
676
|
-
except Exception:
|
|
677
|
-
pass
|
|
659
|
+
def _status(state: RunState) -> str:
|
|
660
|
+
return str(state.status.value if hasattr(state.status, "value") else state.status)
|
|
678
661
|
|
|
679
662
|
def _events():
|
|
680
663
|
terminal_seen = False
|
|
681
664
|
try:
|
|
682
665
|
yield {
|
|
683
666
|
"type": "runtime_start",
|
|
684
|
-
"schema": "abstractruntime.tts_stream.start.
|
|
667
|
+
"schema": "abstractruntime.tts_stream.start.v2",
|
|
685
668
|
"ok": True,
|
|
686
669
|
"run_id": parent.run_id,
|
|
687
|
-
"child_run_id":
|
|
688
|
-
"
|
|
689
|
-
"durability": "runtime_child_run",
|
|
670
|
+
"child_run_id": child_run_id,
|
|
671
|
+
"durability": "runtime_child_run_on_completion",
|
|
690
672
|
"transport": "jsonl",
|
|
691
673
|
"chunk_format": "wav-segment",
|
|
692
674
|
}
|
|
693
675
|
for raw_event in stream:
|
|
694
676
|
event = dict(raw_event) if isinstance(raw_event, dict) else {"type": "event", "value": str(raw_event)}
|
|
695
|
-
event.setdefault("child_run_id",
|
|
677
|
+
event.setdefault("child_run_id", child_run_id)
|
|
696
678
|
event.setdefault("run_id", parent.run_id)
|
|
697
679
|
event_type = str(event.get("type") or "").strip().lower()
|
|
698
680
|
if event_type in {"done", "cancelled", "error"}:
|
|
699
681
|
terminal_seen = True
|
|
700
|
-
|
|
701
|
-
final_state = self._resume(
|
|
702
|
-
workflow=workflow,
|
|
703
|
-
run_id=child.run_id,
|
|
704
|
-
wait_key=wait_key,
|
|
705
|
-
payload=final_result,
|
|
706
|
-
max_steps=100,
|
|
707
|
-
)
|
|
708
|
-
event["child_run_status"] = str(final_state.status.value if hasattr(final_state.status, "value") else final_state.status)
|
|
682
|
+
event["child_run_status"] = _status(_record(_final_result_for_event(event)))
|
|
709
683
|
yield event
|
|
710
684
|
return
|
|
711
685
|
yield event
|
|
712
686
|
if not terminal_seen:
|
|
687
|
+
terminal_seen = True
|
|
713
688
|
event = {
|
|
714
689
|
"type": "error",
|
|
715
690
|
"ok": False,
|
|
716
691
|
"error": "TTS stream ended without a terminal event.",
|
|
717
|
-
"child_run_id":
|
|
692
|
+
"child_run_id": child_run_id,
|
|
718
693
|
"run_id": parent.run_id,
|
|
719
694
|
}
|
|
720
|
-
|
|
721
|
-
workflow=workflow,
|
|
722
|
-
run_id=child.run_id,
|
|
723
|
-
wait_key=wait_key,
|
|
724
|
-
payload=_final_result_for_event(event),
|
|
725
|
-
max_steps=100,
|
|
726
|
-
)
|
|
727
|
-
event["child_run_status"] = str(final_state.status.value if hasattr(final_state.status, "value") else final_state.status)
|
|
695
|
+
event["child_run_status"] = _status(_record(_final_result_for_event(event)))
|
|
728
696
|
yield event
|
|
729
697
|
except GeneratorExit:
|
|
730
698
|
cancel_event.set()
|
|
@@ -735,36 +703,69 @@ class AbstractCoreRunFacade:
|
|
|
735
703
|
except Exception:
|
|
736
704
|
pass
|
|
737
705
|
if not terminal_seen:
|
|
738
|
-
|
|
706
|
+
try:
|
|
707
|
+
_record(
|
|
708
|
+
_final_result_for_event(
|
|
709
|
+
{
|
|
710
|
+
"type": "cancelled",
|
|
711
|
+
"ok": False,
|
|
712
|
+
"cancelled": True,
|
|
713
|
+
"error": "TTS stream disconnected before completion",
|
|
714
|
+
"child_run_id": child_run_id,
|
|
715
|
+
"run_id": parent.run_id,
|
|
716
|
+
}
|
|
717
|
+
)
|
|
718
|
+
)
|
|
719
|
+
except Exception:
|
|
720
|
+
pass
|
|
739
721
|
raise
|
|
740
722
|
except Exception as exc:
|
|
741
723
|
event = {
|
|
742
724
|
"type": "error",
|
|
743
725
|
"ok": False,
|
|
744
726
|
"error": str(exc),
|
|
745
|
-
"child_run_id":
|
|
727
|
+
"child_run_id": child_run_id,
|
|
746
728
|
"run_id": parent.run_id,
|
|
747
729
|
}
|
|
748
730
|
try:
|
|
749
|
-
|
|
750
|
-
workflow=workflow,
|
|
751
|
-
run_id=child.run_id,
|
|
752
|
-
wait_key=wait_key,
|
|
753
|
-
payload=_final_result_for_event(event),
|
|
754
|
-
max_steps=100,
|
|
755
|
-
)
|
|
756
|
-
event["child_run_status"] = str(final_state.status.value if hasattr(final_state.status, "value") else final_state.status)
|
|
731
|
+
event["child_run_status"] = _status(_record(_final_result_for_event(event)))
|
|
757
732
|
except Exception:
|
|
758
|
-
|
|
759
|
-
if callable(cancel_run):
|
|
760
|
-
try:
|
|
761
|
-
cancel_run(child.run_id, reason=str(exc))
|
|
762
|
-
except Exception:
|
|
763
|
-
pass
|
|
733
|
+
pass
|
|
764
734
|
yield event
|
|
765
735
|
|
|
766
736
|
return _events()
|
|
767
737
|
|
|
738
|
+
def close_interrupted_voice_stream(self, child_run_id: str, *, reason: str) -> RunState:
|
|
739
|
+
"""Finish a LEGACY streamed-speech child run left WAITING by a process that died.
|
|
740
|
+
|
|
741
|
+
Runtimes before R13.1 parked the stream's child run on
|
|
742
|
+
``WAIT_EVENT abstractcore.voice.tts.stream:<uuid>`` while audio
|
|
743
|
+
streamed; only the process holding the stream could resume it, so a
|
|
744
|
+
gateway restart mid-stream left it waiting forever. Hosts call this at
|
|
745
|
+
boot for such runs (``is_interrupted_voice_stream_wait``): the run
|
|
746
|
+
completes with ``errors[0] = {"code": "interrupted", "message": reason}``
|
|
747
|
+
and is never waiting again.
|
|
748
|
+
"""
|
|
749
|
+
|
|
750
|
+
child = self._runtime.get_state(child_run_id)
|
|
751
|
+
waiting = child.waiting
|
|
752
|
+
if child.status != RunStatus.WAITING or waiting is None or not is_interrupted_voice_stream_wait(waiting):
|
|
753
|
+
raise ValueError(f"Run '{child_run_id}' is not waiting on a streamed-speech event")
|
|
754
|
+
result_key = str(waiting.result_key or _RESULT_KEY).strip() or _RESULT_KEY
|
|
755
|
+
workflow = _build_stream_record_workflow(workflow_id=str(child.workflow_id or "voice_stream"), result_key=result_key)
|
|
756
|
+
return self._resume(
|
|
757
|
+
workflow=workflow,
|
|
758
|
+
run_id=child.run_id,
|
|
759
|
+
wait_key=waiting.wait_key,
|
|
760
|
+
payload={
|
|
761
|
+
"content": None,
|
|
762
|
+
"outputs": {},
|
|
763
|
+
"errors": [{"message": str(reason or "The speech stream was interrupted."), "code": "interrupted"}],
|
|
764
|
+
"metadata": {"streaming": True, "interrupted": True},
|
|
765
|
+
},
|
|
766
|
+
max_steps=10,
|
|
767
|
+
)
|
|
768
|
+
|
|
768
769
|
def generate_music(
|
|
769
770
|
self,
|
|
770
771
|
run_id: str,
|
|
@@ -896,7 +897,9 @@ def get_abstractcore_run_facade(runtime: Any) -> AbstractCoreRunFacade:
|
|
|
896
897
|
|
|
897
898
|
|
|
898
899
|
__all__ = [
|
|
900
|
+
"LEGACY_VOICE_STREAM_WAIT_KEY_PREFIX",
|
|
899
901
|
"AbstractCoreRunFacade",
|
|
902
|
+
"is_interrupted_voice_stream_wait",
|
|
900
903
|
"get_abstractcore_run_facade",
|
|
901
904
|
"inline_run_active",
|
|
902
905
|
]
|
|
@@ -1153,8 +1153,15 @@ def _rewrite_tool_arguments(*, tool_name: str, args: Dict[str, Any], scope: Work
|
|
|
1153
1153
|
inner = t[len("file://"):]
|
|
1154
1154
|
resolved = resolve_user_path(scope=scope, user_path=inner)
|
|
1155
1155
|
out["target"] = f"file://{resolved}"
|
|
1156
|
+
# Round 14: a local page is served to the browser from a loopback origin
|
|
1157
|
+
# limited to the run's scope (never file://), so a page cannot pull refused
|
|
1158
|
+
# files as subresources. The scope is the same stamp the commands get.
|
|
1159
|
+
core_sandbox_module()
|
|
1160
|
+
out[SANDBOX_STAMP_ARG] = sandbox_stamp(scope)
|
|
1156
1161
|
else:
|
|
1157
1162
|
out["target"] = str(resolve_user_path(scope=scope, user_path=t))
|
|
1163
|
+
core_sandbox_module()
|
|
1164
|
+
out[SANDBOX_STAMP_ARG] = sandbox_stamp(scope)
|
|
1158
1165
|
return out
|
|
1159
1166
|
|
|
1160
1167
|
return out
|
|
@@ -69,3 +69,18 @@ def test_http_targets_pass_untouched(tmp_path: Path) -> None:
|
|
|
69
69
|
tool_name="browser_probe", args={"target": url}, scope=scope
|
|
70
70
|
)
|
|
71
71
|
assert out["target"] == url
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_local_targets_carry_the_run_scope_stamp_remote_targets_do_not(tmp_path: Path) -> None:
|
|
75
|
+
"""Round 14 (backlog 1002 item 3): a local page is served from a loopback origin
|
|
76
|
+
limited to the run's scope; the runtime stamps that scope (the commands' `_sandbox`
|
|
77
|
+
stamp, built from the same keys the file tools read) on every local target."""
|
|
78
|
+
from abstractruntime.integrations.abstractcore.workspace_scoped_tools import sandbox_stamp
|
|
79
|
+
|
|
80
|
+
scope = _scope(tmp_path)
|
|
81
|
+
(tmp_path / "ws" / "page.html").write_text("<p>hi</p>", encoding="utf-8")
|
|
82
|
+
for target in ("page.html", f"file://{tmp_path / 'ws' / 'page.html'}"):
|
|
83
|
+
out = rewrite_tool_arguments(tool_name="browser_probe", args={"target": target, "_sandbox": {"forged": True}}, scope=scope)
|
|
84
|
+
assert out["_sandbox"] == sandbox_stamp(scope), target
|
|
85
|
+
out = rewrite_tool_arguments(tool_name="browser_probe", args={"target": "https://example.org/"}, scope=scope)
|
|
86
|
+
assert "_sandbox" not in out
|
|
@@ -52,7 +52,7 @@ def test_runtime_base_is_remote_light_with_multimodal_and_mcp_support() -> None:
|
|
|
52
52
|
assert "abstractcore = [" not in text
|
|
53
53
|
assert "multimodal = [" not in text
|
|
54
54
|
assert "mcp-worker = [" not in text
|
|
55
|
-
assert '"abstractcore>=2.25.
|
|
55
|
+
assert '"abstractcore>=2.25.1"' in text
|
|
56
56
|
# Only AbstractCore's three install settings: light (no extra), apple, gpu.
|
|
57
57
|
assert re.findall(r'"abstractcore\[([^\]]*)\]', text) == ["apple", "gpu"]
|
|
58
58
|
assert '"openai<3.0.0,>=1.109.1"' in text
|
|
@@ -89,8 +89,8 @@ def test_runtime_exposes_only_apple_and_gpu_user_install_profiles() -> None:
|
|
|
89
89
|
apple_block = _extract_optional_dependency_block(text, key="apple")
|
|
90
90
|
gpu_block = _extract_optional_dependency_block(text, key="gpu")
|
|
91
91
|
|
|
92
|
-
assert '"abstractcore[apple]>=2.25.
|
|
93
|
-
assert '"abstractcore[gpu]>=2.25.
|
|
92
|
+
assert '"abstractcore[apple]>=2.25.1"' in apple_block
|
|
93
|
+
assert '"abstractcore[gpu]>=2.25.1"' in gpu_block
|
|
94
94
|
assert '"setuptools<82.0.0,>=80.10.2"' in apple_block
|
|
95
95
|
assert '"setuptools<82.0.0,>=77.0.3"' in gpu_block
|
|
96
96
|
assert "pymupdf" not in apple_block.lower()
|
|
@@ -66,7 +66,10 @@ def _fresh_host():
|
|
|
66
66
|
|
|
67
67
|
@pytest.fixture
|
|
68
68
|
def t(tmp_path, monkeypatch):
|
|
69
|
-
|
|
69
|
+
return _tree(Path(os.path.realpath(tmp_path)), monkeypatch)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _tree(root: Path, monkeypatch) -> Path:
|
|
70
73
|
for d in ("data/workspaces/session-1", "data/other", "home/.ssh", "home/parent/child", "home/parent/child/deny", "ro", "rw", "refused"):
|
|
71
74
|
(root / d).mkdir(parents=True, exist_ok=True)
|
|
72
75
|
(root / "refused/secret.txt").write_text(MARK)
|
|
@@ -283,8 +286,39 @@ def test_e2e_fail_closed_keeps_the_run_going(t, monkeypatch):
|
|
|
283
286
|
assert MARK not in str(res)
|
|
284
287
|
|
|
285
288
|
|
|
289
|
+
@pytest.fixture(params=["temp_root", "user_data_root"])
|
|
290
|
+
def t_anywhere(request, tmp_path, monkeypatch):
|
|
291
|
+
"""The same tree under pytest's temp root (macOS: /private/var/folders or /private/tmp,
|
|
292
|
+
Linux: /tmp) AND under a user-data root (the real home), so the entity test cannot flip
|
|
293
|
+
on where TMPDIR points: an unlisted folder must be unreadable in both."""
|
|
294
|
+
if request.param == "temp_root":
|
|
295
|
+
yield _tree(Path(os.path.realpath(tmp_path)), monkeypatch)
|
|
296
|
+
return
|
|
297
|
+
import pwd
|
|
298
|
+
import shutil
|
|
299
|
+
import tempfile
|
|
300
|
+
|
|
301
|
+
real_home = Path(pwd.getpwuid(os.getuid()).pw_dir)
|
|
302
|
+
base = real_home / ".cache" / "abstractruntime-tests"
|
|
303
|
+
base.mkdir(parents=True, exist_ok=True)
|
|
304
|
+
root = Path(os.path.realpath(tempfile.mkdtemp(prefix="r12-", dir=str(base))))
|
|
305
|
+
try:
|
|
306
|
+
yield _tree(root, monkeypatch)
|
|
307
|
+
finally:
|
|
308
|
+
shutil.rmtree(root, ignore_errors=True)
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def test_macos_allow_list_denies_the_shared_temp_roots():
|
|
312
|
+
"""macOS "Deny everything, allow listed workspaces" denies the shared temp roots too
|
|
313
|
+
(where pytest's tmp tree and other processes' files live), not only /Users."""
|
|
314
|
+
roots = core_sandbox._USER_DATA_ROOTS_DARWIN
|
|
315
|
+
for r in ("/Users", "/Volumes", "/private/var/root", "/private/tmp", "/private/var/folders"):
|
|
316
|
+
assert r in roots, r
|
|
317
|
+
|
|
318
|
+
|
|
286
319
|
@real_sandbox
|
|
287
|
-
def test_e2e_entity_exec_is_sandboxed(
|
|
320
|
+
def test_e2e_entity_exec_is_sandboxed(t_anywhere):
|
|
321
|
+
t = t_anywhere
|
|
288
322
|
from abstractruntime.identity.tools import WorkspaceRoot, _run_execute_command
|
|
289
323
|
|
|
290
324
|
home = t / "entity"
|