openhands-sdk 1.58.0__tar.gz → 1.58.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 (328) hide show
  1. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/PKG-INFO +2 -1
  2. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_agent.py +51 -5
  3. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/call_context.py +14 -0
  4. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/chat_options.py +2 -0
  5. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/common.py +12 -0
  6. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/responses_options.py +2 -0
  7. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/PKG-INFO +2 -1
  8. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/requires.txt +1 -0
  9. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/pyproject.toml +2 -1
  10. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/__init__.py +0 -0
  11. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/__init__.py +0 -0
  12. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_contracts.py +0 -0
  13. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_file_credentials.py +0 -0
  14. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_model_discovery.py +0 -0
  15. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_models.py +0 -0
  16. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/acp_tracing.py +0 -0
  17. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/agent.py +0 -0
  18. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/base.py +0 -0
  19. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/critic_mixin.py +0 -0
  20. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/parallel_executor.py +0 -0
  21. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/response_dispatch.py +0 -0
  22. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/stream_context.py +0 -0
  23. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/agent/utils.py +0 -0
  24. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/automation/__init__.py +0 -0
  25. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/banner.py +0 -0
  26. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/__init__.py +0 -0
  27. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/agent_context.py +0 -0
  28. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/__init__.py +0 -0
  29. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/base.py +0 -0
  30. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +0 -0
  31. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
  32. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
  33. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/prompts/summarizing_events.j2 +0 -0
  34. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/prompts/summarizing_system.j2 +0 -0
  35. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/condenser/utils.py +0 -0
  36. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/memory.py +0 -0
  37. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/__init__.py +0 -0
  38. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/presets.py +0 -0
  39. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/prompt.py +0 -0
  40. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/registry.py +0 -0
  41. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/section.py +0 -0
  42. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/__init__.py +0 -0
  43. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/dynamic.py +0 -0
  44. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/planning.py +0 -0
  45. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/sections/static.py +0 -0
  46. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
  47. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
  48. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/__init__.py +0 -0
  49. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/manipulation_indices.py +0 -0
  50. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/__init__.py +0 -0
  51. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/base.py +0 -0
  52. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/batch_atomicity.py +0 -0
  53. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/observation_uniqueness.py +0 -0
  54. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/tool_call_matching.py +0 -0
  55. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/properties/tool_loop_atomicity.py +0 -0
  56. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/context/view/view.py +0 -0
  57. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/__init__.py +0 -0
  58. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/base.py +0 -0
  59. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/cancellation.py +0 -0
  60. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/conversation.py +0 -0
  61. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/conversation_stats.py +0 -0
  62. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/event_store.py +0 -0
  63. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/events_list_base.py +0 -0
  64. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/exceptions.py +0 -0
  65. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/fifo_lock.py +0 -0
  66. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/__init__.py +0 -0
  67. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/controller.py +0 -0
  68. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/judge.py +0 -0
  69. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/prompts.py +0 -0
  70. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/goal/runner.py +0 -0
  71. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/__init__.py +0 -0
  72. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/local_conversation.py +0 -0
  73. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/impl/remote_conversation.py +0 -0
  74. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/message_request.py +0 -0
  75. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/persistence_const.py +0 -0
  76. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/request.py +0 -0
  77. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/resource_lock_manager.py +0 -0
  78. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/response_utils.py +0 -0
  79. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/secret_registry.py +0 -0
  80. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/state.py +0 -0
  81. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/stuck_detector.py +0 -0
  82. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/title_utils.py +0 -0
  83. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/types.py +0 -0
  84. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
  85. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/visualizer/base.py +0 -0
  86. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/conversation/visualizer/default.py +0 -0
  87. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/credential.py +0 -0
  88. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/__init__.py +0 -0
  89. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/base.py +0 -0
  90. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/__init__.py +0 -0
  91. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/agent_finished.py +0 -0
  92. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/__init__.py +0 -0
  93. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/chat_template.py +0 -0
  94. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/client.py +0 -0
  95. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/critic.py +0 -0
  96. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/api/taxonomy.py +0 -0
  97. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/empty_patch.py +0 -0
  98. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/impl/pass_critic.py +0 -0
  99. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/critic/result.py +0 -0
  100. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/__init__.py +0 -0
  101. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/acp_tool_call.py +0 -0
  102. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/base.py +0 -0
  103. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/condenser.py +0 -0
  104. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/conversation_error.py +0 -0
  105. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/conversation_state.py +0 -0
  106. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/error_classification.py +0 -0
  107. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/hook_execution.py +0 -0
  108. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_completion_log.py +0 -0
  109. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
  110. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/action.py +0 -0
  111. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/message.py +0 -0
  112. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/observation.py +0 -0
  113. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/reasoning_utils.py +0 -0
  114. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/llm_convertible/system.py +0 -0
  115. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/resume_transcript.py +0 -0
  116. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/security.py +0 -0
  117. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/streaming_delta.py +0 -0
  118. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/token.py +0 -0
  119. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/types.py +0 -0
  120. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/event/user_action.py +0 -0
  121. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/__init__.py +0 -0
  122. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/fetch.py +0 -0
  123. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/__init__.py +0 -0
  124. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/info.py +0 -0
  125. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/interface.py +0 -0
  126. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/manager.py +0 -0
  127. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/metadata.py +0 -0
  128. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/extensions/installation/utils.py +0 -0
  129. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/cached_repo.py +0 -0
  130. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/exceptions.py +0 -0
  131. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/git_changes.py +0 -0
  132. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/git_commits.py +0 -0
  133. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/git_diff.py +0 -0
  134. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/models.py +0 -0
  135. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/git/utils.py +0 -0
  136. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/__init__.py +0 -0
  137. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/config.py +0 -0
  138. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/conversation_hooks.py +0 -0
  139. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/executor.py +0 -0
  140. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/manager.py +0 -0
  141. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/hooks/types.py +0 -0
  142. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/__init__.py +0 -0
  143. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/base.py +0 -0
  144. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/cache.py +0 -0
  145. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/local.py +0 -0
  146. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/io/memory.py +0 -0
  147. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/__init__.py +0 -0
  148. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/errors.py +0 -0
  149. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/finalize.py +0 -0
  150. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/preview.py +0 -0
  151. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/launch/resolve.py +0 -0
  152. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/__init__.py +0 -0
  153. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/_message_normalization.py +0 -0
  154. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/_response_stream.py +0 -0
  155. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/_tokenizer.py +0 -0
  156. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/auth/__init__.py +0 -0
  157. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/auth/credentials.py +0 -0
  158. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/auth/openai.py +0 -0
  159. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/cleanup_profile.py +0 -0
  160. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/__init__.py +0 -0
  161. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/classifier.py +0 -0
  162. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/mapping.py +0 -0
  163. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/exceptions/types.py +0 -0
  164. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/fallback_strategy.py +0 -0
  165. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm.py +0 -0
  166. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm_profile_store.py +0 -0
  167. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm_registry.py +0 -0
  168. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/llm_response.py +0 -0
  169. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/message.py +0 -0
  170. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/meta_profile_store.py +0 -0
  171. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
  172. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/mixins/fn_call_examples.py +0 -0
  173. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
  174. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/options/__init__.py +0 -0
  175. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/provider_connection_store.py +0 -0
  176. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/__init__.py +0 -0
  177. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/base.py +0 -0
  178. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
  179. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/router/impl/random.py +0 -0
  180. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/streaming.py +0 -0
  181. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/image_inline.py +0 -0
  182. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/image_resize.py +0 -0
  183. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/litellm_provider.py +0 -0
  184. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/metrics.py +0 -0
  185. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/model_features.py +0 -0
  186. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/model_info.py +0 -0
  187. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/model_prompt_spec.py +0 -0
  188. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/openhands_provider.py +0 -0
  189. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/providers/__init__.py +0 -0
  190. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/providers/openrouter.py +0 -0
  191. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/responses_serialization.py +0 -0
  192. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
  193. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/runtime_metadata.py +0 -0
  194. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/telemetry.py +0 -0
  195. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/unverified_models.py +0 -0
  196. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/verified_models.py +0 -0
  197. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/llm/utils/vertex_preflight.py +0 -0
  198. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/__init__.py +0 -0
  199. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/_rich_handler.py +0 -0
  200. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/logger.py +0 -0
  201. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/logger/rolling.py +0 -0
  202. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/__init__.py +0 -0
  203. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/registration.py +0 -0
  204. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/registry.py +0 -0
  205. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/marketplace/types.py +0 -0
  206. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/__init__.py +0 -0
  207. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/client.py +0 -0
  208. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/config.py +0 -0
  209. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/definition.py +0 -0
  210. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/exceptions.py +0 -0
  211. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/oauth.py +0 -0
  212. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/tool.py +0 -0
  213. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/mcp/utils.py +0 -0
  214. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/observability/__init__.py +0 -0
  215. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/observability/laminar.py +0 -0
  216. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/observability/utils.py +0 -0
  217. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/__init__.py +0 -0
  218. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/discovery.py +0 -0
  219. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/fetch.py +0 -0
  220. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/__init__.py +0 -0
  221. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/agent_plugins.py +0 -0
  222. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/agent_plugins_mcp.py +0 -0
  223. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/base.py +0 -0
  224. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/claude_code.py +0 -0
  225. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/schemas/mcp-1.0.0.schema.json +0 -0
  226. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/format/schemas/plugin-1.0.0.schema.json +0 -0
  227. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/installed.py +0 -0
  228. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/loader.py +0 -0
  229. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/paths.py +0 -0
  230. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/plugin.py +0 -0
  231. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/source.py +0 -0
  232. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/strict_fetch.py +0 -0
  233. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/plugin/types.py +0 -0
  234. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/__init__.py +0 -0
  235. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/agent_profile.py +0 -0
  236. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/agent_profile_store.py +0 -0
  237. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/profile_refs.py +0 -0
  238. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/resolver.py +0 -0
  239. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/profiles/seed.py +0 -0
  240. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/py.typed +0 -0
  241. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/secret/__init__.py +0 -0
  242. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/secret/secrets.py +0 -0
  243. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/__init__.py +0 -0
  244. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/_shell_ast.py +0 -0
  245. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/analyzer.py +0 -0
  246. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/confirmation_policy.py +0 -0
  247. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/__init__.py +0 -0
  248. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/pattern.py +0 -0
  249. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/policy_rails.py +0 -0
  250. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/shell_semantics.py +0 -0
  251. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/defense_in_depth/utils.py +0 -0
  252. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/ensemble.py +0 -0
  253. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/grayswan/__init__.py +0 -0
  254. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/grayswan/analyzer.py +0 -0
  255. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/grayswan/utils.py +0 -0
  256. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/llm_analyzer.py +0 -0
  257. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/risk.py +0 -0
  258. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/shell_parser.py +0 -0
  259. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/toolshield_helpers.py +0 -0
  260. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/security/toolshield_llm_analyzer.py +0 -0
  261. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/__init__.py +0 -0
  262. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/acp_install_catalog.py +0 -0
  263. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/acp_providers.py +0 -0
  264. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/api_models.py +0 -0
  265. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/metadata.py +0 -0
  266. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/settings/model.py +0 -0
  267. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/__init__.py +0 -0
  268. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/exceptions.py +0 -0
  269. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/execute.py +0 -0
  270. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/fetch.py +0 -0
  271. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/installed.py +0 -0
  272. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/skill.py +0 -0
  273. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/trigger.py +0 -0
  274. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/types.py +0 -0
  275. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/skills/utils.py +0 -0
  276. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/__init__.py +0 -0
  277. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/load.py +0 -0
  278. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/registry.py +0 -0
  279. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/schema.py +0 -0
  280. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/subagent/scope.py +0 -0
  281. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/testing/__init__.py +0 -0
  282. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/testing/test_llm.py +0 -0
  283. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/__init__.py +0 -0
  284. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/__init__.py +0 -0
  285. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/classify_and_switch_llm.py +0 -0
  286. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/finish.py +0 -0
  287. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/invoke_skill.py +0 -0
  288. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/switch_llm.py +0 -0
  289. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/think.py +0 -0
  290. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/builtins/vision_inspect.py +0 -0
  291. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/client_tool.py +0 -0
  292. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/defaults.py +0 -0
  293. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/registry.py +0 -0
  294. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/schema.py +0 -0
  295. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/spec.py +0 -0
  296. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/tool/tool.py +0 -0
  297. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/__init__.py +0 -0
  298. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/async_executor.py +0 -0
  299. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/async_utils.py +0 -0
  300. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/cipher.py +0 -0
  301. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/command.py +0 -0
  302. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/datetime.py +0 -0
  303. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/deprecation.py +0 -0
  304. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/files.py +0 -0
  305. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/github.py +0 -0
  306. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/json.py +0 -0
  307. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/masking.py +0 -0
  308. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/models.py +0 -0
  309. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/paging.py +0 -0
  310. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/path.py +0 -0
  311. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/pydantic_secrets.py +0 -0
  312. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/redact.py +0 -0
  313. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/truncate.py +0 -0
  314. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/utils/visualize.py +0 -0
  315. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/__init__.py +0 -0
  316. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/base.py +0 -0
  317. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/local.py +0 -0
  318. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/models.py +0 -0
  319. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/__init__.py +0 -0
  320. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
  321. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/base.py +0 -0
  322. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
  323. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/repo.py +0 -0
  324. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands/sdk/workspace/workspace.py +0 -0
  325. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/SOURCES.txt +0 -0
  326. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/dependency_links.txt +0 -0
  327. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/openhands_sdk.egg-info/top_level.txt +0 -0
  328. {openhands_sdk-1.58.0 → openhands_sdk-1.58.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.58.0
3
+ Version: 1.58.2
4
4
  Summary: OpenHands SDK - Core functionality for building AI agents
5
5
  Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
6
6
  Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
@@ -8,6 +8,7 @@ Project-URL: Documentation, https://docs.openhands.dev/sdk
8
8
  Project-URL: Bug Tracker, https://github.com/OpenHands/software-agent-sdk/issues
9
9
  Requires-Python: >=3.12
10
10
  Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
11
+ Requires-Dist: certifi>=2026.10.19
11
12
  Requires-Dist: deprecation>=2.1.0
12
13
  Requires-Dist: fakeredis[lua]>=2.32.1
13
14
  Requires-Dist: fastmcp<4,>=3.2.0
@@ -126,7 +126,7 @@ from openhands.sdk.event import (
126
126
  from openhands.sdk.event.conversation_error import ConversationErrorEvent
127
127
  from openhands.sdk.llm import LLM, ImageContent, Message, MessageToolCall, TextContent
128
128
  from openhands.sdk.logger import get_logger
129
- from openhands.sdk.mcp.config import MCPServer
129
+ from openhands.sdk.mcp.config import MCPOAuthAuthCredential, MCPServer
130
130
  from openhands.sdk.observability.laminar import maybe_init_laminar, observe
131
131
  from openhands.sdk.settings.acp_providers import (
132
132
  ACP_PROVIDERS,
@@ -672,20 +672,65 @@ def _extract_session_models(
672
672
  _ACPMcpServer = HttpMcpServer | SseMcpServer | McpServerStdio | AcpMcpServer
673
673
 
674
674
 
675
+ def _oauth_bearer_header(auth: MCPOAuthAuthCredential, name: str) -> dict[str, str]:
676
+ """Forward a stored OAuth2 access token as an ``Authorization`` header.
677
+
678
+ The ACP subprocess owns its own MCP transport and has no access to the
679
+ FastMCP token store the native path uses, so the token persisted in the
680
+ connection's ``auth.state`` is the only credential available here. Without
681
+ this the server is forwarded as a bare URL and the ACP agent reports it is
682
+ not logged in (``codex mcp login ...``).
683
+
684
+ A missing or expired token still forwards what exists: a 401 from the
685
+ server is more actionable than an unauthenticated URL. Both cases are
686
+ logged so the drop is not silent.
687
+ """
688
+ state = auth.state
689
+ token = state.tokens.access_token if state is not None and state.tokens else None
690
+ if token is None:
691
+ logger.warning(
692
+ "ACP MCP server %r has an OAuth2 connection with no stored access "
693
+ "token; forwarding it unauthenticated",
694
+ name,
695
+ )
696
+ return {}
697
+ if (
698
+ state is not None
699
+ and state.token_expires_at is not None
700
+ and state.token_expires_at <= time.time()
701
+ ):
702
+ logger.warning(
703
+ "ACP MCP server %r has an expired OAuth2 access token; the ACP path "
704
+ "cannot refresh it, forwarding it as-is",
705
+ name,
706
+ )
707
+ return {"Authorization": f"Bearer {token.get_secret_value()}"}
708
+
709
+
675
710
  def _remote_mcp_headers(server: MCPServer, name: str) -> list[HttpHeader]:
676
- """Convert remote MCP headers/auth into ACP's header-only representation."""
711
+ """Convert remote MCP headers/auth into ACP's header-only representation.
712
+
713
+ Header-compatible auth (api key / bearer / basic / explicit headers)
714
+ converts directly. OAuth2 does not -- ``to_http_headers()`` returns ``None``
715
+ because the native path materializes tokens through FastMCP's token store --
716
+ so its stored access token is forwarded explicitly instead.
717
+ """
677
718
  headers = [
678
719
  HttpHeader(name=name, value=value.get_secret_value())
679
720
  for name, value in (server.headers or {}).items()
680
721
  ]
681
722
 
682
- auth_headers = server.auth.to_http_headers() if server.auth is not None else {}
723
+ auth = server.auth
724
+ if isinstance(auth, MCPOAuthAuthCredential):
725
+ auth_headers = _oauth_bearer_header(auth, name)
726
+ else:
727
+ auth_headers = auth.to_http_headers() if auth is not None else {}
683
728
  if auth_headers is None:
684
729
  logger.warning(
685
730
  "ACP MCP server %r uses unsupported remote MCP auth type %r; "
686
731
  "only header-compatible auth can be forwarded",
687
732
  name,
688
- type(server.auth).__name__,
733
+ type(auth).__name__,
689
734
  )
690
735
  return headers
691
736
  headers.extend(
@@ -724,7 +769,8 @@ def _mcp_config_to_acp_servers(
724
769
  with a warning rather than failing init — one misconfigured server should
725
770
  not sink the whole conversation. ``env`` / ``headers`` maps are converted
726
771
  to the protocol's ``[{name, value}]`` list form; header-compatible auth
727
- credentials are also converted to headers.
772
+ credentials, and the stored access token of an OAuth2 connection, are also
773
+ converted to headers.
728
774
  """
729
775
  caps = normalize_mcp_capabilities(mcp_capabilities)
730
776
  http_ok = caps.http
@@ -69,12 +69,19 @@ def apply_llm_call_context(
69
69
  context: LLMCallContext,
70
70
  *,
71
71
  supports_prompt_cache_key: bool = False,
72
+ openrouter: bool = False,
72
73
  ) -> None:
73
74
  """Apply SDK-owned call context to provider request options in one place.
74
75
 
75
76
  ``prompt_cache_key`` is only sent to providers that accept it as an OpenAI
76
77
  param (OpenAI Responses/Chat). Anthropic and Gemini reject it with a 400
77
78
  ``UnsupportedParamsError`` when litellm validates non-default params.
79
+
80
+ ``openrouter`` selects OpenRouter's own affinity parameter: OpenRouter keys
81
+ sticky routing off ``session_id``, so later turns of a conversation return
82
+ to the endpoint holding the warm prompt cache. Without it OpenRouter derives
83
+ the routing key by hashing the opening messages, which agent conversations
84
+ rewrite as they compact, so affinity is lost mid-run.
78
85
  """
79
86
  if context.prompt_cache_key and supports_prompt_cache_key:
80
87
  options["prompt_cache_key"] = context.prompt_cache_key
@@ -84,3 +91,10 @@ def apply_llm_call_context(
84
91
  **existing,
85
92
  "x-litellm-session-id": context.session_id,
86
93
  }
94
+ if openrouter:
95
+ # Merge rather than replace: extra_body may already carry caller
96
+ # routing (e.g. provider.only) that must survive. An explicit
97
+ # session_id from the caller wins over the conversation id.
98
+ extra_body = dict(options.get("extra_body") or {})
99
+ extra_body.setdefault("session_id", context.session_id)
100
+ options["extra_body"] = extra_body
@@ -10,6 +10,7 @@ from openhands.sdk.llm.options.common import (
10
10
  apply_defaults_if_absent,
11
11
  apply_extra_body,
12
12
  apply_extra_headers,
13
+ is_openrouter,
13
14
  )
14
15
 
15
16
 
@@ -96,6 +97,7 @@ def select_chat_options(
96
97
  out,
97
98
  context,
98
99
  supports_prompt_cache_key=model_features.supports_prompt_cache_key,
100
+ openrouter=is_openrouter(llm),
99
101
  )
100
102
 
101
103
  return out
@@ -55,3 +55,15 @@ def apply_extra_body(user_kwargs: dict[str, Any], llm: LLM) -> dict[str, Any]:
55
55
  if llm.litellm_extra_body:
56
56
  out["extra_body"] = llm.litellm_extra_body
57
57
  return out
58
+
59
+
60
+ def is_openrouter(llm: LLM) -> bool:
61
+ """Return whether this LLM routes through OpenRouter.
62
+
63
+ Matches the ``openrouter/`` model prefix and the ``openrouter.ai`` base URL
64
+ that the OpenRouter runtime-metadata resolver also keys off, so the two
65
+ agree on what counts as OpenRouter.
66
+ """
67
+ model = llm.model or ""
68
+ base_url = llm.base_url or ""
69
+ return model.startswith("openrouter/") or "openrouter.ai" in base_url
@@ -10,6 +10,7 @@ from openhands.sdk.llm.options.common import (
10
10
  apply_defaults_if_absent,
11
11
  apply_extra_body,
12
12
  apply_extra_headers,
13
+ is_openrouter,
13
14
  )
14
15
 
15
16
 
@@ -90,6 +91,7 @@ def select_responses_options(
90
91
  out,
91
92
  context,
92
93
  supports_prompt_cache_key=model_features.supports_prompt_cache_key,
94
+ openrouter=is_openrouter(llm),
93
95
  )
94
96
 
95
97
  return out
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.58.0
3
+ Version: 1.58.2
4
4
  Summary: OpenHands SDK - Core functionality for building AI agents
5
5
  Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
6
6
  Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
@@ -8,6 +8,7 @@ Project-URL: Documentation, https://docs.openhands.dev/sdk
8
8
  Project-URL: Bug Tracker, https://github.com/OpenHands/software-agent-sdk/issues
9
9
  Requires-Python: >=3.12
10
10
  Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
11
+ Requires-Dist: certifi>=2026.10.19
11
12
  Requires-Dist: deprecation>=2.1.0
12
13
  Requires-Dist: fakeredis[lua]>=2.32.1
13
14
  Requires-Dist: fastmcp<4,>=3.2.0
@@ -1,4 +1,5 @@
1
1
  agent-client-protocol<0.13.0,>=0.12.1
2
+ certifi>=2026.10.19
2
3
  deprecation>=2.1.0
3
4
  fakeredis[lua]>=2.32.1
4
5
  fastmcp<4,>=3.2.0
@@ -1,11 +1,12 @@
1
1
  [project]
2
2
  name = "openhands-sdk"
3
- version = "1.58.0"
3
+ version = "1.58.2"
4
4
  description = "OpenHands SDK - Core functionality for building AI agents"
5
5
 
6
6
  requires-python = ">=3.12"
7
7
  dependencies = [
8
8
  "agent-client-protocol>=0.12.1,<0.13.0", # 0.11.0 reordered prompt() args, broke the client (#4830)
9
+ "certifi>=2026.10.19", # eMudhra CA distrust: GHSA-6q48-6c7w-9gw2
9
10
  "deprecation>=2.1.0",
10
11
  "fakeredis[lua]>=2.32.1", # Explicit dependency for docket/fastmcp background tasks
11
12
  # 3.2.0 reads back the stored absolute OAuth token expiry; 4.x requires