AbstractRuntime 0.7.0__tar.gz → 0.7.2__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 (653) hide show
  1. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/ACKNOWLEDGMENTS.md +1 -1
  2. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/CHANGELOG.md +44 -0
  3. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/PKG-INFO +9 -9
  4. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/README.md +4 -4
  5. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/api.md +3 -3
  6. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/architecture.md +2 -2
  7. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/troubleshooting.md +1 -1
  8. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/llms-full.txt +11 -11
  9. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/llms.txt +2 -2
  10. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/pyproject.toml +8 -7
  11. abstractruntime-0.7.2/release-notes.md +24 -0
  12. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +22 -3
  13. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +2 -1
  14. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/token_budget.py +39 -3
  15. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/session_history.py +49 -1
  16. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_abstractcore_discovery_facade.py +42 -0
  17. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_discovery_tts_unavailable_reason.py +1 -1
  18. abstractruntime-0.7.2/tests/test_history_window_multimodal.py +142 -0
  19. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_packaging_extras.py +39 -10
  20. abstractruntime-0.7.0/release-notes.md +0 -94
  21. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/.github/workflows/ci.yml +0 -0
  22. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/.github/workflows/release.yml +0 -0
  23. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/.gitignore +0 -0
  24. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/CODE_OF_CONDUCT.md +0 -0
  25. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/CONTRIBUTING.md +0 -0
  26. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/LICENSE +0 -0
  27. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/ROADMAP.md +0 -0
  28. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/SECURITY.md +0 -0
  29. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/README.md +0 -0
  30. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  31. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  32. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  33. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  34. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  35. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  36. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  37. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/adr/README.md +0 -0
  38. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/artifacts.md +0 -0
  39. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/automations.md +0 -0
  40. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/README.md +0 -0
  41. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  42. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  43. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  44. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  45. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  46. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  47. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  48. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  49. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/003_wait_primitives.md +0 -0
  50. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  51. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  52. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  53. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  54. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  55. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  56. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  57. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  58. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/009_artifact_store.md +0 -0
  59. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  60. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  61. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  62. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  63. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  64. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  65. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  66. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  67. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  68. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  69. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  70. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  71. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  72. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  73. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  74. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  75. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  76. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  77. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  78. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  79. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  80. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  81. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  82. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  83. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  84. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/004_tests.md +0 -0
  85. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  86. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  87. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  88. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  89. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/README.md +0 -0
  90. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  91. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  92. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  93. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  94. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  95. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  96. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  97. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  98. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  99. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  100. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  101. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  102. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  103. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  104. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  105. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_portability/README.md +0 -0
  106. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  107. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  108. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  109. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  110. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  111. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  112. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  113. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  114. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  115. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  116. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  117. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  118. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  119. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  120. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  121. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  122. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  123. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  124. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  125. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  126. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  127. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  128. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  129. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  130. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  131. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  132. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  133. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  134. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  135. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/entity-runtime.md +0 -0
  136. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/evidence.md +0 -0
  137. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/faq.md +0 -0
  138. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/getting-started.md +0 -0
  139. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/integrations/abstractcore.md +0 -0
  140. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/limits.md +0 -0
  141. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/manual_testing.md +0 -0
  142. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/mcp-worker.md +0 -0
  143. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/proposal.md +0 -0
  144. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/provenance.md +0 -0
  145. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/snapshots.md +0 -0
  146. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/tool-approval.md +0 -0
  147. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/tools-comms.md +0 -0
  148. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/docs/workflow-bundles.md +0 -0
  149. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/emails.config.example.yaml +0 -0
  150. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/01_hello_world.py +0 -0
  151. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/02_ask_user.py +0 -0
  152. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/03_wait_until.py +0 -0
  153. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/04_multi_step.py +0 -0
  154. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/05_persistence.py +0 -0
  155. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/06_llm_integration.py +0 -0
  156. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/07_react_agent.py +0 -0
  157. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/examples/README.md +0 -0
  158. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/mkdocs.yml +0 -0
  159. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/pytest.ini +0 -0
  160. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/scripts/backfill_diary_edges.py +0 -0
  161. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/scripts/generate_llms_full.py +0 -0
  162. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/__init__.py +0 -0
  163. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automation_queries.py +0 -0
  164. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/__init__.py +0 -0
  165. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/adapters.py +0 -0
  166. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/attention.py +0 -0
  167. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/bundle.py +0 -0
  168. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  169. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  170. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/commands.py +0 -0
  171. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/controller.py +0 -0
  172. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/ledger.py +0 -0
  173. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/models.py +0 -0
  174. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/automations/service.py +0 -0
  175. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/__init__.py +0 -0
  176. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/config.py +0 -0
  177. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/effect_cancellation.py +0 -0
  178. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/event_keys.py +0 -0
  179. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/health.py +0 -0
  180. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/live_deltas.py +0 -0
  181. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/models.py +0 -0
  182. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/policy.py +0 -0
  183. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/progress_channel.py +0 -0
  184. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/run_attribution.py +0 -0
  185. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/run_identity.py +0 -0
  186. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/run_lifecycle.py +0 -0
  187. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/runtime.py +0 -0
  188. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/spec.py +0 -0
  189. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/tool_scope.py +0 -0
  190. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/core/vars.py +0 -0
  191. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/documents/__init__.py +0 -0
  192. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/documents/charts.py +0 -0
  193. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/documents/docx.py +0 -0
  194. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/documents/pdf.py +0 -0
  195. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/evidence/__init__.py +0 -0
  196. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/evidence/recorder.py +0 -0
  197. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/history_bundle.py +0 -0
  198. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/__init__.py +0 -0
  199. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/act_only.py +0 -0
  200. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/chat.py +0 -0
  201. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/communities.py +0 -0
  202. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/diary.py +0 -0
  203. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/digest.py +0 -0
  204. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/entity_runtime.py +0 -0
  205. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/fingerprint.py +0 -0
  206. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/lease.py +0 -0
  207. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/life.py +0 -0
  208. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/memory_reader.py +0 -0
  209. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/night_voice.py +0 -0
  210. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/phase_graph.py +0 -0
  211. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/phase_spec.py +0 -0
  212. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/prelude.py +0 -0
  213. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  214. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/reflection.py +0 -0
  215. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  216. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/substrate.py +0 -0
  217. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/tool_effects.py +0 -0
  218. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/tool_policy.py +0 -0
  219. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/tools.py +0 -0
  220. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/identity/visit_workflow.py +0 -0
  221. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/__init__.py +0 -0
  222. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  223. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  224. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  225. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  226. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  227. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  228. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  229. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  230. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  231. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  232. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  233. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  234. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  235. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  236. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  237. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  238. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  239. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  240. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  241. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  242. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  243. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  244. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  245. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  246. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  247. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  248. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  249. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  250. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  251. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  252. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  253. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/__init__.py +0 -0
  254. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/active_context.py +0 -0
  255. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/active_memory.py +0 -0
  256. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/compaction.py +0 -0
  257. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/kg_packets.py +0 -0
  258. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/memact_composer.py +0 -0
  259. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/memory/recall_levels.py +0 -0
  260. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/rendering/__init__.py +0 -0
  261. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  262. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/rendering/json_stringify.py +0 -0
  263. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/scheduler/__init__.py +0 -0
  264. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/scheduler/convenience.py +0 -0
  265. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/scheduler/multi_store.py +0 -0
  266. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/scheduler/registry.py +0 -0
  267. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/scheduler/scheduler.py +0 -0
  268. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/session_turns.py +0 -0
  269. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/__init__.py +0 -0
  270. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/artifacts.py +0 -0
  271. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/base.py +0 -0
  272. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/commands.py +0 -0
  273. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/in_memory.py +0 -0
  274. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/json_files.py +0 -0
  275. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/lease.py +0 -0
  276. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/ledger_chain.py +0 -0
  277. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/ledger_slim.py +0 -0
  278. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/observable.py +0 -0
  279. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/offloading.py +0 -0
  280. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/serialize.py +0 -0
  281. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/snapshots.py +0 -0
  282. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/sqlite.py +0 -0
  283. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  284. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/triggers/__init__.py +0 -0
  285. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/triggers/manual.py +0 -0
  286. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/triggers/protocol.py +0 -0
  287. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/triggers/registry.py +0 -0
  288. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/triggers/schedule.py +0 -0
  289. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/turn_grounding.py +0 -0
  290. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/utils/__init__.py +0 -0
  291. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/utils/atomic_files.py +0 -0
  292. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/utils/file_filters.py +0 -0
  293. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/utils/workspace_paths.py +0 -0
  294. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  295. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  296. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  297. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  298. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  299. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  300. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  301. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  302. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  303. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  304. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  305. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  306. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  307. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  308. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  309. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  310. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  311. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  312. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  313. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  314. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  315. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  316. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  317. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  318. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/workflow_bundle/models.py +0 -0
  319. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  320. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  321. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  322. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/README.md +0 -0
  323. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/automation_harness.py +0 -0
  324. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/conftest.py +0 -0
  325. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_abstractcore_comms_facade.py +0 -0
  326. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_abstractcore_host_facade.py +0 -0
  327. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_abstractcore_run_facade.py +0 -0
  328. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_abstractcore_telegram_facade.py +0 -0
  329. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_active_context_policy.py +0 -0
  330. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_active_memory.py +0 -0
  331. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_agora_agent_alias_identity.py +0 -0
  332. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_agora_tools_http.py +0 -0
  333. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  334. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_answer_user_effect.py +0 -0
  335. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_artifacts.py +0 -0
  336. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_commands.py +0 -0
  337. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_controller.py +0 -0
  338. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_controller_recovery.py +0 -0
  339. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_definition.py +0 -0
  340. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_discussion_isolation.py +0 -0
  341. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_growing_context.py +0 -0
  342. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_index.py +0 -0
  343. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_next_fire.py +0 -0
  344. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_occurrence_recovery.py +0 -0
  345. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_replay_read_only.py +0 -0
  346. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_retry.py +0 -0
  347. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_session_turns.py +0 -0
  348. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_status.py +0 -0
  349. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_automation_tool_approval.py +0 -0
  350. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_browser_probe_target_walling.py +0 -0
  351. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  352. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_capability_default_reasoning.py +0 -0
  353. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_chat_summarizer_integration.py +0 -0
  354. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_code_node_restricted_python.py +0 -0
  355. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_command_store.py +0 -0
  356. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_compaction_helpers.py +0 -0
  357. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_compaction_summarizer_route.py +0 -0
  358. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_config_facade_models_engines.py +0 -0
  359. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_control_adapter_while.py +0 -0
  360. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_controller_bundle_packaged.py +0 -0
  361. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_crash_ordering_inversions.py +0 -0
  362. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_create_if_absent.py +0 -0
  363. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_data_registry_facade.py +0 -0
  364. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_default_tools_camera_gating.py +0 -0
  365. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_default_tools_comms_gating.py +0 -0
  366. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_default_tools_include_skim_files.py +0 -0
  367. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_default_tools_include_skim_folders.py +0 -0
  368. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_default_tools_include_skim_web.py +0 -0
  369. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_default_tools_search_files_executor.py +0 -0
  370. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_diary_capture.py +0 -0
  371. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_diary_write_rescue.py +0 -0
  372. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_directory_lease.py +0 -0
  373. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_disabled_toolsets_seam.py +0 -0
  374. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  375. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_discovery_voice_openai_api_key.py +0 -0
  376. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_discussion_session_anchor.py +0 -0
  377. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_document_markdown_tables.py +0 -0
  378. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_document_renderers_hr_quote.py +0 -0
  379. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_durable_toolsets.py +0 -0
  380. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_durable_write_discipline.py +0 -0
  381. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  382. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_effect_cancellation.py +0 -0
  383. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_effect_issuance_idempotency.py +0 -0
  384. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  385. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_election_consequence_teaching.py +0 -0
  386. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_emergence_experiment.py +0 -0
  387. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_emit_event_uses_wait_index.py +0 -0
  388. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_emit_event_without_workflow_registry.py +0 -0
  389. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_endpoint_profile_route_context.py +0 -0
  390. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_awake_memory_fixes.py +0 -0
  391. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_brain_effects.py +0 -0
  392. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_chat_driver.py +0 -0
  393. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_chat_tools_reflection.py +0 -0
  394. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_diary.py +0 -0
  395. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_execute_tool.py +0 -0
  396. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_fetch_url_tool.py +0 -0
  397. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_history_window.py +0 -0
  398. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_life_loop.py +0 -0
  399. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_memory_richness.py +0 -0
  400. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_phase_graph_conformance.py +0 -0
  401. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_react_visit_window.py +0 -0
  402. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_recent_memories.py +0 -0
  403. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_runtime.py +0 -0
  404. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_search_memory.py +0 -0
  405. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  406. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_substrate_resolution.py +0 -0
  407. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_visit_honesty.py +0 -0
  408. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_workspace_cap.py +0 -0
  409. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_entity_workspace_tools.py +0 -0
  410. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_event_wait_index.py +0 -0
  411. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  412. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_evidence_recorder.py +0 -0
  413. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  414. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_execute_command_output_offload.py +0 -0
  415. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_execution_capability_discovery.py +0 -0
  416. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_explicit_eject_other_clients.py +0 -0
  417. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_factory_default_retry_policy.py +0 -0
  418. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  419. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_format_repair_nudge.py +0 -0
  420. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_fresh_install_no_provider.py +0 -0
  421. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_gateway_facades_c4899.py +0 -0
  422. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_git_read_only_refiner.py +0 -0
  423. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_hf_process_residency_merge.py +0 -0
  424. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_hot_path_store_reads.py +0 -0
  425. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_indexed_idempotency_lookup.py +0 -0
  426. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_integration_abstractcore.py +0 -0
  427. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_integrations_abstractcore.py +0 -0
  428. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_json_file_run_store_children_index.py +0 -0
  429. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_json_run_cache_bound.py +0 -0
  430. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_json_store_scan_memo.py +0 -0
  431. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_jsonl_ledger_recovery.py +0 -0
  432. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_kg_learn_and_recall_contract.py +0 -0
  433. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_ledger_chain.py +0 -0
  434. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_ledger_record_slimming.py +0 -0
  435. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_ledger_subscription.py +0 -0
  436. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_live_token_deltas.py +0 -0
  437. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_media_artifact_refs.py +0 -0
  438. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  439. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  440. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  441. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_requires_prompt.py +0 -0
  442. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_response_schema_normalization.py +0 -0
  443. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_structured_output_fallback.py +0 -0
  444. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_text_phase_progress.py +0 -0
  445. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  446. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  447. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  448. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_client_grounding_tail.py +0 -0
  449. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_client_media_artifacts.py +0 -0
  450. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_client_system_context.py +0 -0
  451. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_client_tool_call_parsing.py +0 -0
  452. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_retry_classification.py +0 -0
  453. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_llm_streaming_on_token.py +0 -0
  454. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_local_helper_tool_exposure.py +0 -0
  455. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_local_residency_host_sweep.py +0 -0
  456. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  457. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_max_iterations_ceiling.py +0 -0
  458. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_mcp_remote_tool_executor.py +0 -0
  459. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_mcp_worker_logging.py +0 -0
  460. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_mcp_worker_security.py +0 -0
  461. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_mcp_worker_stdio.py +0 -0
  462. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_media_artifact_resolution.py +0 -0
  463. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_media_capability_default_routing.py +0 -0
  464. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_media_subprocess.py +0 -0
  465. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memact_composer_from_kg_result.py +0 -0
  466. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_appraise_handler.py +0 -0
  467. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_communities.py +0 -0
  468. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  469. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_kg_packets.py +0 -0
  470. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  471. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  472. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  473. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  474. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_note_effect.py +0 -0
  475. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_query_effect.py +0 -0
  476. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_query_rich_filters.py +0 -0
  477. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  478. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_seam_handlers.py +0 -0
  479. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_seam_sqlite_durability.py +0 -0
  480. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_memory_tag_effect.py +0 -0
  481. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_mlx_generation_serialization.py +0 -0
  482. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_mlx_process_residency_merge.py +0 -0
  483. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_model_eject_cancel.py +0 -0
  484. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_model_residency_clean_switch.py +0 -0
  485. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_model_residency_control_plane.py +0 -0
  486. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  487. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_multi_store_scheduler.py +0 -0
  488. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_multimodal_abstractcore_integration.py +0 -0
  489. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_native_mlx_application_wiring.py +0 -0
  490. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_native_mlx_execution_controls_live.py +0 -0
  491. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_native_tool_channel.py +0 -0
  492. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_night_voice.py +0 -0
  493. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_no_default_provider_refusal_ux.py +0 -0
  494. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_offload_answer_chain_c4978.py +0 -0
  495. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  496. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_offloading.py +0 -0
  497. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_parallel_readonly_tool_execution.py +0 -0
  498. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_pause_resume.py +0 -0
  499. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_pdf_unicode_rendering.py +0 -0
  500. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_personal_cycle.py +0 -0
  501. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_phantom_attachment_index.py +0 -0
  502. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_phase_graph_artifact_control.py +0 -0
  503. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_phase_graph_obedience.py +0 -0
  504. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_phase_vocabulary_migration.py +0 -0
  505. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  506. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_prompt_cache_export_import.py +0 -0
  507. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  508. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_prompt_cache_modules.py +0 -0
  509. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  510. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  511. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_prompt_overlay.py +0 -0
  512. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  513. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_provider_pin_routing_isolation.py +0 -0
  514. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_queryable_run_store.py +0 -0
  515. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  516. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_read_idle_threading.py +0 -0
  517. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_readoption_experiment.py +0 -0
  518. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_real_integration.py +0 -0
  519. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_realize_election.py +0 -0
  520. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_recall_levels_policy.py +0 -0
  521. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_remote_client_cancel.py +0 -0
  522. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_remote_llm_client.py +0 -0
  523. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_remote_speculation_defaults.py +0 -0
  524. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_rendering_agent_trace_report.py +0 -0
  525. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_rendering_json_stringify.py +0 -0
  526. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_report_branding.py +0 -0
  527. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_resume_concurrent_same_wait.py +0 -0
  528. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_retry_idempotency.py +0 -0
  529. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_run_history_bundle.py +0 -0
  530. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_run_index_workspace_root.py +0 -0
  531. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_run_mutation_lock.py +0 -0
  532. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_run_scoped_tool_policy.py +0 -0
  533. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_run_tool_scope_ceiling.py +0 -0
  534. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_browser_session_boundary.py +0 -0
  535. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  536. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  537. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_effect_invocation_trace.py +0 -0
  538. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  539. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_install_boundary.py +0 -0
  540. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  541. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_node_traces.py +0 -0
  542. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  543. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_runtime_tick_step_gate.py +0 -0
  544. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_scheduler.py +0 -0
  545. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_send_email_refiner.py +0 -0
  546. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  547. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_session_history.py +0 -0
  548. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_session_prompt_cache_attribution.py +0 -0
  549. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_session_prompt_cache_visibility.py +0 -0
  550. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_session_route_stamp.py +0 -0
  551. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_session_start_cost.py +0 -0
  552. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_shell_tool_exposure.py +0 -0
  553. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_snapshots.py +0 -0
  554. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_speculation_inheritance.py +0 -0
  555. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_speculation_reaches_provider_construction.py +0 -0
  556. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_sqlite_ledger_store.py +0 -0
  557. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_start_subworkflow_async_wait.py +0 -0
  558. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  559. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  560. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_steer_sidecar.py +0 -0
  561. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_storage_deletion.py +0 -0
  562. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_structured_output_schema_enum.py +0 -0
  563. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_subworkflow.py +0 -0
  564. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_terminal_effect_completion.py +0 -0
  565. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  566. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_thinking_inheritance.py +0 -0
  567. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  568. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_approval_executor.py +0 -0
  569. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_approval_resume_executes.py +0 -0
  570. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_approval_wait_key_identity.py +0 -0
  571. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_calls_idempotency_keys.py +0 -0
  572. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_catalog.py +0 -0
  573. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_descriptor_registry.py +0 -0
  574. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_executor_argument_sanitization.py +0 -0
  575. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_executor_error_output_detection.py +0 -0
  576. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_executor_filename_alias.py +0 -0
  577. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  578. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_executor_read_file_aliases.py +0 -0
  579. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_executor_timeout.py +0 -0
  580. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_inventory_facade.py +0 -0
  581. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_invoke_effect.py +0 -0
  582. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_policy_and_mounts.py +0 -0
  583. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_tool_wait_allowlist_safety.py +0 -0
  584. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_topic_election_world_model.py +0 -0
  585. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_trace_context_propagation.py +0 -0
  586. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_trigger_registry.py +0 -0
  587. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_trigger_schedule_math.py +0 -0
  588. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_turn_grounding_byte_stability.py +0 -0
  589. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_turn_grounding_carriers_a3.py +0 -0
  590. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_vars_query_effect.py +0 -0
  591. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visit_ab_fixture.py +0 -0
  592. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visit_midturn_elections.py +0 -0
  593. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visit_midturn_resume.py +0 -0
  594. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visit_workflow.py +0 -0
  595. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  596. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  597. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  598. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  599. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  600. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  601. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_entity_memory_nodes.py +0 -0
  602. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  603. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_llm_call_partial_override.py +0 -0
  604. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  605. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_memact_compose_node.py +0 -0
  606. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  607. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  608. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  609. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  610. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  611. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_add_message_builtin.py +0 -0
  612. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  613. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_agora_react_agent.py +0 -0
  614. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_call_tool_node.py +0 -0
  615. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  616. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_compiler_basic.py +0 -0
  617. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  618. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_continue_on_error.py +0 -0
  619. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  620. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  621. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  622. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_function_library.py +0 -0
  623. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_get_element_node.py +0 -0
  624. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_get_random_element_node.py +0 -0
  625. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_get_var_node.py +0 -0
  626. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_has_tools_builtin.py +0 -0
  627. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  628. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  629. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_make_object_node.py +0 -0
  630. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_media_nodes.py +0 -0
  631. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  632. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_memory_source_pins.py +0 -0
  633. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_pin_expressions.py +0 -0
  634. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_prompt_only.py +0 -0
  635. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_random_nodes.py +0 -0
  636. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_schema_enum_switch.py +0 -0
  637. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_string_contains_replace.py +0 -0
  638. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_visualflow_tool_parameters_node.py +0 -0
  639. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_voice_openai_api_key_path.py +0 -0
  640. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_w4_feelings_lens.py +0 -0
  641. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_wait_event_deadline.py +0 -0
  642. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_wait_event_prompt_metadata.py +0 -0
  643. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_wait_until_streak.py +0 -0
  644. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_wait_until_utc_normalization.py +0 -0
  645. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workflow_bundle_registry.py +0 -0
  646. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workspace_builtin_deny.py +0 -0
  647. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  648. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  649. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  650. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  651. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workspace_prompt_context.py +0 -0
  652. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_workspace_read_only.py +0 -0
  653. {abstractruntime-0.7.0 → abstractruntime-0.7.2}/tests/test_write_chart.py +0 -0
@@ -11,7 +11,7 @@ The canonical dependency list lives in `pyproject.toml`.
11
11
  - **AbstractMemory** (`>=0.3.0`) — TripleStore models and store contract used by Runtime's `MEMORY_KG_*` effects. Durable/vector backend dependencies such as LanceDB remain selected by hosts.
12
12
 
13
13
  ## Runtime integrations
14
- - **abstractcore** (`abstractcore[remote,tools,vision,voice,audio,music]>=2.15.1`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install; the `apple` and `gpu` extras select `abstractcore[all-apple]` / `abstractcore[all-gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
14
+ - **abstractcore** (`abstractcore>=2.19.0`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
15
15
  - The AbstractCore integration uses **httpx** for remote mode (`src/abstractruntime/integrations/abstractcore/llm_client.py`) and **pydantic** for structured validation (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). These are provided by AbstractCore’s dependency set.
16
16
  - The `tools` extra of AbstractCore backs the base Runtime toolset and the `abstractruntime-mcp-worker` entry point.
17
17
  - **RestrictedPython** (`>=7.0`, core install) — sandbox for VisualFlow “Code” nodes and pin expressions (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
@@ -7,6 +7,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.2] - 2026-09-29
11
+
12
+ ### Changed
13
+
14
+ - **Dependencies follow AbstractCore's three install settings.** The base install requires
15
+ `abstractcore>=2.19.0` (its light install: remote providers, built-in tools and the MCP worker's
16
+ web tools, media inputs, and the voice/vision/music plugins), `abstractruntime[apple]` requires
17
+ `abstractcore[apple]>=2.19.0` and `abstractruntime[gpu]` requires `abstractcore[gpu]>=2.19.0`.
18
+ What gets installed is unchanged; the deprecated AbstractCore extras (`remote`, `tools`, `voice`,
19
+ `all-apple`, `all-gpu`, ...) are no longer named.
20
+ - **`openai` may be 2.x (`openai<3.0.0,>=1.109.1`).** The `<2.0.0` cap held vLLM at an old release
21
+ in the `gpu` setting (newer vLLM needs `openai>=2`), and that release does not start with
22
+ Transformers 5.
23
+ - **The MCP worker's startup tip names the right install.** When `abstractruntime-mcp-worker` fails
24
+ to start, its tip says that the web tools come with AbstractCore's light install and suggests
25
+ `pip install -U abstractcore` to repair it, instead of pointing to the deprecated
26
+ `abstractcore[tools]` extra.
27
+
28
+ ### Fixed
29
+
30
+ - **The local STT model catalog lists each engine's own models.** When AbstractVoice's catalog
31
+ carried no per-provider STT map (for example with no OpenAI key),
32
+ `GET /api/gateway/audio/transcriptions/models` listed OpenAI's `gpt-4o-transcribe` as a
33
+ faster-whisper model and reported it as `active_model`. `local_list_stt_models()` now asks each
34
+ STT provider for its own list (without loading an engine) and takes `active_model` from the active
35
+ provider's list.
36
+
37
+ ## [0.7.1] - 2026-09-28
38
+
39
+ ### Fixed
40
+
41
+ - **Images in replayed history stay images.** When the history window drops older turns, it writes a
42
+ `[#TRUNCATION: ...]` notice at the start of the oldest kept message. If that message held a list of content parts
43
+ (text plus an image, `[{"type": "text", ...}, {"type": "image_url", ...}]`), the notice turned the whole list into
44
+ one string, so the model received the image's base64 as text. The notice is now added as one text part and every
45
+ other part is left exactly as it was. A message that starts with its `<runtime_metadata>` envelope keeps it first.
46
+ This affects `announce_dropped` and `window_transcript`, and so the gateway's `/runs/start` client-context window and
47
+ any replay that keeps images. Content of any other type is left untouched and a warning is logged.
48
+ - **An image no longer counts as tens of thousands of tokens in the window.** `estimate_message_tokens` turned a
49
+ content-part list into a string, so a 150 KB inline image counted about 50,000 tokens and pushed every older turn out
50
+ of the history window. Text parts now count their text, and each media part (image, audio, file) counts a flat 512
51
+ tokens (`MEDIA_PART_TOKEN_ESTIMATE`, AbstractCore's per-image fallback). The input-budget trim
52
+ (`trim_messages_to_max_input_tokens`) uses the same estimate.
53
+
10
54
  ## [0.7.0] - 2026-09-28
11
55
 
12
56
  Replayed session history is one window: the most recent 50,000 tokens of whole turns, recorded in the run.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.7.0
3
+ Version: 0.7.2
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -20,12 +20,12 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: abstractcore[audio,music,remote,tools,vision,voice]>=2.18.0
23
+ Requires-Dist: abstractcore>=2.19.0
24
24
  Requires-Dist: abstractmemory>=0.3.0
25
25
  Requires-Dist: abstractsemantics>=0.0.5
26
26
  Requires-Dist: anyio<5.0.0,>=4.12.1
27
27
  Requires-Dist: httpx<1.0.0,>=0.28.1
28
- Requires-Dist: openai<2.0.0,>=1.109.1
28
+ Requires-Dist: openai<3.0.0,>=1.109.1
29
29
  Requires-Dist: pandas<3.0.0,>=1.0.0
30
30
  Requires-Dist: pillow<13.0.0,>=10.0.0
31
31
  Requires-Dist: pypdf<7.0.0,>=6.0.0
@@ -35,14 +35,14 @@ Requires-Dist: reportlab<5.0.0,>=4.0.0
35
35
  Requires-Dist: restrictedpython>=7.0
36
36
  Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<0.19.0,>=0.18.32
37
37
  Provides-Extra: apple
38
- Requires-Dist: abstractcore[all-apple]>=2.18.0; extra == 'apple'
38
+ Requires-Dist: abstractcore[apple]>=2.19.0; extra == 'apple'
39
39
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
40
40
  Provides-Extra: docs
41
41
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
42
42
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
43
43
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
44
44
  Provides-Extra: gpu
45
- Requires-Dist: abstractcore[all-gpu]>=2.18.0; extra == 'gpu'
45
+ Requires-Dist: abstractcore[gpu]>=2.19.0; extra == 'gpu'
46
46
  Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
47
47
  Provides-Extra: test
48
48
  Requires-Dist: pytest>=7.0.0; extra == 'test'
@@ -54,7 +54,7 @@ Description-Content-Type: text/markdown
54
54
 
55
55
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
56
56
 
57
- **Version:** 0.7.0 • **Python:** 3.10+
57
+ **Version:** 0.7.2 • **Python:** 3.10+
58
58
 
59
59
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
60
60
 
@@ -82,8 +82,8 @@ Remote-light runtime:
82
82
  pip install abstractruntime
83
83
  ```
84
84
 
85
- The base install includes AbstractCore 2.18.0 or newer with remote provider,
86
- tool, vision, voice, audio, and music integration, plus the
85
+ The base install includes AbstractCore 2.19.0 or newer (its light install:
86
+ remote providers, tools, vision, voice, audio, and music integration), plus the
87
87
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
88
88
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
89
89
  sentence-transformer embeddings are not selected unless you choose a hardware
@@ -146,7 +146,7 @@ state = rt.resume(
146
146
  assert state.status.value == "completed"
147
147
  ```
148
148
 
149
- ## What’s included (v0.7.0)
149
+ ## What’s included (v0.7.2)
150
150
 
151
151
  Kernel (import-light):
152
152
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -4,7 +4,7 @@
4
4
 
5
5
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
6
 
7
- **Version:** 0.7.0 • **Python:** 3.10+
7
+ **Version:** 0.7.2 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
@@ -32,8 +32,8 @@ Remote-light runtime:
32
32
  pip install abstractruntime
33
33
  ```
34
34
 
35
- The base install includes AbstractCore 2.18.0 or newer with remote provider,
36
- tool, vision, voice, audio, and music integration, plus the
35
+ The base install includes AbstractCore 2.19.0 or newer (its light install:
36
+ remote providers, tools, vision, voice, audio, and music integration), plus the
37
37
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
38
38
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
39
39
  sentence-transformer embeddings are not selected unless you choose a hardware
@@ -96,7 +96,7 @@ state = rt.resume(
96
96
  assert state.status.value == "completed"
97
97
  ```
98
98
 
99
- ## What’s included (v0.7.0)
99
+ ## What’s included (v0.7.2)
100
100
 
101
101
  Kernel (import-light):
102
102
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -252,10 +252,10 @@ Implementation: `src/abstractruntime/session_turns.py`, `src/abstractruntime/ses
252
252
 
253
253
  - `select_session_turns(run_store, session_id, *, include_occurrences=True, until_ms=None, automation_id=None, through_occurrence=None, include_drafts=False, limit=50)` (package root): a session's turns, oldest first. Turns are parent-less runs except automation controllers, plus automation occurrences (a retried occurrence counts once, as its newest attempt); child runs, runtime-internal runs, legacy scheduled wrappers and draft-test runs are left out
254
254
  - `session_chat_messages(run_store=, ledger_store=, artifact_store=, session_id=, max_tokens=HISTORY_REPLAY_MAX_TOKENS, until_ms=None, exclude_run_ids=None, automation_id=None, through_occurrence=None, strict=False)` (package root): the session's completed turns as user/assistant message pairs; in a discussion session the discussion's seed comes first. Returns a `ReplayedHistory` (a list of messages) whose `.report` says what was replayed and dropped. `strict=True` raises `SessionHistoryError` (`reason_code = "history_unavailable"`) instead of returning a partial history. `max_messages`, `max_total_chars` and `max_chars_per_message` (keyword-only, default `None`) are the caps retired in 0.7.0: they are accepted so hosts built against 0.6 (AbstractGateway 0.6.0) still get their history, and ignored. Passing any of them logs one warning and names them in `report["ignored_inputs"]`
255
- - The history window: `HISTORY_REPLAY_MAX_TOKENS = 50_000` (package root). Replay keeps the most recent turns that fit 50,000 estimated tokens, newest first, as whole messages. There is no message-count cap and no character cap, and no message is ever cut. The fold stops at the first older turn that does not fit, so the window has no gaps. A total of exactly 50,000 tokens fits. One exception: when the newest turn alone is larger than the window, it is kept whole (`oversize_turn_kept: true`), because cutting it would lose content and dropping it would replay nothing. The model can use the rest of its context window; if a turn is too large for the model, the provider reports the error. Tokens are counted with `abstractruntime.memory.token_budget.estimate_message_tokens`. `max_tokens` must be a positive int
255
+ - The history window: `HISTORY_REPLAY_MAX_TOKENS = 50_000` (package root). Replay keeps the most recent turns that fit 50,000 estimated tokens, newest first, as whole messages. There is no message-count cap and no character cap, and no message is ever cut. The fold stops at the first older turn that does not fit, so the window has no gaps. A total of exactly 50,000 tokens fits. One exception: when the newest turn alone is larger than the window, it is kept whole (`oversize_turn_kept: true`), because cutting it would lose content and dropping it would replay nothing. The model can use the rest of its context window; if a turn is too large for the model, the provider reports the error. Tokens are counted with `abstractruntime.memory.token_budget.estimate_message_tokens`: for a content-part list it counts the text parts' text plus `MEDIA_PART_TOKEN_ESTIMATE` (512) for each media part (`MEDIA_PART_TYPES`: image, audio, file), never the part's base64; any other part (a tool result, a thinking block) counts by its text (0.7.1). `max_tokens` must be a positive int
256
256
  - `ReplayedHistory.report`: `{policy: "most_recent_whole_turns", max_tokens, token_estimator, replayed_messages, replayed_tokens, dropped_messages, dropped_tokens, dropped_counts_complete, oversize_turn_kept}`. Replay stops reading once the window is full, so in a long session `dropped_counts_complete` is `false` and the dropped counts cover only the turns it read. When turns were dropped, the oldest replayed message starts with a `[#TRUNCATION: N earlier message(s) ... were dropped from replay by the history window ...]` line (ADR-0026). Hosts record the report in the run as `vars._runtime.session_history`
257
257
  - `fold_history_window(pairs, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS)` (package root): the window itself, applied to chronological turns (lists of whole messages); returns `(kept, report)`
258
- - `announce_dropped(messages, report, *, stamp_metadata=True)` (package root): writes the window's `[#TRUNCATION: ...]` notice at the start of the oldest kept message, in place, when `report` says turns were dropped. Use it after your own `fold_history_window` call (for example on client-sent history) so the notice matches session replay. `stamp_metadata=True` also adds `metadata.replay_truncated` and `metadata.history_window` to that message; pass `False` for plain role/content messages. `_announce_dropped` is kept as an alias of the pre-0.7.0 private name
258
+ - `announce_dropped(messages, report, *, stamp_metadata=True)` (package root): writes the window's `[#TRUNCATION: ...]` notice at the start of the oldest kept message, in place, when `report` says turns were dropped. Use it after your own `fold_history_window` call (for example on client-sent history) so the notice matches session replay. `stamp_metadata=True` also adds `metadata.replay_truncated` and `metadata.history_window` to that message; pass `False` for plain role/content messages. When the message's content is a content-part list (`[{"type": "text", ...}, {"type": "image_url", ...}]`), the notice is added as one `{"type": "text"}` part and every other part is left as it is, so images stay images (0.7.1); a stamped head keeps its `<runtime_metadata>` envelope first. Content of any other type is left untouched and a warning is logged. `_announce_dropped` is kept as an alias of the pre-0.7.0 private name
259
259
  - `window_transcript(messages, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS, current_turn_start=None)` (package root): the same window over a transcript you already hold (a turn is a user message and the messages after it). `current_turn_start` is the index of the message that opened the turn in progress: from there on everything is one turn, the newest, always kept whole (`oversize_turn_kept` when it alone exceeds the window), whatever user-role messages a loop adds inside it; an index out of range raises `ValueError`. Returns a `ReplayedHistory` of copies with the notice written by `announce_dropped(..., stamp_metadata=False)`. The entity chat driver and the entity visit workflow use it for their prompts. The visit records the report in `vars._runtime.session_history`; the chat driver puts it on `TurnReport.history_window`. On the react visit arm, BRIDGE sets `_runtime.history_window_tokens` (50,000) and `_runtime.history_window_turn_start` (the visitor's message) and the AbstractAgent react loop (0.3.17 or newer) sends `window_transcript(context.messages)` on each call and records the report; the stored transcript stays whole. The report carries `window_applied: true`; with an older AbstractAgent that records no window the turn still completes, a warning is logged and the report is `{"window_applied": false, "reason": "agent_too_old", ...}` (the whole transcript was sent). When the oldest kept message carries a `<runtime_metadata>` envelope, the notice is written after it
260
260
  - `session_attribution(run_store, session_id)` (`abstractruntime.core.run_attribution`): `None` or `{"kind": "chat" | "automation" | "occurrence" | "discussion", ...}`; a discussion adds its validated root, automation, occurrence and workspace. Raises `SessionAttributionError` when the lookup cannot be completed
261
261
  - `is_draft_lifecycle(run_lifecycle)` (package root): whether a run's lifecycle value marks a draft test run
@@ -277,7 +277,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
277
277
 
278
278
  ### AbstractCore (LLM + tools)
279
279
 
280
- Requires: `pip install abstractruntime` (AbstractCore 2.18.0 or newer is part of the base install).
280
+ Requires: `pip install abstractruntime` (AbstractCore 2.19.0 or newer is part of the base install).
281
281
 
282
282
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
283
283
 
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
- > Updated: 2026-09-28
4
- > Version: 0.7.0
3
+ > Updated: 2026-09-29
4
+ > Version: 0.7.2
5
5
  > Scope: this describes **what is implemented in this repository**.
6
6
 
7
7
  AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
@@ -20,7 +20,7 @@ Fix:
20
20
  - Install or upgrade the base Runtime package. LLM/tools integration, common
21
21
  remote-light multimodal dependencies, and the MCP worker entry point are part
22
22
  of the base install.
23
- - The current AbstractCore integration expects `abstractcore>=2.18.0`.
23
+ - The current AbstractCore integration expects `abstractcore>=2.19.0`.
24
24
 
25
25
  Verify:
26
26
 
@@ -52,7 +52,7 @@ See llms.txt for the linked index.
52
52
 
53
53
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
54
54
 
55
- **Version:** 0.7.0 • **Python:** 3.10+
55
+ **Version:** 0.7.2 • **Python:** 3.10+
56
56
 
57
57
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
58
58
 
@@ -80,8 +80,8 @@ Remote-light runtime:
80
80
  pip install abstractruntime
81
81
  ```
82
82
 
83
- The base install includes AbstractCore 2.18.0 or newer with remote provider,
84
- tool, vision, voice, audio, and music integration, plus the
83
+ The base install includes AbstractCore 2.19.0 or newer (its light install:
84
+ remote providers, tools, vision, voice, audio, and music integration), plus the
85
85
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
86
86
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
87
87
  sentence-transformer embeddings are not selected unless you choose a hardware
@@ -144,7 +144,7 @@ state = rt.resume(
144
144
  assert state.status.value == "completed"
145
145
  ```
146
146
 
147
- ## What’s included (v0.7.0)
147
+ ## What’s included (v0.7.2)
148
148
 
149
149
  Kernel (import-light):
150
150
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -429,8 +429,8 @@ rt = create_local_runtime(provider="ollama", model="qwen3:4b")
429
429
 
430
430
  # AbstractRuntime — Architecture
431
431
 
432
- > Updated: 2026-09-28
433
- > Version: 0.7.0
432
+ > Updated: 2026-09-29
433
+ > Version: 0.7.2
434
434
  > Scope: this describes **what is implemented in this repository**.
435
435
 
436
436
  AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
@@ -1107,10 +1107,10 @@ Implementation: `src/abstractruntime/session_turns.py`, `src/abstractruntime/ses
1107
1107
 
1108
1108
  - `select_session_turns(run_store, session_id, *, include_occurrences=True, until_ms=None, automation_id=None, through_occurrence=None, include_drafts=False, limit=50)` (package root): a session's turns, oldest first. Turns are parent-less runs except automation controllers, plus automation occurrences (a retried occurrence counts once, as its newest attempt); child runs, runtime-internal runs, legacy scheduled wrappers and draft-test runs are left out
1109
1109
  - `session_chat_messages(run_store=, ledger_store=, artifact_store=, session_id=, max_tokens=HISTORY_REPLAY_MAX_TOKENS, until_ms=None, exclude_run_ids=None, automation_id=None, through_occurrence=None, strict=False)` (package root): the session's completed turns as user/assistant message pairs; in a discussion session the discussion's seed comes first. Returns a `ReplayedHistory` (a list of messages) whose `.report` says what was replayed and dropped. `strict=True` raises `SessionHistoryError` (`reason_code = "history_unavailable"`) instead of returning a partial history. `max_messages`, `max_total_chars` and `max_chars_per_message` (keyword-only, default `None`) are the caps retired in 0.7.0: they are accepted so hosts built against 0.6 (AbstractGateway 0.6.0) still get their history, and ignored. Passing any of them logs one warning and names them in `report["ignored_inputs"]`
1110
- - The history window: `HISTORY_REPLAY_MAX_TOKENS = 50_000` (package root). Replay keeps the most recent turns that fit 50,000 estimated tokens, newest first, as whole messages. There is no message-count cap and no character cap, and no message is ever cut. The fold stops at the first older turn that does not fit, so the window has no gaps. A total of exactly 50,000 tokens fits. One exception: when the newest turn alone is larger than the window, it is kept whole (`oversize_turn_kept: true`), because cutting it would lose content and dropping it would replay nothing. The model can use the rest of its context window; if a turn is too large for the model, the provider reports the error. Tokens are counted with `abstractruntime.memory.token_budget.estimate_message_tokens`. `max_tokens` must be a positive int
1110
+ - The history window: `HISTORY_REPLAY_MAX_TOKENS = 50_000` (package root). Replay keeps the most recent turns that fit 50,000 estimated tokens, newest first, as whole messages. There is no message-count cap and no character cap, and no message is ever cut. The fold stops at the first older turn that does not fit, so the window has no gaps. A total of exactly 50,000 tokens fits. One exception: when the newest turn alone is larger than the window, it is kept whole (`oversize_turn_kept: true`), because cutting it would lose content and dropping it would replay nothing. The model can use the rest of its context window; if a turn is too large for the model, the provider reports the error. Tokens are counted with `abstractruntime.memory.token_budget.estimate_message_tokens`: for a content-part list it counts the text parts' text plus `MEDIA_PART_TOKEN_ESTIMATE` (512) for each media part (`MEDIA_PART_TYPES`: image, audio, file), never the part's base64; any other part (a tool result, a thinking block) counts by its text (0.7.1). `max_tokens` must be a positive int
1111
1111
  - `ReplayedHistory.report`: `{policy: "most_recent_whole_turns", max_tokens, token_estimator, replayed_messages, replayed_tokens, dropped_messages, dropped_tokens, dropped_counts_complete, oversize_turn_kept}`. Replay stops reading once the window is full, so in a long session `dropped_counts_complete` is `false` and the dropped counts cover only the turns it read. When turns were dropped, the oldest replayed message starts with a `[#TRUNCATION: N earlier message(s) ... were dropped from replay by the history window ...]` line (ADR-0026). Hosts record the report in the run as `vars._runtime.session_history`
1112
1112
  - `fold_history_window(pairs, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS)` (package root): the window itself, applied to chronological turns (lists of whole messages); returns `(kept, report)`
1113
- - `announce_dropped(messages, report, *, stamp_metadata=True)` (package root): writes the window's `[#TRUNCATION: ...]` notice at the start of the oldest kept message, in place, when `report` says turns were dropped. Use it after your own `fold_history_window` call (for example on client-sent history) so the notice matches session replay. `stamp_metadata=True` also adds `metadata.replay_truncated` and `metadata.history_window` to that message; pass `False` for plain role/content messages. `_announce_dropped` is kept as an alias of the pre-0.7.0 private name
1113
+ - `announce_dropped(messages, report, *, stamp_metadata=True)` (package root): writes the window's `[#TRUNCATION: ...]` notice at the start of the oldest kept message, in place, when `report` says turns were dropped. Use it after your own `fold_history_window` call (for example on client-sent history) so the notice matches session replay. `stamp_metadata=True` also adds `metadata.replay_truncated` and `metadata.history_window` to that message; pass `False` for plain role/content messages. When the message's content is a content-part list (`[{"type": "text", ...}, {"type": "image_url", ...}]`), the notice is added as one `{"type": "text"}` part and every other part is left as it is, so images stay images (0.7.1); a stamped head keeps its `<runtime_metadata>` envelope first. Content of any other type is left untouched and a warning is logged. `_announce_dropped` is kept as an alias of the pre-0.7.0 private name
1114
1114
  - `window_transcript(messages, *, max_tokens=HISTORY_REPLAY_MAX_TOKENS, current_turn_start=None)` (package root): the same window over a transcript you already hold (a turn is a user message and the messages after it). `current_turn_start` is the index of the message that opened the turn in progress: from there on everything is one turn, the newest, always kept whole (`oversize_turn_kept` when it alone exceeds the window), whatever user-role messages a loop adds inside it; an index out of range raises `ValueError`. Returns a `ReplayedHistory` of copies with the notice written by `announce_dropped(..., stamp_metadata=False)`. The entity chat driver and the entity visit workflow use it for their prompts. The visit records the report in `vars._runtime.session_history`; the chat driver puts it on `TurnReport.history_window`. On the react visit arm, BRIDGE sets `_runtime.history_window_tokens` (50,000) and `_runtime.history_window_turn_start` (the visitor's message) and the AbstractAgent react loop (0.3.17 or newer) sends `window_transcript(context.messages)` on each call and records the report; the stored transcript stays whole. The report carries `window_applied: true`; with an older AbstractAgent that records no window the turn still completes, a warning is logged and the report is `{"window_applied": false, "reason": "agent_too_old", ...}` (the whole transcript was sent). When the oldest kept message carries a `<runtime_metadata>` envelope, the notice is written after it
1115
1115
  - `session_attribution(run_store, session_id)` (`abstractruntime.core.run_attribution`): `None` or `{"kind": "chat" | "automation" | "occurrence" | "discussion", ...}`; a discussion adds its validated root, automation, occurrence and workspace. Raises `SessionAttributionError` when the lookup cannot be completed
1116
1116
  - `is_draft_lifecycle(run_lifecycle)` (package root): whether a run's lifecycle value marks a draft test run
@@ -1132,7 +1132,7 @@ from Core route resolution and persisted from `LLM_CALL` results.
1132
1132
 
1133
1133
  ### AbstractCore (LLM + tools)
1134
1134
 
1135
- Requires: `pip install abstractruntime` (AbstractCore 2.18.0 or newer is part of the base install).
1135
+ Requires: `pip install abstractruntime` (AbstractCore 2.19.0 or newer is part of the base install).
1136
1136
 
1137
1137
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
1138
1138
 
@@ -1633,7 +1633,7 @@ Fix:
1633
1633
  - Install or upgrade the base Runtime package. LLM/tools integration, common
1634
1634
  remote-light multimodal dependencies, and the MCP worker entry point are part
1635
1635
  of the base install.
1636
- - The current AbstractCore integration expects `abstractcore>=2.18.0`.
1636
+ - The current AbstractCore integration expects `abstractcore>=2.19.0`.
1637
1637
 
1638
1638
  Verify:
1639
1639
 
@@ -5266,7 +5266,7 @@ The canonical dependency list lives in `pyproject.toml`.
5266
5266
  - **AbstractMemory** (`>=0.3.0`) — TripleStore models and store contract used by Runtime's `MEMORY_KG_*` effects. Durable/vector backend dependencies such as LanceDB remain selected by hosts.
5267
5267
 
5268
5268
  ## Runtime integrations
5269
- - **abstractcore** (`abstractcore[remote,tools,vision,voice,audio,music]>=2.15.1`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install; the `apple` and `gpu` extras select `abstractcore[all-apple]` / `abstractcore[all-gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
5269
+ - **abstractcore** (`abstractcore>=2.19.0`) — LLM, tools, media, and capability integration used by the base `abstractruntime` install (AbstractCore's light install); the `apple` and `gpu` extras select `abstractcore[apple]` / `abstractcore[gpu]` at the same floor (declared in `pyproject.toml`, implementation under `src/abstractruntime/integrations/abstractcore/*`, docs: `docs/integrations/abstractcore.md`).
5270
5270
  - The AbstractCore integration uses **httpx** for remote mode (`src/abstractruntime/integrations/abstractcore/llm_client.py`) and **pydantic** for structured validation (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). These are provided by AbstractCore’s dependency set.
5271
5271
  - The `tools` extra of AbstractCore backs the base Runtime toolset and the `abstractruntime-mcp-worker` entry point.
5272
5272
  - **RestrictedPython** (`>=7.0`, core install) — sandbox for VisualFlow “Code” nodes and pin expressions (`src/abstractruntime/visualflow_compiler/visual/code_executor.py`).
@@ -3,10 +3,10 @@
3
3
  > Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
4
 
5
5
  - Python: 3.10+ (see `pyproject.toml`)
6
- - Version: 0.7.0
6
+ - Version: 0.7.2
7
7
  - Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
8
8
  - Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
9
- - Current AbstractCore baseline: base `abstractruntime` installs `abstractcore[remote,tools,vision,voice,audio,music]>=2.18.0`
9
+ - Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.19.0 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
10
10
  - Install profiles: base `abstractruntime` is remote-light with MCP, generated media routing, and Runtime-owned permissive PDF read/write nodes; `abstractruntime[apple]` and `abstractruntime[gpu]` add local inferencer stacks.
11
11
  - Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned config should be translated into explicit Runtime inputs or Runtime-owned env names. Hosts can attach `resolve_provider_endpoint_profile(provider_id)` to the LLM client; Runtime treats it as an optional resolver hook, injects transient provider/base URL/key params for the call, and redacts secret-like params from persisted observability.
12
12
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.7.0"
7
+ version = "0.7.2"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -48,10 +48,11 @@ dependencies = [
48
48
  # package extras owned by AbstractMemory and selected by hosts such as Gateway.
49
49
  "AbstractMemory>=0.3.0",
50
50
  # Runtime's base install is the remote-light workflow host: LLM/tool effects,
51
- # MCP worker support, and multimodal routing are available without selecting
52
- # local inference engines.
53
- "abstractcore[remote,tools,vision,voice,audio,music]>=2.18.0",
54
- "openai<2.0.0,>=1.109.1",
51
+ # MCP worker support, and multimodal routing come with AbstractCore's light
52
+ # install (remote providers, built-in tools, media inputs, voice/vision/music
53
+ # plugins) without selecting local inference engines.
54
+ "abstractcore>=2.19.0",
55
+ "openai<3.0.0,>=1.109.1",
55
56
  "httpx<1.0.0,>=0.28.1",
56
57
  "anyio<5.0.0,>=4.12.1",
57
58
  "Pillow<13.0.0,>=10.0.0",
@@ -67,12 +68,12 @@ dependencies = [
67
68
 
68
69
  [project.optional-dependencies]
69
70
  apple = [
70
- "abstractcore[all-apple]>=2.18.0",
71
+ "abstractcore[apple]>=2.19.0",
71
72
  "setuptools<82.0.0,>=80.10.2",
72
73
  ]
73
74
 
74
75
  gpu = [
75
- "abstractcore[all-gpu]>=2.18.0",
76
+ "abstractcore[gpu]>=2.19.0",
76
77
  # vLLM 0.9-0.19 caps setuptools below 80; 77.0.3 is still a modern floor.
77
78
  "setuptools<82.0.0,>=77.0.3",
78
79
  ]
@@ -0,0 +1,24 @@
1
+ ### Changed
2
+
3
+ - **Dependencies follow AbstractCore's three install settings.** The base install requires
4
+ `abstractcore>=2.19.0` (its light install: remote providers, built-in tools and the MCP worker's
5
+ web tools, media inputs, and the voice/vision/music plugins), `abstractruntime[apple]` requires
6
+ `abstractcore[apple]>=2.19.0` and `abstractruntime[gpu]` requires `abstractcore[gpu]>=2.19.0`.
7
+ What gets installed is unchanged; the deprecated AbstractCore extras (`remote`, `tools`, `voice`,
8
+ `all-apple`, `all-gpu`, ...) are no longer named.
9
+ - **`openai` may be 2.x (`openai<3.0.0,>=1.109.1`).** The `<2.0.0` cap held vLLM at an old release
10
+ in the `gpu` setting (newer vLLM needs `openai>=2`), and that release does not start with
11
+ Transformers 5.
12
+ - **The MCP worker's startup tip names the right install.** When `abstractruntime-mcp-worker` fails
13
+ to start, its tip says that the web tools come with AbstractCore's light install and suggests
14
+ `pip install -U abstractcore` to repair it, instead of pointing to the deprecated
15
+ `abstractcore[tools]` extra.
16
+
17
+ ### Fixed
18
+
19
+ - **The local STT model catalog lists each engine's own models.** When AbstractVoice's catalog
20
+ carried no per-provider STT map (for example with no OpenAI key),
21
+ `GET /api/gateway/audio/transcriptions/models` listed OpenAI's `gpt-4o-transcribe` as a
22
+ faster-whisper model and reported it as `active_model`. `local_list_stt_models()` now asks each
23
+ STT provider for its own list (without loading an engine) and takes `active_model` from the active
24
+ provider's list.
@@ -1295,16 +1295,35 @@ def local_list_stt_models(
1295
1295
  )
1296
1296
  active_provider = str(catalog.get("active_stt_provider") or "").strip()
1297
1297
  if cleaned and not models_by_provider and (active_provider or providers):
1298
- models_by_provider[active_provider or providers[0]] = cleaned
1298
+ # The catalog carried no per-provider STT map (AbstractVoice's light
1299
+ # catalog, e.g. when the default OpenAI engine has no key). The flat
1300
+ # list spans every engine, so attributing it to the active provider
1301
+ # advertised OpenAI's gpt-4o-transcribe as a faster-whisper model and
1302
+ # as the active model (framework backlog 0989). Ask each provider for
1303
+ # its own list instead; that call is engine-free.
1304
+ for provider_id in _dedupe_strings(([active_provider] if active_provider else []) + providers):
1305
+ try:
1306
+ provider_models = voice.list_stt_models(provider=provider_id)
1307
+ except Exception:
1308
+ continue
1309
+ provider_cleaned = _dedupe_strings([str(item) for item in list(provider_models or [])])
1310
+ if provider_cleaned:
1311
+ models_by_provider[provider_id] = provider_cleaned
1312
+ active_provider_value = active_provider or (providers[0] if providers else None)
1313
+ if active_provider_value and models_by_provider:
1314
+ active_provider_models = models_by_provider.get(active_provider_value) or []
1315
+ active_model = active_provider_models[0] if active_provider_models else None
1316
+ else:
1317
+ active_model = cleaned[0] if cleaned else None
1299
1318
  payload = _with_status(
1300
1319
  {
1301
1320
  "models": cleaned,
1302
- "active_model": cleaned[0] if cleaned else None,
1321
+ "active_model": active_model,
1303
1322
  "providers": providers,
1304
1323
  "available_providers": list(catalog.get("available_stt_providers") or providers)
1305
1324
  if isinstance(catalog.get("available_stt_providers"), list)
1306
1325
  else providers,
1307
- "active_provider": active_provider or (providers[0] if providers else None),
1326
+ "active_provider": active_provider_value,
1308
1327
  "models_by_provider": models_by_provider,
1309
1328
  "stt_models_by_provider": models_by_provider,
1310
1329
  "provider_models": _provider_models_from_mapping(models_by_provider),
@@ -536,7 +536,8 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
536
536
  "Failed to start MCP worker.\n\n"
537
537
  f"Error: {e}\n\n"
538
538
  "Tips:\n"
539
- "- Ensure AbstractCore is installed (and, for web tools, `abstractcore[tools]`).\n"
539
+ "- Ensure AbstractCore is installed; the web tools are part of its light install "
540
+ "(repair with `pip install -U abstractcore`).\n"
540
541
  "- Choose toolsets explicitly (e.g. `--toolsets files` or `--toolsets files,system`).\n"
541
542
  )
542
543
  return 1
@@ -10,6 +10,7 @@ budget (ADR-0008) even when the underlying model supports much larger contexts.
10
10
 
11
11
  from __future__ import annotations
12
12
 
13
+ import json
13
14
  import logging
14
15
  from typing import Any, Dict, Iterable, List, Optional
15
16
 
@@ -35,15 +36,50 @@ def estimate_tokens(text: str, *, model: Optional[str] = None) -> int:
35
36
  return max(1, int(len(s) / 4))
36
37
 
37
38
 
39
+ # Flat estimate for one non-text content part (an image, a file) — AbstractCore's
40
+ # own fallback per image (`VLMTokenCalculator` base_tokens). The real cost depends
41
+ # on the model and the image size; what matters here is that it is a bounded
42
+ # per-part cost, not the length of the part's base64 payload.
43
+ MEDIA_PART_TOKEN_ESTIMATE = 512
44
+ # Content-part types that carry media (an image, audio or a file), counted at the flat estimate.
45
+ # Every other part (tool_result, thinking, ...) is counted by its text, never flat.
46
+ MEDIA_PART_TYPES = frozenset({"image_url", "image", "input_image", "input_audio", "audio", "file"})
47
+
48
+
38
49
  def estimate_message_tokens(message: Dict[str, Any], *, model: Optional[str] = None) -> int:
39
- """Estimate tokens for a chat message dict (role+content)."""
50
+ """Estimate tokens for a chat message dict (role+content).
51
+
52
+ A content-part list (OpenAI-style `[{"type": "text", ...}, {"type":
53
+ "image_url", ...}]`) counts the text of its text parts, plus
54
+ `MEDIA_PART_TOKEN_ESTIMATE` for each media part (`MEDIA_PART_TYPES`); any
55
+ other part is counted by its serialized text. Before 0.7.1 the list
56
+ was stringified, so an inline image counted as its base64 text (~50,000
57
+ tokens for a 150 KB image) and pushed every older turn out of the window.
58
+ """
40
59
  if not isinstance(message, dict):
41
60
  return 0
42
61
  role = str(message.get("role") or "").strip()
43
- content = "" if message.get("content") is None else str(message.get("content"))
62
+ raw = message.get("content")
63
+ media_parts = 0
64
+ if isinstance(raw, list):
65
+ texts: List[str] = []
66
+ for part in raw:
67
+ if isinstance(part, dict) and isinstance(part.get("text"), str) and "text" in str(part.get("type") or "text"):
68
+ texts.append(part["text"])
69
+ elif isinstance(part, str):
70
+ texts.append(part)
71
+ elif isinstance(part, dict) and str(part.get("type") or "") in MEDIA_PART_TYPES:
72
+ media_parts += 1
73
+ elif isinstance(part, dict) and part.get("type") == "text":
74
+ continue # an empty or non-string text part carries nothing
75
+ else:
76
+ texts.append(json.dumps(part, ensure_ascii=False, default=str))
77
+ content = "\n".join(texts)
78
+ else:
79
+ content = "" if raw is None else str(raw)
44
80
  # Include a small role prefix so token estimation reflects chat formatting overhead.
45
81
  text = f"{role}: {content}" if role else content
46
- return estimate_tokens(text, model=model)
82
+ return estimate_tokens(text, model=model) + media_parts * MEDIA_PART_TOKEN_ESTIMATE
47
83
 
48
84
 
49
85
  def trim_messages_to_max_input_tokens(
@@ -236,6 +236,23 @@ def announce_dropped(messages: List[Dict[str, Any]], report: Dict[str, Any], *,
236
236
  `stamp_metadata=False` leaves the message's keys as they were (plain
237
237
  role/content transcripts that go straight to a model client); the notice
238
238
  in the content is the same.
239
+
240
+ Content shapes (0.7.1):
241
+ - a string (or empty/None): the notice is a prefix line, after the
242
+ message's own `<runtime_metadata>` envelope when it has one;
243
+ - a content-part list (OpenAI-style `[{"type": "text", ...},
244
+ {"type": "image_url", ...}]`, the shape AbstractCore accepts): the
245
+ notice is inserted as ONE `{"type": "text"}` part and every other part
246
+ is kept as is (images byte-identical). Prefixing it to the list used to
247
+ turn the whole content into a string, so the model read the image's
248
+ base64 as text. Without an envelope the notice part goes first. With
249
+ one (it heads the first text part, where the payload boundary looks
250
+ for it), that part is split: the envelope stays alone in it, the
251
+ notice part follows, then the part's remaining text as its own text
252
+ part — joined with newlines, the text reads exactly as the string path;
253
+ - anything else: the content is left untouched (rewriting an unknown
254
+ shape could corrupt it) and a warning is logged; with
255
+ `stamp_metadata=True` the metadata still records the drop.
239
256
  """
240
257
  if not messages or int(report.get("dropped_messages") or 0) <= 0:
241
258
  return
@@ -257,7 +274,19 @@ def announce_dropped(messages: List[Dict[str, Any]], report: Dict[str, Any], *,
257
274
  # payload boundary would otherwise stack a second one in front).
258
275
  from .turn_grounding import split_head_grounding # lazy: the grounding helpers load AbstractCore
259
276
 
260
- envelope, rest = split_head_grounding(head.get("content") or "")
277
+ content = head.get("content")
278
+ if isinstance(content, list):
279
+ head["content"] = _notice_into_parts(content, notice, split_head_grounding)
280
+ return
281
+ if content is not None and not isinstance(content, str):
282
+ logger.warning(
283
+ "history window: the oldest kept message has %s content; the #TRUNCATION notice "
284
+ "was not written into it (%s message(s) dropped)",
285
+ type(content).__name__,
286
+ report["dropped_messages"],
287
+ )
288
+ return
289
+ envelope, rest = split_head_grounding(content or "")
261
290
  if envelope:
262
291
  sep = "" if envelope.endswith("\n") else "\n"
263
292
  head["content"] = f"{envelope}{sep}{notice}\n{rest.lstrip(chr(10))}"
@@ -265,6 +294,25 @@ def announce_dropped(messages: List[Dict[str, Any]], report: Dict[str, Any], *,
265
294
  head["content"] = f"{notice}\n{rest}"
266
295
 
267
296
 
297
+ def _is_text_part(part: Any) -> bool:
298
+ return isinstance(part, dict) and str(part.get("type") or "").strip().lower() == "text"
299
+
300
+
301
+ def _notice_into_parts(parts: List[Any], notice: str, split_head_grounding: Any) -> List[Any]:
302
+ """A new part list with the notice as one text part (see `announce_dropped`)."""
303
+ out = list(parts)
304
+ notice_part = {"type": "text", "text": notice}
305
+ first = next((i for i, part in enumerate(out) if _is_text_part(part)), None)
306
+ if first is not None:
307
+ envelope, rest = split_head_grounding(out[first].get("text"))
308
+ if envelope:
309
+ head_part = {**out[first], "text": envelope.rstrip("\n")}
310
+ tail = rest.lstrip("\n")
311
+ replacement = [head_part, notice_part] + ([{**out[first], "text": tail}] if tail else [])
312
+ return out[:first] + replacement + out[first + 1 :]
313
+ return [notice_part] + out
314
+
315
+
268
316
  # The pre-0.7.0 private name, kept for callers that imported it.
269
317
  _announce_dropped = announce_dropped
270
318
 
@@ -1478,3 +1478,45 @@ def test_remote_discovery_marks_transport_failures_as_route_unavailable() -> Non
1478
1478
  assert payload["available"] is False
1479
1479
  assert payload["route_available"] is False
1480
1480
  assert payload["error"] == "connection refused"
1481
+
1482
+
1483
+ def test_local_stt_catalog_without_provider_map_asks_each_provider(monkeypatch) -> None:
1484
+ """Framework backlog 0989: AbstractVoice's light catalog carries no per-provider STT
1485
+ map; the flat model list spans every engine and was attributed wholesale to the
1486
+ active provider, advertising OpenAI's gpt-4o-transcribe as faster-whisper's model
1487
+ and as the active model."""
1488
+
1489
+ from abstractruntime.integrations.abstractcore import discovery_queries
1490
+
1491
+ per_provider = {
1492
+ None: ["gpt-4o-transcribe", "whisper-1", "tiny", "base", "Qwen/Qwen3-ASR-1.7B"],
1493
+ "faster-whisper": ["tiny", "base"],
1494
+ "transformers-asr": ["Qwen/Qwen3-ASR-1.7B"],
1495
+ }
1496
+
1497
+ class _FakeVoice:
1498
+ def voice_catalog(self, *args: Any, **kwargs: Any) -> Dict[str, Any]:
1499
+ _ = args, kwargs
1500
+ return {
1501
+ "active_stt_provider": "faster-whisper",
1502
+ "stt_providers": ["faster-whisper", "transformers-asr"],
1503
+ "stt_models_by_provider": {},
1504
+ }
1505
+
1506
+ def list_stt_models(self, provider: str | None = None) -> List[str]:
1507
+ return list(per_provider.get(provider, []))
1508
+
1509
+ class _FakeRegistry:
1510
+ voice = _FakeVoice()
1511
+
1512
+ monkeypatch.setattr(discovery_queries, "_runtime_capability_registry", lambda **_kwargs: _FakeRegistry())
1513
+
1514
+ payload = discovery_queries.local_list_stt_models()
1515
+
1516
+ assert payload["active_provider"] == "faster-whisper"
1517
+ assert payload["active_model"] == "tiny"
1518
+ assert payload["stt_models_by_provider"] == {
1519
+ "faster-whisper": ["tiny", "base"],
1520
+ "transformers-asr": ["Qwen/Qwen3-ASR-1.7B"],
1521
+ }
1522
+ assert "gpt-4o-transcribe" not in payload["stt_models_by_provider"]["faster-whisper"]
@@ -14,7 +14,7 @@ import pytest
14
14
 
15
15
  from abstractruntime.integrations.abstractcore import discovery_queries as dq
16
16
 
17
- # AbstractVoice is a declared dependency (abstractcore[voice] in the base install):
17
+ # AbstractVoice is a declared dependency (through AbstractCore's light install):
18
18
  # the first two tests run the real catalog, engine-free, with no key configured.
19
19
 
20
20