openhands-sdk 1.49.2__tar.gz → 1.49.4__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 (305) hide show
  1. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/PKG-INFO +3 -3
  2. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_agent.py +62 -18
  3. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/agent_context.py +8 -0
  4. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm.py +4 -1
  5. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/model_features.py +1 -0
  6. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/verified_models.py +3 -0
  7. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/secret/__init__.py +6 -0
  8. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/secret/secrets.py +48 -0
  9. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/base.py +19 -4
  10. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/PKG-INFO +3 -3
  11. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/requires.txt +2 -2
  12. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/pyproject.toml +3 -3
  13. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/__init__.py +0 -0
  14. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/__init__.py +0 -0
  15. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_file_credentials.py +0 -0
  16. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_models.py +0 -0
  17. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/acp_tracing.py +0 -0
  18. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/agent.py +0 -0
  19. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/base.py +0 -0
  20. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/critic_mixin.py +0 -0
  21. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/parallel_executor.py +0 -0
  22. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/response_dispatch.py +0 -0
  23. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/stream_context.py +0 -0
  24. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/agent/utils.py +0 -0
  25. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/banner.py +0 -0
  26. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/__init__.py +0 -0
  27. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/__init__.py +0 -0
  28. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/base.py +0 -0
  29. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/llm_summarizing_condenser.py +0 -0
  30. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/no_op_condenser.py +0 -0
  31. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/pipeline_condenser.py +0 -0
  32. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/prompts/summarizing_prompt.j2 +0 -0
  33. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/condenser/utils.py +0 -0
  34. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/memory.py +0 -0
  35. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/__init__.py +0 -0
  36. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/presets.py +0 -0
  37. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/prompt.py +0 -0
  38. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/registry.py +0 -0
  39. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/section.py +0 -0
  40. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/__init__.py +0 -0
  41. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/dynamic.py +0 -0
  42. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/planning.py +0 -0
  43. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/sections/static.py +0 -0
  44. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/templates/ask_agent_template.j2 +0 -0
  45. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/prompts/templates/skill_knowledge_info.j2 +0 -0
  46. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/__init__.py +0 -0
  47. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/manipulation_indices.py +0 -0
  48. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/__init__.py +0 -0
  49. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/base.py +0 -0
  50. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/batch_atomicity.py +0 -0
  51. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/observation_uniqueness.py +0 -0
  52. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/tool_call_matching.py +0 -0
  53. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/properties/tool_loop_atomicity.py +0 -0
  54. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/context/view/view.py +0 -0
  55. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/__init__.py +0 -0
  56. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/base.py +0 -0
  57. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/cancellation.py +0 -0
  58. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/conversation.py +0 -0
  59. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/conversation_stats.py +0 -0
  60. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/event_store.py +0 -0
  61. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/events_list_base.py +0 -0
  62. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/exceptions.py +0 -0
  63. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/fifo_lock.py +0 -0
  64. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/__init__.py +0 -0
  65. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/controller.py +0 -0
  66. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/judge.py +0 -0
  67. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/prompts.py +0 -0
  68. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/goal/runner.py +0 -0
  69. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/__init__.py +0 -0
  70. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/local_conversation.py +0 -0
  71. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/impl/remote_conversation.py +0 -0
  72. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/persistence_const.py +0 -0
  73. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/request.py +0 -0
  74. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/resource_lock_manager.py +0 -0
  75. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/response_utils.py +0 -0
  76. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/secret_registry.py +0 -0
  77. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/state.py +0 -0
  78. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/stuck_detector.py +0 -0
  79. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/title_utils.py +0 -0
  80. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/types.py +0 -0
  81. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/visualizer/__init__.py +0 -0
  82. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/visualizer/base.py +0 -0
  83. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/conversation/visualizer/default.py +0 -0
  84. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/credential.py +0 -0
  85. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/__init__.py +0 -0
  86. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/base.py +0 -0
  87. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/__init__.py +0 -0
  88. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/agent_finished.py +0 -0
  89. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/__init__.py +0 -0
  90. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/chat_template.py +0 -0
  91. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/client.py +0 -0
  92. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/critic.py +0 -0
  93. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/api/taxonomy.py +0 -0
  94. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/empty_patch.py +0 -0
  95. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/impl/pass_critic.py +0 -0
  96. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/critic/result.py +0 -0
  97. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/__init__.py +0 -0
  98. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/acp_tool_call.py +0 -0
  99. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/base.py +0 -0
  100. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/condenser.py +0 -0
  101. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/conversation_error.py +0 -0
  102. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/conversation_state.py +0 -0
  103. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/error_classification.py +0 -0
  104. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/hook_execution.py +0 -0
  105. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_completion_log.py +0 -0
  106. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/__init__.py +0 -0
  107. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/action.py +0 -0
  108. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/message.py +0 -0
  109. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/observation.py +0 -0
  110. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/reasoning_utils.py +0 -0
  111. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/llm_convertible/system.py +0 -0
  112. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/resume_transcript.py +0 -0
  113. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/streaming_delta.py +0 -0
  114. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/token.py +0 -0
  115. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/types.py +0 -0
  116. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/event/user_action.py +0 -0
  117. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/__init__.py +0 -0
  118. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/fetch.py +0 -0
  119. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/__init__.py +0 -0
  120. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/info.py +0 -0
  121. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/interface.py +0 -0
  122. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/manager.py +0 -0
  123. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/metadata.py +0 -0
  124. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/extensions/installation/utils.py +0 -0
  125. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/cached_repo.py +0 -0
  126. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/exceptions.py +0 -0
  127. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/git_changes.py +0 -0
  128. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/git_commits.py +0 -0
  129. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/git_diff.py +0 -0
  130. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/models.py +0 -0
  131. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/git/utils.py +0 -0
  132. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/__init__.py +0 -0
  133. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/config.py +0 -0
  134. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/conversation_hooks.py +0 -0
  135. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/executor.py +0 -0
  136. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/manager.py +0 -0
  137. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/hooks/types.py +0 -0
  138. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/__init__.py +0 -0
  139. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/base.py +0 -0
  140. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/cache.py +0 -0
  141. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/local.py +0 -0
  142. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/io/memory.py +0 -0
  143. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/__init__.py +0 -0
  144. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/auth/__init__.py +0 -0
  145. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/auth/credentials.py +0 -0
  146. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/auth/openai.py +0 -0
  147. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/cleanup_profile.py +0 -0
  148. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/__init__.py +0 -0
  149. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/classifier.py +0 -0
  150. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/mapping.py +0 -0
  151. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/exceptions/types.py +0 -0
  152. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/fallback_strategy.py +0 -0
  153. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm_profile_store.py +0 -0
  154. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm_registry.py +0 -0
  155. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/llm_response.py +0 -0
  156. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/message.py +0 -0
  157. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/mixins/fn_call_converter.py +0 -0
  158. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/mixins/fn_call_examples.py +0 -0
  159. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/mixins/non_native_fc.py +0 -0
  160. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/__init__.py +0 -0
  161. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/chat_options.py +0 -0
  162. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/common.py +0 -0
  163. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/options/responses_options.py +0 -0
  164. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/provider_connection_store.py +0 -0
  165. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/__init__.py +0 -0
  166. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/base.py +0 -0
  167. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/impl/multimodal.py +0 -0
  168. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/router/impl/random.py +0 -0
  169. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/streaming.py +0 -0
  170. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/image_inline.py +0 -0
  171. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/image_resize.py +0 -0
  172. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/litellm_provider.py +0 -0
  173. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/metrics.py +0 -0
  174. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/model_info.py +0 -0
  175. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/model_prompt_spec.py +0 -0
  176. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/openhands_provider.py +0 -0
  177. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/providers/__init__.py +0 -0
  178. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/providers/openrouter.py +0 -0
  179. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/responses_serialization.py +0 -0
  180. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/retry_mixin.py +0 -0
  181. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/runtime_metadata.py +0 -0
  182. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/telemetry.py +0 -0
  183. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/unverified_models.py +0 -0
  184. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/llm/utils/vertex_preflight.py +0 -0
  185. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/logger/__init__.py +0 -0
  186. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/logger/logger.py +0 -0
  187. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/logger/rolling.py +0 -0
  188. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/__init__.py +0 -0
  189. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/registration.py +0 -0
  190. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/registry.py +0 -0
  191. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/marketplace/types.py +0 -0
  192. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/__init__.py +0 -0
  193. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/client.py +0 -0
  194. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/config.py +0 -0
  195. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/definition.py +0 -0
  196. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/exceptions.py +0 -0
  197. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/tool.py +0 -0
  198. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/mcp/utils.py +0 -0
  199. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/observability/__init__.py +0 -0
  200. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/observability/laminar.py +0 -0
  201. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/observability/utils.py +0 -0
  202. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/__init__.py +0 -0
  203. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/discovery.py +0 -0
  204. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/fetch.py +0 -0
  205. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/__init__.py +0 -0
  206. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/agent_plugins.py +0 -0
  207. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/agent_plugins_mcp.py +0 -0
  208. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/base.py +0 -0
  209. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/claude_code.py +0 -0
  210. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/schemas/mcp-1.0.0.schema.json +0 -0
  211. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/format/schemas/plugin-1.0.0.schema.json +0 -0
  212. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/installed.py +0 -0
  213. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/loader.py +0 -0
  214. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/plugin.py +0 -0
  215. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/source.py +0 -0
  216. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/plugin/types.py +0 -0
  217. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/__init__.py +0 -0
  218. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/agent_profile.py +0 -0
  219. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/agent_profile_store.py +0 -0
  220. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/profile_refs.py +0 -0
  221. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/resolver.py +0 -0
  222. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/profiles/seed.py +0 -0
  223. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/py.typed +0 -0
  224. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/__init__.py +0 -0
  225. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/_shell_ast.py +0 -0
  226. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/analyzer.py +0 -0
  227. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/confirmation_policy.py +0 -0
  228. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/__init__.py +0 -0
  229. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/pattern.py +0 -0
  230. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/policy_rails.py +0 -0
  231. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/shell_semantics.py +0 -0
  232. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/defense_in_depth/utils.py +0 -0
  233. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/ensemble.py +0 -0
  234. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/grayswan/__init__.py +0 -0
  235. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/grayswan/analyzer.py +0 -0
  236. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/grayswan/utils.py +0 -0
  237. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/llm_analyzer.py +0 -0
  238. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/risk.py +0 -0
  239. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/shell_parser.py +0 -0
  240. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/toolshield_helpers.py +0 -0
  241. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/security/toolshield_llm_analyzer.py +0 -0
  242. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/__init__.py +0 -0
  243. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/acp_install_catalog.py +0 -0
  244. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/acp_providers.py +0 -0
  245. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/api_models.py +0 -0
  246. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/metadata.py +0 -0
  247. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/settings/model.py +0 -0
  248. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/__init__.py +0 -0
  249. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/exceptions.py +0 -0
  250. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/execute.py +0 -0
  251. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/fetch.py +0 -0
  252. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/installed.py +0 -0
  253. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/skill.py +0 -0
  254. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/trigger.py +0 -0
  255. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/types.py +0 -0
  256. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/skills/utils.py +0 -0
  257. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/__init__.py +0 -0
  258. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/load.py +0 -0
  259. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/registry.py +0 -0
  260. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/subagent/schema.py +0 -0
  261. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/testing/__init__.py +0 -0
  262. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/testing/test_llm.py +0 -0
  263. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/__init__.py +0 -0
  264. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/__init__.py +0 -0
  265. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/finish.py +0 -0
  266. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/invoke_skill.py +0 -0
  267. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/switch_llm.py +0 -0
  268. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/think.py +0 -0
  269. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/builtins/vision_inspect.py +0 -0
  270. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/client_tool.py +0 -0
  271. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/defaults.py +0 -0
  272. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/registry.py +0 -0
  273. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/schema.py +0 -0
  274. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/spec.py +0 -0
  275. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/tool/tool.py +0 -0
  276. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/__init__.py +0 -0
  277. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/async_executor.py +0 -0
  278. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/async_utils.py +0 -0
  279. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/cipher.py +0 -0
  280. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/command.py +0 -0
  281. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/datetime.py +0 -0
  282. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/deprecation.py +0 -0
  283. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/files.py +0 -0
  284. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/github.py +0 -0
  285. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/json.py +0 -0
  286. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/models.py +0 -0
  287. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/paging.py +0 -0
  288. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/path.py +0 -0
  289. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/pydantic_secrets.py +0 -0
  290. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/redact.py +0 -0
  291. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/truncate.py +0 -0
  292. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/utils/visualize.py +0 -0
  293. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/__init__.py +0 -0
  294. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/base.py +0 -0
  295. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/local.py +0 -0
  296. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/models.py +0 -0
  297. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/__init__.py +0 -0
  298. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/async_remote_workspace.py +0 -0
  299. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/remote/remote_workspace_mixin.py +0 -0
  300. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/repo.py +0 -0
  301. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands/sdk/workspace/workspace.py +0 -0
  302. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/SOURCES.txt +0 -0
  303. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/dependency_links.txt +0 -0
  304. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/openhands_sdk.egg-info/top_level.txt +0 -0
  305. {openhands_sdk-1.49.2 → openhands_sdk-1.49.4}/setup.cfg +0 -0
@@ -1,20 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.49.2
3
+ Version: 1.49.4
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
7
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
- Requires-Dist: agent-client-protocol<0.11.0,>=0.10.1
10
+ Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
11
11
  Requires-Dist: deprecation>=2.1.0
12
12
  Requires-Dist: fakeredis[lua]>=2.32.1
13
13
  Requires-Dist: fastmcp<4,>=3.2.0
14
14
  Requires-Dist: filelock>=3.20.1
15
15
  Requires-Dist: httpx[socks]>=0.27.0
16
16
  Requires-Dist: jsonschema>=4.23.0
17
- Requires-Dist: joserfc>=1.6.8
17
+ Requires-Dist: joserfc>=1.7.5
18
18
  Requires-Dist: litellm>=1.93.0
19
19
  Requires-Dist: pillow>=12.3.0
20
20
  Requires-Dist: pydantic>=2.12.5
@@ -43,21 +43,34 @@ from acp.client.connection import ClientSideConnection
43
43
  from acp.exceptions import RequestError as ACPRequestError
44
44
  from acp.helpers import image_block, text_block
45
45
  from acp.schema import (
46
+ AcpMcpServer,
46
47
  AgentMessageChunk,
47
48
  AgentThoughtChunk,
48
49
  AllowedOutcome,
50
+ CreateElicitationResponse,
51
+ CreateTerminalResponse,
52
+ DeclineElicitationResponse,
53
+ ElicitationMode,
49
54
  EnvVariable,
50
55
  HttpHeader,
51
56
  HttpMcpServer,
52
57
  ImageContentBlock,
58
+ KillTerminalResponse,
53
59
  McpServerStdio,
60
+ PermissionOption,
54
61
  PromptResponse,
62
+ ReadTextFileResponse,
63
+ ReleaseTerminalResponse,
55
64
  RequestPermissionResponse,
56
65
  SseMcpServer,
66
+ TerminalOutputResponse,
57
67
  TextContentBlock,
58
68
  ToolCallProgress,
59
69
  ToolCallStart,
70
+ ToolCallUpdate,
60
71
  UsageUpdate,
72
+ WaitForTerminalExitResponse,
73
+ WriteTextFileResponse,
61
74
  )
62
75
  from acp.transports import default_environment
63
76
  from pydantic import (
@@ -617,14 +630,23 @@ async def _apply_acp_model(
617
630
  Codex, callers may still pass a combined Canvas id such as ``gpt-5.5/high``;
618
631
  codex-acp exposes reasoning effort as a separate config option, so split it
619
632
  only on the config-options mechanism.
633
+
634
+ agent-client-protocol 0.12.1 dropped the UNSTABLE ``models`` extension from
635
+ the ACP schema and removed ``ClientSideConnection.set_session_model``. A live
636
+ 0.12 connection therefore has no legacy RPC to call, so the ``else`` branch
637
+ only invokes it when the connection actually exposes the method (test
638
+ doubles do; real 0.12 connections do not) and otherwise no-ops rather than
639
+ raising ``AttributeError``.
620
640
  """
621
641
  if via_config_option:
622
642
  for config_id, value in _model_config_options(agent_name, model):
623
643
  await conn.set_config_option(
624
644
  config_id=config_id, value=value, session_id=session_id
625
645
  )
626
- else:
627
- await conn.set_session_model(model_id=model, session_id=session_id)
646
+ elif hasattr(conn, "set_session_model"):
647
+ await conn.set_session_model( # type: ignore[attr-defined]
648
+ model_id=model, session_id=session_id
649
+ )
628
650
 
629
651
 
630
652
  def _usable_models(infos: Iterable[ACPModelInfo]) -> list[ACPModelInfo]:
@@ -689,7 +711,7 @@ def _extract_session_models(
689
711
 
690
712
 
691
713
  # The ACP MCP server union accepted by new_session() / load_session().
692
- _ACPMcpServer = HttpMcpServer | SseMcpServer | McpServerStdio
714
+ _ACPMcpServer = HttpMcpServer | SseMcpServer | McpServerStdio | AcpMcpServer
693
715
 
694
716
 
695
717
  def _remote_mcp_headers(server: MCPServer, name: str) -> list[HttpHeader]:
@@ -1579,11 +1601,11 @@ class _OpenHandsACPBridge:
1579
1601
 
1580
1602
  async def request_permission(
1581
1603
  self,
1582
- options: list[Any],
1583
1604
  session_id: str, # noqa: ARG002
1584
- tool_call: Any,
1605
+ tool_call: ToolCallUpdate,
1606
+ options: list[PermissionOption],
1585
1607
  **kwargs: Any, # noqa: ARG002
1586
- ) -> Any:
1608
+ ) -> RequestPermissionResponse:
1587
1609
  """Auto-approve all permission requests from the ACP server."""
1588
1610
  # Pick the first option (usually "allow once")
1589
1611
  option_id = options[0].option_id if options else "allow_once"
@@ -1596,52 +1618,74 @@ class _OpenHandsACPBridge:
1596
1618
  outcome=AllowedOutcome(outcome="selected", option_id=option_id),
1597
1619
  )
1598
1620
 
1621
+ async def create_elicitation(
1622
+ self,
1623
+ message: str, # noqa: ARG002
1624
+ mode: ElicitationMode, # noqa: ARG002
1625
+ **kwargs: Any, # noqa: ARG002
1626
+ ) -> CreateElicitationResponse:
1627
+ """Decline elicitation requests; the headless bridge has no user to ask.
1628
+
1629
+ Added to the ``Client`` protocol in agent-client-protocol 0.12.x. None
1630
+ of the pinned ACP providers elicit during a headless turn, so this is a
1631
+ defensive default rather than an exercised code path.
1632
+ """
1633
+ return DeclineElicitationResponse(action="decline")
1634
+
1635
+ async def complete_elicitation(
1636
+ self,
1637
+ elicitation_id: str, # noqa: ARG002
1638
+ **kwargs: Any, # noqa: ARG002
1639
+ ) -> None:
1640
+ """No-op completion for an elicitation the bridge always declines."""
1641
+ return None
1642
+
1599
1643
  # fs/terminal methods — raise NotImplementedError; ACP server handles its own
1600
1644
  async def write_text_file(
1601
- self, content: str, path: str, session_id: str, **kwargs: Any
1602
- ) -> None:
1645
+ self, session_id: str, path: str, content: str, **kwargs: Any
1646
+ ) -> WriteTextFileResponse | None:
1603
1647
  raise NotImplementedError("ACP server handles file operations")
1604
1648
 
1605
1649
  async def read_text_file(
1606
1650
  self,
1607
- path: str,
1608
1651
  session_id: str,
1609
- limit: int | None = None,
1652
+ path: str,
1610
1653
  line: int | None = None,
1654
+ limit: int | None = None,
1611
1655
  **kwargs: Any,
1612
- ) -> Any:
1656
+ ) -> ReadTextFileResponse:
1613
1657
  raise NotImplementedError("ACP server handles file operations")
1614
1658
 
1615
1659
  async def create_terminal(
1616
1660
  self,
1617
- command: str,
1618
1661
  session_id: str,
1662
+ command: str,
1619
1663
  args: list[str] | None = None,
1664
+ env: list[EnvVariable] | None = None,
1620
1665
  cwd: str | None = None,
1621
- env: Any = None,
1622
1666
  output_byte_limit: int | None = None,
1623
1667
  **kwargs: Any,
1624
- ) -> Any:
1668
+ ) -> CreateTerminalResponse:
1625
1669
  raise NotImplementedError("ACP server handles terminal operations")
1626
1670
 
1627
1671
  async def terminal_output(
1628
1672
  self, session_id: str, terminal_id: str, **kwargs: Any
1629
- ) -> Any:
1673
+ ) -> TerminalOutputResponse:
1630
1674
  raise NotImplementedError("ACP server handles terminal operations")
1631
1675
 
1632
1676
  async def release_terminal(
1633
1677
  self, session_id: str, terminal_id: str, **kwargs: Any
1634
- ) -> None:
1678
+ ) -> ReleaseTerminalResponse | None:
1635
1679
  raise NotImplementedError("ACP server handles terminal operations")
1636
1680
 
1637
1681
  async def wait_for_terminal_exit(
1638
1682
  self, session_id: str, terminal_id: str, **kwargs: Any
1639
- ) -> Any:
1683
+ ) -> WaitForTerminalExitResponse:
1640
1684
  raise NotImplementedError("ACP server handles terminal operations")
1641
1685
 
1642
1686
  async def kill_terminal(
1643
1687
  self, session_id: str, terminal_id: str, **kwargs: Any
1644
- ) -> None:
1688
+ ) -> KillTerminalResponse | None:
1645
1689
  raise NotImplementedError("ACP server handles terminal operations")
1646
1690
 
1647
1691
  async def ext_method(
@@ -260,6 +260,14 @@ class AgentContext(BaseModel):
260
260
  @model_validator(mode="after")
261
261
  def _load_auto_skills(self):
262
262
  """Load user/legacy-public skills if enabled, then apply ``disabled_skills``."""
263
+ return self.resolve_auto_skills()
264
+
265
+ def resolve_auto_skills(self) -> AgentContext:
266
+ """Resolve ``load_*_skills`` into ``skills`` and apply ``disabled_skills``.
267
+
268
+ Exposed because ``model_copy`` skips validators: callers that rebuild a
269
+ context that way must re-run this or the deny-list silently won't apply.
270
+ """
263
271
  include_public = self.load_public_skills
264
272
  if self.load_user_skills or include_public:
265
273
  auto_skills = load_available_skills(
@@ -1129,8 +1129,11 @@ class LLM(BaseModel, RetryMixin, NonNativeToolCallingMixin):
1129
1129
  ):
1130
1130
  delta = event.delta
1131
1131
  if delta:
1132
+ # ModelResponseStream mints a fresh id per instance, and a
1133
+ # changed chunk id reads as a retry (StreamContext._emit_delta).
1132
1134
  delta_chunk = ModelResponseStream(
1133
- choices=[StreamingChoices(delta=Delta(content=delta))]
1135
+ id=event.item_id,
1136
+ choices=[StreamingChoices(delta=Delta(content=delta))],
1134
1137
  )
1135
1138
 
1136
1139
  return output_item, delta_chunk
@@ -221,6 +221,7 @@ SEND_REASONING_CONTENT_MODELS: list[str] = [
221
221
  "deepseek/deepseek-reasoner",
222
222
  "deepseek/deepseek-v4-pro", # Dual-mode (Thinking/Non-Thinking)
223
223
  "deepseek/deepseek-v4-flash", # Dual-mode (Thinking/Non-Thinking)
224
+ "deepseek/deepseek-v4.1-flash", # Dual-mode (Thinking/Non-Thinking)
224
225
  ]
225
226
 
226
227
  # Match token -> canonical LiteLLM ID for vision metadata overrides.
@@ -53,6 +53,7 @@ VERIFIED_DEEPSEEK_MODELS = [
53
53
  "deepseek-v4-pro",
54
54
  "deepseek-v4-flash",
55
55
  "deepseek-v4-flash-vision-exp",
56
+ "deepseek-v4.1-flash",
56
57
  "deepseek-v3.2-reasoner",
57
58
  ]
58
59
 
@@ -81,6 +82,7 @@ VERIFIED_GLM_MODELS = [
81
82
  VERIFIED_NVIDIA_MODELS = [
82
83
  "nemotron-3.5-lightning-30b-a3b",
83
84
  "nemotron-3-nano",
85
+ "nemotron-3-nano-omni-30b-a3b-reasoning",
84
86
  "nemotron-3-super-120b-a12b",
85
87
  "nemotron-3-ultra-550b-a55b",
86
88
  ]
@@ -123,6 +125,7 @@ VERIFIED_OPENHANDS_MODELS = [
123
125
  "deepseek-v4-pro",
124
126
  "deepseek-v4-flash",
125
127
  "deepseek-v4-flash-vision-exp",
128
+ "deepseek-v4.1-flash",
126
129
  "deepseek-v3.2-reasoner",
127
130
  "kimi-k3",
128
131
  "kimi-k2.7-code",
@@ -4,16 +4,22 @@ This module provides classes and types for managing secrets in OpenHands.
4
4
  """
5
5
 
6
6
  from openhands.sdk.secret.secrets import (
7
+ LocalSecretResolver,
7
8
  LookupSecret,
8
9
  SecretSource,
9
10
  SecretValue,
10
11
  StaticSecret,
12
+ register_local_secret_resolver,
13
+ unregister_local_secret_resolver,
11
14
  )
12
15
 
13
16
 
14
17
  __all__ = [
18
+ "LocalSecretResolver",
15
19
  "SecretSource",
16
20
  "StaticSecret",
17
21
  "LookupSecret",
18
22
  "SecretValue",
23
+ "register_local_secret_resolver",
24
+ "unregister_local_secret_resolver",
19
25
  ]
@@ -2,6 +2,7 @@
2
2
 
3
3
  import os
4
4
  from abc import ABC, abstractmethod
5
+ from collections.abc import Callable
5
6
  from urllib.parse import urljoin, urlsplit
6
7
 
7
8
  import httpx
@@ -32,6 +33,50 @@ def _resolve_lookup_secret_url(url: str) -> str:
32
33
  return urljoin(f"{base_url.rstrip('/')}/", url)
33
34
 
34
35
 
36
+ LocalSecretResolver = Callable[[str], str | None]
37
+
38
+ _local_secret_resolvers: list[LocalSecretResolver] = []
39
+
40
+
41
+ def register_local_secret_resolver(resolver: LocalSecretResolver) -> None:
42
+ """Register an in-process resolver for ``LookupSecret`` URLs.
43
+
44
+ A process that both serves and consumes ``LookupSecret`` URLs — an
45
+ agent-server running an in-process conversation, say — cannot fetch them
46
+ over HTTP from its own event loop: the request can only be answered by the
47
+ loop that is blocked waiting for it, so it stalls until the client times
48
+ out. Registering a resolver lets such a process answer its own URLs
49
+ directly and skip the round trip.
50
+
51
+ The resolver receives the fully-resolved URL and returns the secret value,
52
+ or ``None`` when it does not serve that URL, in which case resolution falls
53
+ through to the next resolver and finally to HTTP.
54
+ """
55
+ if resolver not in _local_secret_resolvers:
56
+ _local_secret_resolvers.append(resolver)
57
+
58
+
59
+ def unregister_local_secret_resolver(resolver: LocalSecretResolver) -> None:
60
+ """Remove a resolver registered with ``register_local_secret_resolver``."""
61
+ if resolver in _local_secret_resolvers:
62
+ _local_secret_resolvers.remove(resolver)
63
+
64
+
65
+ def _resolve_secret_locally(url: str) -> str | None:
66
+ """Return a locally-served value for ``url``, or ``None`` if there is none."""
67
+ for resolver in list(_local_secret_resolvers):
68
+ try:
69
+ value = resolver(url)
70
+ except Exception:
71
+ logger.warning(
72
+ "Local secret resolver raised; falling back to HTTP", exc_info=True
73
+ )
74
+ continue
75
+ if value is not None:
76
+ return value
77
+ return None
78
+
79
+
35
80
  class SecretSource(DiscriminatedUnionMixin, ABC):
36
81
  """Source for a named secret which may be obtained dynamically"""
37
82
 
@@ -77,6 +122,9 @@ class LookupSecret(SecretSource):
77
122
  return _resolve_lookup_secret_url(url)
78
123
 
79
124
  def get_value(self) -> str:
125
+ local_value = _resolve_secret_locally(self.url)
126
+ if local_value is not None:
127
+ return local_value
80
128
  response = httpx.get(self.url, headers=self.headers, timeout=30.0)
81
129
  response.raise_for_status()
82
130
  return response.text
@@ -886,6 +886,7 @@ class RemoteWorkspace(RemoteWorkspaceMixin, BaseWorkspace):
886
886
  load_project: bool = True,
887
887
  load_org: bool = True,
888
888
  timeout: float = 60.0,
889
+ base_context: "AgentContext | None" = None,
889
890
  ) -> tuple[list["Skill"], "AgentContext"]:
890
891
  """Load skills via the agent-server's /api/skills endpoint.
891
892
 
@@ -906,6 +907,11 @@ class RemoteWorkspace(RemoteWorkspaceMixin, BaseWorkspace):
906
907
  load_project: Load project skills from workspace directories.
907
908
  load_org: Load organization-level skills.
908
909
  timeout: Request timeout in seconds.
910
+ base_context: Existing AgentContext to preserve. All of its
911
+ fields survive except `skills` and `load_public_skills`,
912
+ which this method always sets based on whether skills
913
+ were found. Defaults to None, which starts from a fresh
914
+ AgentContext — today's behavior.
909
915
 
910
916
  Returns:
911
917
  Tuple of (list of Skill objects, AgentContext).
@@ -958,11 +964,20 @@ class RemoteWorkspace(RemoteWorkspaceMixin, BaseWorkspace):
958
964
  if loaded_skills:
959
965
  logger.debug(f"Skills: {[s.name for s in loaded_skills]}")
960
966
 
961
- # Create AgentContext - fall back to public skills if none loaded
967
+ # Update `base_context` (or start fresh if none given) with the
968
+ # newly loaded skills — every other field the caller configured is
969
+ # preserved. Fall back to public skills if none loaded.
970
+ base = base_context if base_context is not None else AgentContext()
962
971
  if loaded_skills:
963
- agent_context = AgentContext(skills=loaded_skills, load_public_skills=False)
972
+ agent_context = base.model_copy(
973
+ update={"skills": loaded_skills, "load_public_skills": False}
974
+ )
964
975
  else:
965
976
  logger.warning("No skills loaded, falling back to public skills")
966
- agent_context = AgentContext(skills=[], load_public_skills=True)
977
+ agent_context = base.model_copy(
978
+ update={"skills": [], "load_public_skills": True}
979
+ )
967
980
 
968
- return loaded_skills, agent_context
981
+ # ``model_copy`` skips validators, so re-run the resolution that
982
+ # applies ``load_*_skills`` and the ``disabled_skills`` deny-list.
983
+ return loaded_skills, agent_context.resolve_auto_skills()
@@ -1,20 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-sdk
3
- Version: 1.49.2
3
+ Version: 1.49.4
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
7
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
- Requires-Dist: agent-client-protocol<0.11.0,>=0.10.1
10
+ Requires-Dist: agent-client-protocol<0.13.0,>=0.12.1
11
11
  Requires-Dist: deprecation>=2.1.0
12
12
  Requires-Dist: fakeredis[lua]>=2.32.1
13
13
  Requires-Dist: fastmcp<4,>=3.2.0
14
14
  Requires-Dist: filelock>=3.20.1
15
15
  Requires-Dist: httpx[socks]>=0.27.0
16
16
  Requires-Dist: jsonschema>=4.23.0
17
- Requires-Dist: joserfc>=1.6.8
17
+ Requires-Dist: joserfc>=1.7.5
18
18
  Requires-Dist: litellm>=1.93.0
19
19
  Requires-Dist: pillow>=12.3.0
20
20
  Requires-Dist: pydantic>=2.12.5
@@ -1,11 +1,11 @@
1
- agent-client-protocol<0.11.0,>=0.10.1
1
+ agent-client-protocol<0.13.0,>=0.12.1
2
2
  deprecation>=2.1.0
3
3
  fakeredis[lua]>=2.32.1
4
4
  fastmcp<4,>=3.2.0
5
5
  filelock>=3.20.1
6
6
  httpx[socks]>=0.27.0
7
7
  jsonschema>=4.23.0
8
- joserfc>=1.6.8
8
+ joserfc>=1.7.5
9
9
  litellm>=1.93.0
10
10
  pillow>=12.3.0
11
11
  pydantic>=2.12.5
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "openhands-sdk"
3
- version = "1.49.2"
3
+ version = "1.49.4"
4
4
  description = "OpenHands SDK - Core functionality for building AI agents"
5
5
 
6
6
  requires-python = ">=3.12"
7
7
  dependencies = [
8
- "agent-client-protocol>=0.10.1,<0.11.0", # 0.11.0 reordered prompt() args, broke the client (#4830)
8
+ "agent-client-protocol>=0.12.1,<0.13.0", # 0.11.0 reordered prompt() args, broke the client (#4830)
9
9
  "deprecation>=2.1.0",
10
10
  "fakeredis[lua]>=2.32.1", # Explicit dependency for docket/fastmcp background tasks
11
11
  # 3.2.0 reads back the stored absolute OAuth token expiry; 4.x requires
@@ -14,7 +14,7 @@ dependencies = [
14
14
  "filelock>=3.20.1",
15
15
  "httpx[socks]>=0.27.0",
16
16
  "jsonschema>=4.23.0",
17
- "joserfc>=1.6.8",
17
+ "joserfc>=1.7.5",
18
18
  "litellm>=1.93.0",
19
19
  "pillow>=12.3.0",
20
20
  "pydantic>=2.12.5",