AbstractRuntime 0.5.1__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.5.1 → abstractruntime-0.7.0}/.github/workflows/ci.yml +11 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/.github/workflows/release.yml +11 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/CHANGELOG.md +224 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/PKG-INFO +10 -7
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/README.md +6 -3
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/README.md +2 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/api.md +60 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/architecture.md +68 -2
- abstractruntime-0.7.0/docs/automations.md +634 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/README.md +16 -8
- {abstractruntime-0.5.1/docs/backlog/planned → abstractruntime-0.7.0/docs/backlog/completed}/0847_automations_v1_controller_contracts_occurrences_triggers.md +113 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +10 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +5 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/faq.md +57 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/troubleshooting.md +116 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/llms-full.txt +950 -8
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/llms.txt +4 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/pyproject.toml +10 -4
- abstractruntime-0.7.0/release-notes.md +94 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/scripts/generate_llms_full.py +1 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/__init__.py +24 -1
- abstractruntime-0.7.0/src/abstractruntime/automation_queries.py +201 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/__init__.py +84 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/adapters.py +86 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/attention.py +310 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/bundle.py +84 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +161 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/bundles/automation-controller/manifest.json +22 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/commands.py +368 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/controller.py +642 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/ledger.py +260 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/models.py +493 -0
- abstractruntime-0.7.0/src/abstractruntime/automations/service.py +536 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/__init__.py +2 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/models.py +2 -1
- abstractruntime-0.7.0/src/abstractruntime/core/run_attribution.py +303 -0
- abstractruntime-0.7.0/src/abstractruntime/core/run_identity.py +114 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/run_lifecycle.py +15 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/runtime.py +207 -7
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/history_bundle.py +26 -110
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/chat.py +27 -12
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/tools.py +5 -3
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/visit_workflow.py +78 -63
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +11 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +22 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +27 -0
- abstractruntime-0.7.0/src/abstractruntime/integrations/abstractcore/tool_effects.py +160 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +74 -2
- {abstractruntime-0.5.1 → 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.7.0/src/abstractruntime/session_turns.py +289 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/__init__.py +11 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/base.py +56 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/in_memory.py +35 -2
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/json_files.py +352 -9
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/offloading.py +57 -7
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/sqlite.py +346 -68
- abstractruntime-0.7.0/src/abstractruntime/triggers/__init__.py +52 -0
- abstractruntime-0.7.0/src/abstractruntime/triggers/manual.py +86 -0
- abstractruntime-0.7.0/src/abstractruntime/triggers/protocol.py +199 -0
- abstractruntime-0.7.0/src/abstractruntime/triggers/registry.py +202 -0
- abstractruntime-0.7.0/src/abstractruntime/triggers/schedule.py +249 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/turn_grounding.py +16 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/utils/workspace_paths.py +85 -4
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/compiler.py +30 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +41 -18
- abstractruntime-0.7.0/tests/automation_harness.py +187 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_abstractcore_discovery_facade.py +6 -3
- abstractruntime-0.7.0/tests/test_automation_commands.py +414 -0
- abstractruntime-0.7.0/tests/test_automation_controller.py +201 -0
- abstractruntime-0.7.0/tests/test_automation_controller_recovery.py +205 -0
- abstractruntime-0.7.0/tests/test_automation_definition.py +166 -0
- abstractruntime-0.7.0/tests/test_automation_discussion_isolation.py +337 -0
- abstractruntime-0.7.0/tests/test_automation_growing_context.py +161 -0
- abstractruntime-0.7.0/tests/test_automation_index.py +275 -0
- abstractruntime-0.7.0/tests/test_automation_next_fire.py +100 -0
- abstractruntime-0.7.0/tests/test_automation_occurrence_recovery.py +169 -0
- abstractruntime-0.7.0/tests/test_automation_replay_read_only.py +77 -0
- abstractruntime-0.7.0/tests/test_automation_retry.py +100 -0
- abstractruntime-0.7.0/tests/test_automation_session_turns.py +313 -0
- abstractruntime-0.7.0/tests/test_automation_status.py +88 -0
- abstractruntime-0.7.0/tests/test_automation_tool_approval.py +181 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_budget_law_no_unrequested_caps.py +43 -0
- abstractruntime-0.7.0/tests/test_controller_bundle_packaged.py +65 -0
- abstractruntime-0.7.0/tests/test_create_if_absent.py +227 -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_discussion_session_anchor.py +123 -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.5.1 → abstractruntime-0.7.0}/tests/test_packaging_extras.py +3 -3
- abstractruntime-0.7.0/tests/test_run_index_workspace_root.py +106 -0
- abstractruntime-0.7.0/tests/test_run_mutation_lock.py +129 -0
- abstractruntime-0.7.0/tests/test_session_history.py +617 -0
- abstractruntime-0.7.0/tests/test_session_start_cost.py +189 -0
- abstractruntime-0.7.0/tests/test_trigger_registry.py +122 -0
- abstractruntime-0.7.0/tests/test_trigger_schedule_math.py +207 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visit_midturn_resume.py +6 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visit_workflow.py +6 -1
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +5 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_agora_react_agent.py +8 -0
- {abstractruntime-0.5.1 → 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.7.0/tests/test_workspace_read_only.py +363 -0
- abstractruntime-0.5.1/release-notes.md +0 -12
- abstractruntime-0.5.1/src/abstractruntime/session_history.py +0 -249
- abstractruntime-0.5.1/tests/test_session_history.py +0 -445
- abstractruntime-0.5.1/tests/test_visit_history_replay_caps.py +0 -161
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/.gitignore +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/LICENSE +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/ROADMAP.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/SECURITY.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/adr/README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/artifacts.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/evidence.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/getting-started.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/limits.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/manual_testing.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/proposal.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/provenance.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/snapshots.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/tool-approval.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/tools-comms.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/emails.config.example.yaml +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/05_persistence.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/examples/README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/mkdocs.yml +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/pytest.ini +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/README.md +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/conftest.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_command_store.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_offloading.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.5.1 → abstractruntime-0.7.0}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.5.1 → 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,230 @@ 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
|
+
|
|
107
|
+
## [0.6.0] - 2026-09-27
|
|
108
|
+
|
|
109
|
+
Automations v1: run a workflow on a schedule or on request as a durable, crash-safe controller run. Hosts that
|
|
110
|
+
fold root runs into sessions should read the **Changed** notes (occurrences appear as session turns).
|
|
111
|
+
|
|
112
|
+
### Added
|
|
113
|
+
|
|
114
|
+
- **Automations** (`abstractruntime.automations`, see `docs/automations.md`): run a workflow on a trigger. An
|
|
115
|
+
automation is a durable controller run (the packaged bundle `abstractframework.automation-controller@1.0.0`), and
|
|
116
|
+
each firing (an occurrence) is a child run with a deterministic id, so a crash never loses an occurrence or starts
|
|
117
|
+
one twice. Every transition is an `automation.*` record in the controller's ledger.
|
|
118
|
+
- `create_automation(runtime, request, *, actor_id=None)` returns `(automation_id, revision)`; the same request
|
|
119
|
+
returns the same automation and a reused `request_id` with a different request raises `identity_conflict`.
|
|
120
|
+
`get_automation`, `list_occurrences` and `drive_automation` (a run loop for hosts without one) complete the
|
|
121
|
+
service API.
|
|
122
|
+
- `apply_automation_command` pauses, resumes, runs now, revises, stops the current occurrence or archives. Commands
|
|
123
|
+
are idempotent per `command_id` (a reused id for a different command is refused with `identity_conflict`), are
|
|
124
|
+
checked against `expected_revision`, and never interleave with the controller. Pause stops scheduled runs only;
|
|
125
|
+
resume never fires missed runs; revising `policy` changes only the fields sent.
|
|
126
|
+
- Context: independent occurrences (the default) start fresh in their own session; in growing mode each occurrence
|
|
127
|
+
joins the automation's session and receives its previous turns (at most 40 messages / 24,000 characters).
|
|
128
|
+
- Failed occurrences are retried: 3 attempts by default, 30 s then 60 s apart, capped at 10 minutes. An occurrence's
|
|
129
|
+
inputs are frozen when it is admitted, so a later revision never changes it.
|
|
130
|
+
- Automations are quiet unless the output carries `notify: true` or `notify: {title, body}`, or an occurrence still
|
|
131
|
+
fails after its last retry. `list_attention` pages these items oldest first.
|
|
132
|
+
- `policy.tool_approval`: `"auto"` (default; creating the automation is the consent, and each occurrence receives a
|
|
133
|
+
frozen `_runtime.tool_policy.auto_approve_tools` grant) or `"ask"`. Unclassified tools still ask.
|
|
134
|
+
- `pending_waits` lists occurrence runs waiting on a person as typed waits: `ask_user`, `tool_approval` (with the
|
|
135
|
+
calls to approve in `details`) or `event` (with `{scope, name}` when known); `ANSWER_PAYLOADS` gives the resume
|
|
136
|
+
payload for each kind.
|
|
137
|
+
- `start_discussion(..., workspace_root=...)` forks a separate conversation at occurrence N: a new root run in its
|
|
138
|
+
own session, seeded once with the automation's whole conversation through N (every occurrence 1..N, in either
|
|
139
|
+
context mode, oldest dropped first under the history budget), working in its own writable workspace with the
|
|
140
|
+
automation's workspace mounted read-only alongside, and without the automation's tool grant. Discussion sessions
|
|
141
|
+
are scoped to their automation.
|
|
142
|
+
- `get_automation` and `list_automations` summaries carry `next_fire_at` for every active scheduled automation,
|
|
143
|
+
also while an occurrence runs (the tick the controller will admit next, coalescing included), and
|
|
144
|
+
`current_occurrence` (`{index, run_id, attempt, status}` of the occurrence in flight), so clients never
|
|
145
|
+
compute schedules themselves.
|
|
146
|
+
- `adopt_legacy_schedule_projection(run)` summarizes a legacy gateway `scheduled:*` root read-only.
|
|
147
|
+
- Limits: `every` is at most `366d`, `count` at most 1,000,000.
|
|
148
|
+
- **Trigger sources** (`abstractruntime.triggers`): `schedule@1` (fixed UTC intervals such as `5m` or `24h` on a grid
|
|
149
|
+
that does not drift; `start_at`, exclusive `until` and `count`; one-shot when `every` is absent; missed ticks run
|
|
150
|
+
once, marked `coalesced`) and `manual@1`. Other packages add sources through the `abstractruntime.trigger_sources`
|
|
151
|
+
entry-point group; a broken third-party source is listed as unavailable, and a missing built-in source is an error.
|
|
152
|
+
- VisualFlow node type `automation` (the controller's nodes, adapters `automation.<node_id>`).
|
|
153
|
+
- `abstractruntime.automation_queries`: `list_automations(store, status=, cursor=, limit=)` (automation summaries,
|
|
154
|
+
newest first, with a cursor that survives restarts; archived automations stay listed) and
|
|
155
|
+
`latest_occurrence(store, automation_id)`. `changed_since` is refused with `unsupported_feature`.
|
|
156
|
+
- Explicit run ids: `Runtime.start(..., run_id=...)` and `START_SUBWORKFLOW` `payload.run_id` create a run only if the
|
|
157
|
+
id is free. Starting it again with the same identity (workflow, session, parent, `vars._meta.occurrence`,
|
|
158
|
+
`vars._meta.creation_digest`) returns the existing run untouched; a different identity raises
|
|
159
|
+
`RunIdentityConflict` (a `ValueError`, `reason_code = "identity_conflict"`). A parent that crashes after starting
|
|
160
|
+
such a child, but before saving its wait, finds the same child on replay; if the child already finished, the parent
|
|
161
|
+
receives its result directly.
|
|
162
|
+
- `RunStore.create_if_absent(run) -> (run, created)` on the SQLite, JSON-file, in-memory and offloading stores (the JSON
|
|
163
|
+
store publishes a fully written temp file with an atomic hard link and never replaces an existing run file).
|
|
164
|
+
`store_supports_create_if_absent` / `require_create_if_absent` check a store. Recovery after a process crash is
|
|
165
|
+
covered; power-loss durability is not claimed.
|
|
166
|
+
- `run_mutation_lock(run_id)`: the per-run, per-process lock that `Runtime.tick` holds for the whole tick and
|
|
167
|
+
`Runtime.resume` for its commit. Hosts take it around their own read-modify-save of a run. v1 supports one writer
|
|
168
|
+
process per store.
|
|
169
|
+
- Run index attribution: rows carry `automation_id`, `role` (`controller`, `occurrence`, `descendant`, `discussion`,
|
|
170
|
+
`legacy_schedule` or empty), `occurrence_index` and `session_kind` (`chat`, `automation`, `occurrence`,
|
|
171
|
+
`discussion`), and `list_run_index` filters on them (`session_kind="chat,discussion"` works). Existing SQLite stores
|
|
172
|
+
fill the new columns once when opened; the JSON store re-reads each run file once. Every store has
|
|
173
|
+
`session_kinds(session_id)` and `latest_occurrence_row(automation_id)`.
|
|
174
|
+
- Run index rows carry `workspace_root`: the folder the run executes in (its top-level `vars["workspace_root"]` as
|
|
175
|
+
stored, stripped, never resolved; `None` when absent), so apps can open a session's folder without loading runs.
|
|
176
|
+
Existing SQLite stores fill it once when opened; the JSON store re-reads each run file once.
|
|
177
|
+
- `session_attribution(store, session_id)` (`abstractruntime.core.run_attribution`) reports what kind of session an id
|
|
178
|
+
is (`chat`, `automation`, `occurrence` or `discussion`, with the discussion's validated root, automation and
|
|
179
|
+
workspace). Every root run started in a discussion session gets the discussion's own workspace, access settings and
|
|
180
|
+
read-only mounts (the whole-workspace read-only flag only when the discussion carries it) and its provenance,
|
|
181
|
+
whatever the caller passed; when the session cannot be attributed (an invalid
|
|
182
|
+
discussion root, or a store without a run index) `Runtime.start` raises `SessionAttributionError`.
|
|
183
|
+
- `select_session_turns(store, session_id, ...)`: the one definition of a session's turns (parent-less runs except
|
|
184
|
+
automation controllers, plus automation occurrences; never child runs, internal runs, legacy scheduled wrappers or,
|
|
185
|
+
unless asked, draft-test runs), with `include_occurrences`, `automation_id`, `through_occurrence`, `until_ms`,
|
|
186
|
+
`include_drafts` and `limit`. `is_draft_lifecycle` is exported too.
|
|
187
|
+
- `session_chat_messages(..., automation_id=None, through_occurrence=None, strict=False)`: bound the replayed turns to
|
|
188
|
+
one automation or to the history as it stood at occurrence N, however old. In a discussion session the seed is
|
|
189
|
+
replayed first and dropped first under the budget. `strict=True` raises `SessionHistoryError`
|
|
190
|
+
(`reason_code = "history_unavailable"`) instead of returning a partial history.
|
|
191
|
+
- Read-only workspaces: a run started with `workspace_read_only: true` (or trusted runtime policy
|
|
192
|
+
`_runtime.workspace_read_only: true`) can read its workspace but not change it. Tools that write files or run
|
|
193
|
+
commands or code, and any tool the runtime has not classified, are refused, as are the VisualFlow `write_file`,
|
|
194
|
+
`write_pdf`, `write_docx`, `write_chart` and `export_artifact` nodes. A read-only workspace folder is never created,
|
|
195
|
+
a read-only run without one is refused, and child runs and nodes inherit the setting.
|
|
196
|
+
`tool_effects.TOOL_EFFECT_CLASSES` classifies every exposable tool (`read`, `write`, `exec`, `delegate`, `comms`,
|
|
197
|
+
`memory-write`).
|
|
198
|
+
- Read-only mounts: `_runtime.workspace_read_only_paths` (absolute folders, symlinks resolved) makes those folders
|
|
199
|
+
readable but not writable by the file tools (`write_file`, `edit_file`) and the VisualFlow file/export writers,
|
|
200
|
+
while the run's own workspace stays writable. Commands and code (`execute_command`, `execute_python`, ...) are not
|
|
201
|
+
restricted by a mount: the shell cannot be sandboxed, so mounts protect the file tools only. Child runs and
|
|
202
|
+
VisualFlow nodes inherit the mounts and can only add more. Helpers `read_only_paths(vars)` and
|
|
203
|
+
`path_is_read_only(vars, path)` in `abstractruntime.utils.workspace_paths`.
|
|
204
|
+
- `select_session_turns(..., automation_id=A)` gathers A's occurrences from every session (an independent-mode
|
|
205
|
+
automation runs each occurrence in its own session), interleaved with the session's own turns.
|
|
206
|
+
- `JsonFileRunStore.warm_session_index()` builds the session and children indexes at host startup.
|
|
207
|
+
|
|
208
|
+
### Changed
|
|
209
|
+
|
|
210
|
+
- Session history bundles and session replay include automation occurrences as turns (kind `occurrence`, with
|
|
211
|
+
`automation_id` and `occurrence_index`); a retried occurrence counts once, as its last attempt. Draft-test runs are
|
|
212
|
+
left out of a session's history.
|
|
213
|
+
- `list_run_index(root_only=True)` returns turn roots: parent-less runs except automation controllers, plus automation
|
|
214
|
+
occurrences. Apps that fold root runs into sessions show an automation's session as a chat whose turns are its
|
|
215
|
+
occurrences.
|
|
216
|
+
- Children of an automation occurrence carry `vars._meta.occurrence` with `role = "descendant"`, and children of a
|
|
217
|
+
discussion carry its `vars._meta.discussion` (without the seed); a child cannot clear or change either.
|
|
218
|
+
|
|
219
|
+
### Fixed
|
|
220
|
+
|
|
221
|
+
- Session lookups on the JSON run store use an index of each session's runs instead of scanning the store (about
|
|
222
|
+
0.1 ms per new chat turn at 20,000 runs). Several store objects or processes on one run folder see each other's
|
|
223
|
+
created and deleted runs through a creation journal (`.runs_created.log`).
|
|
224
|
+
- History "through occurrence N" returns the history up to that occurrence in sessions of any length, and raises
|
|
225
|
+
(`strict`) or returns nothing when the session has no occurrence N.
|
|
226
|
+
- A discussion session's seed is read only from a validated root: every run of the session must name the same root,
|
|
227
|
+
and that root must belong to the session and carry the seed.
|
|
228
|
+
- The JSON run store removes run temp files left behind by a crash (older than 10 minutes) when it opens.
|
|
229
|
+
- Automation identity metadata (`vars._meta.automation`, `.occurrence`, `.discussion`, `.creation_digest`) always
|
|
230
|
+
stays inline when a finished run is offloaded.
|
|
231
|
+
|
|
8
232
|
## [0.5.1] - 2026-09-26
|
|
9
233
|
|
|
10
234
|
### Added
|
|
@@ -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`)
|
|
@@ -158,6 +158,8 @@ Kernel (import-light):
|
|
|
158
158
|
- Stop that reaches the running effect: `Runtime.cancel_run(...)` signals the in-flight model or tool call, which ends as a `cancelled` ledger record (never retried); a model unload stops the calls using that model first (`docs/api.md`)
|
|
159
159
|
- host pause at step boundaries: `Runtime.tick(..., step_gate=...)`
|
|
160
160
|
- run-tree tool ceiling: an explicit `allowed_tools` list can only narrow across child runs, and approval policy never widens it
|
|
161
|
+
- automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
|
|
162
|
+
- explicit run ids: `Runtime.start(..., run_id=...)` creates a run only if the id is free (`RunStore.create_if_absent`), and `run_mutation_lock(run_id)` serializes a run's writers in a process
|
|
161
163
|
|
|
162
164
|
Durability + storage:
|
|
163
165
|
- stores: in-memory, JSON/JSONL, SQLite (`src/abstractruntime/storage/*`)
|
|
@@ -236,6 +238,7 @@ sr = create_scheduled_runtime(
|
|
|
236
238
|
| [Architecture](docs/architecture.md) | Component map + diagrams |
|
|
237
239
|
| [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
|
|
238
240
|
| [AbstractCore Integration](docs/integrations/abstractcore.md) | `LLM_CALL` / `TOOL_CALLS`, host facades, models/engines/host jobs |
|
|
241
|
+
| [Automations](docs/automations.md) | Scheduled and on-request workflows: controller, triggers, commands, context, discussions, storage guarantees |
|
|
239
242
|
| [Artifacts](docs/artifacts.md) | Artifact identity, descriptors, catalog search and access stats |
|
|
240
243
|
| [Tool Approval](docs/tool-approval.md) | Tool risk tiers, run-policy ceiling, per-call refiners |
|
|
241
244
|
| [Comms Toolset](docs/tools-comms.md) | Opt-in email/WhatsApp/Telegram tools |
|
|
@@ -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`)
|
|
@@ -108,6 +108,8 @@ Kernel (import-light):
|
|
|
108
108
|
- Stop that reaches the running effect: `Runtime.cancel_run(...)` signals the in-flight model or tool call, which ends as a `cancelled` ledger record (never retried); a model unload stops the calls using that model first (`docs/api.md`)
|
|
109
109
|
- host pause at step boundaries: `Runtime.tick(..., step_gate=...)`
|
|
110
110
|
- run-tree tool ceiling: an explicit `allowed_tools` list can only narrow across child runs, and approval policy never widens it
|
|
111
|
+
- automations: run a workflow on a schedule (`schedule@1`, fixed UTC intervals) or on request (`manual@1`) as a durable controller run whose occurrences are deterministic child runs and session turns, with commands, independent or growing context, discussions forked at any occurrence (own workspace, automation workspace mounted read-only), tool approval, typed waits and quiet-by-default notifications (`docs/automations.md`)
|
|
112
|
+
- explicit run ids: `Runtime.start(..., run_id=...)` creates a run only if the id is free (`RunStore.create_if_absent`), and `run_mutation_lock(run_id)` serializes a run's writers in a process
|
|
111
113
|
|
|
112
114
|
Durability + storage:
|
|
113
115
|
- stores: in-memory, JSON/JSONL, SQLite (`src/abstractruntime/storage/*`)
|
|
@@ -186,6 +188,7 @@ sr = create_scheduled_runtime(
|
|
|
186
188
|
| [Architecture](docs/architecture.md) | Component map + diagrams |
|
|
187
189
|
| [Overview](docs/proposal.md) | Design goals, core concepts, and scope |
|
|
188
190
|
| [AbstractCore Integration](docs/integrations/abstractcore.md) | `LLM_CALL` / `TOOL_CALLS`, host facades, models/engines/host jobs |
|
|
191
|
+
| [Automations](docs/automations.md) | Scheduled and on-request workflows: controller, triggers, commands, context, discussions, storage guarantees |
|
|
189
192
|
| [Artifacts](docs/artifacts.md) | Artifact identity, descriptors, catalog search and access stats |
|
|
190
193
|
| [Tool Approval](docs/tool-approval.md) | Tool risk tiers, run-policy ceiling, per-call refiners |
|
|
191
194
|
| [Comms Toolset](docs/tools-comms.md) | Opt-in email/WhatsApp/Telegram tools |
|
|
@@ -30,10 +30,12 @@ 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)
|
|
36
37
|
|
|
38
|
+
- `automations.md` — automations: a workflow run on a schedule or on request as a durable controller run; triggers (`schedule@1`, `manual@1`, entry-point sources), commands, independent or growing context, discussions forked at any occurrence (own writable workspace, the automation's workspace mounted read-only), tool approval, typed waits, notifications and retries, and the storage guarantees (create-if-absent, per-run lock, turn roots, session kinds, one writer process per store)
|
|
37
39
|
- `entity-runtime.md` — per-entity runtimes for summoned entities: homes, the one-writer lease, act-only diary privacy (`$act_only` refs), durable visit waits with deadlines
|
|
38
40
|
- `evidence.md` — artifact-backed evidence capture for external-boundary tools
|
|
39
41
|
- `mcp-worker.md` — MCP worker CLI (`abstractruntime-mcp-worker`)
|
|
@@ -62,8 +62,10 @@ Durability invariant: `RunState.vars` must remain JSON-serializable (`src/abstra
|
|
|
62
62
|
|
|
63
63
|
Implementation: `src/abstractruntime/core/runtime.py`.
|
|
64
64
|
|
|
65
|
-
- `Runtime.start(workflow, vars=..., actor_id=..., session_id=...) -> run_id`
|
|
65
|
+
- `Runtime.start(workflow, vars=..., actor_id=..., session_id=..., parent_run_id=..., run_id=...) -> run_id`
|
|
66
66
|
- creates and persists a new `RunState`
|
|
67
|
+
- `run_id` starts the run under an id you choose (`[A-Za-z0-9_-]+`). The run is created only if that id is free; starting it again with the same identity (workflow, session, parent, `vars._meta.occurrence`, `vars._meta.creation_digest`) returns the existing run untouched, and a different identity raises `RunIdentityConflict` (a `ValueError`, `reason_code = "identity_conflict"`). The store must support `create_if_absent` (otherwise `NotImplementedError`). `START_SUBWORKFLOW` accepts the same explicit id as `payload.run_id`
|
|
68
|
+
- a root run that names a session is checked against the session's attribution: in a discussion session it gets the discussion's workspace setup (its own writable workspace and the read-only mount) and provenance, and when the attribution cannot be read (an invalid discussion root, or a store without a run index) the start raises `SessionAttributionError` (see [automations.md](automations.md#discussions))
|
|
67
69
|
- `Runtime.tick(workflow, run_id, max_steps=..., step_gate=None) -> RunState`
|
|
68
70
|
- executes node handlers and effects until the run becomes `WAITING`, `COMPLETED`, `FAILED`, or `CANCELLED`
|
|
69
71
|
- optional `step_gate()` is consulted at every step boundary; when it returns `False` the tick returns the persisted state and the run stays `RUNNING` (a later tick continues where it stopped)
|
|
@@ -71,6 +73,7 @@ Implementation: `src/abstractruntime/core/runtime.py`.
|
|
|
71
73
|
- validates the `wait_key`, writes `payload` to `WaitState.result_key` (if set), and continues from `WaitState.resume_to_node`
|
|
72
74
|
- a wait is resumed at most once: a resume of a run that is no longer waiting, or that waits on another key, raises `StaleResumeError` (a `ValueError`), for example when another caller resumed it first
|
|
73
75
|
- the check and the commit run under a per-run lock, and tools approved with `{"approved": true}` execute while that lock is held, so a long tool delays a competing resume of the same run, which is then refused
|
|
76
|
+
- `run_mutation_lock(run_id)` (package root): the per-run, per-process, re-entrant lock that `tick` holds for the whole tick and `resume` for its commit; take it around your own read-modify-save of a run so a tick cannot overwrite your change
|
|
74
77
|
- `Runtime.get_state(run_id) -> RunState` and `Runtime.get_ledger(run_id) -> list[dict]`
|
|
75
78
|
- host-facing read APIs for checkpoints and the append-only ledger
|
|
76
79
|
- `Runtime.cancel_run(run_id, reason=None, cancelled_by="api") -> RunState`
|
|
@@ -117,6 +120,12 @@ Notes:
|
|
|
117
120
|
- `from abstractruntime import SqliteRunStore, SqliteLedgerStore`, or
|
|
118
121
|
- `from abstractruntime.storage.sqlite import SqliteRunStore, SqliteLedgerStore`
|
|
119
122
|
|
|
123
|
+
Run index and creation (all built-in run stores, including the offloading wrapper):
|
|
124
|
+
- `create_if_absent(run) -> (run, created)`: creates a run only if its id is free and never overwrites an existing one; `store_supports_create_if_absent(store)` / `require_create_if_absent(store)` check a store first. Process-crash safe; power-loss durability is not claimed
|
|
125
|
+
- `list_run_index(status=, workflow_id=, session_id=, root_only=, limit=, oldest_first=, automation_id=, role=, session_kind=)`: lightweight rows carrying `automation_id`, `role`, `occurrence_index`, `session_kind` and `workspace_root` (the run's top-level `vars["workspace_root"]` as stored, stripped; `None` when absent); the three attribution filters take a value, a comma-separated string or a list; `root_only=True` returns turn roots (parent-less runs except automation controllers, plus automation occurrences)
|
|
126
|
+
- `session_kinds(session_id) -> frozenset` and `latest_occurrence_row(automation_id)`: indexed lookups used by session attribution and automation listings
|
|
127
|
+
- `JsonFileRunStore.warm_session_index()` builds the session and children indexes at host startup. Store objects and processes sharing one JSON run folder see each other's created and deleted runs through the creation journal `.runs_created.log`; v1 supports one writer process per store
|
|
128
|
+
|
|
120
129
|
Common decorators:
|
|
121
130
|
- `ObservableLedgerStore` for subscriptions (`src/abstractruntime/storage/observable.py`)
|
|
122
131
|
- `HashChainedLedgerStore` + `verify_ledger_chain(...)` for tamper-evidence (`src/abstractruntime/storage/ledger_chain.py`)
|
|
@@ -205,6 +214,54 @@ Public bundle APIs are exported from `src/abstractruntime/workflow_bundle/__init
|
|
|
205
214
|
|
|
206
215
|
Docs: `workflow-bundles.md`.
|
|
207
216
|
|
|
217
|
+
## Automations
|
|
218
|
+
|
|
219
|
+
Implementation: `src/abstractruntime/automations/*`, `src/abstractruntime/triggers/*`, `src/abstractruntime/automation_queries.py`.
|
|
220
|
+
Deep dive: [automations.md](automations.md).
|
|
221
|
+
|
|
222
|
+
```python
|
|
223
|
+
from abstractruntime.automations import (
|
|
224
|
+
apply_automation_command, # pause / resume / run_now / revise / stop_current / archive
|
|
225
|
+
create_automation, # -> (automation_id, revision)
|
|
226
|
+
drive_automation, # standalone run loop
|
|
227
|
+
get_automation,
|
|
228
|
+
list_attention,
|
|
229
|
+
list_occurrences,
|
|
230
|
+
pending_waits,
|
|
231
|
+
register_controller_bundle,
|
|
232
|
+
start_discussion,
|
|
233
|
+
)
|
|
234
|
+
from abstractruntime.automation_queries import latest_occurrence, list_automations
|
|
235
|
+
from abstractruntime.triggers import get_trigger_adapter, trigger_sources
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
- `create_automation(runtime, request, *, now=None, actor_id=None)`: creates the controller root run (the automation) with a deterministic id; raises `AutomationError` (`invalid_definition`, `unsupported_feature`, `unknown_trigger_source`, `identity_conflict`)
|
|
239
|
+
- `apply_automation_command(runtime, *, automation_id, command_id, type, payload=None, actor=None, expected_revision=None)`: the only writer of automation state; returns `{status: "applied" | "rejected", error?, duplicate}`; idempotent per `command_id`
|
|
240
|
+
- `record_automation_command_result(...)`: records a host-side failure of a command as a rejected result
|
|
241
|
+
- reads: `get_automation(run_store, id)`, `list_occurrences(runtime, id, cursor=, limit=)`, `list_attention(ledger_store, id, after_seq=, cursor=, limit=)`, `pending_waits(run_store, id, limit=)` with typed waits (`ask_user`, `tool_approval`, `event`) and `ANSWER_PAYLOADS`; `list_automations(run_store, status=, cursor=, limit=)`, `automation_summary(run)`, `latest_occurrence(run_store, id)`
|
|
242
|
+
- `start_discussion(runtime, *, automation_id, occurrence_index, request_id, prompt, workspace_root, actor_id=None)`: a separate conversation forked at any occurrence N, seeded with the automation's whole timeline 1..N, working in its own writable `workspace_root` with the automation's workspace mounted read-only
|
|
243
|
+
- controller bundle: `register_controller_bundle(registry)`, `controller_workflow_spec()`, `controller_bundle_path()`; `CONTROLLER_WORKFLOW_ID` is `abstractframework.automation-controller@1.0.0:controller`
|
|
244
|
+
- trigger sources: `trigger_sources()`, `get_trigger_adapter(id, version)`, built-ins `schedule@1` and `manual@1`, third-party sources through the `abstractruntime.trigger_sources` entry-point group
|
|
245
|
+
- `adopt_legacy_schedule_projection(run)`: read-only summary of a legacy gateway `scheduled:*` root
|
|
246
|
+
- read-only mounts: `_runtime.workspace_read_only_paths` (absolute folders; file write tools and VisualFlow writers refused inside, reads and command/code tools allowed); helpers `read_only_paths(vars)`, `path_is_read_only(vars, path)` and `READ_ONLY_PATHS_KEY` in `abstractruntime.utils.workspace_paths`
|
|
247
|
+
- read-only workspaces: run vars `workspace_read_only: true` (or `_runtime.workspace_read_only: true`); `abstractruntime.integrations.abstractcore.tool_effects.TOOL_EFFECT_CLASSES` classifies every exposable tool as `read`, `write`, `exec`, `delegate`, `comms` or `memory-write`
|
|
248
|
+
|
|
249
|
+
## Sessions and history
|
|
250
|
+
|
|
251
|
+
Implementation: `src/abstractruntime/session_turns.py`, `src/abstractruntime/session_history.py`, `src/abstractruntime/core/run_attribution.py`.
|
|
252
|
+
|
|
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=, 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
|
|
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
|
|
261
|
+
- `is_draft_lifecycle(run_lifecycle)` (package root): whether a run's lifecycle value marks a draft test run
|
|
262
|
+
|
|
263
|
+
History bundles (`export_run_history_bundle`) and session replay use the same turn selection, so automation occurrences appear as turns (kind `occurrence`, with `automation_id` and `occurrence_index`) in both.
|
|
264
|
+
|
|
208
265
|
## Run history bundle export (portable replay artifact)
|
|
209
266
|
|
|
210
267
|
Implementation: `src/abstractruntime/history_bundle.py`.
|
|
@@ -220,7 +277,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
|
|
|
220
277
|
|
|
221
278
|
### AbstractCore (LLM + tools)
|
|
222
279
|
|
|
223
|
-
Requires: `pip install abstractruntime` (AbstractCore 2.
|
|
280
|
+
Requires: `pip install abstractruntime` (AbstractCore 2.18.0 or newer is part of the base install).
|
|
224
281
|
|
|
225
282
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
226
283
|
|
|
@@ -234,6 +291,7 @@ Entry points:
|
|
|
234
291
|
- effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
|
|
235
292
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
236
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`)
|
|
237
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
|
|
238
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`)
|
|
239
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
|