AbstractRuntime 0.10.5__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.
Files changed (713) hide show
  1. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/CHANGELOG.md +9 -0
  2. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/PKG-INFO +1 -1
  3. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/README.md +1 -0
  4. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/api.md +11 -0
  5. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/automations.md +20 -2
  6. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/README.md +2 -1
  7. abstractruntime-0.10.6/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +40 -0
  8. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/llms-full.txt +32 -2
  9. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/llms.txt +2 -1
  10. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/pyproject.toml +1 -1
  11. abstractruntime-0.10.6/release-notes.md +6 -0
  12. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/controller.py +26 -1
  13. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/models.py +16 -1
  14. abstractruntime-0.10.6/src/abstractruntime/conversation_search.py +616 -0
  15. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/llm_client.py +7 -1
  16. abstractruntime-0.10.6/tests/test_automation_named_policy_compiler.py +32 -0
  17. abstractruntime-0.10.6/tests/test_conversation_search.py +289 -0
  18. abstractruntime-0.10.6/tests/test_streamed_voice_namespace.py +36 -0
  19. abstractruntime-0.10.5/release-notes.md +0 -9
  20. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/.github/workflows/ci.yml +0 -0
  21. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/.github/workflows/release.yml +0 -0
  22. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/.gitignore +0 -0
  23. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/ACKNOWLEDGMENTS.md +0 -0
  24. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/CODE_OF_CONDUCT.md +0 -0
  25. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/CONTRIBUTING.md +0 -0
  26. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/LICENSE +0 -0
  27. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/README.md +0 -0
  28. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/ROADMAP.md +0 -0
  29. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/SECURITY.md +0 -0
  30. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  31. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  32. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  33. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  34. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  35. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  36. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  37. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/adr/README.md +0 -0
  38. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/architecture.md +0 -0
  39. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/artifacts.md +0 -0
  40. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  41. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  42. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  43. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  44. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  45. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  46. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  47. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  48. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/003_wait_primitives.md +0 -0
  49. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  50. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  51. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  52. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  53. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  54. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  55. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  56. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  57. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/009_artifact_store.md +0 -0
  58. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  59. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  60. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  61. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  62. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  63. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  64. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  65. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  66. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  67. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  68. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  69. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  70. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  71. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  72. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  73. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  74. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  75. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  76. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  77. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  78. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  79. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  80. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  81. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  82. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  83. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/004_tests.md +0 -0
  84. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  85. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  86. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  87. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  88. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/README.md +0 -0
  89. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  90. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  91. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  92. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  93. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  94. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  95. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  96. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  97. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  98. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  99. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  100. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  101. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  102. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  103. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  104. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_portability/README.md +0 -0
  105. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  106. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  107. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  108. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  109. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  110. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  111. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  112. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  113. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  114. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  115. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  116. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  117. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  118. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  119. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  120. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  121. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  122. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  123. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  124. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  125. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  126. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  127. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  128. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  129. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  130. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  131. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  132. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  133. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  134. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/email.md +0 -0
  135. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/entity-runtime.md +0 -0
  136. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/evidence.md +0 -0
  137. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/faq.md +0 -0
  138. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/getting-started.md +0 -0
  139. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/integrations/abstractcore.md +0 -0
  140. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/limits.md +0 -0
  141. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/manual_testing.md +0 -0
  142. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/mcp-worker.md +0 -0
  143. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/proposal.md +0 -0
  144. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/provenance.md +0 -0
  145. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/snapshots.md +0 -0
  146. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/tool-approval.md +0 -0
  147. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/tools-comms.md +0 -0
  148. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/troubleshooting.md +0 -0
  149. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/docs/workflow-bundles.md +0 -0
  150. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/01_hello_world.py +0 -0
  151. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/02_ask_user.py +0 -0
  152. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/03_wait_until.py +0 -0
  153. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/04_multi_step.py +0 -0
  154. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/05_persistence.py +0 -0
  155. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/06_llm_integration.py +0 -0
  156. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/07_react_agent.py +0 -0
  157. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/examples/README.md +0 -0
  158. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/mkdocs.yml +0 -0
  159. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/pytest.ini +0 -0
  160. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/scripts/backfill_diary_edges.py +0 -0
  161. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/scripts/generate_llms_full.py +0 -0
  162. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/__init__.py +0 -0
  163. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automation_queries.py +0 -0
  164. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/__init__.py +0 -0
  165. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/adapters.py +0 -0
  166. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/attention.py +0 -0
  167. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/bundle.py +0 -0
  168. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  169. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  170. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/commands.py +0 -0
  171. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/ledger.py +0 -0
  172. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/automations/service.py +0 -0
  173. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/__init__.py +0 -0
  174. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/config.py +0 -0
  175. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/effect_cancellation.py +0 -0
  176. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/event_keys.py +0 -0
  177. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/health.py +0 -0
  178. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/live_deltas.py +0 -0
  179. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/models.py +0 -0
  180. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/policy.py +0 -0
  181. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/progress_channel.py +0 -0
  182. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/run_attribution.py +0 -0
  183. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/run_identity.py +0 -0
  184. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/run_lifecycle.py +0 -0
  185. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/runtime.py +0 -0
  186. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/spec.py +0 -0
  187. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/tool_scope.py +0 -0
  188. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/core/vars.py +0 -0
  189. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/documents/__init__.py +0 -0
  190. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/documents/charts.py +0 -0
  191. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/documents/docx.py +0 -0
  192. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/documents/pdf.py +0 -0
  193. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/email/__init__.py +0 -0
  194. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/email/actions.py +0 -0
  195. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/email/automations.py +0 -0
  196. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/email/binding.py +0 -0
  197. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/email/feeder.py +0 -0
  198. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/email/frame.py +0 -0
  199. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/email/inbox.py +0 -0
  200. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/evidence/__init__.py +0 -0
  201. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/evidence/recorder.py +0 -0
  202. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/history_bundle.py +0 -0
  203. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/__init__.py +0 -0
  204. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/act_only.py +0 -0
  205. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/chat.py +0 -0
  206. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/communities.py +0 -0
  207. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/diary.py +0 -0
  208. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/digest.py +0 -0
  209. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/entity_runtime.py +0 -0
  210. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/fingerprint.py +0 -0
  211. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/lease.py +0 -0
  212. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/life.py +0 -0
  213. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/memory_reader.py +0 -0
  214. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/night_voice.py +0 -0
  215. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/phase_graph.py +0 -0
  216. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/phase_spec.py +0 -0
  217. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/prelude.py +0 -0
  218. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  219. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/reflection.py +0 -0
  220. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  221. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/substrate.py +0 -0
  222. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/tool_effects.py +0 -0
  223. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/tool_policy.py +0 -0
  224. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/tools.py +0 -0
  225. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/identity/visit_workflow.py +0 -0
  226. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/__init__.py +0 -0
  227. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  228. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  229. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  230. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  231. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  232. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  233. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  234. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  235. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  236. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  237. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  238. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  239. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  240. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  241. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  242. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  243. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  244. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  245. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  246. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  247. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  248. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  249. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  250. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  251. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  252. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  253. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  254. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  255. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  256. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  257. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  258. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  259. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  260. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  261. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  262. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  263. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  264. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/__init__.py +0 -0
  265. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/active_context.py +0 -0
  266. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/active_memory.py +0 -0
  267. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/compaction.py +0 -0
  268. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/kg_packets.py +0 -0
  269. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/memact_composer.py +0 -0
  270. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/recall_levels.py +0 -0
  271. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/memory/token_budget.py +0 -0
  272. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/rendering/__init__.py +0 -0
  273. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  274. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/rendering/json_stringify.py +0 -0
  275. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/__init__.py +0 -0
  276. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/convenience.py +0 -0
  277. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/multi_store.py +0 -0
  278. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/registry.py +0 -0
  279. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/scheduler/scheduler.py +0 -0
  280. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/session_history.py +0 -0
  281. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/session_turns.py +0 -0
  282. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/__init__.py +0 -0
  283. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/artifacts.py +0 -0
  284. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/base.py +0 -0
  285. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/commands.py +0 -0
  286. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/in_memory.py +0 -0
  287. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/json_files.py +0 -0
  288. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/lease.py +0 -0
  289. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/ledger_chain.py +0 -0
  290. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/ledger_slim.py +0 -0
  291. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/observable.py +0 -0
  292. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/offloading.py +0 -0
  293. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/serialize.py +0 -0
  294. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/snapshots.py +0 -0
  295. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/sqlite.py +0 -0
  296. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  297. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/triggers/__init__.py +0 -0
  298. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/triggers/email_received.py +0 -0
  299. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/triggers/manual.py +0 -0
  300. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/triggers/protocol.py +0 -0
  301. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/triggers/registry.py +0 -0
  302. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/triggers/schedule.py +0 -0
  303. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/turn_grounding.py +0 -0
  304. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/utils/__init__.py +0 -0
  305. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/utils/atomic_files.py +0 -0
  306. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/utils/file_filters.py +0 -0
  307. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/utils/workspace_paths.py +0 -0
  308. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  309. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  310. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  311. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  312. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  313. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  314. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  315. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  316. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  317. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  318. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  319. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  320. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  321. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  322. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  323. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  324. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  325. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  326. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  327. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  328. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  329. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  330. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  331. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  332. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  333. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  334. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  335. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/models.py +0 -0
  336. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  337. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  338. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  339. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/README.md +0 -0
  340. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/automation_harness.py +0 -0
  341. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/conftest.py +0 -0
  342. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/email_wp2_support.py +0 -0
  343. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/fixtures/schedule_v1_corpus.json +0 -0
  344. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/live_email/conftest.py +0 -0
  345. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/live_email/live_email_support.py +0 -0
  346. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/live_email/test_email_live_runtime.py +0 -0
  347. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_abstractcore_comms_facade.py +0 -0
  348. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_abstractcore_discovery_facade.py +0 -0
  349. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_abstractcore_host_facade.py +0 -0
  350. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_abstractcore_run_facade.py +0 -0
  351. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_abstractcore_server_facade.py +0 -0
  352. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_abstractcore_structured_facade.py +0 -0
  353. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_abstractcore_telegram_facade.py +0 -0
  354. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_active_context_policy.py +0 -0
  355. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_active_index.py +0 -0
  356. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_active_memory.py +0 -0
  357. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_agora_agent_alias_identity.py +0 -0
  358. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_agora_tools_http.py +0 -0
  359. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  360. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_answer_user_effect.py +0 -0
  361. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_artifacts.py +0 -0
  362. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_calendar_schedule.py +0 -0
  363. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_commands.py +0 -0
  364. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_controller.py +0 -0
  365. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_controller_recovery.py +0 -0
  366. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_definition.py +0 -0
  367. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_discussion_isolation.py +0 -0
  368. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_email_results.py +0 -0
  369. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_growing_context.py +0 -0
  370. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_index.py +0 -0
  371. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_next_fire.py +0 -0
  372. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_occurrence_input_resolver.py +0 -0
  373. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_occurrence_recovery.py +0 -0
  374. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_replay_read_only.py +0 -0
  375. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_retry.py +0 -0
  376. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_session_turns.py +0 -0
  377. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_status.py +0 -0
  378. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_automation_tool_approval.py +0 -0
  379. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_browser_probe_target_walling.py +0 -0
  380. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  381. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_capability_default_reasoning.py +0 -0
  382. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_chat_summarizer_integration.py +0 -0
  383. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_code_node_imports.py +0 -0
  384. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_code_node_restricted_python.py +0 -0
  385. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_command_sandbox_host_facade.py +0 -0
  386. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_command_store.py +0 -0
  387. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_compaction_helpers.py +0 -0
  388. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_compaction_summarizer_route.py +0 -0
  389. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_config_facade_models_engines.py +0 -0
  390. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_config_facade_voice_input_hint.py +0 -0
  391. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_control_adapter_while.py +0 -0
  392. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_controller_bundle_packaged.py +0 -0
  393. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_crash_ordering_inversions.py +0 -0
  394. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_create_if_absent.py +0 -0
  395. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_data_registry_facade.py +0 -0
  396. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_default_tools_camera_gating.py +0 -0
  397. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_default_tools_comms_gating.py +0 -0
  398. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_default_tools_include_skim_files.py +0 -0
  399. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_default_tools_include_skim_folders.py +0 -0
  400. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_default_tools_include_skim_web.py +0 -0
  401. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_default_tools_search_files_executor.py +0 -0
  402. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_diary_capture.py +0 -0
  403. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_diary_write_rescue.py +0 -0
  404. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_directory_lease.py +0 -0
  405. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_disabled_toolsets_seam.py +0 -0
  406. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  407. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  408. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_discovery_voice_openai_api_key.py +0 -0
  409. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_discussion_session_anchor.py +0 -0
  410. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_document_markdown_tables.py +0 -0
  411. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_document_renderers_hr_quote.py +0 -0
  412. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_durable_toolsets.py +0 -0
  413. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_durable_write_discipline.py +0 -0
  414. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  415. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_effect_cancellation.py +0 -0
  416. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_effect_issuance_idempotency.py +0 -0
  417. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  418. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_election_consequence_teaching.py +0 -0
  419. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_email_binding_and_refiner.py +0 -0
  420. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_email_gate_fixes.py +0 -0
  421. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_email_inbox_and_trigger.py +0 -0
  422. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_email_regate_fixes.py +0 -0
  423. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_email_review_fixes.py +0 -0
  424. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_email_self_trigger_loop.py +0 -0
  425. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_email_toolset_and_walls.py +0 -0
  426. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_emergence_experiment.py +0 -0
  427. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_emit_event_uses_wait_index.py +0 -0
  428. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_emit_event_without_workflow_registry.py +0 -0
  429. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
  430. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_endpoint_profile_media_in_process.py +0 -0
  431. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
  432. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_endpoint_profile_route_context.py +0 -0
  433. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_awake_memory_fixes.py +0 -0
  434. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_brain_effects.py +0 -0
  435. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_chat_driver.py +0 -0
  436. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_chat_tools_reflection.py +0 -0
  437. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_diary.py +0 -0
  438. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_execute_tool.py +0 -0
  439. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_fetch_url_tool.py +0 -0
  440. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_history_window.py +0 -0
  441. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_life_loop.py +0 -0
  442. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_memory_richness.py +0 -0
  443. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_phase_graph_conformance.py +0 -0
  444. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_react_visit_window.py +0 -0
  445. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_recent_memories.py +0 -0
  446. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_runtime.py +0 -0
  447. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_search_memory.py +0 -0
  448. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  449. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_substrate_resolution.py +0 -0
  450. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_visit_honesty.py +0 -0
  451. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_workspace_cap.py +0 -0
  452. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_entity_workspace_tools.py +0 -0
  453. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_event_wait_index.py +0 -0
  454. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  455. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_evidence_recorder.py +0 -0
  456. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  457. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_execute_command_output_offload.py +0 -0
  458. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_execution_capability_discovery.py +0 -0
  459. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_explicit_eject_other_clients.py +0 -0
  460. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_factory_default_retry_policy.py +0 -0
  461. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  462. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_format_repair_nudge.py +0 -0
  463. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_fresh_install_no_provider.py +0 -0
  464. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_gateway_facades_c4899.py +0 -0
  465. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_git_read_only_refiner.py +0 -0
  466. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_hf_process_residency_merge.py +0 -0
  467. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_history_window_multimodal.py +0 -0
  468. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_hot_path_store_reads.py +0 -0
  469. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_indexed_idempotency_lookup.py +0 -0
  470. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_integration_abstractcore.py +0 -0
  471. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_integrations_abstractcore.py +0 -0
  472. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_json_file_run_store_children_index.py +0 -0
  473. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_json_run_cache_bound.py +0 -0
  474. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_json_store_scan_memo.py +0 -0
  475. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_jsonl_ledger_recovery.py +0 -0
  476. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_kg_learn_and_recall_contract.py +0 -0
  477. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_ledger_chain.py +0 -0
  478. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_ledger_record_slimming.py +0 -0
  479. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_ledger_subscription.py +0 -0
  480. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_live_token_deltas.py +0 -0
  481. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_media_artifact_refs.py +0 -0
  482. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  483. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  484. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  485. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_requires_prompt.py +0 -0
  486. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_response_schema_normalization.py +0 -0
  487. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_structured_output_fallback.py +0 -0
  488. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_text_phase_progress.py +0 -0
  489. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  490. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  491. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  492. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_client_grounding_tail.py +0 -0
  493. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_client_media_artifacts.py +0 -0
  494. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_client_system_context.py +0 -0
  495. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_client_tool_call_parsing.py +0 -0
  496. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_retry_classification.py +0 -0
  497. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_llm_streaming_on_token.py +0 -0
  498. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_local_helper_tool_exposure.py +0 -0
  499. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_local_residency_host_sweep.py +0 -0
  500. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  501. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_max_iterations_ceiling.py +0 -0
  502. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_mcp_remote_tool_executor.py +0 -0
  503. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  504. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_mcp_worker_logging.py +0 -0
  505. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_mcp_worker_security.py +0 -0
  506. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_mcp_worker_stdio.py +0 -0
  507. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_media_artifact_resolution.py +0 -0
  508. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_media_capability_default_routing.py +0 -0
  509. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_media_only_requests_skip_text_client.py +0 -0
  510. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_media_subprocess.py +0 -0
  511. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memact_composer_from_kg_result.py +0 -0
  512. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_appraise_handler.py +0 -0
  513. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_communities.py +0 -0
  514. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  515. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_kg_packets.py +0 -0
  516. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  517. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  518. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  519. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  520. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_note_effect.py +0 -0
  521. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_query_effect.py +0 -0
  522. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_query_rich_filters.py +0 -0
  523. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  524. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_seam_handlers.py +0 -0
  525. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_seam_sqlite_durability.py +0 -0
  526. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_memory_tag_effect.py +0 -0
  527. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_mlx_generation_serialization.py +0 -0
  528. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_mlx_process_residency_merge.py +0 -0
  529. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_model_eject_cancel.py +0 -0
  530. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_model_residency_clean_switch.py +0 -0
  531. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_model_residency_control_plane.py +0 -0
  532. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  533. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_multi_store_scheduler.py +0 -0
  534. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_multimodal_abstractcore_integration.py +0 -0
  535. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_native_mlx_application_wiring.py +0 -0
  536. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_native_mlx_execution_controls_live.py +0 -0
  537. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_native_tool_channel.py +0 -0
  538. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_night_voice.py +0 -0
  539. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_no_default_provider_refusal_ux.py +0 -0
  540. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_offload_answer_chain_c4978.py +0 -0
  541. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  542. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_offloading.py +0 -0
  543. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_packaging_extras.py +0 -0
  544. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_parallel_readonly_tool_execution.py +0 -0
  545. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_pause_resume.py +0 -0
  546. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_pdf_unicode_rendering.py +0 -0
  547. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_personal_cycle.py +0 -0
  548. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_phantom_attachment_index.py +0 -0
  549. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_phase_graph_artifact_control.py +0 -0
  550. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_phase_graph_obedience.py +0 -0
  551. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_phase_vocabulary_migration.py +0 -0
  552. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  553. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_prompt_cache_export_import.py +0 -0
  554. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  555. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_prompt_cache_modules.py +0 -0
  556. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  557. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  558. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_prompt_overlay.py +0 -0
  559. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  560. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_provider_pin_routing_isolation.py +0 -0
  561. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_queryable_run_store.py +0 -0
  562. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_r12_workspace_sandbox.py +0 -0
  563. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  564. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_read_idle_threading.py +0 -0
  565. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_readoption_experiment.py +0 -0
  566. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_real_integration.py +0 -0
  567. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_realize_election.py +0 -0
  568. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_recall_levels_policy.py +0 -0
  569. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_remote_client_cancel.py +0 -0
  570. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_remote_llm_client.py +0 -0
  571. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_remote_speculation_defaults.py +0 -0
  572. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_rendering_agent_trace_report.py +0 -0
  573. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_rendering_json_stringify.py +0 -0
  574. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_report_branding.py +0 -0
  575. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_resident_media_generation.py +0 -0
  576. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_resume_concurrent_same_wait.py +0 -0
  577. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_retry_idempotency.py +0 -0
  578. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_run_history_bundle.py +0 -0
  579. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_run_index_workspace_root.py +0 -0
  580. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_run_mutation_lock.py +0 -0
  581. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_run_scoped_tool_policy.py +0 -0
  582. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_run_tool_scope_ceiling.py +0 -0
  583. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_browser_session_boundary.py +0 -0
  584. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  585. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  586. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_effect_invocation_trace.py +0 -0
  587. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  588. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_install_boundary.py +0 -0
  589. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  590. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_node_traces.py +0 -0
  591. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  592. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_runtime_tick_step_gate.py +0 -0
  593. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_schedule_v1_corpus.py +0 -0
  594. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_schedule_v2_calendar.py +0 -0
  595. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_scheduler.py +0 -0
  596. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_send_email_refiner.py +0 -0
  597. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_send_email_self_default_policy.py +0 -0
  598. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  599. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_session_history.py +0 -0
  600. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_session_prompt_cache_attribution.py +0 -0
  601. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_session_prompt_cache_visibility.py +0 -0
  602. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_session_route_stamp.py +0 -0
  603. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_session_start_cost.py +0 -0
  604. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_shell_tool_exposure.py +0 -0
  605. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_snapshots.py +0 -0
  606. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_speculation_inheritance.py +0 -0
  607. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_speculation_reaches_provider_construction.py +0 -0
  608. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_sqlite_ledger_store.py +0 -0
  609. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_start_subworkflow_async_wait.py +0 -0
  610. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  611. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  612. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_steer_sidecar.py +0 -0
  613. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_storage_deletion.py +0 -0
  614. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_structured_output_schema_enum.py +0 -0
  615. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_subworkflow.py +0 -0
  616. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_terminal_effect_completion.py +0 -0
  617. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  618. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_thinking_inheritance.py +0 -0
  619. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  620. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_approval_executor.py +0 -0
  621. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_approval_resume_executes.py +0 -0
  622. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_approval_wait_key_identity.py +0 -0
  623. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_calls_idempotency_keys.py +0 -0
  624. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_catalog.py +0 -0
  625. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_descriptor_registry.py +0 -0
  626. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_executor_argument_sanitization.py +0 -0
  627. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_executor_error_output_detection.py +0 -0
  628. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_executor_filename_alias.py +0 -0
  629. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  630. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_executor_read_file_aliases.py +0 -0
  631. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_executor_timeout.py +0 -0
  632. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_inventory_facade.py +0 -0
  633. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_invoke_effect.py +0 -0
  634. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_policy_and_mounts.py +0 -0
  635. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_tool_wait_allowlist_safety.py +0 -0
  636. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_topic_election_world_model.py +0 -0
  637. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_trace_context_propagation.py +0 -0
  638. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_trigger_registry.py +0 -0
  639. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_trigger_schedule_math.py +0 -0
  640. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_turn_grounding_byte_stability.py +0 -0
  641. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_turn_grounding_carriers_a3.py +0 -0
  642. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_vars_query_effect.py +0 -0
  643. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visit_ab_fixture.py +0 -0
  644. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visit_midturn_elections.py +0 -0
  645. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visit_midturn_resume.py +0 -0
  646. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visit_workflow.py +0 -0
  647. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  648. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  649. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  650. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  651. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  652. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  653. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_entity_memory_nodes.py +0 -0
  654. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  655. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_llm_call_partial_override.py +0 -0
  656. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  657. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_loop_back_out_of_body.py +0 -0
  658. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  659. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_loop_limit_on_wire.py +0 -0
  660. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_memact_compose_node.py +0 -0
  661. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  662. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  663. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  664. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_reroute_lowering.py +0 -0
  665. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_set_vars_pins.py +0 -0
  666. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  667. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  668. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_add_message_builtin.py +0 -0
  669. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  670. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_agora_react_agent.py +0 -0
  671. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_call_tool_node.py +0 -0
  672. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  673. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_compiler_basic.py +0 -0
  674. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  675. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_continue_on_error.py +0 -0
  676. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  677. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  678. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  679. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_function_library.py +0 -0
  680. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_get_element_node.py +0 -0
  681. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_get_random_element_node.py +0 -0
  682. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_get_var_node.py +0 -0
  683. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_has_tools_builtin.py +0 -0
  684. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  685. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  686. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_make_object_node.py +0 -0
  687. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_media_nodes.py +0 -0
  688. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  689. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_memory_source_pins.py +0 -0
  690. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_pin_expressions.py +0 -0
  691. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_prompt_only.py +0 -0
  692. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_random_nodes.py +0 -0
  693. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_schema_enum_switch.py +0 -0
  694. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_string_contains_replace.py +0 -0
  695. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_visualflow_tool_parameters_node.py +0 -0
  696. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_voice_openai_api_key_path.py +0 -0
  697. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  698. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_w4_feelings_lens.py +0 -0
  699. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_wait_event_deadline.py +0 -0
  700. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_wait_event_prompt_metadata.py +0 -0
  701. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_wait_until_streak.py +0 -0
  702. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_wait_until_utc_normalization.py +0 -0
  703. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workflow_bundle_registry.py +0 -0
  704. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_builtin_deny.py +0 -0
  705. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  706. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  707. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  708. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  709. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  710. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_prompt_context.py +0 -0
  711. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_read_only.py +0 -0
  712. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_workspace_writable_paths.py +0 -0
  713. {abstractruntime-0.10.5 → abstractruntime-0.10.6}/tests/test_write_chart.py +0 -0
@@ -5,6 +5,15 @@ 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
+
8
17
  ## [0.10.5] - 2026-10-18
9
18
 
10
19
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.10.5
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,6 +362,7 @@ 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`)
@@ -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.tool_approval` decides whether the target's tools may run without asking.
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: 12
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,6 +1232,7 @@ 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`)
@@ -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.tool_approval` decides whether the target's tools may run without asking.
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.9.1
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.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.10.5"
7
+ version = "0.10.6"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -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`.
@@ -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
- if approval == "auto" or untrusted:
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))