steerable-agent-runtime 0.7.1__tar.gz → 0.7.3__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 (163) hide show
  1. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/PKG-INFO +2 -2
  2. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/pyproject.toml +2 -2
  3. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/approval.py +7 -6
  4. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/tool_presentation.py +25 -3
  5. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime.egg-info/PKG-INFO +2 -2
  6. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime.egg-info/requires.txt +1 -1
  7. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_approval.py +21 -0
  8. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_skills.py +1 -1
  9. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_tool_presentation.py +16 -0
  10. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/README.md +0 -0
  11. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/setup.cfg +0 -0
  12. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/__init__.py +0 -0
  13. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/antihallucination.py +0 -0
  14. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/approval_policy.py +0 -0
  15. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/ask_user.py +0 -0
  16. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/branch.py +0 -0
  17. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/cache_control.py +0 -0
  18. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/calibration.py +0 -0
  19. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/compaction.py +0 -0
  20. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/compaction_policy.py +0 -0
  21. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/config.py +0 -0
  22. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/default.harness.json +0 -0
  23. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/default.harness.yaml +0 -0
  24. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/delegation_gate.py +0 -0
  25. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/errors.py +0 -0
  26. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/gateway_catalog.py +0 -0
  27. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/handoff.py +0 -0
  28. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/harness.py +0 -0
  29. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/harness_spec.py +0 -0
  30. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/history.py +0 -0
  31. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/hooks.py +0 -0
  32. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/__init__.py +0 -0
  33. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/anthropic_native.py +0 -0
  34. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/compat.py +0 -0
  35. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/errors.py +0 -0
  36. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/google_genai.py +0 -0
  37. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/openai_compat.py +0 -0
  38. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/openai_responses.py +0 -0
  39. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/parts.py +0 -0
  40. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/presets.py +0 -0
  41. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/llm/system_proxy.py +0 -0
  42. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/loop.py +0 -0
  43. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/maintenance.py +0 -0
  44. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/mcp.py +0 -0
  45. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/mcp_server.py +0 -0
  46. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/model_catalog.py +0 -0
  47. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/model_info.py +0 -0
  48. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/model_resolve.py +0 -0
  49. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/native_bridge.py +0 -0
  50. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/observation_aging.py +0 -0
  51. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/orchestration.py +0 -0
  52. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/otel.py +0 -0
  53. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/plugins.py +0 -0
  54. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/pool.py +0 -0
  55. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/pricing.py +0 -0
  56. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/pseudo.py +0 -0
  57. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/recording.py +0 -0
  58. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/reminders.py +0 -0
  59. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/replay.py +0 -0
  60. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/resume.py +0 -0
  61. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/retry.py +0 -0
  62. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/sandboxed.py +0 -0
  63. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/skills.py +0 -0
  64. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/spill.py +0 -0
  65. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/storage/__init__.py +0 -0
  66. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/storage/in_memory.py +0 -0
  67. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/storage/sqlalchemy_store.py +0 -0
  68. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/storage/sqlite_store.py +0 -0
  69. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/storage/write_lease.py +0 -0
  70. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/subagent.py +0 -0
  71. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/todo.py +0 -0
  72. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/tokens.py +0 -0
  73. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/tool_schema.py +0 -0
  74. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/tool_search.py +0 -0
  75. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/tools.py +0 -0
  76. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/tracing.py +0 -0
  77. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/transport/__init__.py +0 -0
  78. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/transport/fastapi_sse.py +0 -0
  79. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/transport/stdio_jsonrpc.py +0 -0
  80. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime/world_state.py +0 -0
  81. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime.egg-info/SOURCES.txt +0 -0
  82. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime.egg-info/dependency_links.txt +0 -0
  83. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/src/steerable_agent_runtime.egg-info/top_level.txt +0 -0
  84. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_antihallucination.py +0 -0
  85. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_approval_policy.py +0 -0
  86. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_ask_user.py +0 -0
  87. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_branch.py +0 -0
  88. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_cache_control.py +0 -0
  89. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_cache_instrumentation.py +0 -0
  90. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_calibration.py +0 -0
  91. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_compaction.py +0 -0
  92. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_compaction_policy.py +0 -0
  93. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_compaction_strategy.py +0 -0
  94. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_config.py +0 -0
  95. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_content_parts.py +0 -0
  96. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_delegation_gate.py +0 -0
  97. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_error_taxonomy.py +0 -0
  98. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_fragment_bounds.py +0 -0
  99. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_gateway_catalog.py +0 -0
  100. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_golden.py +0 -0
  101. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_handoff.py +0 -0
  102. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_harness.py +0 -0
  103. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_harness_spec.py +0 -0
  104. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_history.py +0 -0
  105. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_history_persistence.py +0 -0
  106. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_hooks.py +0 -0
  107. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_in_memory_storage.py +0 -0
  108. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_llm_gemini_wire.py +0 -0
  109. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_llm_responses_wire.py +0 -0
  110. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_llm_stream_e2e.py +0 -0
  111. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_llm_wire_helpers.py +0 -0
  112. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_long_session.py +0 -0
  113. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_loop.py +0 -0
  114. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_loop_cancellation.py +0 -0
  115. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_loop_replay.py +0 -0
  116. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_loop_sandbox_event.py +0 -0
  117. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_loop_terminal.py +0 -0
  118. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_maintenance.py +0 -0
  119. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_mcp.py +0 -0
  120. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_mcp_server.py +0 -0
  121. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_model_catalog.py +0 -0
  122. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_model_equivalence.py +0 -0
  123. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_model_info.py +0 -0
  124. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_model_resolve.py +0 -0
  125. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_native_default.py +0 -0
  126. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_observation_aging.py +0 -0
  127. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_orchestration.py +0 -0
  128. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_otel.py +0 -0
  129. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_parallel_tools.py +0 -0
  130. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_plugins.py +0 -0
  131. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_provider_compat.py +0 -0
  132. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_provider_presets.py +0 -0
  133. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_pseudo.py +0 -0
  134. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_pyo3_api_surface.py +0 -0
  135. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_recording.py +0 -0
  136. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_reminders.py +0 -0
  137. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_replay_crosslang.py +0 -0
  138. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_resume.py +0 -0
  139. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_retry_hooks.py +0 -0
  140. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_safety_gate.py +0 -0
  141. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_sandboxed.py +0 -0
  142. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_soft_timeout.py +0 -0
  143. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_spill.py +0 -0
  144. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_sqlite_storage.py +0 -0
  145. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_steer.py +0 -0
  146. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_storage_contract.py +0 -0
  147. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_stream_strip.py +0 -0
  148. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_subagent.py +0 -0
  149. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_system_proxy.py +0 -0
  150. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_todo.py +0 -0
  151. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_todo_gate.py +0 -0
  152. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_tokens.py +0 -0
  153. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_tool_exposure.py +0 -0
  154. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_tool_hygiene.py +0 -0
  155. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_tool_router.py +0 -0
  156. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_tool_schema.py +0 -0
  157. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_tool_timeout.py +0 -0
  158. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_trace_recorder.py +0 -0
  159. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_transport_jsonrpc.py +0 -0
  160. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_transport_sse.py +0 -0
  161. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_usage_attribution.py +0 -0
  162. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_world_state.py +0 -0
  163. {steerable_agent_runtime-0.7.1 → steerable_agent_runtime-0.7.3}/tests/test_write_lease.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steerable-agent-runtime
3
- Version: 0.7.1
3
+ Version: 0.7.3
4
4
  Summary: Steerable agent runtime: LLM, tool, storage, and transport adapters.
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -10,7 +10,7 @@ Requires-Dist: mcp<2.0.0,>=1.13.0
10
10
  Requires-Dist: pydantic>=2.10.0
11
11
  Requires-Dist: steerable-agent-protocol<1.0.0,>=0.1.0
12
12
  Requires-Dist: steerable-agent-harness<1.0.0,>=0.1.0
13
- Requires-Dist: steerable-agent-runtime-native==1.0.3
13
+ Requires-Dist: steerable-agent-runtime-native==1.0.5
14
14
  Provides-Extra: sqlalchemy
15
15
  Requires-Dist: sqlalchemy>=2.0; extra == "sqlalchemy"
16
16
  Provides-Extra: fastapi
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "steerable-agent-runtime"
3
- version = "0.7.1"
3
+ version = "0.7.3"
4
4
  description = "Steerable agent runtime: LLM, tool, storage, and transport adapters."
5
5
  license = { text = "Apache-2.0" }
6
6
  readme = "README.md"
@@ -21,7 +21,7 @@ dependencies = [
21
21
  "pydantic>=2.10.0",
22
22
  "steerable-agent-protocol>=0.1.0,<1.0.0",
23
23
  "steerable-agent-harness>=0.1.0,<1.0.0",
24
- "steerable-agent-runtime-native==1.0.3",
24
+ "steerable-agent-runtime-native==1.0.5",
25
25
  ]
26
26
 
27
27
  [project.optional-dependencies]
@@ -617,13 +617,14 @@ class ApprovalExecutor:
617
617
  }
618
618
  }
619
619
  elif waited_ms is not None:
620
- approval_marker = {
621
- "_approval": {
622
- "kind": decision.kind,
623
- "category": request.category,
624
- "waitMs": waited_ms,
625
- }
620
+ recorded: dict[str, Any] = {
621
+ "kind": decision.kind,
622
+ "category": request.category,
623
+ "waitMs": waited_ms,
626
624
  }
625
+ if decision.reason == "unattended":
626
+ recorded["auto"] = True
627
+ approval_marker = {"_approval": recorded}
627
628
  else:
628
629
  approval_marker = None
629
630
 
@@ -73,6 +73,24 @@ _CARDS = frozenset({"generic", "terminal", "diff", "search", "read", "web"})
73
73
  _KINDS = frozenset({"read", "edit", "delete", "move", "search", "execute", "fetch", "other"})
74
74
 
75
75
 
76
+ def _ask_title(arguments: dict[str, Any] | None) -> str | None:
77
+ """The folded ask row shows the first question. The intro is only a fallback."""
78
+ if not isinstance(arguments, dict):
79
+ return None
80
+ questions = arguments.get("questions")
81
+ if isinstance(questions, list):
82
+ for question in questions:
83
+ if not isinstance(question, dict):
84
+ continue
85
+ text = question.get("text")
86
+ if isinstance(text, str) and text.strip():
87
+ return text.strip()
88
+ intro = arguments.get("intro")
89
+ if isinstance(intro, str) and intro.strip():
90
+ return intro.strip()
91
+ return None
92
+
93
+
76
94
  def builtin_presentation(name: str) -> dict[str, Any] | None:
77
95
  """Return the declared view spec for ``name``, or None when undeclared."""
78
96
  spec = BUILTIN_PRESENTATIONS.get(name)
@@ -97,9 +115,13 @@ def present_call(
97
115
  spec = builtin_presentation(name)
98
116
  if not spec:
99
117
  return {"card": "generic", "kind": "other", "title": name, "declared": False}
100
- key = spec.get("title_from")
101
- raw = arguments.get(key) if isinstance(key, str) and key and isinstance(arguments, dict) else None
102
- title = raw.strip() if isinstance(raw, str) and raw.strip() else name
118
+ if name == "ask_user":
119
+ asked = _ask_title(arguments)
120
+ title = asked if asked else name
121
+ else:
122
+ key = spec.get("title_from")
123
+ raw = arguments.get(key) if isinstance(key, str) and key and isinstance(arguments, dict) else None
124
+ title = raw.strip() if isinstance(raw, str) and raw.strip() else name
103
125
  if len(title) > 80:
104
126
  title = title[:79] + "…"
105
127
  return {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: steerable-agent-runtime
3
- Version: 0.7.1
3
+ Version: 0.7.3
4
4
  Summary: Steerable agent runtime: LLM, tool, storage, and transport adapters.
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -10,7 +10,7 @@ Requires-Dist: mcp<2.0.0,>=1.13.0
10
10
  Requires-Dist: pydantic>=2.10.0
11
11
  Requires-Dist: steerable-agent-protocol<1.0.0,>=0.1.0
12
12
  Requires-Dist: steerable-agent-harness<1.0.0,>=0.1.0
13
- Requires-Dist: steerable-agent-runtime-native==1.0.3
13
+ Requires-Dist: steerable-agent-runtime-native==1.0.5
14
14
  Provides-Extra: sqlalchemy
15
15
  Requires-Dist: sqlalchemy>=2.0; extra == "sqlalchemy"
16
16
  Provides-Extra: fastapi
@@ -3,7 +3,7 @@ mcp<2.0.0,>=1.13.0
3
3
  pydantic>=2.10.0
4
4
  steerable-agent-protocol<1.0.0,>=0.1.0
5
5
  steerable-agent-harness<1.0.0,>=0.1.0
6
- steerable-agent-runtime-native==1.0.3
6
+ steerable-agent-runtime-native==1.0.5
7
7
 
8
8
  [all]
9
9
  sqlalchemy>=2.0
@@ -213,6 +213,27 @@ async def test_session_scope_caches_per_category() -> None:
213
213
  assert first.data["_approval"].get("cached") is not True
214
214
 
215
215
 
216
+ @pytest.mark.asyncio
217
+ async def test_unattended_allow_marks_the_tool_row() -> None:
218
+ router, calls = _router_with_tools()
219
+ executor = ApprovalExecutor(
220
+ RouterToolExecutor(router),
221
+ _ScriptedApprover(
222
+ [
223
+ ApprovalDecision("allow_once", "unattended"),
224
+ ApprovalDecision("allow_once", "ok"),
225
+ ]
226
+ ),
227
+ )
228
+ marked = await executor.execute(_call("delete_file", path="/tmp/x"), LoopContext())
229
+ plain = await executor.execute(_call("delete_file", path="/tmp/y"), LoopContext())
230
+ assert marked.success and plain.success
231
+ assert calls["delete_file"] == 2
232
+ assert marked.data["_approval"]["auto"] is True
233
+ assert marked.data["_approval"]["kind"] == "allow_once"
234
+ assert plain.data["_approval"].get("auto") is not True
235
+
236
+
216
237
  @pytest.mark.asyncio
217
238
  async def test_session_allow_marker_precedes_a_large_result() -> None:
218
239
  class _Blob:
@@ -450,7 +450,7 @@ def nonleading_system_indices(messages: list[LLMMessage]) -> list[int]:
450
450
  async def test_qwen_template_rejects_a_system_role_catalog(skills_root: Path) -> None:
451
451
  """The skill catalog must not be a second system message.
452
452
 
453
- CIFLog's first turn is one system prompt plus the user text. Appending
453
+ The product's first turn is one system prompt plus the user text. Appending
454
454
  the catalog as ``role=system`` made a self-hosted Qwen3.8-27B-W8A8
455
455
  return HTTP 400. The follow-up tool round has to keep that shape too.
456
456
  """
@@ -80,6 +80,22 @@ def test_caller_presentation_is_kept():
80
80
  assert registered.metadata["presentation"]["title_from"] == "path"
81
81
 
82
82
 
83
+ def test_ask_row_uses_the_first_question_then_the_intro():
84
+ asked = present_call(
85
+ "ask_user",
86
+ {
87
+ "intro": "继续吗",
88
+ "questions": [
89
+ {"id": "q1", "text": "要不要同时改重试次数?"},
90
+ {"id": "q2", "text": "要不要记一条说明?"},
91
+ ],
92
+ },
93
+ )
94
+ assert asked["title"] == "要不要同时改重试次数?"
95
+ assert present_call("ask_user", {"intro": "继续吗"})["title"] == "继续吗"
96
+ assert present_call("ask_user", {})["title"] == "ask_user"
97
+
98
+
83
99
  def test_present_call_clips_long_titles_and_falls_back_to_the_name():
84
100
  long = present_call("bash", {"command": "x" * 100})
85
101
  assert long["declared"] is True