AbstractRuntime 0.10.4__tar.gz → 0.10.6__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.10.4 → abstractruntime-0.10.6}/CHANGELOG.md +21 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/PKG-INFO +1 -1
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/README.md +1 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/api.md +12 -1
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/automations.md +20 -2
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/README.md +2 -1
- abstractruntime-0.10.6/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +40 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/llms-full.txt +33 -3
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/llms.txt +2 -1
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/pyproject.toml +1 -1
- abstractruntime-0.10.6/release-notes.md +6 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/controller.py +26 -1
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/models.py +16 -1
- abstractruntime-0.10.6/src/abstractruntime/conversation_search.py +616 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/llm_client.py +38 -36
- abstractruntime-0.10.6/tests/test_automation_named_policy_compiler.py +32 -0
- abstractruntime-0.10.6/tests/test_conversation_search.py +289 -0
- abstractruntime-0.10.6/tests/test_endpoint_profile_media_end_to_end.py +159 -0
- abstractruntime-0.10.6/tests/test_streamed_voice_namespace.py +36 -0
- abstractruntime-0.10.4/release-notes.md +0 -15
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/.gitignore +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/LICENSE +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/ROADMAP.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/SECURITY.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/adr/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/architecture.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/artifacts.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/email.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/evidence.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/faq.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/getting-started.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/limits.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/manual_testing.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/proposal.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/provenance.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/snapshots.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/tool-approval.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/tools-comms.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/05_persistence.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/examples/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/mkdocs.yml +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/pytest.ini +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/README.md +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/automation_harness.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/conftest.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/fixtures/schedule_v1_corpus.json +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_active_index.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_calendar_schedule.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_code_node_imports.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_command_store.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_config_facade_voice_input_hint.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_endpoint_profile_media_in_process.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_offloading.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_r12_workspace_sandbox.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_schedule_v1_corpus.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_schedule_v2_calendar.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_session_history.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_loop_back_out_of_body.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_loop_limit_on_wire.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_reroute_lowering.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_set_vars_pins.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_voice_stream_is_not_a_wait.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.10.4 → abstractruntime-0.10.6}/tests/test_write_chart.py +0 -0
|
@@ -5,6 +5,27 @@ All notable changes to AbstractRuntime will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.10.6] - 2026-10-18
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `abstractruntime.conversation_search.ConversationSearch`: keyword search over a plane's conversations: each turn's question and answer (as the session replay builds them) and its media, the artifacts it generated (kind and generation prompt, attributed to the turn whose run made them) and the attachments it was sent with (kind and file name); read-aloud audio and internal artifacts are not media. A hit on an artifact names it (`artifact`: id, owning run, kind, content type), so a client can show it. Its own SQLite file per plane, an FTS5 `trigram` index over text lowercased and without accents: words and parts of words, every word required, words of one or two letters as whole words, and a fuzzy pass that keeps a turn holding at least 60% of each word's trigrams (a typo still finds it). One hit per session (its best turn, a snippet, the match positions, where it matched: question, artifact or answer). Tool usage, tool outputs and intermediate thinking are not indexed: [backlog 0849](docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md). `sync(budget_s=…)` indexes what changed since the last call, newest sessions first, and reports what is left. Works with the file and the SQLite run stores; without the `trigram` tokenizer (SQLite < 3.34) it indexes whole words with prefixes.
|
|
13
|
+
|
|
14
|
+
- Automation definitions accept a named `policy.tool_policy` snapshot for per-tool Auto and Approve choices. The target tool ceiling remains authoritative; unspecified tools ask for approval. Messaging and untrusted-input restrictions remain enforced. See [Tool approval](docs/automations.md#tool-approval).
|
|
15
|
+
- Streamed read-aloud recordings (`_finalize_tts_stream_artifact`, the streamed-voice path of the AbstractCore integration) are stored under the voice namespace: their artifact tags carry `purpose=voice_playback`, `artifact_space=voice`, a `filename` and a logical `path` of `voice/tts-<id>.wav`, so a host can list a user's generated documents and attachments without the playback audio while playback and replay keep the same artifact ref and provenance. Test: `tests/test_streamed_voice_namespace.py`.
|
|
16
|
+
|
|
17
|
+
## [0.10.5] - 2026-10-18
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- The pooled client wires every client it builds in one place (`_adopt_client`): the residency core, the
|
|
22
|
+
Core execution context, the host's endpoint-profile resolver and the pool-wide token callback reach the
|
|
23
|
+
text clients, the per-call override clients and the media host through the same path, and a setting
|
|
24
|
+
applied later reaches all of them through `_owned_clients`. No behaviour change. Tests:
|
|
25
|
+
`tests/test_endpoint_profile_media_end_to_end.py` (an image spec on an `endpoint:<id>` profile reaches
|
|
26
|
+
that endpoint through the `LLM_CALL` handler, the pooled client and AbstractCore's capability host, with
|
|
27
|
+
and without a text provider on the call).
|
|
28
|
+
|
|
8
29
|
## [0.10.4] - 2026-10-18
|
|
9
30
|
|
|
10
31
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.6
|
|
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
|
|
@@ -32,6 +32,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
32
32
|
- `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` recipient rule: self and pre-authorised recipients)
|
|
33
33
|
- `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
|
|
34
34
|
- `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
|
|
35
|
+
- `api.md#conversation-search` — keyword search over a plane's conversations (`ConversationSearch`): questions, answers and the turn's artifacts, one SQLite FTS5 trigram index per plane, incremental `sync` with a time budget, exact then fuzzy matching
|
|
35
36
|
- `api.md#run-history-bundle-export-portable-replay-artifact` — run history bundles, including `resolved_actions` summaries for cross-client capability replay
|
|
36
37
|
|
|
37
38
|
## Features (reference)
|
|
@@ -291,6 +291,16 @@ Implementation: `src/abstractruntime/session_turns.py`, `src/abstractruntime/ses
|
|
|
291
291
|
|
|
292
292
|
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.
|
|
293
293
|
|
|
294
|
+
## Conversation search
|
|
295
|
+
|
|
296
|
+
Implementation: `src/abstractruntime/conversation_search.py`.
|
|
297
|
+
|
|
298
|
+
- `ConversationSearch(db_path, *, run_store, ledger_store, artifact_store=None, kinds=None)`: the keyword search index of one runtime plane. `db_path` is its own SQLite file in that plane's data folder (one index per plane, so a principal's search can only ever read the plane it was opened on; the file is disposable and is rebuilt when the schema changes). Each turn root (a question and its answer, as the session replay builds them) is one row, together with the turn's media: the artifacts its run generated (image, voice, video, music, by their generation prompt) and the attachments it was sent with (by their file name), each with its kind. Read-aloud audio, media saved without a prompt and internal artifacts are not indexed. `kinds` defaults to `INDEXED_KINDS` (`chat`, `discussion`): automation sessions are not indexed
|
|
299
|
+
- `sync(*, budget_s=3.0) -> SyncReport`: indexes what changed since the last call (turn roots whose `updated_at` moved, re-read by session, newest sessions first) within the time budget. `SyncReport`: `{indexed_turns, reindexed_sessions, pending_sessions, total_turns, seconds, complete, errors}`; `complete` is `False` while older conversations are still waiting, so a first search on a large plane can say it is still indexing
|
|
300
|
+
- `search(query, *, limit=20, sessions=None, exclude=None, session_kinds=None) -> list[SearchHit]`: one hit per session, best first. Text is indexed and queried lowercased and without accents (`normalize`) with the FTS5 `trigram` tokenizer: every query word of three or more characters must appear in the turn, as a word or part of one ("surviv" finds "overall survival"); words of one or two characters are matched as whole words; ranked by bm25, the question weighing more than the answer. When exact matches are fewer than `limit`, a fuzzy pass keeps turns holding at least `FUZZY_MIN` (60%) of each word's trigrams, so a typo still finds its turn (`fuzzy: true` on those hits). `sessions`, `exclude` and `session_kinds` filter inside the query, so a filter never empties a page that had matches further down. `limit` is clamped to 1–100
|
|
301
|
+
- `SearchHit` (`as_dict()`): `session_id`, `run_id` (the best turn), `prompt`, `snippet` (around the first match), `matched_in` (`question`, `answer` or `artifact`), `highlights` (`[start, length]` pairs in the snippet), `score`, `created_at`, `updated_at`, `session_kind`, `fuzzy`, and `artifact` when the match is an artifact: `{artifact_id, run_id, kind, content_type, name, prompt}`, `run_id` being the run that owns it (a host's artifact content route is scoped to that run)
|
|
302
|
+
- Without the `trigram` tokenizer (SQLite before 3.34) the index falls back to whole words with prefix matching. Tool usage, tool outputs and intermediate thinking are not indexed: [backlog 0849](backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md)
|
|
303
|
+
|
|
294
304
|
## Run history bundle export (portable replay artifact)
|
|
295
305
|
|
|
296
306
|
Implementation: `src/abstractruntime/history_bundle.py`.
|
|
@@ -352,11 +362,12 @@ Multimodal support:
|
|
|
352
362
|
- remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, image upscaling, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
|
|
353
363
|
- remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
|
|
354
364
|
- generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
365
|
+
- streamed TTS playback artifacts carry `purpose=voice_playback`, `artifact_space=voice` and a logical `voice/tts-<id>.wav` path in their tags; hosts can separate read-aloud recordings from user attachments while retaining their artifact refs and provenance
|
|
355
366
|
- with the pooled local client (`MultiLocalAbstractCoreLLMClient`), a request whose outputs are all non-text (image, video, voice, music, transcription) and that carries no tools never builds the text client: it runs on AbstractCore's capability host (`CapabilityHostProvider`, no text model), and so does streaming TTS. A text default that cannot be built (an engine not installed) therefore never blocks speech or image generation
|
|
356
367
|
- media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
|
|
357
368
|
- local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
|
|
358
369
|
- a media spec whose `provider` is an endpoint profile (`endpoint:<id>`) never uses the one-shot subprocess: it is an HTTP call to that endpoint, and the host's endpoint-profile resolver (`set_provider_endpoint_profile_resolver`) exists only in this process
|
|
359
|
-
- the `LLM_CALL` handler resolves only the call's own `provider` (`endpoint:<id>` on the effect payload) into Core routing params (`_provider`, `base_url`, `provider_api_key`); an endpoint profile named on an output spec stays on the spec, and the media plugin resolves it through the resolver the host attached to the client.
|
|
370
|
+
- the `LLM_CALL` handler resolves only the call's own `provider` (`endpoint:<id>` on the effect payload) into Core routing params (`_provider`, `base_url`, `provider_api_key`); an endpoint profile named on an output spec stays on the spec, and the media plugin resolves it through the resolver the host attached to the client. Every client the pooled client builds carries that resolver: the text clients, the per-call override clients and the media host that serves media-only calls
|
|
360
371
|
- optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
|
|
361
372
|
- Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
|
|
362
373
|
|
|
@@ -104,7 +104,7 @@ unknown fields are rejected at every level.
|
|
|
104
104
|
| `target` | `{workflow_id, bundle_ref, flow_id, input_data}`: a concrete workflow; a host resolves `@default` before creating (`flow_id: "@default"` is refused) |
|
|
105
105
|
| `trigger` | `{binding_id, source_id, source_version, config}`; the runtime creates `binding_id` |
|
|
106
106
|
| `context` | `{mode: "independent" \| "growing", growing: {}}` |
|
|
107
|
-
| `policy` | `{serial: true, misfire: "coalesce", failure: "continue", retry, tool_approval, email_allowed_recipients, untrusted_input_tools}` |
|
|
107
|
+
| `policy` | `{serial: true, misfire: "coalesce", failure: "continue", retry, tool_approval, tool_policy?, email_allowed_recipients, untrusted_input_tools}` |
|
|
108
108
|
| `notify` | `{channels: ["console"] \| ["console", "email"]}`: where attention items are delivered (default `["console"]`) |
|
|
109
109
|
| `session_id` | `automation:<automation_id>` |
|
|
110
110
|
| `workspace_root` | absolute path given to every occurrence |
|
|
@@ -457,7 +457,25 @@ returns the refusal message for a tool, or `None` when it is allowed.
|
|
|
457
457
|
|
|
458
458
|
## Tool approval
|
|
459
459
|
|
|
460
|
-
`policy.
|
|
460
|
+
Optional `policy.tool_policy` stores a complete named snapshot:
|
|
461
|
+
|
|
462
|
+
```json
|
|
463
|
+
{"auto_approve_tools": ["read_file"], "require_approval_tools": ["execute_command"]}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
When present it takes precedence over `tool_approval`. Require-approval wins if a tool
|
|
467
|
+
appears in both lists; unmentioned candidate tools require approval. Tool availability
|
|
468
|
+
still comes from `target.input_data.tools` and `_runtime.allowed_tools`; explicit `[]`
|
|
469
|
+
denies all tools. The controller compiles this policy into the occurrence's runtime inputs
|
|
470
|
+
at admission. Edits affect subsequent occurrences, preserving the current run's grant.
|
|
471
|
+
|
|
472
|
+
Named Auto is individual consent for untrusted-input tools. For untrusted triggers,
|
|
473
|
+
message-sending tools remain withheld and MCP tools remain unavailable. Trusted triggers
|
|
474
|
+
retain their existing messaging and recipient restrictions. Source restrictions remain in force.
|
|
475
|
+
Omit the field for legacy behavior, or revise it to `null` to restore that behavior.
|
|
476
|
+
Older runtimes that lack this field reject it rather than silently discarding the policy.
|
|
477
|
+
|
|
478
|
+
Without a named snapshot, `policy.tool_approval` decides whether the target's tools may run without asking.
|
|
461
479
|
|
|
462
480
|
- **`"auto"` (default).** An automation runs unattended and cannot ask a person before every tool call, so creating
|
|
463
481
|
the automation is the consent; client forms state that its tools run without asking and list them. At admission,
|
|
@@ -13,7 +13,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
13
13
|
## Counts
|
|
14
14
|
|
|
15
15
|
- Planned: 29
|
|
16
|
-
- Proposed:
|
|
16
|
+
- Proposed: 13
|
|
17
17
|
- Completed: 35
|
|
18
18
|
- Deprecated: 13
|
|
19
19
|
- Recurrent: 0
|
|
@@ -171,6 +171,7 @@ four-digit space rather than the completed records.
|
|
|
171
171
|
| ID | Item |
|
|
172
172
|
|----|------|
|
|
173
173
|
| 0031 | `proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md` |
|
|
174
|
+
| 0849 | [Conversation search: tool usage, tool outputs and intermediate thinking](proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md): proposed 2026-10-18; the sources left out of `ConversationSearch` on purpose, with costs and risks. |
|
|
174
175
|
| 0036 | `proposed/0036_local_media_residency_bridge_to_core_residency.md` |
|
|
175
176
|
| 0038 | `proposed/0038_core_server_pool_residency_affinity.md` |
|
|
176
177
|
| 0056 | `proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md` |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 0849 — Conversation search: tool usage, tool outputs and intermediate thinking
|
|
2
|
+
|
|
3
|
+
- **Status**: PROPOSED 2026-10-18
|
|
4
|
+
- **Owner**: runtime (`conversation_search.py`), surfaced by the gateway (`GET /api/gateway/sessions/search`)
|
|
5
|
+
- **Origin**: operator, while building conversation search for the Apple Watch (2026-10-18): the
|
|
6
|
+
index holds each turn's question, answer and media (generated artifacts' kind and prompt,
|
|
7
|
+
attachments' kind and file name). These three sources were weighed and left out on purpose.
|
|
8
|
+
|
|
9
|
+
## What is indexed today
|
|
10
|
+
|
|
11
|
+
`ConversationSearch` keeps one row per turn root: the question and the answer as the session replay
|
|
12
|
+
builds them, and the turn's media. An FTS5 `trigram` index over text lowercased and without accents;
|
|
13
|
+
exact matches first, then a fuzzy pass; filters (archived, session purpose, kinds) inside the query.
|
|
14
|
+
|
|
15
|
+
## Proposed sources
|
|
16
|
+
|
|
17
|
+
1. **Tool usage per turn** — the tools a turn called and their key arguments: search terms, URLs,
|
|
18
|
+
file names, commands ("the conversation where it read the Apple support page"). Source: the
|
|
19
|
+
turn's agent run(s) `tool_calls` ledger records (`effect.payload.tool_calls[{name, arguments}]`),
|
|
20
|
+
read once when the turn is indexed (a turn's ledger does not change after it ends). Cost: one
|
|
21
|
+
ledger read per new turn; agent ledgers are 0.2–3 MB, mostly thinking records, so the read needs
|
|
22
|
+
a records-of-one-type path (or the compact ledger mode the watch's live activity also wants).
|
|
23
|
+
Index the arguments only (name + the argument values a person would recognise, cut at ~200
|
|
24
|
+
characters each), never the results.
|
|
25
|
+
2. **Tool outputs** — what tools returned (pages read, command output, file contents). Large (30–90
|
|
26
|
+
KB per call), noisy (a web page matches most words), and sensitive (file contents, command
|
|
27
|
+
output, tokens printed by a command would become searchable from a search box). If ever
|
|
28
|
+
indexed: opt-in per account, outputs cut short, and a redaction pass for secrets.
|
|
29
|
+
3. **Intermediate thinking** — the agent's own words between tool calls (`result.content` of its
|
|
30
|
+
thinking steps; the last one is the answer, already indexed). Small and often useful ("I'll
|
|
31
|
+
check the logs first"), but it is the model's working text, not what the person was told; mixed
|
|
32
|
+
into results it would surface claims the answer later corrected. If indexed: its own field,
|
|
33
|
+
weighted below the answer, shown as "while working".
|
|
34
|
+
|
|
35
|
+
## Open questions
|
|
36
|
+
|
|
37
|
+
- One ledger read per turn at index time vs. a runtime-maintained per-turn digest written when the
|
|
38
|
+
turn ends (cheaper reads, one more write path).
|
|
39
|
+
- Whether the gateway's compact ledger mode (proposed for the watch's live activity) should be the
|
|
40
|
+
common source for both.
|
|
@@ -1161,6 +1161,16 @@ Implementation: `src/abstractruntime/session_turns.py`, `src/abstractruntime/ses
|
|
|
1161
1161
|
|
|
1162
1162
|
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.
|
|
1163
1163
|
|
|
1164
|
+
## Conversation search
|
|
1165
|
+
|
|
1166
|
+
Implementation: `src/abstractruntime/conversation_search.py`.
|
|
1167
|
+
|
|
1168
|
+
- `ConversationSearch(db_path, *, run_store, ledger_store, artifact_store=None, kinds=None)`: the keyword search index of one runtime plane. `db_path` is its own SQLite file in that plane's data folder (one index per plane, so a principal's search can only ever read the plane it was opened on; the file is disposable and is rebuilt when the schema changes). Each turn root (a question and its answer, as the session replay builds them) is one row, together with the turn's media: the artifacts its run generated (image, voice, video, music, by their generation prompt) and the attachments it was sent with (by their file name), each with its kind. Read-aloud audio, media saved without a prompt and internal artifacts are not indexed. `kinds` defaults to `INDEXED_KINDS` (`chat`, `discussion`): automation sessions are not indexed
|
|
1169
|
+
- `sync(*, budget_s=3.0) -> SyncReport`: indexes what changed since the last call (turn roots whose `updated_at` moved, re-read by session, newest sessions first) within the time budget. `SyncReport`: `{indexed_turns, reindexed_sessions, pending_sessions, total_turns, seconds, complete, errors}`; `complete` is `False` while older conversations are still waiting, so a first search on a large plane can say it is still indexing
|
|
1170
|
+
- `search(query, *, limit=20, sessions=None, exclude=None, session_kinds=None) -> list[SearchHit]`: one hit per session, best first. Text is indexed and queried lowercased and without accents (`normalize`) with the FTS5 `trigram` tokenizer: every query word of three or more characters must appear in the turn, as a word or part of one ("surviv" finds "overall survival"); words of one or two characters are matched as whole words; ranked by bm25, the question weighing more than the answer. When exact matches are fewer than `limit`, a fuzzy pass keeps turns holding at least `FUZZY_MIN` (60%) of each word's trigrams, so a typo still finds its turn (`fuzzy: true` on those hits). `sessions`, `exclude` and `session_kinds` filter inside the query, so a filter never empties a page that had matches further down. `limit` is clamped to 1–100
|
|
1171
|
+
- `SearchHit` (`as_dict()`): `session_id`, `run_id` (the best turn), `prompt`, `snippet` (around the first match), `matched_in` (`question`, `answer` or `artifact`), `highlights` (`[start, length]` pairs in the snippet), `score`, `created_at`, `updated_at`, `session_kind`, `fuzzy`, and `artifact` when the match is an artifact: `{artifact_id, run_id, kind, content_type, name, prompt}`, `run_id` being the run that owns it (a host's artifact content route is scoped to that run)
|
|
1172
|
+
- Without the `trigram` tokenizer (SQLite before 3.34) the index falls back to whole words with prefix matching. Tool usage, tool outputs and intermediate thinking are not indexed: [backlog 0849](backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md)
|
|
1173
|
+
|
|
1164
1174
|
## Run history bundle export (portable replay artifact)
|
|
1165
1175
|
|
|
1166
1176
|
Implementation: `src/abstractruntime/history_bundle.py`.
|
|
@@ -1222,11 +1232,12 @@ Multimodal support:
|
|
|
1222
1232
|
- remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, image upscaling, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
|
|
1223
1233
|
- remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
|
|
1224
1234
|
- generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
1235
|
+
- streamed TTS playback artifacts carry `purpose=voice_playback`, `artifact_space=voice` and a logical `voice/tts-<id>.wav` path in their tags; hosts can separate read-aloud recordings from user attachments while retaining their artifact refs and provenance
|
|
1225
1236
|
- with the pooled local client (`MultiLocalAbstractCoreLLMClient`), a request whose outputs are all non-text (image, video, voice, music, transcription) and that carries no tools never builds the text client: it runs on AbstractCore's capability host (`CapabilityHostProvider`, no text model), and so does streaming TTS. A text default that cannot be built (an engine not installed) therefore never blocks speech or image generation
|
|
1226
1237
|
- media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
|
|
1227
1238
|
- local image/video generation runs in a one-shot subprocess (`execution_mode="local_one_shot_subprocess"`) unless every requested media model is resident (explicitly loaded with `load_model_residency`), in which case it runs in-process on the loaded pipeline (`execution_mode="resident_in_process"`, `resident_load_ids`)
|
|
1228
1239
|
- a media spec whose `provider` is an endpoint profile (`endpoint:<id>`) never uses the one-shot subprocess: it is an HTTP call to that endpoint, and the host's endpoint-profile resolver (`set_provider_endpoint_profile_resolver`) exists only in this process
|
|
1229
|
-
- the `LLM_CALL` handler resolves only the call's own `provider` (`endpoint:<id>` on the effect payload) into Core routing params (`_provider`, `base_url`, `provider_api_key`); an endpoint profile named on an output spec stays on the spec, and the media plugin resolves it through the resolver the host attached to the client.
|
|
1240
|
+
- the `LLM_CALL` handler resolves only the call's own `provider` (`endpoint:<id>` on the effect payload) into Core routing params (`_provider`, `base_url`, `provider_api_key`); an endpoint profile named on an output spec stays on the spec, and the media plugin resolves it through the resolver the host attached to the client. Every client the pooled client builds carries that resolver: the text clients, the per-call override clients and the media host that serves media-only calls
|
|
1230
1241
|
- optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; local media warmup that no capability plugin can serve (`image_generation`, `image_upscale`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, `music_generation`) reports `requires_long_lived_server=true`, and image/video tasks also report `execution_mode="local_one_shot_subprocess"`
|
|
1231
1242
|
- Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected local-inference profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
|
|
1232
1243
|
|
|
@@ -3686,7 +3697,7 @@ unknown fields are rejected at every level.
|
|
|
3686
3697
|
| `target` | `{workflow_id, bundle_ref, flow_id, input_data}`: a concrete workflow; a host resolves `@default` before creating (`flow_id: "@default"` is refused) |
|
|
3687
3698
|
| `trigger` | `{binding_id, source_id, source_version, config}`; the runtime creates `binding_id` |
|
|
3688
3699
|
| `context` | `{mode: "independent" \| "growing", growing: {}}` |
|
|
3689
|
-
| `policy` | `{serial: true, misfire: "coalesce", failure: "continue", retry, tool_approval, email_allowed_recipients, untrusted_input_tools}` |
|
|
3700
|
+
| `policy` | `{serial: true, misfire: "coalesce", failure: "continue", retry, tool_approval, tool_policy?, email_allowed_recipients, untrusted_input_tools}` |
|
|
3690
3701
|
| `notify` | `{channels: ["console"] \| ["console", "email"]}`: where attention items are delivered (default `["console"]`) |
|
|
3691
3702
|
| `session_id` | `automation:<automation_id>` |
|
|
3692
3703
|
| `workspace_root` | absolute path given to every occurrence |
|
|
@@ -4039,7 +4050,25 @@ returns the refusal message for a tool, or `None` when it is allowed.
|
|
|
4039
4050
|
|
|
4040
4051
|
## Tool approval
|
|
4041
4052
|
|
|
4042
|
-
`policy.
|
|
4053
|
+
Optional `policy.tool_policy` stores a complete named snapshot:
|
|
4054
|
+
|
|
4055
|
+
```json
|
|
4056
|
+
{"auto_approve_tools": ["read_file"], "require_approval_tools": ["execute_command"]}
|
|
4057
|
+
```
|
|
4058
|
+
|
|
4059
|
+
When present it takes precedence over `tool_approval`. Require-approval wins if a tool
|
|
4060
|
+
appears in both lists; unmentioned candidate tools require approval. Tool availability
|
|
4061
|
+
still comes from `target.input_data.tools` and `_runtime.allowed_tools`; explicit `[]`
|
|
4062
|
+
denies all tools. The controller compiles this policy into the occurrence's runtime inputs
|
|
4063
|
+
at admission. Edits affect subsequent occurrences, preserving the current run's grant.
|
|
4064
|
+
|
|
4065
|
+
Named Auto is individual consent for untrusted-input tools. For untrusted triggers,
|
|
4066
|
+
message-sending tools remain withheld and MCP tools remain unavailable. Trusted triggers
|
|
4067
|
+
retain their existing messaging and recipient restrictions. Source restrictions remain in force.
|
|
4068
|
+
Omit the field for legacy behavior, or revise it to `null` to restore that behavior.
|
|
4069
|
+
Older runtimes that lack this field reject it rather than silently discarding the policy.
|
|
4070
|
+
|
|
4071
|
+
Without a named snapshot, `policy.tool_approval` decides whether the target's tools may run without asking.
|
|
4043
4072
|
|
|
4044
4073
|
- **`"auto"` (default).** An automation runs unattended and cannot ask a person before every tool call, so creating
|
|
4045
4074
|
the automation is the consent; client forms state that its tools run without asking and list them. At admission,
|
|
@@ -5928,6 +5957,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
5928
5957
|
- `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` recipient rule: self and pre-authorised recipients)
|
|
5929
5958
|
- `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
|
|
5930
5959
|
- `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
|
|
5960
|
+
- `api.md#conversation-search` — keyword search over a plane's conversations (`ConversationSearch`): questions, answers and the turn's artifacts, one SQLite FTS5 trigram index per plane, incremental `sync` with a time budget, exact then fuzzy matching
|
|
5931
5961
|
- `api.md#run-history-bundle-export-portable-replay-artifact` — run history bundles, including `resolved_actions` summaries for cross-client capability replay
|
|
5932
5962
|
|
|
5933
5963
|
## Features (reference)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
|
|
4
4
|
|
|
5
5
|
- Python: 3.10+ (see `pyproject.toml`)
|
|
6
|
-
- Version: 0.
|
|
6
|
+
- Version: 0.10.6
|
|
7
7
|
- Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
|
|
8
8
|
- Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
|
|
9
9
|
- Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.24.0 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
- Host-local operator wrappers: the host facade exposes single-user email helpers (`list_email_accounts`, `list_emails`, `read_email`, `send_email`), `abstractruntime.integrations.abstractcore.email_facade` re-exports AbstractCore's mail library for multi-user hosts, and `abstractruntime.integrations.abstractcore.telegram_facade` exposes Telegram bootstrap/global-client/send wrappers without requiring hosts to import AbstractCore directly.
|
|
51
51
|
- Durable outbound comms: when an email or Telegram send belongs to a run, use `get_abstractcore_run_facade(...).send_email(...)` or `send_telegram_message(...)` so Runtime records the request and outcome in a child run; replay should show the recorded result, not resend the message. If the child run waits for approval or passthrough execution, resume it through `resume_tool_calls(...)`.
|
|
52
52
|
- [Artifacts](docs/artifacts.md): Runtime artifact identity, JSON-safe refs, canonical descriptors, generated-media provenance, tool-output offload thresholds, catalog search/stats, access counters, and Gateway/Observer retrieval boundaries.
|
|
53
|
+
- [Conversation search](docs/api.md#conversation-search): `ConversationSearch(db_path, run_store=, ledger_store=, artifact_store=)` keeps one SQLite FTS5 trigram index per runtime plane over each turn's question, answer and media (generated artifacts by their prompt, attachments by their file name), lowercased and without accents; `sync(budget_s=)` indexes what changed within a time budget and reports what is left (`SyncReport`), `search(query, limit=, sessions=, exclude=, session_kinds=)` returns one `SearchHit` per session (its best turn, a snippet, highlight positions, `matched_in` question / answer / artifact, the matching `artifact`), exact matches first then a fuzzy pass that forgives a typo.
|
|
53
54
|
- [Sessions and history](docs/api.md#sessions-and-history): `session_chat_messages(...)` replays a session's completed turns under one window, the most recent `HISTORY_REPLAY_MAX_TOKENS` (50,000) estimated tokens of whole messages, and returns a `ReplayedHistory` whose `.report` records replayed and dropped messages and tokens; `fold_history_window(...)` applies the same window to any turns, `window_transcript(...)` to a transcript you already hold, and `announce_dropped(...)` writes the window's `#TRUNCATION` notice.
|
|
54
55
|
- [Artifacts API](docs/api.md#artifacts-store-by-reference): `ArtifactStore`, `ArtifactDescriptor`, `ArtifactAccessStats`, `search()`, `count()`, `facet_counts()`, and `stats()` for Runtime-owned catalog queries.
|
|
55
56
|
- VisualFlow document/file nodes: `read_file`/`write_file` use workspace-scoped paths (`rel/path` or `mount_alias/rel/path` in Gateway-hosted runs), `read_pdf` extracts text/metadata with `pypdf`, `write_pdf` renders text or Markdown-style content to real PDF bytes with `reportlab`, `list_folder_files` enumerates workspace folders, `import_workspace_file` snapshots a server file into an artifact, `read_artifact` projects saved file content, and `export_artifact` writes a durable artifact back to a workspace path. Local Runtime-only runs without workspace scope still fall back to the process working directory for relative file-node paths.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
### Added
|
|
2
|
+
|
|
3
|
+
- `abstractruntime.conversation_search.ConversationSearch`: keyword search over a plane's conversations: each turn's question and answer (as the session replay builds them) and its media, the artifacts it generated (kind and generation prompt, attributed to the turn whose run made them) and the attachments it was sent with (kind and file name); read-aloud audio and internal artifacts are not media. A hit on an artifact names it (`artifact`: id, owning run, kind, content type), so a client can show it. Its own SQLite file per plane, an FTS5 `trigram` index over text lowercased and without accents: words and parts of words, every word required, words of one or two letters as whole words, and a fuzzy pass that keeps a turn holding at least 60% of each word's trigrams (a typo still finds it). One hit per session (its best turn, a snippet, the match positions, where it matched: question, artifact or answer). Tool usage, tool outputs and intermediate thinking are not indexed: [backlog 0849](docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md). `sync(budget_s=…)` indexes what changed since the last call, newest sessions first, and reports what is left. Works with the file and the SQLite run stores; without the `trigram` tokenizer (SQLite < 3.34) it indexes whole words with prefixes.
|
|
4
|
+
|
|
5
|
+
- Automation definitions accept a named `policy.tool_policy` snapshot for per-tool Auto and Approve choices. The target tool ceiling remains authoritative; unspecified tools ask for approval. Messaging and untrusted-input restrictions remain enforced. See [Tool approval](docs/automations.md#tool-approval).
|
|
6
|
+
- Streamed read-aloud recordings (`_finalize_tts_stream_artifact`, the streamed-voice path of the AbstractCore integration) are stored under the voice namespace: their artifact tags carry `purpose=voice_playback`, `artifact_space=voice`, a `filename` and a logical `path` of `voice/tts-<id>.wav`, so a host can list a user's generated documents and attachments without the playback audio while playback and replay keep the same artifact ref and provenance. Test: `tests/test_streamed_voice_namespace.py`.
|
{abstractruntime-0.10.4 → abstractruntime-0.10.6}/src/abstractruntime/automations/controller.py
RENAMED
|
@@ -458,6 +458,28 @@ def grant_tool_approval(
|
|
|
458
458
|
}
|
|
459
459
|
|
|
460
460
|
|
|
461
|
+
def apply_named_tool_policy(input_data: Dict[str, Any], named_policy: Dict[str, Any], *, untrusted_input: bool = False) -> None:
|
|
462
|
+
"""Compile an explicit named snapshot without weakening automation safeguards.
|
|
463
|
+
|
|
464
|
+
Unmentioned candidates require approval. Named Auto is individual consent for
|
|
465
|
+
untrusted-input tools. Existing messaging safeguards remain in force;
|
|
466
|
+
untrusted-input occurrences never receive MCP grants.
|
|
467
|
+
"""
|
|
468
|
+
requested_auto = set(named_policy.get("auto_approve_tools", []))
|
|
469
|
+
requested_require = set(named_policy.get("require_approval_tools", []))
|
|
470
|
+
# The validated definition owns this policy, not a workflow-supplied grant.
|
|
471
|
+
runtime_ns = dict(input_data.get("_runtime") or {})
|
|
472
|
+
runtime_ns.pop("tool_policy", None)
|
|
473
|
+
input_data["_runtime"] = runtime_ns
|
|
474
|
+
grant_tool_approval(input_data, untrusted_input=untrusted_input,
|
|
475
|
+
named_tools=sorted(requested_auto - requested_require), approval="ask" if untrusted_input else "auto")
|
|
476
|
+
policy = input_data["_runtime"]["tool_policy"]
|
|
477
|
+
candidates = set(policy["auto_approve_tools"]) | set(policy["withheld_tools"])
|
|
478
|
+
auto = set(policy["auto_approve_tools"]) & requested_auto - requested_require
|
|
479
|
+
policy["auto_approve_tools"] = sorted(auto)
|
|
480
|
+
policy["require_approval_tools"] = sorted(candidates - auto)
|
|
481
|
+
|
|
482
|
+
|
|
461
483
|
# The flow input that makes an agent read `context.messages` (basic-agent's
|
|
462
484
|
# `use_context` pin defaults to False; `include_context` is its alias, and
|
|
463
485
|
# wins when present, so both are set).
|
|
@@ -540,7 +562,10 @@ def build_prepared(
|
|
|
540
562
|
if isinstance(emails, list):
|
|
541
563
|
resolve_vars = _freeze_email_inputs(turn, input_data, emails)
|
|
542
564
|
approval = definition["policy"].get("tool_approval", "auto")
|
|
543
|
-
|
|
565
|
+
named_policy = definition["policy"].get("tool_policy")
|
|
566
|
+
if isinstance(named_policy, dict):
|
|
567
|
+
apply_named_tool_policy(input_data, named_policy, untrusted_input=untrusted)
|
|
568
|
+
elif approval == "auto" or untrusted:
|
|
544
569
|
# Untrusted input ALWAYS gets a per-run policy, under "ask" too: without one the
|
|
545
570
|
# executor's static defaults decide, and they auto-run network and sending tools.
|
|
546
571
|
grant_tool_approval(
|
|
@@ -354,11 +354,25 @@ def validate_notify(value: Any) -> Dict[str, Any]:
|
|
|
354
354
|
return result
|
|
355
355
|
|
|
356
356
|
|
|
357
|
+
def validate_named_tool_policy(value: Any) -> Dict[str, Any]:
|
|
358
|
+
"""Named approval snapshot; the target's allowed_tools remains the ceiling."""
|
|
359
|
+
policy = _require_mapping(value, "policy.tool_policy")
|
|
360
|
+
keys = ("auto_approve_tools", "require_approval_tools")
|
|
361
|
+
_reject_unknown(policy, keys, "policy.tool_policy")
|
|
362
|
+
result = {}
|
|
363
|
+
for key in keys:
|
|
364
|
+
names = policy.get(key, [])
|
|
365
|
+
if not isinstance(names, list) or any(not isinstance(n, str) or not n.strip() for n in names):
|
|
366
|
+
raise _invalid(f"policy.tool_policy.{key} must be a list of nonempty tool names", f"policy.tool_policy.{key}")
|
|
367
|
+
result[key] = sorted({n.strip() for n in names})
|
|
368
|
+
return result
|
|
369
|
+
|
|
370
|
+
|
|
357
371
|
def validate_policy(value: Any) -> Dict[str, Any]:
|
|
358
372
|
policy = _require_mapping(value if value is not None else {}, "policy")
|
|
359
373
|
_reject_unknown(
|
|
360
374
|
policy,
|
|
361
|
-
("serial", "misfire", "failure", "retry", "tool_approval", "email_allowed_recipients", "untrusted_input_tools"),
|
|
375
|
+
("serial", "misfire", "failure", "retry", "tool_approval", "email_allowed_recipients", "untrusted_input_tools", "tool_policy"),
|
|
362
376
|
"policy",
|
|
363
377
|
)
|
|
364
378
|
tool_approval = policy.get("tool_approval", "auto")
|
|
@@ -389,6 +403,7 @@ def validate_policy(value: Any) -> Dict[str, Any]:
|
|
|
389
403
|
"max": _duration(backoff.get("max", DEFAULT_RETRY["backoff"]["max"]), "policy.retry.backoff.max"),
|
|
390
404
|
},
|
|
391
405
|
},
|
|
406
|
+
**({"tool_policy": validate_named_tool_policy(policy["tool_policy"])} if policy.get("tool_policy") is not None else {}),
|
|
392
407
|
"tool_approval": tool_approval,
|
|
393
408
|
"email_allowed_recipients": validate_email_allowed_recipients(
|
|
394
409
|
policy.get("email_allowed_recipients", list(DEFAULT_EMAIL_ALLOWED_RECIPIENTS))
|