AbstractRuntime 0.8.3__tar.gz → 0.8.5__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.8.3 → abstractruntime-0.8.5}/.github/workflows/ci.yml +1 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/CHANGELOG.md +9 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/PKG-INFO +5 -5
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/README.md +1 -1
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/api.md +5 -1
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/automations.md +15 -4
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/getting-started.md +1 -1
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/integrations/abstractcore.md +17 -1
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/llms-full.txt +39 -8
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/llms.txt +3 -3
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/pyproject.toml +4 -4
- abstractruntime-0.8.5/release-notes.md +1 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automation_queries.py +2 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/attention.py +3 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/controller.py +9 -3
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/models.py +15 -6
- abstractruntime-0.8.5/src/abstractruntime/integrations/abstractcore/server_facade.py +32 -0
- abstractruntime-0.8.5/tests/test_abstractcore_server_facade.py +72 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_definition.py +13 -0
- abstractruntime-0.8.5/tests/test_automation_email_results.py +59 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_growing_context.py +39 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_packaging_extras.py +3 -3
- abstractruntime-0.8.3/release-notes.md +0 -11
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/.gitignore +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/LICENSE +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/ROADMAP.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/SECURITY.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/adr/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/architecture.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/artifacts.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/email.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/evidence.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/faq.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/limits.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/manual_testing.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/proposal.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/provenance.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/snapshots.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/tool-approval.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/tools-comms.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/05_persistence.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/examples/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/mkdocs.yml +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/pytest.ini +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/README.md +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/automation_harness.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/conftest.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_command_store.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_offloading.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_session_history.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.8.3 → abstractruntime-0.8.5}/tests/test_write_chart.py +0 -0
|
@@ -60,6 +60,7 @@ jobs:
|
|
|
60
60
|
tests/test_abstractcore_comms_facade.py \
|
|
61
61
|
tests/test_abstractcore_discovery_facade.py \
|
|
62
62
|
tests/test_automation_definition.py \
|
|
63
|
+
tests/test_automation_email_results.py \
|
|
63
64
|
tests/test_automation_tool_approval.py \
|
|
64
65
|
tests/test_default_tools_comms_gating.py \
|
|
65
66
|
tests/test_every_path_bearing_tool_is_walled.py \
|
|
@@ -9,6 +9,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
Nothing yet.
|
|
11
11
|
|
|
12
|
+
## [0.8.5] - 2026-10-03
|
|
13
|
+
|
|
14
|
+
- Hosts can serve AbstractCore ASGI requests through `integrations.abstractcore.server_facade.serve_core_request`, with independent request-scoped authentication preserved throughout streaming. Requires AbstractCore 2.24.0 or newer.
|
|
15
|
+
|
|
16
|
+
## [0.8.4] - 2026-10-02
|
|
17
|
+
|
|
18
|
+
- Automations accept `context.growing.max_tokens` at creation and revision, defaulting to 50,000 tokens. Whole-turn history and admitted retry inputs are preserved.
|
|
19
|
+
- Email-enabled automations produce a result notification for every completed occurrence, with the full answer and configurable `notify.recipients`.
|
|
20
|
+
|
|
12
21
|
## [0.8.3] - 2026-10-01
|
|
13
22
|
|
|
14
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.5
|
|
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.
|
|
23
|
+
Requires-Dist: abstractcore>=2.24.0
|
|
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.
|
|
38
|
+
Requires-Dist: abstractcore[apple]>=2.24.0; 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.
|
|
45
|
+
Requires-Dist: abstractcore[gpu]>=2.24.0; 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'
|
|
@@ -83,7 +83,7 @@ Remote-light runtime:
|
|
|
83
83
|
pip install abstractruntime
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
The base install includes AbstractCore 2.
|
|
86
|
+
The base install includes AbstractCore 2.24.0 or newer (its light install:
|
|
87
87
|
remote providers, tools, vision, voice, audio, and music integration), plus the
|
|
88
88
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
89
89
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -32,7 +32,7 @@ Remote-light runtime:
|
|
|
32
32
|
pip install abstractruntime
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
The base install includes AbstractCore 2.
|
|
35
|
+
The base install includes AbstractCore 2.24.0 or newer (its light install:
|
|
36
36
|
remote providers, tools, vision, voice, audio, and music integration), plus the
|
|
37
37
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
38
38
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -302,7 +302,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
302
302
|
|
|
303
303
|
### AbstractCore (LLM + tools)
|
|
304
304
|
|
|
305
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.
|
|
305
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.24.0 or newer is part of the base install).
|
|
306
306
|
|
|
307
307
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
308
308
|
|
|
@@ -391,3 +391,7 @@ This provides handlers for `MEMORY_KG_*` effects (opt-in wiring layer).
|
|
|
391
391
|
- `architecture.md` — component map + durability invariants
|
|
392
392
|
- `faq.md` — common questions and gotchas
|
|
393
393
|
- `integrations/abstractcore.md` — `LLM_CALL` / `TOOL_CALLS` wiring
|
|
394
|
+
|
|
395
|
+
### Host ASGI serving
|
|
396
|
+
|
|
397
|
+
`abstractruntime.integrations.abstractcore.server_facade.serve_core_request(scope, receive, send, *, token: str, allow_unauthenticated: bool = False)` delegates host-admitted ASGI requests with request-scoped Core authentication. See [host-managed serving](integrations/abstractcore.md#host-managed-serving) for network and credential responsibilities.
|
|
@@ -318,7 +318,7 @@ controller is woken with `max_steps=0`; the host (or `drive_automation`) then ti
|
|
|
318
318
|
| | Independent (default) | Growing |
|
|
319
319
|
|---|---|---|
|
|
320
320
|
| Session | a new session per occurrence, named after its attempt-1 run id | the automation's session, `automation:<automation_id>` |
|
|
321
|
-
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages`: the most recent 50,000 tokens
|
|
321
|
+
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages`: the most recent whole turns within the configured token budget (50,000 tokens by default) (the session history window) |
|
|
322
322
|
| `use_context` given to the target | `false` | `true` |
|
|
323
323
|
| `_meta.occurrence.session_kind` | `occurrence` | `automation` |
|
|
324
324
|
|
|
@@ -514,7 +514,7 @@ Automations are **quiet by default**. An occurrence creates an attention item on
|
|
|
514
514
|
- its output carries `notify: true`: the item's title is the automation title and its body is the answer, cut to 280
|
|
515
515
|
characters;
|
|
516
516
|
- its output carries `notify: {title, body}`: title at most 120 characters (the automation title when empty), body at
|
|
517
|
-
most 2,000 characters. A missing, `false` or empty `notify` stays quiet;
|
|
517
|
+
most 2,000 characters. A missing, `false` or empty `notify` stays quiet unless result email is enabled;
|
|
518
518
|
- it **failed after its last retry**: the title is "<automation title> failed" and the body is the error. A failure
|
|
519
519
|
that a retry fixed is quiet, and so is a cancelled occurrence.
|
|
520
520
|
|
|
@@ -523,7 +523,7 @@ with its end-node values or `{success, result}`. An output with `success: false`
|
|
|
523
523
|
must flag a result adds `notify` next to its answer.
|
|
524
524
|
|
|
525
525
|
Each notify or final failure creates exactly one attention item per occurrence. The item is carried by the The item's `channels` repeats the definition's `notify.channels`; a host that delivers notifications by email
|
|
526
|
-
|
|
526
|
+
emails every completed result when `email` is listed. `notify.recipients` selects delivery addresses (default `["self"]`); the full answer is retained for email while console previews stay bounded.
|
|
527
527
|
occurrence's `automation.completed` record with a per-automation sequence number.
|
|
528
528
|
|
|
529
529
|
`list_attention(ledger_store, automation_id, *, after_seq=0, cursor=None, limit=50)` returns
|
|
@@ -685,7 +685,7 @@ receives its result directly.
|
|
|
685
685
|
event source yet.
|
|
686
686
|
- Occurrences run one at a time (`serial`), missed ticks coalesce, and a failed occurrence never stops the
|
|
687
687
|
automation (`failure: "continue"`). These policies cannot be changed.
|
|
688
|
-
- Growing history is the most recent 50,000 tokens
|
|
688
|
+
- Growing history is the most recent whole turns within the configured token budget (50,000 tokens by default) and is not summarized automatically; older turns
|
|
689
689
|
drop out of the replay (they stay in the store).
|
|
690
690
|
- Tools outside `TOOL_EFFECT_CLASSES`, such as third-party MCP tools, still ask for approval under `auto`.
|
|
691
691
|
- Retries repeat external effects.
|
|
@@ -701,3 +701,14 @@ receives its result directly.
|
|
|
701
701
|
- [email.md](email.md): email accounts, the `email.received@1` trigger and the send-email action
|
|
702
702
|
- [faq.md](faq.md): common questions
|
|
703
703
|
- [troubleshooting.md](troubleshooting.md#an-automation-does-not-fire): symptom-oriented fixes
|
|
704
|
+
|
|
705
|
+
## Growing context limit
|
|
706
|
+
|
|
707
|
+
Choose **Growing** to set **Max growing context (tokens)** when creating or editing an
|
|
708
|
+
automation. The default is 50,000; enter `30000` for a 30,000-token history budget.
|
|
709
|
+
The limit is hidden for **Independent** runs. Changing it affects subsequent occurrences;
|
|
710
|
+
already admitted occurrences retain their history for retries. History retains whole turns,
|
|
711
|
+
including the newest turn even when that turn alone exceeds the budget.
|
|
712
|
+
|
|
713
|
+
The API field is `context.growing.max_tokens`, a positive integer. Existing definitions
|
|
714
|
+
that omit it retain the 50,000-token default.
|
|
@@ -12,7 +12,7 @@ Remote-light runtime:
|
|
|
12
12
|
pip install abstractruntime
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
This installs AbstractCore 2.
|
|
15
|
+
This installs AbstractCore 2.24.0 or newer with remote provider, vision,
|
|
16
16
|
voice, audio, music, tool, and MCP-worker support. The base install is
|
|
17
17
|
remote-light: it can route multimodal workflows to hosted or OpenAI-compatible
|
|
18
18
|
endpoints, but it does not select local inferencer stacks such as MLX, vLLM,
|
|
@@ -16,7 +16,7 @@ Implementation pointers (this repo):
|
|
|
16
16
|
pip install abstractruntime
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
The base install includes AbstractCore 2.
|
|
19
|
+
The base install includes AbstractCore 2.24.0 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, image upscaling, capability catalog, prompt-cache control-plane endpoints (including session attribution via `/acore/prompt_cache/key_meta`), host memory snapshots, the host-wide loaded-model sweep used by residency listings, the process-wide MLX residency report and eject used by model unload, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, the public local vision-cache catalog helper used by Runtime discovery, vision adapter discovery plus batch/LoRA media controls, and the released shared workspace/file-filter utility surface used by Runtime packaging and integration checks.
|
|
20
20
|
|
|
21
21
|
The base install also includes the remote-light media/capability plugins needed
|
|
22
22
|
for AbstractCore's multimodal `generate(..., output=...)` path. Local
|
|
@@ -1168,3 +1168,19 @@ This is useful when building a `MappingToolExecutor` quickly.
|
|
|
1168
1168
|
- `../architecture.md` — effect handler boundaries and durability invariants
|
|
1169
1169
|
- `../tools-comms.md` — enabling email/WhatsApp/Telegram tools
|
|
1170
1170
|
- `../adr/0002_execution_modes_local_remote_hybrid.md` — rationale for local/remote/hybrid
|
|
1171
|
+
|
|
1172
|
+
## Host-managed serving
|
|
1173
|
+
|
|
1174
|
+
Hosts that expose AbstractCore serving routes use
|
|
1175
|
+
`abstractruntime.integrations.abstractcore.server_facade.serve_core_request(scope, receive, send, *, token, allow_unauthenticated=False)`.
|
|
1176
|
+
The facade lazily loads the Core ASGI application and keeps the host's independent
|
|
1177
|
+
inbound authentication policy scoped to the entire response, including streamed
|
|
1178
|
+
bodies. Concurrent requests retain separate policies; cancellation and exceptions
|
|
1179
|
+
restore the previous policy.
|
|
1180
|
+
|
|
1181
|
+
The host owns route admission, network exposure, origin checks, and token storage.
|
|
1182
|
+
Provide a nonempty token even for open access: absent Authorization is allowed when
|
|
1183
|
+
`allow_unauthenticated=True`, while any supplied Authorization must validate.
|
|
1184
|
+
Anonymous callers cannot use server-held cloud credentials; explicit provider
|
|
1185
|
+
keys use `X-AbstractCore-Provider-API-Key`. This serving facade does not create
|
|
1186
|
+
durable Runtime runs. The AbstractCore server dependencies must be installed.
|
|
@@ -81,7 +81,7 @@ Remote-light runtime:
|
|
|
81
81
|
pip install abstractruntime
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
The base install includes AbstractCore 2.
|
|
84
|
+
The base install includes AbstractCore 2.24.0 or newer (its light install:
|
|
85
85
|
remote providers, tools, vision, voice, audio, and music integration), plus the
|
|
86
86
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
87
87
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -287,7 +287,7 @@ Remote-light runtime:
|
|
|
287
287
|
pip install abstractruntime
|
|
288
288
|
```
|
|
289
289
|
|
|
290
|
-
This installs AbstractCore 2.
|
|
290
|
+
This installs AbstractCore 2.24.0 or newer with remote provider, vision,
|
|
291
291
|
voice, audio, music, tool, and MCP-worker support. The base install is
|
|
292
292
|
remote-light: it can route multimodal workflows to hosted or OpenAI-compatible
|
|
293
293
|
endpoints, but it does not select local inferencer stacks such as MLX, vLLM,
|
|
@@ -1167,7 +1167,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
1167
1167
|
|
|
1168
1168
|
### AbstractCore (LLM + tools)
|
|
1169
1169
|
|
|
1170
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.
|
|
1170
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.24.0 or newer is part of the base install).
|
|
1171
1171
|
|
|
1172
1172
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
1173
1173
|
|
|
@@ -1257,6 +1257,10 @@ This provides handlers for `MEMORY_KG_*` effects (opt-in wiring layer).
|
|
|
1257
1257
|
- `faq.md` — common questions and gotchas
|
|
1258
1258
|
- `integrations/abstractcore.md` — `LLM_CALL` / `TOOL_CALLS` wiring
|
|
1259
1259
|
|
|
1260
|
+
### Host ASGI serving
|
|
1261
|
+
|
|
1262
|
+
`abstractruntime.integrations.abstractcore.server_facade.serve_core_request(scope, receive, send, *, token: str, allow_unauthenticated: bool = False)` delegates host-admitted ASGI requests with request-scoped Core authentication. See [host-managed serving](integrations/abstractcore.md#host-managed-serving) for network and credential responsibilities.
|
|
1263
|
+
|
|
1260
1264
|
|
|
1261
1265
|
==============================================================================
|
|
1262
1266
|
# FILE: docs/faq.md
|
|
@@ -1978,7 +1982,7 @@ Implementation pointers (this repo):
|
|
|
1978
1982
|
pip install abstractruntime
|
|
1979
1983
|
```
|
|
1980
1984
|
|
|
1981
|
-
The base install includes AbstractCore 2.
|
|
1985
|
+
The base install includes AbstractCore 2.24.0 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, image upscaling, capability catalog, prompt-cache control-plane endpoints (including session attribution via `/acore/prompt_cache/key_meta`), host memory snapshots, the host-wide loaded-model sweep used by residency listings, the process-wide MLX residency report and eject used by model unload, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, the public local vision-cache catalog helper used by Runtime discovery, vision adapter discovery plus batch/LoRA media controls, and the released shared workspace/file-filter utility surface used by Runtime packaging and integration checks.
|
|
1982
1986
|
|
|
1983
1987
|
The base install also includes the remote-light media/capability plugins needed
|
|
1984
1988
|
for AbstractCore's multimodal `generate(..., output=...)` path. Local
|
|
@@ -3131,6 +3135,22 @@ This is useful when building a `MappingToolExecutor` quickly.
|
|
|
3131
3135
|
- `../tools-comms.md` — enabling email/WhatsApp/Telegram tools
|
|
3132
3136
|
- `../adr/0002_execution_modes_local_remote_hybrid.md` — rationale for local/remote/hybrid
|
|
3133
3137
|
|
|
3138
|
+
## Host-managed serving
|
|
3139
|
+
|
|
3140
|
+
Hosts that expose AbstractCore serving routes use
|
|
3141
|
+
`abstractruntime.integrations.abstractcore.server_facade.serve_core_request(scope, receive, send, *, token, allow_unauthenticated=False)`.
|
|
3142
|
+
The facade lazily loads the Core ASGI application and keeps the host's independent
|
|
3143
|
+
inbound authentication policy scoped to the entire response, including streamed
|
|
3144
|
+
bodies. Concurrent requests retain separate policies; cancellation and exceptions
|
|
3145
|
+
restore the previous policy.
|
|
3146
|
+
|
|
3147
|
+
The host owns route admission, network exposure, origin checks, and token storage.
|
|
3148
|
+
Provide a nonempty token even for open access: absent Authorization is allowed when
|
|
3149
|
+
`allow_unauthenticated=True`, while any supplied Authorization must validate.
|
|
3150
|
+
Anonymous callers cannot use server-held cloud credentials; explicit provider
|
|
3151
|
+
keys use `X-AbstractCore-Provider-API-Key`. This serving facade does not create
|
|
3152
|
+
durable Runtime runs. The AbstractCore server dependencies must be installed.
|
|
3153
|
+
|
|
3134
3154
|
|
|
3135
3155
|
==============================================================================
|
|
3136
3156
|
# FILE: docs/proposal.md
|
|
@@ -3839,7 +3859,7 @@ controller is woken with `max_steps=0`; the host (or `drive_automation`) then ti
|
|
|
3839
3859
|
| | Independent (default) | Growing |
|
|
3840
3860
|
|---|---|---|
|
|
3841
3861
|
| Session | a new session per occurrence, named after its attempt-1 run id | the automation's session, `automation:<automation_id>` |
|
|
3842
|
-
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages`: the most recent 50,000 tokens
|
|
3862
|
+
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages`: the most recent whole turns within the configured token budget (50,000 tokens by default) (the session history window) |
|
|
3843
3863
|
| `use_context` given to the target | `false` | `true` |
|
|
3844
3864
|
| `_meta.occurrence.session_kind` | `occurrence` | `automation` |
|
|
3845
3865
|
|
|
@@ -4035,7 +4055,7 @@ Automations are **quiet by default**. An occurrence creates an attention item on
|
|
|
4035
4055
|
- its output carries `notify: true`: the item's title is the automation title and its body is the answer, cut to 280
|
|
4036
4056
|
characters;
|
|
4037
4057
|
- its output carries `notify: {title, body}`: title at most 120 characters (the automation title when empty), body at
|
|
4038
|
-
most 2,000 characters. A missing, `false` or empty `notify` stays quiet;
|
|
4058
|
+
most 2,000 characters. A missing, `false` or empty `notify` stays quiet unless result email is enabled;
|
|
4039
4059
|
- it **failed after its last retry**: the title is "<automation title> failed" and the body is the error. A failure
|
|
4040
4060
|
that a retry fixed is quiet, and so is a cancelled occurrence.
|
|
4041
4061
|
|
|
@@ -4044,7 +4064,7 @@ with its end-node values or `{success, result}`. An output with `success: false`
|
|
|
4044
4064
|
must flag a result adds `notify` next to its answer.
|
|
4045
4065
|
|
|
4046
4066
|
Each notify or final failure creates exactly one attention item per occurrence. The item is carried by the The item's `channels` repeats the definition's `notify.channels`; a host that delivers notifications by email
|
|
4047
|
-
|
|
4067
|
+
emails every completed result when `email` is listed. `notify.recipients` selects delivery addresses (default `["self"]`); the full answer is retained for email while console previews stay bounded.
|
|
4048
4068
|
occurrence's `automation.completed` record with a per-automation sequence number.
|
|
4049
4069
|
|
|
4050
4070
|
`list_attention(ledger_store, automation_id, *, after_seq=0, cursor=None, limit=50)` returns
|
|
@@ -4206,7 +4226,7 @@ receives its result directly.
|
|
|
4206
4226
|
event source yet.
|
|
4207
4227
|
- Occurrences run one at a time (`serial`), missed ticks coalesce, and a failed occurrence never stops the
|
|
4208
4228
|
automation (`failure: "continue"`). These policies cannot be changed.
|
|
4209
|
-
- Growing history is the most recent 50,000 tokens
|
|
4229
|
+
- Growing history is the most recent whole turns within the configured token budget (50,000 tokens by default) and is not summarized automatically; older turns
|
|
4210
4230
|
drop out of the replay (they stay in the store).
|
|
4211
4231
|
- Tools outside `TOOL_EFFECT_CLASSES`, such as third-party MCP tools, still ask for approval under `auto`.
|
|
4212
4232
|
- Retries repeat external effects.
|
|
@@ -4223,6 +4243,17 @@ receives its result directly.
|
|
|
4223
4243
|
- [faq.md](faq.md): common questions
|
|
4224
4244
|
- [troubleshooting.md](troubleshooting.md#an-automation-does-not-fire): symptom-oriented fixes
|
|
4225
4245
|
|
|
4246
|
+
## Growing context limit
|
|
4247
|
+
|
|
4248
|
+
Choose **Growing** to set **Max growing context (tokens)** when creating or editing an
|
|
4249
|
+
automation. The default is 50,000; enter `30000` for a 30,000-token history budget.
|
|
4250
|
+
The limit is hidden for **Independent** runs. Changing it affects subsequent occurrences;
|
|
4251
|
+
already admitted occurrences retain their history for retries. History retains whole turns,
|
|
4252
|
+
including the newest turn even when that turn alone exceeds the budget.
|
|
4253
|
+
|
|
4254
|
+
The API field is `context.growing.max_tokens`, a positive integer. Existing definitions
|
|
4255
|
+
that omit it retain the 50,000-token default.
|
|
4256
|
+
|
|
4226
4257
|
|
|
4227
4258
|
==============================================================================
|
|
4228
4259
|
# FILE: docs/tool-approval.md
|
|
@@ -3,10 +3,10 @@
|
|
|
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.8.
|
|
6
|
+
- Version: 0.8.5
|
|
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
|
-
- Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.
|
|
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`)
|
|
10
10
|
- Install profiles: base `abstractruntime` is remote-light with MCP, generated media routing, and Runtime-owned permissive PDF read/write nodes; `abstractruntime[apple]` and `abstractruntime[gpu]` add local inferencer stacks.
|
|
11
11
|
- Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned config should be translated into explicit Runtime inputs or Runtime-owned env names. Hosts can attach `resolve_provider_endpoint_profile(provider_id)` to the LLM client; Runtime treats it as an optional resolver hook, injects transient provider/base URL/key params for the call, and redacts secret-like params from persisted observability.
|
|
12
12
|
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
- [MCP worker](docs/mcp-worker.md): `abstractruntime-mcp-worker` CLI (stdio/HTTP)
|
|
58
58
|
- [Comms toolset](docs/tools-comms.md): email enabled by the host (`email_enabled=True`, no env flag); WhatsApp/Telegram env gating
|
|
59
59
|
- [Email](docs/email.md): one user, one runtime, one mailbox: `_runtime.email_account` binding resolved at call time through `Runtime.set_email_context_resolver` (credentials never in vars, ledger or results), `send_email_recipient@v2` (unattended only to self or to the definition's `policy.email_allowed_recipients`), the resolver's `use` (`agent_tool` / `action`) so a host's agent-tools switch gates agent tools only, large structured tool outputs offloaded to attachments, durable event inbox (`JsonFileEventInbox`, retention 90 days / 10,000 events via `prune_email_inbox`) filled by `EmailInboxFeeder.poll` (read-only, per-message cursor, UIDVALIDITY resync, typed failures with backoff), the `email.received@1` trigger (typed filters, batches every `every`, each message once, untrusted input: messages and framed prompt stored as artifacts (refs only in the controller's records), frame markers with a per-occurrence random boundary, and "allow all tools" granting by kind only (no network egress beyond configured services, no execution, no messaging, no writes outside the workspace (the memory-writing tools included), no delegation; anything else only when named in `policy.untrusted_input_tools`, sending tools never; under "ask" nothing runs unasked but the named tools, and the executor's static defaults never decide for an untrusted run or its children)) and the send-email action (fixed-placeholder templates)
|
|
60
|
-
- [Automations](docs/automations.md): an automation is a durable controller run that starts its target as deterministic child runs (occurrences) on `schedule@1` (fixed UTC intervals, coalesced missed ticks) or `manual@1`; `create_automation`, `apply_automation_command` (pause, resume, run_now, revise, stop_current, archive; idempotent per `command_id`), independent or growing context, `start_discussion` (fork at any occurrence N, seeded with the timeline 1..N, own writable workspace, the automation's workspace mounted read-only via `_runtime.workspace_read_only_paths`: file writes refused inside, reads and commands allowed), `policy.tool_approval` (`auto` or `ask`), `policy.email_allowed_recipients`, `notify.channels`, the `email.received@1` trigger, typed `pending_waits`, `notify` attention items and retries; storage guarantees: `create_if_absent`, `run_mutation_lock`, turn roots and `session_kind` in the run index, one writer process per store, `Runtime.start` refusing session starts it cannot attribute
|
|
60
|
+
- [Automations](docs/automations.md): configurable growing-context budgets and result email; an automation is a durable controller run that starts its target as deterministic child runs (occurrences) on `schedule@1` (fixed UTC intervals, coalesced missed ticks) or `manual@1`; `create_automation`, `apply_automation_command` (pause, resume, run_now, revise, stop_current, archive; idempotent per `command_id`), independent or growing context, `start_discussion` (fork at any occurrence N, seeded with the timeline 1..N, own writable workspace, the automation's workspace mounted read-only via `_runtime.workspace_read_only_paths`: file writes refused inside, reads and commands allowed), `policy.tool_approval` (`auto` or `ask`), `policy.email_allowed_recipients`, `notify.channels`, the `email.received@1` trigger, typed `pending_waits`, `notify` attention items and retries; storage guarantees: `create_if_absent`, `run_mutation_lock`, turn roots and `session_kind` in the run index, one writer process per store, `Runtime.start` refusing session starts it cannot attribute
|
|
61
61
|
- [Tool approval](docs/tool-approval.md): tool risk tiers, the run-policy rank ceiling, and per-call refiners
|
|
62
62
|
- [Entity runtime](docs/entity-runtime.md): per-entity runtimes, homes, the one-writer lease, act-only diary privacy, and durable visit waits
|
|
63
63
|
- [Models, engines and host jobs](docs/integrations/abstractcore.md#models-engines-and-host-jobs-config-facade): `config_facade` passthroughs for hosts; `host_job_cancel(job_id, *, by="api", user=None)` records who cancelled a job
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "AbstractRuntime"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.5"
|
|
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,7 @@ 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
|
-
"abstractcore>=2.
|
|
56
|
+
"abstractcore>=2.24.0",
|
|
57
57
|
"openai<3.0.0,>=1.109.1",
|
|
58
58
|
"httpx<1.0.0,>=0.28.1",
|
|
59
59
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -70,12 +70,12 @@ dependencies = [
|
|
|
70
70
|
|
|
71
71
|
[project.optional-dependencies]
|
|
72
72
|
apple = [
|
|
73
|
-
"abstractcore[apple]>=2.
|
|
73
|
+
"abstractcore[apple]>=2.24.0",
|
|
74
74
|
"setuptools<82.0.0,>=80.10.2",
|
|
75
75
|
]
|
|
76
76
|
|
|
77
77
|
gpu = [
|
|
78
|
-
"abstractcore[gpu]>=2.
|
|
78
|
+
"abstractcore[gpu]>=2.24.0",
|
|
79
79
|
# vLLM 0.9-0.19 caps setuptools below 80; 77.0.3 is still a modern floor.
|
|
80
80
|
"setuptools<82.0.0,>=77.0.3",
|
|
81
81
|
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
- Hosts can serve AbstractCore ASGI requests through `integrations.abstractcore.server_facade.serve_core_request`, with independent request-scoped authentication preserved throughout streaming. Requires AbstractCore 2.24.0 or newer.
|
|
@@ -23,6 +23,7 @@ from .automations.controller import current_occurrence as _current_occurrence
|
|
|
23
23
|
from .automations.controller import next_fire_at as _next_fire_at
|
|
24
24
|
from .automations.models import AUTOMATION_STATUSES, automation_status
|
|
25
25
|
from .core.models import RunState, RunStatus, WaitReason
|
|
26
|
+
from .session_history import HISTORY_REPLAY_MAX_TOKENS
|
|
26
27
|
|
|
27
28
|
# Upper bound for one automation's index scan (occurrence rows, controllers).
|
|
28
29
|
# Rows are column-only and cheap; a bound keeps a runaway store from turning a
|
|
@@ -116,6 +117,7 @@ def automation_summary(controller: RunState) -> Dict[str, Any]:
|
|
|
116
117
|
"revision": definition.get("revision"),
|
|
117
118
|
"trigger": definition.get("trigger"),
|
|
118
119
|
"context_mode": context.get("mode", "independent"),
|
|
120
|
+
"growing_max_tokens": context.get("growing", {}).get("max_tokens", HISTORY_REPLAY_MAX_TOKENS),
|
|
119
121
|
"target": definition.get("target"),
|
|
120
122
|
"session_id": controller.session_id,
|
|
121
123
|
"workspace_root": definition.get("workspace_root"),
|
{abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/attention.py
RENAMED
|
@@ -289,6 +289,9 @@ def list_attention(
|
|
|
289
289
|
item["body"] = att["body"]
|
|
290
290
|
# Delivery channels (definition schema v2 `notify.channels`; absent on older records).
|
|
291
291
|
item["channels"] = list(att.get("channels") or ["console"])
|
|
292
|
+
if "email_result" in att:
|
|
293
|
+
item["email_result"] = att["email_result"]
|
|
294
|
+
item["recipients"] = list(att.get("recipients") or ["self"])
|
|
292
295
|
items.append(item)
|
|
293
296
|
items.sort(key=lambda it: it["seq"])
|
|
294
297
|
page = items[:limit]
|
{abstractruntime-0.8.3 → abstractruntime-0.8.5}/src/abstractruntime/automations/controller.py
RENAMED
|
@@ -537,7 +537,7 @@ def build_prepared(
|
|
|
537
537
|
)
|
|
538
538
|
apply_context_mode(input_data, mode=definition["context"]["mode"])
|
|
539
539
|
if definition["context"]["mode"] == "growing":
|
|
540
|
-
from ..session_history import session_chat_messages
|
|
540
|
+
from ..session_history import HISTORY_REPLAY_MAX_TOKENS, session_chat_messages
|
|
541
541
|
|
|
542
542
|
messages = session_chat_messages(
|
|
543
543
|
run_store=turn.run_store,
|
|
@@ -545,6 +545,7 @@ def build_prepared(
|
|
|
545
545
|
artifact_store=turn.artifact_store,
|
|
546
546
|
session_id=definition["session_id"],
|
|
547
547
|
automation_id=turn.automation_id,
|
|
548
|
+
max_tokens=definition["context"].get("growing", {}).get("max_tokens", HISTORY_REPLAY_MAX_TOKENS),
|
|
548
549
|
strict=True,
|
|
549
550
|
)
|
|
550
551
|
context = input_data.get("context") if isinstance(input_data.get("context"), dict) else {}
|
|
@@ -809,8 +810,10 @@ def complete_occurrence(turn: Turn, *, status: str, outcome: Optional[Dict[str,
|
|
|
809
810
|
attention = None
|
|
810
811
|
notify = None
|
|
811
812
|
seq = int(state.get("attention_seq") or 0)
|
|
813
|
+
delivery = definition_notify(definition)
|
|
814
|
+
email_result = "email" in delivery["channels"] and status == "completed"
|
|
812
815
|
if status == "completed" and outcome is not None:
|
|
813
|
-
notify = notify_payload(outcome.get("notify"), title=definition["title"], answer=outcome.get("answer") or "")
|
|
816
|
+
notify = notify_payload(True if email_result else outcome.get("notify"), title=definition["title"], answer=outcome.get("answer") or "")
|
|
814
817
|
if notify is not None:
|
|
815
818
|
seq += 1
|
|
816
819
|
attention = {"kind": "notify", "seq": seq, **notify}
|
|
@@ -821,7 +824,10 @@ def complete_occurrence(turn: Turn, *, status: str, outcome: Optional[Dict[str,
|
|
|
821
824
|
if attention is not None:
|
|
822
825
|
# Where the item is delivered (schema v2 `notify.channels`): "email" asks the host's
|
|
823
826
|
# notification dispatcher to mail the owner (framework backlog 0992 B5/C5).
|
|
824
|
-
attention["channels"] = list(
|
|
827
|
+
attention["channels"] = list(delivery["channels"])
|
|
828
|
+
if email_result:
|
|
829
|
+
attention["email_result"] = str((outcome or {}).get("answer") or "")
|
|
830
|
+
attention["recipients"] = list(delivery.get("recipients", ["self"]))
|
|
825
831
|
last_outcome = {
|
|
826
832
|
"run_id": pending["run_id"],
|
|
827
833
|
"index": int(pending["index"]),
|
|
@@ -254,14 +254,18 @@ def validate_context(value: Any) -> Dict[str, Any]:
|
|
|
254
254
|
if mode not in CONTEXT_MODES:
|
|
255
255
|
raise _invalid(f"context.mode must be one of {list(CONTEXT_MODES)}", "context.mode")
|
|
256
256
|
growing = _require_mapping(ctx.get("growing", {}), "context.growing")
|
|
257
|
-
_reject_unknown(growing, ("summary",), "context.growing")
|
|
257
|
+
_reject_unknown(growing, ("summary", "max_tokens"), "context.growing")
|
|
258
258
|
if "summary" in growing:
|
|
259
259
|
raise _invalid(
|
|
260
260
|
"automatic growing-mode summaries are not supported in v1",
|
|
261
261
|
"context.growing.summary",
|
|
262
262
|
reason_code="unsupported_feature",
|
|
263
263
|
)
|
|
264
|
-
|
|
264
|
+
if "max_tokens" in growing:
|
|
265
|
+
limit = growing["max_tokens"]
|
|
266
|
+
if isinstance(limit, bool) or not isinstance(limit, int) or limit <= 0:
|
|
267
|
+
raise _invalid("Max growing context must be a positive whole number of tokens", "context.growing.max_tokens")
|
|
268
|
+
return {"mode": mode, "growing": dict(growing)}
|
|
265
269
|
|
|
266
270
|
|
|
267
271
|
def _duration(value: Any, field: str) -> str:
|
|
@@ -272,13 +276,12 @@ def _duration(value: Any, field: str) -> str:
|
|
|
272
276
|
return value
|
|
273
277
|
|
|
274
278
|
|
|
275
|
-
def validate_email_allowed_recipients(value: Any) -> list:
|
|
279
|
+
def validate_email_allowed_recipients(value: Any, *, field: str = "policy.email_allowed_recipients") -> list:
|
|
276
280
|
"""`["self" | "name@example.test", ...]`, lower-cased and de-duplicated (order kept).
|
|
277
281
|
|
|
278
282
|
Exact addresses only: no display names, groups, domains or patterns (a pre-authorisation
|
|
279
283
|
must name the person). Empty list = nobody, not even self, runs unattended.
|
|
280
284
|
"""
|
|
281
|
-
field = "policy.email_allowed_recipients"
|
|
282
285
|
if not isinstance(value, list):
|
|
283
286
|
raise _invalid(f"{field} must be a list of 'self' or email addresses", field)
|
|
284
287
|
if len(value) > MAX_EMAIL_ALLOWED_RECIPIENTS:
|
|
@@ -332,7 +335,7 @@ def validate_notify(value: Any) -> Dict[str, Any]:
|
|
|
332
335
|
dispatcher mails the owner's registered address).
|
|
333
336
|
"""
|
|
334
337
|
notify = _require_mapping(value if value is not None else {}, "notify")
|
|
335
|
-
_reject_unknown(notify, ("channels",), "notify")
|
|
338
|
+
_reject_unknown(notify, ("channels", "recipients"), "notify")
|
|
336
339
|
channels = notify.get("channels", DEFAULT_NOTIFY["channels"])
|
|
337
340
|
if not isinstance(channels, list) or not channels:
|
|
338
341
|
raise _invalid(f"notify.channels must be a non-empty list of {list(NOTIFY_CHANNELS)}", "notify.channels")
|
|
@@ -342,7 +345,13 @@ def validate_notify(value: Any) -> Dict[str, Any]:
|
|
|
342
345
|
raise _invalid(f"notify.channels[{i}] must be one of {list(NOTIFY_CHANNELS)}", f"notify.channels[{i}]")
|
|
343
346
|
if ch not in out:
|
|
344
347
|
out.append(ch)
|
|
345
|
-
|
|
348
|
+
result = {"channels": [c for c in NOTIFY_CHANNELS if c in out]}
|
|
349
|
+
if "recipients" in notify:
|
|
350
|
+
recipients = validate_email_allowed_recipients(notify["recipients"], field="notify.recipients")
|
|
351
|
+
if not recipients:
|
|
352
|
+
raise _invalid("Choose at least one result recipient", "notify.recipients")
|
|
353
|
+
result["recipients"] = recipients
|
|
354
|
+
return result
|
|
346
355
|
|
|
347
356
|
|
|
348
357
|
def validate_policy(value: Any) -> Dict[str, Any]:
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Host-facing ASGI delegation to AbstractCore's serving application.
|
|
2
|
+
|
|
3
|
+
Hosts own route admission, network policy, and token storage. This facade keeps
|
|
4
|
+
Core imports behind Runtime's integration boundary and scopes authentication to
|
|
5
|
+
one complete ASGI response, including streamed bodies.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import importlib
|
|
11
|
+
from typing import Any, Awaitable, Callable, MutableMapping
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
async def serve_core_request(
|
|
15
|
+
scope: MutableMapping[str, Any],
|
|
16
|
+
receive: Callable[[], Awaitable[dict[str, Any]]],
|
|
17
|
+
send: Callable[[dict[str, Any]], Awaitable[None]],
|
|
18
|
+
*,
|
|
19
|
+
token: str,
|
|
20
|
+
allow_unauthenticated: bool = False,
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Serve a host-admitted request using an independent inbound auth policy.
|
|
23
|
+
|
|
24
|
+
Requires the AbstractCore server dependencies. Importing this module does
|
|
25
|
+
not load Core or its application. The host must provide a nonempty token,
|
|
26
|
+
even when allowing anonymous requests; supplied credentials still validate.
|
|
27
|
+
"""
|
|
28
|
+
module = await asyncio.to_thread(importlib.import_module, "abstractcore.server.app")
|
|
29
|
+
from abstractcore.server.auth_policy import ServerAuthPolicy, use_server_auth_policy
|
|
30
|
+
|
|
31
|
+
with use_server_auth_policy(ServerAuthPolicy(token, allow_unauthenticated)):
|
|
32
|
+
await module.app(scope, receive, send)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""The host facade preserves ASGI streaming and request-local auth."""
|
|
2
|
+
import asyncio
|
|
3
|
+
import importlib
|
|
4
|
+
import threading
|
|
5
|
+
from types import SimpleNamespace
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from abstractruntime.integrations.abstractcore import server_facade
|
|
10
|
+
from abstractcore.server.auth_policy import current_server_auth_policy
|
|
11
|
+
|
|
12
|
+
pytestmark = pytest.mark.basic
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_concurrent_streams_keep_separate_auth_and_import_off_loop(monkeypatch):
|
|
16
|
+
main_thread = threading.get_ident()
|
|
17
|
+
imports = []
|
|
18
|
+
barrier = None
|
|
19
|
+
seen = []
|
|
20
|
+
|
|
21
|
+
async def app(scope, receive, send):
|
|
22
|
+
policy = current_server_auth_policy()
|
|
23
|
+
assert policy.token == scope["token"]
|
|
24
|
+
await send({"type": "http.response.start", "status": 200, "headers": []})
|
|
25
|
+
await send({"type": "http.response.body", "body": b"first", "more_body": True})
|
|
26
|
+
await barrier.wait()
|
|
27
|
+
assert current_server_auth_policy() is policy
|
|
28
|
+
seen.append((policy.token, policy.allow_unauthenticated))
|
|
29
|
+
await send({"type": "http.response.body", "body": b"last"})
|
|
30
|
+
|
|
31
|
+
def load(name):
|
|
32
|
+
imports.append((name, threading.get_ident()))
|
|
33
|
+
return SimpleNamespace(app=app)
|
|
34
|
+
|
|
35
|
+
monkeypatch.setattr(server_facade.importlib, "import_module", load)
|
|
36
|
+
|
|
37
|
+
async def run():
|
|
38
|
+
nonlocal barrier
|
|
39
|
+
barrier = asyncio.Event()
|
|
40
|
+
bodies = {"one": [], "two": []}
|
|
41
|
+
async def receive():
|
|
42
|
+
return {"type": "http.disconnect"}
|
|
43
|
+
async def invoke(token, anonymous):
|
|
44
|
+
async def send(message):
|
|
45
|
+
bodies[token].append(message)
|
|
46
|
+
if all(any(m.get("more_body") for m in messages) for messages in bodies.values()):
|
|
47
|
+
barrier.set()
|
|
48
|
+
await server_facade.serve_core_request({"token": token}, receive, send, token=token, allow_unauthenticated=anonymous)
|
|
49
|
+
assert current_server_auth_policy() is None
|
|
50
|
+
await asyncio.gather(invoke("one", False), invoke("two", True))
|
|
51
|
+
assert all(messages[-1]["body"] == b"last" for messages in bodies.values())
|
|
52
|
+
asyncio.run(run())
|
|
53
|
+
assert sorted(seen) == [("one", False), ("two", True)]
|
|
54
|
+
assert all(name == "abstractcore.server.app" and thread != main_thread for name, thread in imports)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@pytest.mark.parametrize("error", [RuntimeError("stream failed"), asyncio.CancelledError()])
|
|
58
|
+
def test_policy_resets_on_failure_or_cancellation(monkeypatch, error):
|
|
59
|
+
async def app(scope, receive, send):
|
|
60
|
+
assert current_server_auth_policy().token == "managed"
|
|
61
|
+
await asyncio.sleep(0)
|
|
62
|
+
raise error
|
|
63
|
+
monkeypatch.setattr(server_facade.importlib, "import_module", lambda name: SimpleNamespace(app=app))
|
|
64
|
+
async def run():
|
|
65
|
+
async def receive():
|
|
66
|
+
return {"type": "http.disconnect"}
|
|
67
|
+
async def send(message):
|
|
68
|
+
pass
|
|
69
|
+
with pytest.raises(type(error)):
|
|
70
|
+
await server_facade.serve_core_request({}, receive, send, token="managed")
|
|
71
|
+
assert current_server_auth_policy() is None
|
|
72
|
+
asyncio.run(run())
|
|
@@ -166,3 +166,16 @@ def test_the_longest_accepted_interval_runs():
|
|
|
166
166
|
binding = {"binding_id": "b", "source_id": "schedule", "source_version": 1, "config": cfg}
|
|
167
167
|
state = a.admit(binding, state=a.initial_state(cfg), now=NOW)["state"]
|
|
168
168
|
assert a.prepare(binding, state=state, now=NOW)["until"] == "2027-01-02T00:00:00+00:00"
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@pytest.mark.parametrize("limit", [0, -1, True, False, 1.5, "30000", None])
|
|
172
|
+
def test_growing_context_rejects_invalid_token_limit(limit):
|
|
173
|
+
with pytest.raises(AutomationError) as exc:
|
|
174
|
+
_build(context={"mode": "growing", "growing": {"max_tokens": limit}})
|
|
175
|
+
assert exc.value.field == "context.growing.max_tokens"
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def test_growing_context_keeps_custom_token_limit():
|
|
179
|
+
assert _build(context={"mode": "growing", "growing": {"max_tokens": 30_000}})["context"] == {
|
|
180
|
+
"mode": "growing", "growing": {"max_tokens": 30_000},
|
|
181
|
+
}
|