AbstractRuntime 0.6.0__tar.gz → 0.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/.github/workflows/ci.yml +11 -2
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/.github/workflows/release.yml +11 -2
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/CHANGELOG.md +99 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/PKG-INFO +7 -7
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/README.md +3 -3
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/README.md +1 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/api.md +8 -2
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/architecture.md +2 -2
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/automations.md +19 -7
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +5 -2
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/troubleshooting.md +1 -1
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/llms-full.txt +34 -15
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/llms.txt +3 -2
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/pyproject.toml +4 -4
- abstractruntime-0.7.0/release-notes.md +94 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/__init__.py +10 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/controller.py +43 -5
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/models.py +2 -3
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/service.py +26 -34
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/chat.py +27 -12
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/tools.py +5 -3
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/visit_workflow.py +78 -63
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +11 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +22 -1
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +27 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/token_budget.py +28 -9
- abstractruntime-0.7.0/src/abstractruntime/session_history.py +614 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/turn_grounding.py +16 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/automation_harness.py +10 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_abstractcore_discovery_facade.py +6 -3
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_discussion_isolation.py +43 -16
- abstractruntime-0.7.0/tests/test_automation_growing_context.py +161 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_session_turns.py +5 -2
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_budget_law_no_unrequested_caps.py +43 -0
- abstractruntime-0.7.0/tests/test_discovery_tts_unavailable_reason.py +52 -0
- abstractruntime-0.7.0/tests/test_discovery_voice_openai_api_key.py +58 -0
- abstractruntime-0.7.0/tests/test_entity_history_window.py +260 -0
- abstractruntime-0.7.0/tests/test_entity_react_visit_window.py +266 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_packaging_extras.py +3 -3
- abstractruntime-0.7.0/tests/test_session_history.py +617 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visit_midturn_resume.py +6 -1
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visit_workflow.py +6 -1
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +5 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_agora_react_agent.py +8 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_event_inbox_react_agent.py +8 -0
- abstractruntime-0.7.0/tests/test_voice_openai_api_key_path.py +158 -0
- abstractruntime-0.6.0/release-notes.md +0 -122
- abstractruntime-0.6.0/src/abstractruntime/session_history.py +0 -385
- abstractruntime-0.6.0/tests/test_automation_growing_context.py +0 -90
- abstractruntime-0.6.0/tests/test_session_history.py +0 -445
- abstractruntime-0.6.0/tests/test_visit_history_replay_caps.py +0 -161
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/.gitignore +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/LICENSE +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/ROADMAP.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/SECURITY.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/adr/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/artifacts.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/evidence.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/faq.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/getting-started.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/limits.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/manual_testing.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/proposal.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/provenance.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/snapshots.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/tool-approval.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/tools-comms.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/emails.config.example.yaml +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/05_persistence.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/examples/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/mkdocs.yml +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/pytest.ini +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/README.md +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/conftest.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_command_store.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_offloading.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.6.0 → abstractruntime-0.7.0}/tests/test_write_chart.py +0 -0
|
@@ -29,7 +29,7 @@ jobs:
|
|
|
29
29
|
- name: Install
|
|
30
30
|
run: |
|
|
31
31
|
python -m pip install -U pip
|
|
32
|
-
python -m pip install -e ".[
|
|
32
|
+
python -m pip install -e ".[test]"
|
|
33
33
|
- name: Pytest basic suite
|
|
34
34
|
run: python -m pytest -q -m basic
|
|
35
35
|
- name: Pytest focused runtime suite
|
|
@@ -47,7 +47,16 @@ jobs:
|
|
|
47
47
|
tests/test_visual_multi_entry_loop_overrides.py \
|
|
48
48
|
tests/test_control_adapter_while.py \
|
|
49
49
|
tests/test_jsonl_ledger_recovery.py \
|
|
50
|
-
tests/test_llm_client_media_artifacts.py
|
|
50
|
+
tests/test_llm_client_media_artifacts.py \
|
|
51
|
+
tests/test_session_history.py \
|
|
52
|
+
tests/test_entity_history_window.py \
|
|
53
|
+
tests/test_automation_discussion_isolation.py \
|
|
54
|
+
tests/test_automation_growing_context.py \
|
|
55
|
+
tests/test_automation_session_turns.py \
|
|
56
|
+
tests/test_budget_law_no_unrequested_caps.py \
|
|
57
|
+
tests/test_discovery_voice_openai_api_key.py \
|
|
58
|
+
tests/test_voice_openai_api_key_path.py \
|
|
59
|
+
tests/test_discovery_tts_unavailable_reason.py
|
|
51
60
|
|
|
52
61
|
build:
|
|
53
62
|
name: Build distributions
|
|
@@ -44,7 +44,7 @@ jobs:
|
|
|
44
44
|
- name: Install
|
|
45
45
|
run: |
|
|
46
46
|
python -m pip install -U pip
|
|
47
|
-
python -m pip install -e ".[
|
|
47
|
+
python -m pip install -e ".[test]"
|
|
48
48
|
- name: Pytest basic suite
|
|
49
49
|
run: python -m pytest -q -m basic
|
|
50
50
|
- name: Pytest focused runtime suite
|
|
@@ -62,7 +62,16 @@ jobs:
|
|
|
62
62
|
tests/test_visual_multi_entry_loop_overrides.py \
|
|
63
63
|
tests/test_control_adapter_while.py \
|
|
64
64
|
tests/test_jsonl_ledger_recovery.py \
|
|
65
|
-
tests/test_llm_client_media_artifacts.py
|
|
65
|
+
tests/test_llm_client_media_artifacts.py \
|
|
66
|
+
tests/test_session_history.py \
|
|
67
|
+
tests/test_entity_history_window.py \
|
|
68
|
+
tests/test_automation_discussion_isolation.py \
|
|
69
|
+
tests/test_automation_growing_context.py \
|
|
70
|
+
tests/test_automation_session_turns.py \
|
|
71
|
+
tests/test_budget_law_no_unrequested_caps.py \
|
|
72
|
+
tests/test_discovery_voice_openai_api_key.py \
|
|
73
|
+
tests/test_voice_openai_api_key_path.py \
|
|
74
|
+
tests/test_discovery_tts_unavailable_reason.py
|
|
66
75
|
|
|
67
76
|
docs:
|
|
68
77
|
name: Build docs
|
|
@@ -5,6 +5,105 @@ All notable changes to AbstractRuntime will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.7.0] - 2026-09-28
|
|
11
|
+
|
|
12
|
+
Replayed session history is one window: the most recent 50,000 tokens of whole turns, recorded in the run.
|
|
13
|
+
Library callers of `session_chat_messages` and `automation_timeline_messages` should read the **Breaking** note.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- The base install and the `apple` / `gpu` profiles require AbstractCore 2.18.0 or newer. Its voice extra brings
|
|
18
|
+
AbstractVoice 0.13.0, the first release that honours the `voice_openai_api_key` setting described below.
|
|
19
|
+
|
|
20
|
+
- **Session history replay is one window: the most recent 50,000 tokens.** `session_chat_messages` keeps the newest
|
|
21
|
+
turns that fit `HISTORY_REPLAY_MAX_TOKENS` (50,000) estimated tokens, as whole messages, newest first. The window has
|
|
22
|
+
no gaps, and a total of exactly 50,000 tokens fits. The 40-message cap, the 24,000-character total budget and the
|
|
23
|
+
8,000-character cut per message are removed, so no replayed message is ever cut. When the newest turn alone is larger
|
|
24
|
+
than the window, it is kept whole and the report says so (`oversize_turn_kept`). Tokens are counted with the existing
|
|
25
|
+
estimator, `memory.token_budget.estimate_message_tokens`. This window applies to automation growing mode (it
|
|
26
|
+
replaces the 40-message / 24,000-character limit of contract D), to discussion seeds (`automation_timeline_messages`)
|
|
27
|
+
and to host session seeding. The window is the only limit on replayed history; the model can use the rest of its
|
|
28
|
+
context window (operator ruling 2026-09-28, ADR-0026 §3: budgets are met by choosing whole turns, never by cutting
|
|
29
|
+
content).
|
|
30
|
+
- **Library API:** `session_chat_messages` still accepts `max_messages`, `max_chars_per_message` and
|
|
31
|
+
`max_total_chars` (keyword-only, default `None`) but IGNORES them: they no longer limit anything. Hosts built against
|
|
32
|
+
0.6 (AbstractGateway 0.6.0 passes `max_messages=40, max_total_chars=24000` and treats any error as "no history") keep
|
|
33
|
+
replaying their sessions under the window. Passing any of them logs one warning and names them in
|
|
34
|
+
`report["ignored_inputs"]`. Pass `max_tokens` (a positive int) to use a different window.
|
|
35
|
+
- **Breaking (library API):** `automation_timeline_messages` takes `max_tokens` instead of `max_messages` /
|
|
36
|
+
`max_chars_per_message` / `max_total_chars`. `GROWING_MAX_MESSAGES` and `GROWING_MAX_TOTAL_CHARS` are removed from
|
|
37
|
+
`abstractruntime.automations.models`.
|
|
38
|
+
- **The entity chat driver and the entity visit workflow use the same window.** They used to keep only the last 10
|
|
39
|
+
turns in the prompt, without saying so. Now every turn is kept, and each prompt carries the most recent 50,000 tokens
|
|
40
|
+
of whole turns, with the `[#TRUNCATION: ...]` line when older turns were dropped. The visit records the window's
|
|
41
|
+
report in `vars._runtime.session_history`; `ChatSession` puts it on `TurnReport.history_window` (and
|
|
42
|
+
`ChatSession.history_window`).
|
|
43
|
+
- **The react visit arm (the one AbstractGateway uses) sends the window too.** Its transcript is the durable
|
|
44
|
+
`context.messages`, sent by the AbstractAgent react loop on every call; before, nothing bounded it (after 12 turns of
|
|
45
|
+
~10k tokens a request was ~117k tokens, and a poisoned tool result rode every later turn). BRIDGE now sets
|
|
46
|
+
`_runtime.history_window_tokens` (50,000); the adapter sends `window_transcript(context.messages)` on every call —
|
|
47
|
+
a tool result stays with its turn, so a 495k-character tool result drops out of the request once a newer turn
|
|
48
|
+
exists — and records the report in `vars._runtime.session_history`. The stored transcript stays whole. BRIDGE also
|
|
49
|
+
records `_runtime.history_window_turn_start` (the visitor's message), and the window keeps the turn in progress whole
|
|
50
|
+
from there (`window_transcript(..., current_turn_start=)`): an `ask_user` answer or operator guidance inside the turn
|
|
51
|
+
no longer splits off the turn's own question and tool results; a turn larger than the window is kept whole and
|
|
52
|
+
reported as `oversize_turn_kept`. HARVEST
|
|
53
|
+
keeps a turn whose adapter recorded no window (AbstractAgent older than 0.3.17 sends the whole transcript) but
|
|
54
|
+
logs a warning ("abstractagent < 0.3.17 does not apply the history window; upgrade abstractagent") and records
|
|
55
|
+
`{"window_applied": false, "reason": "agent_too_old", ...}` in `vars._runtime.session_history` (counting the messages
|
|
56
|
+
the last request carried, not the reply stored after it); a windowed turn
|
|
57
|
+
records `window_applied: true`. **The window on the react arm needs AbstractAgent 0.3.17 or newer.**
|
|
58
|
+
- The `[#TRUNCATION: ...]` line is written after a stamped message's own `<runtime_metadata>` envelope, which stays at
|
|
59
|
+
the head (written in front, it made the payload boundary stack a second envelope).
|
|
60
|
+
- **Breaking (library API):** the `history_turns` parameter of `build_visit_workflow` and `ChatSession` is removed,
|
|
61
|
+
with `DEFAULT_HISTORY_TURNS` (no caller in the framework passed it). The entity visit no longer sets the
|
|
62
|
+
per-message character limits `_limits.max_tool_message_chars` (32,000) and `_limits.max_message_chars` (80,000) on
|
|
63
|
+
re-sent history, and `VISIT_HISTORY_TOOL_RESULT_CAP_CHARS` / `VISIT_HISTORY_MESSAGE_CAP_CHARS` are removed. A
|
|
64
|
+
single oversized tool result is still limited by AbstractAgent's own guard for oversized messages (200,000 characters).
|
|
65
|
+
- `trim_messages_to_max_input_tokens` (used only when a caller sets a positive `max_input_tokens`) keeps each tool
|
|
66
|
+
result together with the assistant tool call before it. It used to drop the call and keep the result, which
|
|
67
|
+
OpenAI-style APIs reject.
|
|
68
|
+
|
|
69
|
+
- **The context mode decides whether an automation's target reads history.** At admission the runtime sets
|
|
70
|
+
`use_context` (and `include_context` when present) to `true` for growing occurrences and `false` for independent
|
|
71
|
+
ones, and to `true` for discussion forks. A `use_context: false` frozen in an older definition no longer makes a
|
|
72
|
+
growing automation or a discussion replay nothing (basic-agent's `use_context` pin defaults to `false`). The run
|
|
73
|
+
records `_runtime.automation_context = {mode, use_context, target_use_context}`. Occurrences that were already
|
|
74
|
+
admitted before the upgrade keep their frozen inputs.
|
|
75
|
+
|
|
76
|
+
### Added
|
|
77
|
+
|
|
78
|
+
- Voice discovery (`local_get_voice_catalog`, `local_list_tts_models`, `local_list_stt_models`) accepts a
|
|
79
|
+
host-supplied `voice_openai_api_key` and passes it to AbstractVoice as the plugin setting of the same name (the
|
|
80
|
+
OpenAI credential for its `openai` engines; AbstractVoice reads no environment variable for it). The discovery
|
|
81
|
+
facade and the local clients accept and forward it (`AbstractCoreDiscoveryFacade.get_voice_catalog` /
|
|
82
|
+
`list_tts_models` / `list_stt_models(voice_openai_api_key=...)`); the remote client accepts it and never sends it.
|
|
83
|
+
In `llm_kwargs` it reaches the voice plugin through the provider's `config` and changes no text request; tests
|
|
84
|
+
prove this on real OpenAI, LM Studio, Ollama and MLX provider classes, with the network refused.
|
|
85
|
+
- **The window is recorded.** `session_chat_messages` and `automation_timeline_messages` return a `ReplayedHistory`
|
|
86
|
+
(a list of messages) with a `.report`: `policy`, `max_tokens`, `token_estimator`, `replayed_messages`,
|
|
87
|
+
`replayed_tokens`, `dropped_messages`, `dropped_tokens`, `dropped_counts_complete`, `oversize_turn_kept`. A growing
|
|
88
|
+
occurrence records it in `vars._runtime.session_history`, so the `automation.admitted` record's frozen inputs carry
|
|
89
|
+
it too. A discussion root records its seed window the same way. When older turns are dropped, the oldest replayed
|
|
90
|
+
message starts with a `[#TRUNCATION: ...]` line that gives the number of dropped messages and tokens and the window.
|
|
91
|
+
New exports at the package root: `HISTORY_REPLAY_MAX_TOKENS`, `ReplayedHistory`, `fold_history_window`,
|
|
92
|
+
`announce_dropped` (writes that `[#TRUNCATION: ...]` line after a host's own `fold_history_window` call, for example
|
|
93
|
+
on client-sent history; `session_history._announce_dropped` stays as an alias) and `window_transcript` (the window
|
|
94
|
+
over a transcript the caller already holds).
|
|
95
|
+
- `local_list_tts_models` reports why a provider cannot be listed: when the listing is unavailable, `error` carries
|
|
96
|
+
AbstractVoice's `unavailable_reason` (for example "no OpenAI API key is configured ..." or an unknown provider id).
|
|
97
|
+
It used to return `available: false, error: null`.
|
|
98
|
+
- Replay reads turns newest-first in batches that double in size, and stops once the window is full. A long session
|
|
99
|
+
therefore costs about as much as its window holds.
|
|
100
|
+
|
|
101
|
+
### Tests and CI
|
|
102
|
+
|
|
103
|
+
- CI installs the extras that exist (`.[test]`) and runs the history-window, entity window, automation timeline,
|
|
104
|
+
input-trim and voice-key tests. The five tests that need the sibling `abstractflow/` checkout or the
|
|
105
|
+
`abstractagent` package skip when those are absent (a standalone checkout or an sdist).
|
|
106
|
+
|
|
8
107
|
## [0.6.0] - 2026-09-27
|
|
9
108
|
|
|
10
109
|
Automations v1: run a workflow on a schedule or on request as a durable, crash-safe controller run. Hosts that
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
|
|
5
5
|
Project-URL: AbstractCore (website), https://www.abstractcore.ai/
|
|
6
6
|
Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
|
|
@@ -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[audio,music,remote,tools,vision,voice]>=2.
|
|
23
|
+
Requires-Dist: abstractcore[audio,music,remote,tools,vision,voice]>=2.18.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[all-apple]>=2.
|
|
38
|
+
Requires-Dist: abstractcore[all-apple]>=2.18.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[all-gpu]>=2.
|
|
45
|
+
Requires-Dist: abstractcore[all-gpu]>=2.18.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: pytest>=7.0.0; extra == 'test'
|
|
@@ -54,7 +54,7 @@ Description-Content-Type: text/markdown
|
|
|
54
54
|
|
|
55
55
|
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
|
|
56
56
|
|
|
57
|
-
**Version:** 0.
|
|
57
|
+
**Version:** 0.7.0 • **Python:** 3.10+
|
|
58
58
|
|
|
59
59
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
60
60
|
|
|
@@ -82,7 +82,7 @@ Remote-light runtime:
|
|
|
82
82
|
pip install abstractruntime
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
The base install includes AbstractCore 2.
|
|
85
|
+
The base install includes AbstractCore 2.18.0 or newer with remote provider,
|
|
86
86
|
tool, vision, voice, audio, and music integration, plus the
|
|
87
87
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
88
88
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -146,7 +146,7 @@ state = rt.resume(
|
|
|
146
146
|
assert state.status.value == "completed"
|
|
147
147
|
```
|
|
148
148
|
|
|
149
|
-
## What’s included (v0.
|
|
149
|
+
## What’s included (v0.7.0)
|
|
150
150
|
|
|
151
151
|
Kernel (import-light):
|
|
152
152
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
|
|
6
6
|
|
|
7
|
-
**Version:** 0.
|
|
7
|
+
**Version:** 0.7.0 • **Python:** 3.10+
|
|
8
8
|
|
|
9
9
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
10
10
|
|
|
@@ -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.18.0 or newer with remote provider,
|
|
36
36
|
tool, 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
|
|
@@ -96,7 +96,7 @@ state = rt.resume(
|
|
|
96
96
|
assert state.status.value == "completed"
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
## What’s included (v0.
|
|
99
|
+
## What’s included (v0.7.0)
|
|
100
100
|
|
|
101
101
|
Kernel (import-light):
|
|
102
102
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -30,6 +30,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
30
30
|
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
31
31
|
- `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` self-recipient rule)
|
|
32
32
|
- `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
|
|
33
|
+
- `api.md#sessions-and-history` — session history replay: one window, the most recent 50,000 tokens of whole turns (`HISTORY_REPLAY_MAX_TOKENS`), returned as a `ReplayedHistory` whose `.report` records what was replayed and dropped
|
|
33
34
|
- `api.md#run-history-bundle-export-portable-replay-artifact` — run history bundles, including `resolved_actions` summaries for cross-client capability replay
|
|
34
35
|
|
|
35
36
|
## Features (reference)
|
|
@@ -251,7 +251,12 @@ from abstractruntime.triggers import get_trigger_adapter, trigger_sources
|
|
|
251
251
|
Implementation: `src/abstractruntime/session_turns.py`, `src/abstractruntime/session_history.py`, `src/abstractruntime/core/run_attribution.py`.
|
|
252
252
|
|
|
253
253
|
- `select_session_turns(run_store, session_id, *, include_occurrences=True, until_ms=None, automation_id=None, through_occurrence=None, include_drafts=False, limit=50)` (package root): a session's turns, oldest first. Turns are parent-less runs except automation controllers, plus automation occurrences (a retried occurrence counts once, as its newest attempt); child runs, runtime-internal runs, legacy scheduled wrappers and draft-test runs are left out
|
|
254
|
-
- `session_chat_messages(run_store=, ledger_store=, artifact_store=, session_id=,
|
|
254
|
+
- `session_chat_messages(run_store=, ledger_store=, artifact_store=, session_id=, max_tokens=HISTORY_REPLAY_MAX_TOKENS, until_ms=None, exclude_run_ids=None, automation_id=None, through_occurrence=None, strict=False)` (package root): the session's completed turns as user/assistant message pairs; in a discussion session the discussion's seed comes first. Returns a `ReplayedHistory` (a list of messages) whose `.report` says what was replayed and dropped. `strict=True` raises `SessionHistoryError` (`reason_code = "history_unavailable"`) instead of returning a partial history. `max_messages`, `max_total_chars` and `max_chars_per_message` (keyword-only, default `None`) are the caps retired in 0.7.0: they are accepted so hosts built against 0.6 (AbstractGateway 0.6.0) still get their history, and ignored. Passing any of them logs one warning and names them in `report["ignored_inputs"]`
|
|
255
|
+
- The history window: `HISTORY_REPLAY_MAX_TOKENS = 50_000` (package root). Replay keeps the most recent turns that fit 50,000 estimated tokens, newest first, as whole messages. There is no message-count cap and no character cap, and no message is ever cut. The fold stops at the first older turn that does not fit, so the window has no gaps. A total of exactly 50,000 tokens fits. One exception: when the newest turn alone is larger than the window, it is kept whole (`oversize_turn_kept: true`), because cutting it would lose content and dropping it would replay nothing. The model can use the rest of its context window; if a turn is too large for the model, the provider reports the error. Tokens are counted with `abstractruntime.memory.token_budget.estimate_message_tokens`. `max_tokens` must be a positive int
|
|
256
|
+
- `ReplayedHistory.report`: `{policy: "most_recent_whole_turns", max_tokens, token_estimator, replayed_messages, replayed_tokens, dropped_messages, dropped_tokens, dropped_counts_complete, oversize_turn_kept}`. Replay stops reading once the window is full, so in a long session `dropped_counts_complete` is `false` and the dropped counts cover only the turns it read. When turns were dropped, the oldest replayed message starts with a `[#TRUNCATION: N earlier message(s) ... were dropped from replay by the history window ...]` line (ADR-0026). Hosts record the report in the run as `vars._runtime.session_history`
|
|
257
|
+
- `fold_history_window(pairs, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS)` (package root): the window itself, applied to chronological turns (lists of whole messages); returns `(kept, report)`
|
|
258
|
+
- `announce_dropped(messages, report, *, stamp_metadata=True)` (package root): writes the window's `[#TRUNCATION: ...]` notice at the start of the oldest kept message, in place, when `report` says turns were dropped. Use it after your own `fold_history_window` call (for example on client-sent history) so the notice matches session replay. `stamp_metadata=True` also adds `metadata.replay_truncated` and `metadata.history_window` to that message; pass `False` for plain role/content messages. `_announce_dropped` is kept as an alias of the pre-0.7.0 private name
|
|
259
|
+
- `window_transcript(messages, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS, current_turn_start=None)` (package root): the same window over a transcript you already hold (a turn is a user message and the messages after it). `current_turn_start` is the index of the message that opened the turn in progress: from there on everything is one turn, the newest, always kept whole (`oversize_turn_kept` when it alone exceeds the window), whatever user-role messages a loop adds inside it; an index out of range raises `ValueError`. Returns a `ReplayedHistory` of copies with the notice written by `announce_dropped(..., stamp_metadata=False)`. The entity chat driver and the entity visit workflow use it for their prompts. The visit records the report in `vars._runtime.session_history`; the chat driver puts it on `TurnReport.history_window`. On the react visit arm, BRIDGE sets `_runtime.history_window_tokens` (50,000) and `_runtime.history_window_turn_start` (the visitor's message) and the AbstractAgent react loop (0.3.17 or newer) sends `window_transcript(context.messages)` on each call and records the report; the stored transcript stays whole. The report carries `window_applied: true`; with an older AbstractAgent that records no window the turn still completes, a warning is logged and the report is `{"window_applied": false, "reason": "agent_too_old", ...}` (the whole transcript was sent). When the oldest kept message carries a `<runtime_metadata>` envelope, the notice is written after it
|
|
255
260
|
- `session_attribution(run_store, session_id)` (`abstractruntime.core.run_attribution`): `None` or `{"kind": "chat" | "automation" | "occurrence" | "discussion", ...}`; a discussion adds its validated root, automation, occurrence and workspace. Raises `SessionAttributionError` when the lookup cannot be completed
|
|
256
261
|
- `is_draft_lifecycle(run_lifecycle)` (package root): whether a run's lifecycle value marks a draft test run
|
|
257
262
|
|
|
@@ -272,7 +277,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
272
277
|
|
|
273
278
|
### AbstractCore (LLM + tools)
|
|
274
279
|
|
|
275
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.
|
|
280
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.18.0 or newer is part of the base install).
|
|
276
281
|
|
|
277
282
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
278
283
|
|
|
@@ -286,6 +291,7 @@ Entry points:
|
|
|
286
291
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
287
292
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
288
293
|
- discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
|
|
294
|
+
- the host's OpenAI credential for AbstractVoice's `openai` engines, `voice_openai_api_key`, travels two ways. For discovery, pass it to `get_voice_catalog`, `list_tts_models` or `list_stt_models`; the local clients hand it to the voice plugin's config, and a remote client never sends it (a remote AbstractCore server uses its own voice configuration). For execution, put it in `create_local_runtime(llm_kwargs={"voice_openai_api_key": ...})`. Constructor kwargs become the provider's `config`, which is also the capability-plugin config. Providers read only the keys they name, so a `voice_*` key changes no text request (tests `tests/test_voice_openai_api_key_path.py`)
|
|
289
295
|
- host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`, `get_memory_snapshot`, `list_session_prompt_caches`, `clear_session_prompt_caches`, `lock_model_residency`, `unlock_model_residency`, `get_context_estimate`); the last six are optional in the client contract, and the facade returns `{"ok": false, "supported": false, ...}` when the configured client does not implement one
|
|
290
296
|
- switching the default model (`set_default_provider_model` on the pooled client) unloads the previous in-process model unless an owner in the process still uses it; `list_model_residency` diagnostics report `pending_ejects` and `last_switch_ejects`, and `unload_model_residency(runtime_id=...)` accepts any listed `local:<task>:<provider>:<model>` id, including `local:embedding:<provider>:<model>` rows (see `integrations/abstractcore.md#unloading-and-switching-models`)
|
|
291
297
|
- `lock_model_residency`, `unlock_model_residency`, and `get_context_estimate` accept an optional payload mapping and/or keyword arguments (keyword arguments win on conflicts); a lock requires provider-verified residency — locking a non-resident pair refuses with a structured `model_not_resident` payload (load with `lock: true` instead; remotely the Core server's HTTP 409 refusal is converted to the same payload), while unlock never requires residency so a locked-but-evicted pair is always releasable; a locked model refuses `unload_model_residency` with a structured `model_locked` payload — locally as a client-side per-`(provider, model)` lock, remotely by converting the Core server's HTTP 409 refusal — and unloads only with `force=true`, releasing the lock only after the unload succeeds
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
|
-
> Updated: 2026-09-
|
|
4
|
-
> Version: 0.
|
|
3
|
+
> Updated: 2026-09-28
|
|
4
|
+
> Version: 0.7.0
|
|
5
5
|
> Scope: this describes **what is implemented in this repository**.
|
|
6
6
|
|
|
7
7
|
AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
|
|
@@ -293,13 +293,23 @@ controller is woken with `max_steps=0`; the host (or `drive_automation`) then ti
|
|
|
293
293
|
| | Independent (default) | Growing |
|
|
294
294
|
|---|---|---|
|
|
295
295
|
| Session | a new session per occurrence, named after its attempt-1 run id | the automation's session, `automation:<automation_id>` |
|
|
296
|
-
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages
|
|
296
|
+
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages`: the most recent 50,000 tokens of whole turns (the session history window) |
|
|
297
|
+
| `use_context` given to the target | `false` | `true` |
|
|
297
298
|
| `_meta.occurrence.session_kind` | `occurrence` | `automation` |
|
|
298
299
|
|
|
300
|
+
The context mode alone decides whether the target reads history: at admission the runtime sets the target's
|
|
301
|
+
`use_context` input (and `include_context` when the target has it) to `true` for growing and `false` for
|
|
302
|
+
independent, whatever the definition's `target.input_data` says. A discussion always gets `use_context: true`.
|
|
303
|
+
The run records the decision as `_runtime.automation_context = {mode, use_context, target_use_context}`, where
|
|
304
|
+
`target_use_context` is the value the definition carried. Automations created before this rule, with
|
|
305
|
+
`use_context: false` in their target, now replay their history without being revised.
|
|
306
|
+
|
|
299
307
|
Growing history is read at admission and frozen with the occurrence's inputs, so every retry sees the same history.
|
|
300
308
|
It is read strictly: when it cannot be read (a store without a run index, for example), the admission fails instead
|
|
301
309
|
of running the occurrence without its context. History keeps whole turns, newest first, and says so in the oldest
|
|
302
|
-
kept message when older turns were dropped.
|
|
310
|
+
kept message when older turns were dropped. The occurrence run records what was replayed in
|
|
311
|
+
`vars._runtime.session_history` (`replayed_messages`, `replayed_tokens`, `dropped_messages`, `dropped_tokens`,
|
|
312
|
+
`max_tokens`, ...), and the `automation.admitted` record carries the same values in its frozen inputs.
|
|
303
313
|
|
|
304
314
|
Only completed turns with both a prompt and an answer are replayed. A retried occurrence counts once, as its last
|
|
305
315
|
attempt.
|
|
@@ -318,8 +328,8 @@ actor_id=None)` starts a separate conversation about the automation as it stood
|
|
|
318
328
|
- It is seeded **once** with the automation's whole conversation through occurrence N, whatever the context mode:
|
|
319
329
|
one user/assistant pair per finished occurrence 1..N (its last attempt), the occurrence's trigger/task turn and its
|
|
320
330
|
answer, oldest first (`automation_timeline_messages(...)`). A failed or stopped occurrence stays in the timeline,
|
|
321
|
-
its answer saying so. The pairs
|
|
322
|
-
oldest are dropped first. The first user message starts with a summary line: `[Automation "<title>": <n>
|
|
331
|
+
its answer saying so. The pairs go through the session history window (the most recent 50,000 tokens of whole
|
|
332
|
+
turns, no message ever cut); the oldest are dropped first. The first user message starts with a summary line: `[Automation "<title>": <n>
|
|
323
333
|
occurrence(s) through occurrence N, showing the last K. The automation's files are mounted READ-ONLY at <path>;
|
|
324
334
|
your own workspace <path> is writable.]`. The seed is stored in `_meta.discussion.seed_messages` of the root run.
|
|
325
335
|
- It works in its **own writable workspace**, `workspace_root`, which the host allocates (it must differ from the
|
|
@@ -349,7 +359,7 @@ the same root, and that root must be a parent-less run of this session that carr
|
|
|
349
359
|
discussion provenance too.
|
|
350
360
|
|
|
351
361
|
In a discussion session, `session_chat_messages` replays the seed first, as the oldest history, and drops it first
|
|
352
|
-
under the
|
|
362
|
+
under the history window.
|
|
353
363
|
|
|
354
364
|
### Read-only mounts
|
|
355
365
|
|
|
@@ -547,7 +557,8 @@ its newest attempt. `automation_id` keeps only that automation's occurrences (ot
|
|
|
547
557
|
index to look it up in.
|
|
548
558
|
|
|
549
559
|
`session_chat_messages(..., automation_id=None, through_occurrence=None, strict=False)` replays those turns as
|
|
550
|
-
user/assistant message pairs under
|
|
560
|
+
user/assistant message pairs under the session history window (the most recent `HISTORY_REPLAY_MAX_TOKENS` = 50,000
|
|
561
|
+
tokens of whole turns; see [API](api.md#sessions-and-history)). With `strict=True` it raises
|
|
551
562
|
`SessionHistoryError` (`reason_code = "history_unavailable"`) instead of returning a partial history: a store without
|
|
552
563
|
a run index, a missing occurrence, or a discussion whose seed is missing or cannot be read. Automation admission and
|
|
553
564
|
discussion seeding always read strictly.
|
|
@@ -606,7 +617,8 @@ receives its result directly.
|
|
|
606
617
|
controller does not wait on `event` sources.
|
|
607
618
|
- Occurrences run one at a time (`serial`), missed ticks coalesce, and a failed occurrence never stops the
|
|
608
619
|
automation (`failure: "continue"`). These policies cannot be changed.
|
|
609
|
-
- Growing history is
|
|
620
|
+
- Growing history is the most recent 50,000 tokens of whole turns and is not summarized automatically; older turns
|
|
621
|
+
drop out of the replay (they stay in the store).
|
|
610
622
|
- Tools outside `TOOL_EFFECT_CLASSES`, such as third-party MCP tools, still ask for approval under `auto`.
|
|
611
623
|
- Retries repeat external effects.
|
|
612
624
|
- One writer process per store; the mutation lock does not coordinate separate processes.
|
|
@@ -24,8 +24,11 @@ Unbounded or weakly-bounded growth surfaces:
|
|
|
24
24
|
unbounded in bytes.
|
|
25
25
|
- `evidence_warnings` unbounded (1948-1953).
|
|
26
26
|
- `_runtime.inbox` unbounded if the workflow never drains.
|
|
27
|
-
- `context.messages` / visit sheets have no stated ceiling
|
|
28
|
-
is trimmed to 2×history_turns
|
|
27
|
+
- `context.messages` / visit sheets have no stated ceiling. Visit history
|
|
28
|
+
(`_visit.history`) is no longer trimmed to 2×history_turns: since 0.7.0
|
|
29
|
+
(ADR-0026, operator ruling 2026-09-28) the whole visit is kept and each
|
|
30
|
+
prompt reads it through the 50k-token history window, so it grows with the
|
|
31
|
+
visit like `context.messages` (bounded by the idle close, not by a count).
|
|
29
32
|
- events_inbox is capped at 500 envelopes (gateway-side today) but envelope
|
|
30
33
|
SIZE is unbounded... bridge clamps bodies at 32KB (gateway F7) — runtime
|
|
31
34
|
gets the cap with 0051.
|
|
@@ -20,7 +20,7 @@ Fix:
|
|
|
20
20
|
- Install or upgrade the base Runtime package. LLM/tools integration, common
|
|
21
21
|
remote-light multimodal dependencies, and the MCP worker entry point are part
|
|
22
22
|
of the base install.
|
|
23
|
-
- The current AbstractCore integration expects `abstractcore>=2.
|
|
23
|
+
- The current AbstractCore integration expects `abstractcore>=2.18.0`.
|
|
24
24
|
|
|
25
25
|
Verify:
|
|
26
26
|
|
|
@@ -52,7 +52,7 @@ See llms.txt for the linked index.
|
|
|
52
52
|
|
|
53
53
|
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
|
|
54
54
|
|
|
55
|
-
**Version:** 0.
|
|
55
|
+
**Version:** 0.7.0 • **Python:** 3.10+
|
|
56
56
|
|
|
57
57
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
58
58
|
|
|
@@ -80,7 +80,7 @@ Remote-light runtime:
|
|
|
80
80
|
pip install abstractruntime
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
The base install includes AbstractCore 2.
|
|
83
|
+
The base install includes AbstractCore 2.18.0 or newer with remote provider,
|
|
84
84
|
tool, vision, voice, audio, and music integration, plus the
|
|
85
85
|
`abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
|
|
86
86
|
default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
|
|
@@ -144,7 +144,7 @@ state = rt.resume(
|
|
|
144
144
|
assert state.status.value == "completed"
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
-
## What’s included (v0.
|
|
147
|
+
## What’s included (v0.7.0)
|
|
148
148
|
|
|
149
149
|
Kernel (import-light):
|
|
150
150
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -429,8 +429,8 @@ rt = create_local_runtime(provider="ollama", model="qwen3:4b")
|
|
|
429
429
|
|
|
430
430
|
# AbstractRuntime — Architecture
|
|
431
431
|
|
|
432
|
-
> Updated: 2026-09-
|
|
433
|
-
> Version: 0.
|
|
432
|
+
> Updated: 2026-09-28
|
|
433
|
+
> Version: 0.7.0
|
|
434
434
|
> Scope: this describes **what is implemented in this repository**.
|
|
435
435
|
|
|
436
436
|
AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
|
|
@@ -1106,7 +1106,12 @@ from abstractruntime.triggers import get_trigger_adapter, trigger_sources
|
|
|
1106
1106
|
Implementation: `src/abstractruntime/session_turns.py`, `src/abstractruntime/session_history.py`, `src/abstractruntime/core/run_attribution.py`.
|
|
1107
1107
|
|
|
1108
1108
|
- `select_session_turns(run_store, session_id, *, include_occurrences=True, until_ms=None, automation_id=None, through_occurrence=None, include_drafts=False, limit=50)` (package root): a session's turns, oldest first. Turns are parent-less runs except automation controllers, plus automation occurrences (a retried occurrence counts once, as its newest attempt); child runs, runtime-internal runs, legacy scheduled wrappers and draft-test runs are left out
|
|
1109
|
-
- `session_chat_messages(run_store=, ledger_store=, artifact_store=, session_id=,
|
|
1109
|
+
- `session_chat_messages(run_store=, ledger_store=, artifact_store=, session_id=, max_tokens=HISTORY_REPLAY_MAX_TOKENS, until_ms=None, exclude_run_ids=None, automation_id=None, through_occurrence=None, strict=False)` (package root): the session's completed turns as user/assistant message pairs; in a discussion session the discussion's seed comes first. Returns a `ReplayedHistory` (a list of messages) whose `.report` says what was replayed and dropped. `strict=True` raises `SessionHistoryError` (`reason_code = "history_unavailable"`) instead of returning a partial history. `max_messages`, `max_total_chars` and `max_chars_per_message` (keyword-only, default `None`) are the caps retired in 0.7.0: they are accepted so hosts built against 0.6 (AbstractGateway 0.6.0) still get their history, and ignored. Passing any of them logs one warning and names them in `report["ignored_inputs"]`
|
|
1110
|
+
- The history window: `HISTORY_REPLAY_MAX_TOKENS = 50_000` (package root). Replay keeps the most recent turns that fit 50,000 estimated tokens, newest first, as whole messages. There is no message-count cap and no character cap, and no message is ever cut. The fold stops at the first older turn that does not fit, so the window has no gaps. A total of exactly 50,000 tokens fits. One exception: when the newest turn alone is larger than the window, it is kept whole (`oversize_turn_kept: true`), because cutting it would lose content and dropping it would replay nothing. The model can use the rest of its context window; if a turn is too large for the model, the provider reports the error. Tokens are counted with `abstractruntime.memory.token_budget.estimate_message_tokens`. `max_tokens` must be a positive int
|
|
1111
|
+
- `ReplayedHistory.report`: `{policy: "most_recent_whole_turns", max_tokens, token_estimator, replayed_messages, replayed_tokens, dropped_messages, dropped_tokens, dropped_counts_complete, oversize_turn_kept}`. Replay stops reading once the window is full, so in a long session `dropped_counts_complete` is `false` and the dropped counts cover only the turns it read. When turns were dropped, the oldest replayed message starts with a `[#TRUNCATION: N earlier message(s) ... were dropped from replay by the history window ...]` line (ADR-0026). Hosts record the report in the run as `vars._runtime.session_history`
|
|
1112
|
+
- `fold_history_window(pairs, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS)` (package root): the window itself, applied to chronological turns (lists of whole messages); returns `(kept, report)`
|
|
1113
|
+
- `announce_dropped(messages, report, *, stamp_metadata=True)` (package root): writes the window's `[#TRUNCATION: ...]` notice at the start of the oldest kept message, in place, when `report` says turns were dropped. Use it after your own `fold_history_window` call (for example on client-sent history) so the notice matches session replay. `stamp_metadata=True` also adds `metadata.replay_truncated` and `metadata.history_window` to that message; pass `False` for plain role/content messages. `_announce_dropped` is kept as an alias of the pre-0.7.0 private name
|
|
1114
|
+
- `window_transcript(messages, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS, current_turn_start=None)` (package root): the same window over a transcript you already hold (a turn is a user message and the messages after it). `current_turn_start` is the index of the message that opened the turn in progress: from there on everything is one turn, the newest, always kept whole (`oversize_turn_kept` when it alone exceeds the window), whatever user-role messages a loop adds inside it; an index out of range raises `ValueError`. Returns a `ReplayedHistory` of copies with the notice written by `announce_dropped(..., stamp_metadata=False)`. The entity chat driver and the entity visit workflow use it for their prompts. The visit records the report in `vars._runtime.session_history`; the chat driver puts it on `TurnReport.history_window`. On the react visit arm, BRIDGE sets `_runtime.history_window_tokens` (50,000) and `_runtime.history_window_turn_start` (the visitor's message) and the AbstractAgent react loop (0.3.17 or newer) sends `window_transcript(context.messages)` on each call and records the report; the stored transcript stays whole. The report carries `window_applied: true`; with an older AbstractAgent that records no window the turn still completes, a warning is logged and the report is `{"window_applied": false, "reason": "agent_too_old", ...}` (the whole transcript was sent). When the oldest kept message carries a `<runtime_metadata>` envelope, the notice is written after it
|
|
1110
1115
|
- `session_attribution(run_store, session_id)` (`abstractruntime.core.run_attribution`): `None` or `{"kind": "chat" | "automation" | "occurrence" | "discussion", ...}`; a discussion adds its validated root, automation, occurrence and workspace. Raises `SessionAttributionError` when the lookup cannot be completed
|
|
1111
1116
|
- `is_draft_lifecycle(run_lifecycle)` (package root): whether a run's lifecycle value marks a draft test run
|
|
1112
1117
|
|
|
@@ -1127,7 +1132,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
1127
1132
|
|
|
1128
1133
|
### AbstractCore (LLM + tools)
|
|
1129
1134
|
|
|
1130
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.
|
|
1135
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.18.0 or newer is part of the base install).
|
|
1131
1136
|
|
|
1132
1137
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
1133
1138
|
|
|
@@ -1141,6 +1146,7 @@ Entry points:
|
|
|
1141
1146
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
1142
1147
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
1143
1148
|
- discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_music_providers`, `list_music_models`, `list_vision_provider_models`, `list_cached_vision_models`, `list_vision_adapters`)
|
|
1149
|
+
- the host's OpenAI credential for AbstractVoice's `openai` engines, `voice_openai_api_key`, travels two ways. For discovery, pass it to `get_voice_catalog`, `list_tts_models` or `list_stt_models`; the local clients hand it to the voice plugin's config, and a remote client never sends it (a remote AbstractCore server uses its own voice configuration). For execution, put it in `create_local_runtime(llm_kwargs={"voice_openai_api_key": ...})`. Constructor kwargs become the provider's `config`, which is also the capability-plugin config. Providers read only the keys they name, so a `voice_*` key changes no text request (tests `tests/test_voice_openai_api_key_path.py`)
|
|
1144
1150
|
- host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`, `get_memory_snapshot`, `list_session_prompt_caches`, `clear_session_prompt_caches`, `lock_model_residency`, `unlock_model_residency`, `get_context_estimate`); the last six are optional in the client contract, and the facade returns `{"ok": false, "supported": false, ...}` when the configured client does not implement one
|
|
1145
1151
|
- switching the default model (`set_default_provider_model` on the pooled client) unloads the previous in-process model unless an owner in the process still uses it; `list_model_residency` diagnostics report `pending_ejects` and `last_switch_ejects`, and `unload_model_residency(runtime_id=...)` accepts any listed `local:<task>:<provider>:<model>` id, including `local:embedding:<provider>:<model>` rows (see `integrations/abstractcore.md#unloading-and-switching-models`)
|
|
1146
1152
|
- `lock_model_residency`, `unlock_model_residency`, and `get_context_estimate` accept an optional payload mapping and/or keyword arguments (keyword arguments win on conflicts); a lock requires provider-verified residency — locking a non-resident pair refuses with a structured `model_not_resident` payload (load with `lock: true` instead; remotely the Core server's HTTP 409 refusal is converted to the same payload), while unlock never requires residency so a locked-but-evicted pair is always releasable; a locked model refuses `unload_model_residency` with a structured `model_locked` payload — locally as a client-side per-`(provider, model)` lock, remotely by converting the Core server's HTTP 409 refusal — and unloads only with `force=true`, releasing the lock only after the unload succeeds
|
|
@@ -1627,7 +1633,7 @@ Fix:
|
|
|
1627
1633
|
- Install or upgrade the base Runtime package. LLM/tools integration, common
|
|
1628
1634
|
remote-light multimodal dependencies, and the MCP worker entry point are part
|
|
1629
1635
|
of the base install.
|
|
1630
|
-
- The current AbstractCore integration expects `abstractcore>=2.
|
|
1636
|
+
- The current AbstractCore integration expects `abstractcore>=2.18.0`.
|
|
1631
1637
|
|
|
1632
1638
|
Verify:
|
|
1633
1639
|
|
|
@@ -3756,13 +3762,23 @@ controller is woken with `max_steps=0`; the host (or `drive_automation`) then ti
|
|
|
3756
3762
|
| | Independent (default) | Growing |
|
|
3757
3763
|
|---|---|---|
|
|
3758
3764
|
| Session | a new session per occurrence, named after its attempt-1 run id | the automation's session, `automation:<automation_id>` |
|
|
3759
|
-
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages
|
|
3765
|
+
| History given to the occurrence | none | the automation's previous turns as `input_data.context.messages`: the most recent 50,000 tokens of whole turns (the session history window) |
|
|
3766
|
+
| `use_context` given to the target | `false` | `true` |
|
|
3760
3767
|
| `_meta.occurrence.session_kind` | `occurrence` | `automation` |
|
|
3761
3768
|
|
|
3769
|
+
The context mode alone decides whether the target reads history: at admission the runtime sets the target's
|
|
3770
|
+
`use_context` input (and `include_context` when the target has it) to `true` for growing and `false` for
|
|
3771
|
+
independent, whatever the definition's `target.input_data` says. A discussion always gets `use_context: true`.
|
|
3772
|
+
The run records the decision as `_runtime.automation_context = {mode, use_context, target_use_context}`, where
|
|
3773
|
+
`target_use_context` is the value the definition carried. Automations created before this rule, with
|
|
3774
|
+
`use_context: false` in their target, now replay their history without being revised.
|
|
3775
|
+
|
|
3762
3776
|
Growing history is read at admission and frozen with the occurrence's inputs, so every retry sees the same history.
|
|
3763
3777
|
It is read strictly: when it cannot be read (a store without a run index, for example), the admission fails instead
|
|
3764
3778
|
of running the occurrence without its context. History keeps whole turns, newest first, and says so in the oldest
|
|
3765
|
-
kept message when older turns were dropped.
|
|
3779
|
+
kept message when older turns were dropped. The occurrence run records what was replayed in
|
|
3780
|
+
`vars._runtime.session_history` (`replayed_messages`, `replayed_tokens`, `dropped_messages`, `dropped_tokens`,
|
|
3781
|
+
`max_tokens`, ...), and the `automation.admitted` record carries the same values in its frozen inputs.
|
|
3766
3782
|
|
|
3767
3783
|
Only completed turns with both a prompt and an answer are replayed. A retried occurrence counts once, as its last
|
|
3768
3784
|
attempt.
|
|
@@ -3781,8 +3797,8 @@ actor_id=None)` starts a separate conversation about the automation as it stood
|
|
|
3781
3797
|
- It is seeded **once** with the automation's whole conversation through occurrence N, whatever the context mode:
|
|
3782
3798
|
one user/assistant pair per finished occurrence 1..N (its last attempt), the occurrence's trigger/task turn and its
|
|
3783
3799
|
answer, oldest first (`automation_timeline_messages(...)`). A failed or stopped occurrence stays in the timeline,
|
|
3784
|
-
its answer saying so. The pairs
|
|
3785
|
-
oldest are dropped first. The first user message starts with a summary line: `[Automation "<title>": <n>
|
|
3800
|
+
its answer saying so. The pairs go through the session history window (the most recent 50,000 tokens of whole
|
|
3801
|
+
turns, no message ever cut); the oldest are dropped first. The first user message starts with a summary line: `[Automation "<title>": <n>
|
|
3786
3802
|
occurrence(s) through occurrence N, showing the last K. The automation's files are mounted READ-ONLY at <path>;
|
|
3787
3803
|
your own workspace <path> is writable.]`. The seed is stored in `_meta.discussion.seed_messages` of the root run.
|
|
3788
3804
|
- It works in its **own writable workspace**, `workspace_root`, which the host allocates (it must differ from the
|
|
@@ -3812,7 +3828,7 @@ the same root, and that root must be a parent-less run of this session that carr
|
|
|
3812
3828
|
discussion provenance too.
|
|
3813
3829
|
|
|
3814
3830
|
In a discussion session, `session_chat_messages` replays the seed first, as the oldest history, and drops it first
|
|
3815
|
-
under the
|
|
3831
|
+
under the history window.
|
|
3816
3832
|
|
|
3817
3833
|
### Read-only mounts
|
|
3818
3834
|
|
|
@@ -4010,7 +4026,8 @@ its newest attempt. `automation_id` keeps only that automation's occurrences (ot
|
|
|
4010
4026
|
index to look it up in.
|
|
4011
4027
|
|
|
4012
4028
|
`session_chat_messages(..., automation_id=None, through_occurrence=None, strict=False)` replays those turns as
|
|
4013
|
-
user/assistant message pairs under
|
|
4029
|
+
user/assistant message pairs under the session history window (the most recent `HISTORY_REPLAY_MAX_TOKENS` = 50,000
|
|
4030
|
+
tokens of whole turns; see [API](api.md#sessions-and-history)). With `strict=True` it raises
|
|
4014
4031
|
`SessionHistoryError` (`reason_code = "history_unavailable"`) instead of returning a partial history: a store without
|
|
4015
4032
|
a run index, a missing occurrence, or a discussion whose seed is missing or cannot be read. Automation admission and
|
|
4016
4033
|
discussion seeding always read strictly.
|
|
@@ -4069,7 +4086,8 @@ receives its result directly.
|
|
|
4069
4086
|
controller does not wait on `event` sources.
|
|
4070
4087
|
- Occurrences run one at a time (`serial`), missed ticks coalesce, and a failed occurrence never stops the
|
|
4071
4088
|
automation (`failure: "continue"`). These policies cannot be changed.
|
|
4072
|
-
- Growing history is
|
|
4089
|
+
- Growing history is the most recent 50,000 tokens of whole turns and is not summarized automatically; older turns
|
|
4090
|
+
drop out of the replay (they stay in the store).
|
|
4073
4091
|
- Tools outside `TOOL_EFFECT_CLASSES`, such as third-party MCP tools, still ask for approval under `auto`.
|
|
4074
4092
|
- Retries repeat external effects.
|
|
4075
4093
|
- One writer process per store; the mutation lock does not coordinate separate processes.
|
|
@@ -5328,6 +5346,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
5328
5346
|
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
5329
5347
|
- `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` self-recipient rule)
|
|
5330
5348
|
- `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
|
|
5349
|
+
- `api.md#sessions-and-history` — session history replay: one window, the most recent 50,000 tokens of whole turns (`HISTORY_REPLAY_MAX_TOKENS`), returned as a `ReplayedHistory` whose `.report` records what was replayed and dropped
|
|
5331
5350
|
- `api.md#run-history-bundle-export-portable-replay-artifact` — run history bundles, including `resolved_actions` summaries for cross-client capability replay
|
|
5332
5351
|
|
|
5333
5352
|
## Features (reference)
|
|
@@ -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.
|
|
6
|
+
- Version: 0.7.0
|
|
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` installs `abstractcore[remote,tools,vision,voice,audio,music]>=2.
|
|
9
|
+
- Current AbstractCore baseline: base `abstractruntime` installs `abstractcore[remote,tools,vision,voice,audio,music]>=2.18.0`
|
|
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
|
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
- Host-local operator wrappers: the host facade and `abstractruntime.integrations.abstractcore.comms_facade` expose email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`), and `abstractruntime.integrations.abstractcore.telegram_facade` exposes Telegram bootstrap/global-client/send wrappers without requiring hosts to import AbstractCore directly.
|
|
51
51
|
- Durable outbound comms: when an email or Telegram send belongs to a run, use `get_abstractcore_run_facade(...).send_email(...)` or `send_telegram_message(...)` so Runtime records the request and outcome in a child run; replay should show the recorded result, not resend the message. If the child run waits for approval or passthrough execution, resume it through `resume_tool_calls(...)`.
|
|
52
52
|
- [Artifacts](docs/artifacts.md): Runtime artifact identity, JSON-safe refs, canonical descriptors, generated-media provenance, tool-output offload thresholds, catalog search/stats, access counters, and Gateway/Observer retrieval boundaries.
|
|
53
|
+
- [Sessions and history](docs/api.md#sessions-and-history): `session_chat_messages(...)` replays a session's completed turns under one window, the most recent `HISTORY_REPLAY_MAX_TOKENS` (50,000) estimated tokens of whole messages, and returns a `ReplayedHistory` whose `.report` records replayed and dropped messages and tokens; `fold_history_window(...)` applies the same window to any turns, `window_transcript(...)` to a transcript you already hold, and `announce_dropped(...)` writes the window's `#TRUNCATION` notice.
|
|
53
54
|
- [Artifacts API](docs/api.md#artifacts-store-by-reference): `ArtifactStore`, `ArtifactDescriptor`, `ArtifactAccessStats`, `search()`, `count()`, `facet_counts()`, and `stats()` for Runtime-owned catalog queries.
|
|
54
55
|
- VisualFlow document/file nodes: `read_file`/`write_file` use workspace-scoped paths (`rel/path` or `mount_alias/rel/path` in Gateway-hosted runs), `read_pdf` extracts text/metadata with `pypdf`, `write_pdf` renders text or Markdown-style content to real PDF bytes with `reportlab`, `list_folder_files` enumerates workspace folders, `import_workspace_file` snapshots a server file into an artifact, `read_artifact` projects saved file content, and `export_artifact` writes a durable artifact back to a workspace path. Local Runtime-only runs without workspace scope still fall back to the process working directory for relative file-node paths.
|
|
55
56
|
- Remote multimodal guardrail: remote/hybrid media generation uses AbstractCore Server endpoints, does not inherit the chat model for media endpoints, routes image edits through Core `/images/edits`, routes video generation through Core `/videos/*`, rejects unsupported input media and non-file STT inputs instead of ignoring them, and redacts data URLs from persisted provider-request metadata
|