superqode 2.2.2__tar.gz → 2.2.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 (1036) hide show
  1. {superqode-2.2.2 → superqode-2.2.3}/CHANGELOG.md +29 -0
  2. {superqode-2.2.2 → superqode-2.2.3}/PKG-INFO +1 -1
  3. {superqode-2.2.2 → superqode-2.2.3}/pyproject.toml +1 -1
  4. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/__init__.py +1 -1
  5. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/uhp_client.py +46 -6
  6. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/uhp_server.py +95 -26
  7. {superqode-2.2.2 → superqode-2.2.3}/src/superqode.egg-info/PKG-INFO +1 -1
  8. {superqode-2.2.2 → superqode-2.2.3}/tests/test_uhp_client.py +103 -0
  9. {superqode-2.2.2 → superqode-2.2.3}/tests/test_uhp_server.py +142 -0
  10. {superqode-2.2.2 → superqode-2.2.3}/LICENSE +0 -0
  11. {superqode-2.2.2 → superqode-2.2.3}/MANIFEST.in +0 -0
  12. {superqode-2.2.2 → superqode-2.2.3}/NOTICE +0 -0
  13. {superqode-2.2.2 → superqode-2.2.3}/README.md +0 -0
  14. {superqode-2.2.2 → superqode-2.2.3}/examples/README.md +0 -0
  15. {superqode-2.2.2 → superqode-2.2.3}/examples/a2a/README.md +0 -0
  16. {superqode-2.2.2 → superqode-2.2.3}/examples/a2a/smoke_client.py +0 -0
  17. {superqode-2.2.2 → superqode-2.2.3}/examples/bench/dspy-comprehension.manifest.yaml +0 -0
  18. {superqode-2.2.2 → superqode-2.2.3}/examples/bench/dspy-comprehension.yaml +0 -0
  19. {superqode-2.2.2 → superqode-2.2.3}/examples/bench/spec-core.yaml +0 -0
  20. {superqode-2.2.2 → superqode-2.2.3}/examples/bench/spec-deepagents.yaml +0 -0
  21. {superqode-2.2.2 → superqode-2.2.3}/examples/bench/spec-prime-agent.yaml +0 -0
  22. {superqode-2.2.2 → superqode-2.2.3}/examples/byok-acp-team.yaml +0 -0
  23. {superqode-2.2.2 → superqode-2.2.3}/examples/codex_sdk_quickstart.py +0 -0
  24. {superqode-2.2.2 → superqode-2.2.3}/examples/evals/omni-release.yaml +0 -0
  25. {superqode-2.2.2 → superqode-2.2.3}/examples/evals/omni-tiny.yaml +0 -0
  26. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/README.md +0 -0
  27. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/manifest-guard/context.md +0 -0
  28. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/manifest-guard/hooks.py +0 -0
  29. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/manifest-guard/tools.py +0 -0
  30. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/packages/README.md +0 -0
  31. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/packages/broken-extension/src/superqode_example_broken/__init__.py +0 -0
  32. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/packages/policy-extension/src/superqode_example_policy/__init__.py +0 -0
  33. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/packages/skill-extension/src/superqode_example_skill/SKILL.md +0 -0
  34. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/packages/skill-extension/src/superqode_example_skill/__init__.py +0 -0
  35. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/packages/tool-extension/src/superqode_example_tool/__init__.py +0 -0
  36. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/packages/tool-extension-v2/src/superqode_example_tool/__init__.py +0 -0
  37. {superqode-2.2.2 → superqode-2.2.3}/examples/extensions/python-package/src/superqode_example_extension/__init__.py +0 -0
  38. {superqode-2.2.2 → superqode-2.2.3}/examples/harness-packages/README.md +0 -0
  39. {superqode-2.2.2 → superqode-2.2.3}/examples/harness-packages/hello-harness/src/superqode_hello_harness/__init__.py +0 -0
  40. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/coding.yaml +0 -0
  41. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/deepagents.yaml +0 -0
  42. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/deepseek-harness.yaml +0 -0
  43. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/ds4.yaml +0 -0
  44. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/gemma4.yaml +0 -0
  45. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/google-adk.yaml +0 -0
  46. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/local-recursive-dynamic.yaml +0 -0
  47. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/mcp-docs.yaml +0 -0
  48. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/no-tool.yaml +0 -0
  49. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/omni-tiny-local.yaml +0 -0
  50. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/omnigent-multi-agent.yaml +0 -0
  51. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/openai-agents.yaml +0 -0
  52. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/prime-agent.yaml +0 -0
  53. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/pydanticai.yaml +0 -0
  54. {superqode-2.2.2 → superqode-2.2.3}/examples/harnesses/rlm-code-lid.yaml +0 -0
  55. {superqode-2.2.2 → superqode-2.2.3}/examples/local-models-team.yaml +0 -0
  56. {superqode-2.2.2 → superqode-2.2.3}/examples/mcp/local_docs_server.py +0 -0
  57. {superqode-2.2.2 → superqode-2.2.3}/examples/omnigent-multi-agent.agent.yaml +0 -0
  58. {superqode-2.2.2 → superqode-2.2.3}/examples/qm-deployment-layer/README.md +0 -0
  59. {superqode-2.2.2 → superqode-2.2.3}/examples/qm-deployment-layer/sandbox/skills/superqode-harness/SKILL.md +0 -0
  60. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/INCIDENT.md +0 -0
  61. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/README.md +0 -0
  62. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/RUNBOOK.md +0 -0
  63. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/deploy_audit/__init__.py +0 -0
  64. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/deploy_audit/parser.py +0 -0
  65. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/deploy_audit/report.py +0 -0
  66. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/rlm-docker.yaml +0 -0
  67. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/rlm-monty.yaml +0 -0
  68. {superqode-2.2.2 → superqode-2.2.3}/examples/rlm-demo/tests/test_report.py +0 -0
  69. {superqode-2.2.2 → superqode-2.2.3}/examples/simple-team.yaml +0 -0
  70. {superqode-2.2.2 → superqode-2.2.3}/scripts/check_release_metadata.py +0 -0
  71. {superqode-2.2.2 → superqode-2.2.3}/setup.cfg +0 -0
  72. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/__init__.py +0 -0
  73. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/client.py +0 -0
  74. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/conformance.py +0 -0
  75. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/connection.py +0 -0
  76. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/context.py +0 -0
  77. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/inspect.py +0 -0
  78. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/keys.py +0 -0
  79. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/limits.py +0 -0
  80. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/oauth.py +0 -0
  81. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/presets.py +0 -0
  82. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/registry.py +0 -0
  83. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/reply.py +0 -0
  84. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/security.py +0 -0
  85. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/server.py +0 -0
  86. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/shortlist.py +0 -0
  87. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/skills.py +0 -0
  88. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/tools.py +0 -0
  89. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/trust.py +0 -0
  90. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/types.py +0 -0
  91. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/understand.py +0 -0
  92. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/a2a/workflows.py +0 -0
  93. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/__init__.py +0 -0
  94. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/client.py +0 -0
  95. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/doctor.py +0 -0
  96. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/permission_screen.py +0 -0
  97. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/permission_store.py +0 -0
  98. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/render.py +0 -0
  99. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/server.py +0 -0
  100. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/session_store.py +0 -0
  101. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/slash.py +0 -0
  102. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/tool_call_context.py +0 -0
  103. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp/types.py +0 -0
  104. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/acp_discovery.py +0 -0
  105. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/__init__.py +0 -0
  106. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/auto_memory.py +0 -0
  107. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/command_safety.py +0 -0
  108. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/compaction.py +0 -0
  109. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/context_manager.py +0 -0
  110. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/edit_strategies.py +0 -0
  111. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/exec_policy.py +0 -0
  112. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/hooks.py +0 -0
  113. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/loop.py +0 -0
  114. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/loop_guard.py +0 -0
  115. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/loop_policy.py +0 -0
  116. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/network_policy.py +0 -0
  117. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/output_handler.py +0 -0
  118. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/parallel_compare.py +0 -0
  119. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/peer_agents.py +0 -0
  120. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/plan_mode.py +0 -0
  121. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/reminders.py +0 -0
  122. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/rubric.py +0 -0
  123. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/session_manager.py +0 -0
  124. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/structured_output.py +0 -0
  125. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/summarization.py +0 -0
  126. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/system_prompts.py +0 -0
  127. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/terminal_output_limits.py +0 -0
  128. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/text_tool_calls.py +0 -0
  129. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/tool_args.py +0 -0
  130. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/tool_tracking.py +0 -0
  131. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent/utility_model.py +0 -0
  132. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent_output.py +0 -0
  133. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agent_stream.py +0 -0
  134. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/__init__.py +0 -0
  135. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/acp_registry.py +0 -0
  136. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/client.py +0 -0
  137. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/agentpool.phil65.github.io.toml +0 -0
  138. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/ampcode.com.toml +0 -0
  139. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/augmentcode.com.toml +0 -0
  140. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/autodev.github.io.toml +0 -0
  141. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/blackbox.ai.toml +0 -0
  142. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/bub.dev.toml +0 -0
  143. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/cagent.dev.toml +0 -0
  144. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/claude.com.toml +0 -0
  145. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/cline.bot.toml +0 -0
  146. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/codeassistant.dev.toml +0 -0
  147. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/codebuddy.tencent.com.toml +0 -0
  148. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/codex.openai.com.toml +0 -0
  149. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/copilot.github.com.toml +0 -0
  150. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/cortex.snowflake.com.toml +0 -0
  151. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/crow-ai.dev.toml +0 -0
  152. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/cursor.com.toml +0 -0
  153. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/deepagents-code.langchain.com.toml +0 -0
  154. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/deepagents.langchain.com.toml +0 -0
  155. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/devin.ai.toml +0 -0
  156. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/dirac.run.toml +0 -0
  157. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/factory.ai.toml +0 -0
  158. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/fastagent.ai.toml +0 -0
  159. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/fount.dev.toml +0 -0
  160. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/fx.sh.toml +0 -0
  161. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/geminicli.com.toml +0 -0
  162. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/glm.z.ai.toml +0 -0
  163. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/goose.block.xyz.toml +0 -0
  164. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/harnlang.com.toml +0 -0
  165. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/hermes-agent.nousresearch.com.toml +0 -0
  166. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
  167. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/kilo.ai.toml +0 -0
  168. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
  169. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/kiro.dev.toml +0 -0
  170. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/llmlingagent.dev.toml +0 -0
  171. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/minioncode.dev.toml +0 -0
  172. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/mistral-vibe.mistral.ai.toml +0 -0
  173. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/openclaw.ai.toml +0 -0
  174. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/opencode.ai.toml +0 -0
  175. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/openhands.dev.toml +0 -0
  176. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/pi.dev.toml +0 -0
  177. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/poolside.ai.toml +0 -0
  178. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/primeintellect.ai.toml +0 -0
  179. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/qoder.com.toml +0 -0
  180. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/qwenlm.github.io.toml +0 -0
  181. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/sigit.dev.toml +0 -0
  182. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/stakpak.dev.toml +0 -0
  183. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/stdiobus.dev.toml +0 -0
  184. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/vtcode.dev.toml +0 -0
  185. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/data/x.ai.toml +0 -0
  186. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/discovery.py +0 -0
  187. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/free_models.py +0 -0
  188. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/install_commands.py +0 -0
  189. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/messaging.py +0 -0
  190. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/official_acp.py +0 -0
  191. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/persona.py +0 -0
  192. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/registry.py +0 -0
  193. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/schema.py +0 -0
  194. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/agents/unified.py +0 -0
  195. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/__init__.py +0 -0
  196. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/async_utils.py +0 -0
  197. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/capabilities.py +0 -0
  198. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/constants.py +0 -0
  199. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/css.py +0 -0
  200. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/harness_picker.py +0 -0
  201. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/inputs.py +0 -0
  202. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/__init__.py +0 -0
  203. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/actions_misc.py +0 -0
  204. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/agent_run.py +0 -0
  205. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/build_harness.py +0 -0
  206. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/clickable_commands.py +0 -0
  207. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/codex.py +0 -0
  208. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/commands_impl.py +0 -0
  209. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/completion.py +0 -0
  210. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/connect.py +0 -0
  211. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/dialogs.py +0 -0
  212. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/events.py +0 -0
  213. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/explore.py +0 -0
  214. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/factory.py +0 -0
  215. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/feedback.py +0 -0
  216. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/formatting.py +0 -0
  217. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/harness_hub.py +0 -0
  218. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_clipboard.py +0 -0
  219. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_completion_helpers.py +0 -0
  220. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_diff_review.py +0 -0
  221. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_exit_lifecycle.py +0 -0
  222. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_file_view.py +0 -0
  223. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_interaction_mode.py +0 -0
  224. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_mcp_attach.py +0 -0
  225. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_message_queue.py +0 -0
  226. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_permissions.py +0 -0
  227. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_recipes_skills.py +0 -0
  228. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_share.py +0 -0
  229. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_startup.py +0 -0
  230. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_todos_plan.py +0 -0
  231. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_vim.py +0 -0
  232. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helper_wizard.py +0 -0
  233. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/helpers.py +0 -0
  234. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/huggingface.py +0 -0
  235. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/local_models.py +0 -0
  236. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/mcp.py +0 -0
  237. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/model_catalog.py +0 -0
  238. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/pickers.py +0 -0
  239. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/pipy_commands.py +0 -0
  240. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/rlm_commands.py +0 -0
  241. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/sidebar.py +0 -0
  242. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/slash_commands.py +0 -0
  243. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/switchboard.py +0 -0
  244. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/mixins/tour.py +0 -0
  245. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/models.py +0 -0
  246. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/navigation.py +0 -0
  247. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/outcomes.py +0 -0
  248. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/progress.py +0 -0
  249. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/prompt_stack.py +0 -0
  250. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/recipes.py +0 -0
  251. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/session_state.py +0 -0
  252. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/suggester.py +0 -0
  253. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/theme_bridge.py +0 -0
  254. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/welcome.py +0 -0
  255. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app/widgets.py +0 -0
  256. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app_enhanced.py +0 -0
  257. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/app_main.py +0 -0
  258. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/approval.py +0 -0
  259. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/atomic.py +0 -0
  260. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/auth/__init__.py +0 -0
  261. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/benchmarks.py +0 -0
  262. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/channels/__init__.py +0 -0
  263. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/channels/config.py +0 -0
  264. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/channels/discord.py +0 -0
  265. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/channels/service.py +0 -0
  266. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/channels/slack.py +0 -0
  267. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/channels/telegram.py +0 -0
  268. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/claude.py +0 -0
  269. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/codex.py +0 -0
  270. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/__init__.py +0 -0
  271. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/a2a.py +0 -0
  272. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/a2a_connect.py +0 -0
  273. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/a2a_keys.py +0 -0
  274. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/acp.py +0 -0
  275. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/agents.py +0 -0
  276. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/auth.py +0 -0
  277. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/benchmark.py +0 -0
  278. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/config.py +0 -0
  279. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/connect.py +0 -0
  280. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/daemon.py +0 -0
  281. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/factory.py +0 -0
  282. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/gauge.py +0 -0
  283. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/__init__.py +0 -0
  284. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/_group.py +0 -0
  285. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/_helpers.py +0 -0
  286. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/bench.py +0 -0
  287. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/candidates.py +0 -0
  288. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/evaluation.py +0 -0
  289. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/evidence.py +0 -0
  290. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/inbox.py +0 -0
  291. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/lifecycle.py +0 -0
  292. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/logbook.py +0 -0
  293. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/observability.py +0 -0
  294. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/optimization.py +0 -0
  295. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/promotion.py +0 -0
  296. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/protocol.py +0 -0
  297. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/registry.py +0 -0
  298. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/replay.py +0 -0
  299. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/run_history.py +0 -0
  300. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/harness/worker.py +0 -0
  301. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/hub.py +0 -0
  302. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/local.py +0 -0
  303. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/memory.py +0 -0
  304. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/models.py +0 -0
  305. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/plugins.py +0 -0
  306. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/policy.py +0 -0
  307. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/profiles.py +0 -0
  308. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/providers.py +0 -0
  309. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/runtime.py +0 -0
  310. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/sandbox.py +0 -0
  311. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/serve.py +0 -0
  312. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/sessions.py +0 -0
  313. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/share.py +0 -0
  314. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/skillopt.py +0 -0
  315. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/skills.py +0 -0
  316. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/tools.py +0 -0
  317. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/trust.py +0 -0
  318. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/uhp.py +0 -0
  319. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/update.py +0 -0
  320. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/commands/work.py +0 -0
  321. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/config/__init__.py +0 -0
  322. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/config/loader.py +0 -0
  323. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/config/schema.py +0 -0
  324. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/core/__init__.py +0 -0
  325. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/danger.py +0 -0
  326. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/data/eval_fixtures/ci-dynamic-root-cause.log +0 -0
  327. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/data/eval_fixtures/ci-root-cause.log +0 -0
  328. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/data/eval_packs/local_dynamic_workflow_smoke.yaml +0 -0
  329. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/data/eval_packs/local_recursive_smoke.yaml +0 -0
  330. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/data/superqode-template.yaml +0 -0
  331. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/design_system.py +0 -0
  332. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/dialogs/__init__.py +0 -0
  333. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/dialogs/base.py +0 -0
  334. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/dialogs/model.py +0 -0
  335. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/dialogs/provider.py +0 -0
  336. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/dialogs/runtime.py +0 -0
  337. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/diff_view.py +0 -0
  338. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/enterprise.py +0 -0
  339. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/evaluation/__init__.py +0 -0
  340. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/evaluation/adapters.py +0 -0
  341. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/evaluation/behaviors.py +0 -0
  342. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/evaluation/engine.py +0 -0
  343. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/evaluation/scenarios.py +0 -0
  344. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/execution/__init__.py +0 -0
  345. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/execution/linter.py +0 -0
  346. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/execution/modes.py +0 -0
  347. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/execution/resolver.py +0 -0
  348. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/execution/runner.py +0 -0
  349. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/extensions.py +0 -0
  350. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/file_explorer.py +0 -0
  351. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/file_viewer.py +0 -0
  352. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/flash.py +0 -0
  353. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/gauge/__init__.py +0 -0
  354. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/gauge/levels.py +0 -0
  355. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/gauge/record.py +0 -0
  356. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/gauge/sources.py +0 -0
  357. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/governance.py +0 -0
  358. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/__init__.py +0 -0
  359. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/accelerator.py +0 -0
  360. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/agent_importer.py +0 -0
  361. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/approval_memory.py +0 -0
  362. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/__init__.py +0 -0
  363. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/base.py +0 -0
  364. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/deepagents.py +0 -0
  365. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/dsh.py +0 -0
  366. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/managed.py +0 -0
  367. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/pipy.py +0 -0
  368. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/prime_agent.py +0 -0
  369. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/pydanticai.py +0 -0
  370. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/registry.py +0 -0
  371. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/rlm.py +0 -0
  372. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/rlm_code.py +0 -0
  373. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/runtime.py +0 -0
  374. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/tau.py +0 -0
  375. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/backends/uhp.py +0 -0
  376. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/bench.py +0 -0
  377. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/catalog.py +0 -0
  378. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/compiler.py +0 -0
  379. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/conformance.py +0 -0
  380. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/context_handles.py +0 -0
  381. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/diagnostics.py +0 -0
  382. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/discovery.py +0 -0
  383. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/drift.py +0 -0
  384. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/eval.py +0 -0
  385. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/events.py +0 -0
  386. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/explain.py +0 -0
  387. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/hooks.py +0 -0
  388. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/hub.py +0 -0
  389. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/kernel.py +0 -0
  390. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/loader.py +0 -0
  391. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/mcp_bridge.py +0 -0
  392. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/model_policy.py +0 -0
  393. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/model_routes.py +0 -0
  394. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/observability.py +0 -0
  395. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/omni.py +0 -0
  396. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/omnigent_importer.py +0 -0
  397. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/optimize.py +0 -0
  398. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/output.py +0 -0
  399. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/permissions.py +0 -0
  400. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/pipy_adapter.py +0 -0
  401. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/pipy_extensions.py +0 -0
  402. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/promotion.py +0 -0
  403. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/protocol.py +0 -0
  404. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/protocol_adapters.py +0 -0
  405. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/protocol_controller.py +0 -0
  406. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/registry.py +0 -0
  407. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/rlm_adapter.py +0 -0
  408. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/rlm_code_adapter.py +0 -0
  409. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/sandbox.py +0 -0
  410. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/self_improve.py +0 -0
  411. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/spec.py +0 -0
  412. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/store.py +0 -0
  413. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/tau_adapter.py +0 -0
  414. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/tau_management.py +0 -0
  415. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/templates.py +0 -0
  416. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/testing.py +0 -0
  417. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/uhp_adapter.py +0 -0
  418. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/wizard.py +0 -0
  419. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/workflow.py +0 -0
  420. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/harness/workflow_presets.py +0 -0
  421. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/headless.py +0 -0
  422. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/history.py +0 -0
  423. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/__init__.py +0 -0
  424. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/airplane.py +0 -0
  425. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/bench.py +0 -0
  426. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/build.py +0 -0
  427. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/code_index.py +0 -0
  428. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/devstral.yaml +0 -0
  429. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/ds4.yaml +0 -0
  430. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/gemma4.yaml +0 -0
  431. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/glm.yaml +0 -0
  432. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/gpt-oss.yaml +0 -0
  433. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/kimi.yaml +0 -0
  434. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/laguna.yaml +0 -0
  435. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/minimax.yaml +0 -0
  436. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/qwen-coder.yaml +0 -0
  437. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/model-packs/qwen3.yaml +0 -0
  438. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/data/stack_matrix.yaml +0 -0
  439. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/doctor.py +0 -0
  440. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/engines.py +0 -0
  441. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/guardrails.py +0 -0
  442. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/hardware.py +0 -0
  443. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/inventory.py +0 -0
  444. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/labs.py +0 -0
  445. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/laguna.py +0 -0
  446. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/matrix.py +0 -0
  447. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/migrate.py +0 -0
  448. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/optimize.py +0 -0
  449. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/packs.py +0 -0
  450. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/repo.py +0 -0
  451. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/servers.py +0 -0
  452. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/setup.py +0 -0
  453. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/local/smoke.py +0 -0
  454. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/logging/__init__.py +0 -0
  455. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/logging/adapters.py +0 -0
  456. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/logging/formatter.py +0 -0
  457. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/logging/integration.py +0 -0
  458. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/logging/sinks.py +0 -0
  459. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/logging/unified_log.py +0 -0
  460. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/lsp/__init__.py +0 -0
  461. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/lsp/client.py +0 -0
  462. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/main.py +0 -0
  463. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/__init__.py +0 -0
  464. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/auth_storage.py +0 -0
  465. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/client.py +0 -0
  466. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/config.py +0 -0
  467. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/elicitation.py +0 -0
  468. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/harness_server.py +0 -0
  469. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/hf_auth.py +0 -0
  470. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/integration.py +0 -0
  471. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/oauth.py +0 -0
  472. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/oauth_callback.py +0 -0
  473. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/sampling.py +0 -0
  474. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/search.py +0 -0
  475. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/mcp/types.py +0 -0
  476. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/memory/__init__.py +0 -0
  477. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/memory/config.py +0 -0
  478. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/memory/providers.py +0 -0
  479. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/memory/types.py +0 -0
  480. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/notifications.py +0 -0
  481. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/permissions/__init__.py +0 -0
  482. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/permissions/rules.py +0 -0
  483. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/__init__.py +0 -0
  484. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/ai/__init__.py +0 -0
  485. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/ai/fake.py +0 -0
  486. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/ai/gateway.py +0 -0
  487. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/ai/models.py +0 -0
  488. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/ai/transform.py +0 -0
  489. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/coding_session.py +0 -0
  490. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/compaction.py +0 -0
  491. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/config.py +0 -0
  492. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/event_stream.py +0 -0
  493. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/events.py +0 -0
  494. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/harness.py +0 -0
  495. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/harness_events.py +0 -0
  496. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/loop.py +0 -0
  497. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/messages.py +0 -0
  498. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/permissions.py +0 -0
  499. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/prompt_templates.py +0 -0
  500. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/provider_events.py +0 -0
  501. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/resources.py +0 -0
  502. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/__init__.py +0 -0
  503. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/codec.py +0 -0
  504. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/entries.py +0 -0
  505. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/jsonl.py +0 -0
  506. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/memory.py +0 -0
  507. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/repository.py +0 -0
  508. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/session.py +0 -0
  509. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/session/storage.py +0 -0
  510. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/signals.py +0 -0
  511. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/skills.py +0 -0
  512. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/stream.py +0 -0
  513. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/system_prompt.py +0 -0
  514. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/__init__.py +0 -0
  515. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/base.py +0 -0
  516. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/edit_diff.py +0 -0
  517. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/files.py +0 -0
  518. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/paths.py +0 -0
  519. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/registry.py +0 -0
  520. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/search.py +0 -0
  521. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/shell.py +0 -0
  522. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/tools/truncate.py +0 -0
  523. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/types.py +0 -0
  524. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pipy/validation.py +0 -0
  525. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/plan.py +0 -0
  526. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/platform_locks.py +0 -0
  527. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/plugins.py +0 -0
  528. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/project_trust.py +0 -0
  529. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/__init__.py +0 -0
  530. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/_builtin_profiles.py +0 -0
  531. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/acp_free_models.py +0 -0
  532. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/acp_models.py +0 -0
  533. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/acp_registry.py +0 -0
  534. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/apple_fm.py +0 -0
  535. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/catalog.py +0 -0
  536. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/connection_profiles.py +0 -0
  537. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/copilot_auth.py +0 -0
  538. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/credentials.py +0 -0
  539. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/dynamic.py +0 -0
  540. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/env_introspect.py +0 -0
  541. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/free_inference.py +0 -0
  542. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/gateway/__init__.py +0 -0
  543. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/gateway/base.py +0 -0
  544. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/gateway/litellm_gateway.py +0 -0
  545. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
  546. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/gateway/synthetic.py +0 -0
  547. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/grok_cli_auth.py +0 -0
  548. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/harness_catalog.py +0 -0
  549. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/health.py +0 -0
  550. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/__init__.py +0 -0
  551. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/convert.py +0 -0
  552. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/downloader.py +0 -0
  553. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/endpoints.py +0 -0
  554. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/fetch.py +0 -0
  555. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/hub.py +0 -0
  556. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/inference.py +0 -0
  557. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
  558. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/live_models.py +0 -0
  559. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/__init__.py +0 -0
  560. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/_mlx_worker.py +0 -0
  561. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/base.py +0 -0
  562. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/capabilities.py +0 -0
  563. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/context_probe.py +0 -0
  564. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/discovery.py +0 -0
  565. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/ds4.py +0 -0
  566. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/lmstudio.py +0 -0
  567. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/mlx.py +0 -0
  568. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/mlx_engine.py +0 -0
  569. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/mlx_tools.py +0 -0
  570. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/ollama.py +0 -0
  571. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/sglang.py +0 -0
  572. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/smoke.py +0 -0
  573. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/tgi.py +0 -0
  574. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/tool_support.py +0 -0
  575. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/local/vllm.py +0 -0
  576. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/manager.py +0 -0
  577. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/model_specs.py +0 -0
  578. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/models.py +0 -0
  579. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/models_dev.py +0 -0
  580. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/opencode_models.py +0 -0
  581. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/__init__.py +0 -0
  582. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
  583. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/converters/messages.py +0 -0
  584. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/converters/tools.py +0 -0
  585. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
  586. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/schema/models.py +0 -0
  587. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
  588. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
  589. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
  590. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
  591. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
  592. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
  593. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
  594. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/prime_agent.py +0 -0
  595. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/profiles.py +0 -0
  596. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/recommendations.py +0 -0
  597. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/registry.py +0 -0
  598. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/subscription_env.py +0 -0
  599. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/subscription_login.py +0 -0
  600. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/uhp.py +0 -0
  601. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/providers/usage.py +0 -0
  602. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/pure_mode.py +0 -0
  603. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/py.typed +0 -0
  604. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rendering/__init__.py +0 -0
  605. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rendering/html_export.py +0 -0
  606. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rendering/markdown.py +0 -0
  607. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rendering/transcript_export.py +0 -0
  608. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/__init__.py +0 -0
  609. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/coding_session.py +0 -0
  610. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/config.py +0 -0
  611. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/context.py +0 -0
  612. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/identity.py +0 -0
  613. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/kernel.py +0 -0
  614. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/kernel_backend.py +0 -0
  615. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/kernel_docker.py +0 -0
  616. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/kernel_monty.py +0 -0
  617. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/kernel_server.py +0 -0
  618. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/policy.py +0 -0
  619. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/root_runtime.py +0 -0
  620. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/root_worker.py +0 -0
  621. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/sandbox.py +0 -0
  622. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/subcalls.py +0 -0
  623. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/supervisor.py +0 -0
  624. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/worker.py +0 -0
  625. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/rlm/worker_process.py +0 -0
  626. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/__init__.py +0 -0
  627. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/adk.py +0 -0
  628. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/antigravity_cli.py +0 -0
  629. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/antigravity_managed.py +0 -0
  630. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/antigravity_sdk.py +0 -0
  631. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/antigravity_status.py +0 -0
  632. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/base.py +0 -0
  633. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/builtin.py +0 -0
  634. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/claude_agent_sdk.py +0 -0
  635. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/codex_sdk.py +0 -0
  636. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/copilot_sdk.py +0 -0
  637. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/devin_cli.py +0 -0
  638. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/devin_status.py +0 -0
  639. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/errors.py +0 -0
  640. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/openai_agents.py +0 -0
  641. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/openai_sandbox.py +0 -0
  642. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/openai_session.py +0 -0
  643. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/pydanticai.py +0 -0
  644. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/registry.py +0 -0
  645. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/tool_bridge.py +0 -0
  646. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/tool_bridge_openai.py +0 -0
  647. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/tool_bridge_pydanticai.py +0 -0
  648. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/runtime/vendor_cli.py +0 -0
  649. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/safety/__init__.py +0 -0
  650. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/safety/sandbox.py +0 -0
  651. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/safety/warnings.py +0 -0
  652. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/sandbox/__init__.py +0 -0
  653. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/sandbox/backends.py +0 -0
  654. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/sandbox/execution.py +0 -0
  655. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/sandbox/local_sandbox.py +0 -0
  656. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/search_registry.py +0 -0
  657. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/server/__init__.py +0 -0
  658. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/server/api.py +0 -0
  659. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/server/web.py +0 -0
  660. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/session/__init__.py +0 -0
  661. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/session/factory.py +0 -0
  662. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/session/persistence.py +0 -0
  663. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/session/share_artifacts.py +0 -0
  664. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/session/sharing.py +0 -0
  665. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/session/switchboard.py +0 -0
  666. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/session.py +0 -0
  667. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/sidebar.py +0 -0
  668. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/skillopt.py +0 -0
  669. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/skills.py +0 -0
  670. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/stream_view.py +0 -0
  671. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/styles/__init__.py +0 -0
  672. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tool_call.py +0 -0
  673. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/__init__.py +0 -0
  674. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/agent_tools.py +0 -0
  675. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/apply_patch.py +0 -0
  676. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/base.py +0 -0
  677. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/batch_tool.py +0 -0
  678. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/compact_tool.py +0 -0
  679. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/context_handle.py +0 -0
  680. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/context_tools.py +0 -0
  681. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/core_tools.py +0 -0
  682. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/diagnostics.py +0 -0
  683. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/diff_utils.py +0 -0
  684. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/display.py +0 -0
  685. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/dynamic_workflow.py +0 -0
  686. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/edit_tools.py +0 -0
  687. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/enhanced_base.py +0 -0
  688. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/env_policy.py +0 -0
  689. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/file_tools.py +0 -0
  690. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/file_tracking.py +0 -0
  691. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/governed.py +0 -0
  692. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/harness_agent_session.py +0 -0
  693. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/image_tools.py +0 -0
  694. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/lsp_tools.py +0 -0
  695. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/mcp_tools.py +0 -0
  696. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/monty_tool.py +0 -0
  697. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/network_tools.py +0 -0
  698. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/output_spill.py +0 -0
  699. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/peer_agent_tools.py +0 -0
  700. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/permissions.py +0 -0
  701. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/post_edit.py +0 -0
  702. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/question_tool.py +0 -0
  703. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/request_permissions_tool.py +0 -0
  704. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/search_tools.py +0 -0
  705. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/semantic_search.py +0 -0
  706. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/shell_session.py +0 -0
  707. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/shell_tools.py +0 -0
  708. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/skill_tools.py +0 -0
  709. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/spawn_harness.py +0 -0
  710. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/todo_tools.py +0 -0
  711. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/tool_search.py +0 -0
  712. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/validation.py +0 -0
  713. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tools/web_tools.py +0 -0
  714. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tui_integration.py +0 -0
  715. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tui_widgets/__init__.py +0 -0
  716. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
  717. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tui_widgets/widgets/progress.py +0 -0
  718. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
  719. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/undo_manager.py +0 -0
  720. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/utils/__init__.py +0 -0
  721. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/utils/error_handling.py +0 -0
  722. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/utils/fuzzy.py +0 -0
  723. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/__init__.py +0 -0
  724. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/a2a_connect.py +0 -0
  725. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/agent_store.py +0 -0
  726. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/agent_switcher.py +0 -0
  727. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/animation_manager.py +0 -0
  728. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/code_context.py +0 -0
  729. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/command_palette.py +0 -0
  730. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/connection_status.py +0 -0
  731. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/conversation_history.py +0 -0
  732. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/diff_indicator.py +0 -0
  733. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/enhanced_status_bar.py +0 -0
  734. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/enhanced_toast.py +0 -0
  735. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/file_browser.py +0 -0
  736. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/file_reference.py +0 -0
  737. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/harness_hub.py +0 -0
  738. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/leader_key.py +0 -0
  739. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/mode_switcher.py +0 -0
  740. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/model_picker.py +0 -0
  741. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/outcome_screen.py +0 -0
  742. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/permission_preview.py +0 -0
  743. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/prompt.py +0 -0
  744. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/provider_connect.py +0 -0
  745. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/pty_shell.py +0 -0
  746. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/resizable_sidebar.py +0 -0
  747. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/response_changes.py +0 -0
  748. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/response_display.py +0 -0
  749. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/rewind_overlay.py +0 -0
  750. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/rich_tool_display.py +0 -0
  751. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/sidebar_panels.py +0 -0
  752. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/slash_commands.py +0 -0
  753. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/slash_complete.py +0 -0
  754. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/split_view.py +0 -0
  755. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/status_bar.py +0 -0
  756. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/superqode_display.py +0 -0
  757. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/theme_picker.py +0 -0
  758. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/thinking.py +0 -0
  759. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/thinking_display.py +0 -0
  760. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/throbber.py +0 -0
  761. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/toast.py +0 -0
  762. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/uhp_connect.py +0 -0
  763. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/widgets/unified_output.py +0 -0
  764. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/__init__.py +0 -0
  765. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/cockpit.py +0 -0
  766. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/integration.py +0 -0
  767. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/models.py +0 -0
  768. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/runner.py +0 -0
  769. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/store.py +0 -0
  770. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/usage.py +0 -0
  771. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workorders/worker.py +0 -0
  772. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/__init__.py +0 -0
  773. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/artifacts.py +0 -0
  774. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/change_summary.py +0 -0
  775. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/coordinator.py +0 -0
  776. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/diff_tracker.py +0 -0
  777. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/git_guard.py +0 -0
  778. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/git_snapshot.py +0 -0
  779. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/manager.py +0 -0
  780. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/snapshot.py +0 -0
  781. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/watcher.py +0 -0
  782. {superqode-2.2.2 → superqode-2.2.3}/src/superqode/workspace/worktree.py +0 -0
  783. {superqode-2.2.2 → superqode-2.2.3}/src/superqode.egg-info/SOURCES.txt +0 -0
  784. {superqode-2.2.2 → superqode-2.2.3}/src/superqode.egg-info/dependency_links.txt +0 -0
  785. {superqode-2.2.2 → superqode-2.2.3}/src/superqode.egg-info/entry_points.txt +0 -0
  786. {superqode-2.2.2 → superqode-2.2.3}/src/superqode.egg-info/requires.txt +0 -0
  787. {superqode-2.2.2 → superqode-2.2.3}/src/superqode.egg-info/top_level.txt +0 -0
  788. {superqode-2.2.2 → superqode-2.2.3}/tests/test_030_candidate.py +0 -0
  789. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_bridge.py +0 -0
  790. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_conformance.py +0 -0
  791. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_connect.py +0 -0
  792. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_context.py +0 -0
  793. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_keys.py +0 -0
  794. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_limits.py +0 -0
  795. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_oauth.py +0 -0
  796. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_security.py +0 -0
  797. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_shortlist.py +0 -0
  798. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_trust.py +0 -0
  799. {superqode-2.2.2 → superqode-2.2.3}/tests/test_a2a_understand.py +0 -0
  800. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_agent_dispatch.py +0 -0
  801. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_client.py +0 -0
  802. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_free_models.py +0 -0
  803. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_parent_tool_linking.py +0 -0
  804. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_permission_store.py +0 -0
  805. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_registry.py +0 -0
  806. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_render.py +0 -0
  807. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_server.py +0 -0
  808. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_session_store.py +0 -0
  809. {superqode-2.2.2 → superqode-2.2.3}/tests/test_acp_slash.py +0 -0
  810. {superqode-2.2.2 → superqode-2.2.3}/tests/test_adaptive_compaction.py +0 -0
  811. {superqode-2.2.2 → superqode-2.2.3}/tests/test_agent_importer.py +0 -0
  812. {superqode-2.2.2 → superqode-2.2.3}/tests/test_agent_install_commands.py +0 -0
  813. {superqode-2.2.2 → superqode-2.2.3}/tests/test_agent_loop_harness.py +0 -0
  814. {superqode-2.2.2 → superqode-2.2.3}/tests/test_agent_memory.py +0 -0
  815. {superqode-2.2.2 → superqode-2.2.3}/tests/test_agents_md_compat.py +0 -0
  816. {superqode-2.2.2 → superqode-2.2.3}/tests/test_agy_tui_commands.py +0 -0
  817. {superqode-2.2.2 → superqode-2.2.3}/tests/test_app_main_contract.py +0 -0
  818. {superqode-2.2.2 → superqode-2.2.3}/tests/test_apply_patch.py +0 -0
  819. {superqode-2.2.2 → superqode-2.2.3}/tests/test_auth.py +0 -0
  820. {superqode-2.2.2 → superqode-2.2.3}/tests/test_bash_spill.py +0 -0
  821. {superqode-2.2.2 → superqode-2.2.3}/tests/test_benchmarks.py +0 -0
  822. {superqode-2.2.2 → superqode-2.2.3}/tests/test_catalog_freshness.py +0 -0
  823. {superqode-2.2.2 → superqode-2.2.3}/tests/test_change_summary.py +0 -0
  824. {superqode-2.2.2 → superqode-2.2.3}/tests/test_channels.py +0 -0
  825. {superqode-2.2.2 → superqode-2.2.3}/tests/test_cli_commands.py +0 -0
  826. {superqode-2.2.2 → superqode-2.2.3}/tests/test_cli_connect.py +0 -0
  827. {superqode-2.2.2 → superqode-2.2.3}/tests/test_cli_contract.py +0 -0
  828. {superqode-2.2.2 → superqode-2.2.3}/tests/test_cli_reference_coverage.py +0 -0
  829. {superqode-2.2.2 → superqode-2.2.3}/tests/test_clickable_commands.py +0 -0
  830. {superqode-2.2.2 → superqode-2.2.3}/tests/test_command_safety.py +0 -0
  831. {superqode-2.2.2 → superqode-2.2.3}/tests/test_commands_runtime.py +0 -0
  832. {superqode-2.2.2 → superqode-2.2.3}/tests/test_compaction.py +0 -0
  833. {superqode-2.2.2 → superqode-2.2.3}/tests/test_config_loader.py +0 -0
  834. {superqode-2.2.2 → superqode-2.2.3}/tests/test_config_runtime.py +0 -0
  835. {superqode-2.2.2 → superqode-2.2.3}/tests/test_connect_harness_screen.py +0 -0
  836. {superqode-2.2.2 → superqode-2.2.3}/tests/test_connect_setup.py +0 -0
  837. {superqode-2.2.2 → superqode-2.2.3}/tests/test_connection_profiles.py +0 -0
  838. {superqode-2.2.2 → superqode-2.2.3}/tests/test_context_handles.py +0 -0
  839. {superqode-2.2.2 → superqode-2.2.3}/tests/test_context_probe.py +0 -0
  840. {superqode-2.2.2 → superqode-2.2.3}/tests/test_context_remaining.py +0 -0
  841. {superqode-2.2.2 → superqode-2.2.3}/tests/test_copilot_login_ux.py +0 -0
  842. {superqode-2.2.2 → superqode-2.2.3}/tests/test_copilot_tui_commands.py +0 -0
  843. {superqode-2.2.2 → superqode-2.2.3}/tests/test_create_skill_tool.py +0 -0
  844. {superqode-2.2.2 → superqode-2.2.3}/tests/test_deepagents_model_spec.py +0 -0
  845. {superqode-2.2.2 → superqode-2.2.3}/tests/test_deferred_tools.py +0 -0
  846. {superqode-2.2.2 → superqode-2.2.3}/tests/test_design_system_contrast.py +0 -0
  847. {superqode-2.2.2 → superqode-2.2.3}/tests/test_developer_workflow_docs.py +0 -0
  848. {superqode-2.2.2 → superqode-2.2.3}/tests/test_ds4_local_client.py +0 -0
  849. {superqode-2.2.2 → superqode-2.2.3}/tests/test_dsh_harness.py +0 -0
  850. {superqode-2.2.2 → superqode-2.2.3}/tests/test_dynamic_workflow_tool.py +0 -0
  851. {superqode-2.2.2 → superqode-2.2.3}/tests/test_edit_line_number_strip.py +0 -0
  852. {superqode-2.2.2 → superqode-2.2.3}/tests/test_env_introspect.py +0 -0
  853. {superqode-2.2.2 → superqode-2.2.3}/tests/test_execution_resolver.py +0 -0
  854. {superqode-2.2.2 → superqode-2.2.3}/tests/test_extensions.py +0 -0
  855. {superqode-2.2.2 → superqode-2.2.3}/tests/test_final_parity_wave.py +0 -0
  856. {superqode-2.2.2 → superqode-2.2.3}/tests/test_free_models.py +0 -0
  857. {superqode-2.2.2 → superqode-2.2.3}/tests/test_governance.py +0 -0
  858. {superqode-2.2.2 → superqode-2.2.3}/tests/test_grok_cli_auth.py +0 -0
  859. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_agent_session.py +0 -0
  860. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_backends.py +0 -0
  861. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_bench.py +0 -0
  862. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_bench_paths.py +0 -0
  863. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_catalog.py +0 -0
  864. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_connect_catalog.py +0 -0
  865. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_drift.py +0 -0
  866. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_eval_splits.py +0 -0
  867. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_examples.py +0 -0
  868. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_explain.py +0 -0
  869. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_hooks.py +0 -0
  870. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_hub_catalog.py +0 -0
  871. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_hub_screen.py +0 -0
  872. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_kernel.py +0 -0
  873. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_mcp_server.py +0 -0
  874. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_model_policy.py +0 -0
  875. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_observability.py +0 -0
  876. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_omni.py +0 -0
  877. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_output.py +0 -0
  878. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_permissions.py +0 -0
  879. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_promotion.py +0 -0
  880. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_protocol.py +0 -0
  881. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_sandbox.py +0 -0
  882. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_seesaw_dimensions.py +0 -0
  883. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_self_improve.py +0 -0
  884. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_spec.py +0 -0
  885. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_store.py +0 -0
  886. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_usage.py +0 -0
  887. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_wizard.py +0 -0
  888. {superqode-2.2.2 → superqode-2.2.3}/tests/test_harness_workflow.py +0 -0
  889. {superqode-2.2.2 → superqode-2.2.3}/tests/test_headless.py +0 -0
  890. {superqode-2.2.2 → superqode-2.2.3}/tests/test_hf_fetch.py +0 -0
  891. {superqode-2.2.2 → superqode-2.2.3}/tests/test_hooks.py +0 -0
  892. {superqode-2.2.2 → superqode-2.2.3}/tests/test_install_script.py +0 -0
  893. {superqode-2.2.2 → superqode-2.2.3}/tests/test_integration_docs.py +0 -0
  894. {superqode-2.2.2 → superqode-2.2.3}/tests/test_kimi_k3_provider.py +0 -0
  895. {superqode-2.2.2 → superqode-2.2.3}/tests/test_kimi_k3_routes.py +0 -0
  896. {superqode-2.2.2 → superqode-2.2.3}/tests/test_linter_runner.py +0 -0
  897. {superqode-2.2.2 → superqode-2.2.3}/tests/test_litellm_gateway.py +0 -0
  898. {superqode-2.2.2 → superqode-2.2.3}/tests/test_live_acp_registry.py +0 -0
  899. {superqode-2.2.2 → superqode-2.2.3}/tests/test_live_models.py +0 -0
  900. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_airplane.py +0 -0
  901. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_build.py +0 -0
  902. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_code_index.py +0 -0
  903. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_labs.py +0 -0
  904. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_migrate.py +0 -0
  905. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_model_optimizations.py +0 -0
  906. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_packs.py +0 -0
  907. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_sandbox.py +0 -0
  908. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_search.py +0 -0
  909. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_servers.py +0 -0
  910. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_setup.py +0 -0
  911. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_smoke.py +0 -0
  912. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_stack.py +0 -0
  913. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_tool_capabilities.py +0 -0
  914. {superqode-2.2.2 → superqode-2.2.3}/tests/test_local_tool_support.py +0 -0
  915. {superqode-2.2.2 → superqode-2.2.3}/tests/test_login_api.py +0 -0
  916. {superqode-2.2.2 → superqode-2.2.3}/tests/test_loop_guard.py +0 -0
  917. {superqode-2.2.2 → superqode-2.2.3}/tests/test_managed_harness_backend.py +0 -0
  918. {superqode-2.2.2 → superqode-2.2.3}/tests/test_markdown_render.py +0 -0
  919. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mcp.py +0 -0
  920. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mcp_example_server.py +0 -0
  921. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mcp_integration.py +0 -0
  922. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mcp_live.py +0 -0
  923. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mcp_oauth_generalized.py +0 -0
  924. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mcp_tools_runtime.py +0 -0
  925. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mcp_two_way.py +0 -0
  926. {superqode-2.2.2 → superqode-2.2.3}/tests/test_memory_recall.py +0 -0
  927. {superqode-2.2.2 → superqode-2.2.3}/tests/test_mlx_tools.py +0 -0
  928. {superqode-2.2.2 → superqode-2.2.3}/tests/test_model_profiles.py +0 -0
  929. {superqode-2.2.2 → superqode-2.2.3}/tests/test_model_specs.py +0 -0
  930. {superqode-2.2.2 → superqode-2.2.3}/tests/test_models_dev.py +0 -0
  931. {superqode-2.2.2 → superqode-2.2.3}/tests/test_monty_tool.py +0 -0
  932. {superqode-2.2.2 → superqode-2.2.3}/tests/test_navigation_history.py +0 -0
  933. {superqode-2.2.2 → superqode-2.2.3}/tests/test_network_policy.py +0 -0
  934. {superqode-2.2.2 → superqode-2.2.3}/tests/test_ollama_client.py +0 -0
  935. {superqode-2.2.2 → superqode-2.2.3}/tests/test_omnigent_agent_session_smoke.py +0 -0
  936. {superqode-2.2.2 → superqode-2.2.3}/tests/test_omnigent_importer.py +0 -0
  937. {superqode-2.2.2 → superqode-2.2.3}/tests/test_openai_session.py +0 -0
  938. {superqode-2.2.2 → superqode-2.2.3}/tests/test_output_spill.py +0 -0
  939. {superqode-2.2.2 → superqode-2.2.3}/tests/test_parallel_compare.py +0 -0
  940. {superqode-2.2.2 → superqode-2.2.3}/tests/test_peer_agents.py +0 -0
  941. {superqode-2.2.2 → superqode-2.2.3}/tests/test_plugin_hook_wiring.py +0 -0
  942. {superqode-2.2.2 → superqode-2.2.3}/tests/test_plugins.py +0 -0
  943. {superqode-2.2.2 → superqode-2.2.3}/tests/test_policies_and_turndiff.py +0 -0
  944. {superqode-2.2.2 → superqode-2.2.3}/tests/test_post_edit_verify.py +0 -0
  945. {superqode-2.2.2 → superqode-2.2.3}/tests/test_prime_agent_client.py +0 -0
  946. {superqode-2.2.2 → superqode-2.2.3}/tests/test_prime_agent_harness.py +0 -0
  947. {superqode-2.2.2 → superqode-2.2.3}/tests/test_prime_agent_provider.py +0 -0
  948. {superqode-2.2.2 → superqode-2.2.3}/tests/test_prime_command_surface.py +0 -0
  949. {superqode-2.2.2 → superqode-2.2.3}/tests/test_prime_tui_rpc.py +0 -0
  950. {superqode-2.2.2 → superqode-2.2.3}/tests/test_progressive_discovery.py +0 -0
  951. {superqode-2.2.2 → superqode-2.2.3}/tests/test_progressive_reveals.py +0 -0
  952. {superqode-2.2.2 → superqode-2.2.3}/tests/test_project_trust.py +0 -0
  953. {superqode-2.2.2 → superqode-2.2.3}/tests/test_prompt_stack.py +0 -0
  954. {superqode-2.2.2 → superqode-2.2.3}/tests/test_provider_catalog.py +0 -0
  955. {superqode-2.2.2 → superqode-2.2.3}/tests/test_provider_dynamic.py +0 -0
  956. {superqode-2.2.2 → superqode-2.2.3}/tests/test_provider_models.py +0 -0
  957. {superqode-2.2.2 → superqode-2.2.3}/tests/test_provider_recommendations.py +0 -0
  958. {superqode-2.2.2 → superqode-2.2.3}/tests/test_pure_mode_sessions.py +0 -0
  959. {superqode-2.2.2 → superqode-2.2.3}/tests/test_qm_deployment_layer.py +0 -0
  960. {superqode-2.2.2 → superqode-2.2.3}/tests/test_rate_limit_retry.py +0 -0
  961. {superqode-2.2.2 → superqode-2.2.3}/tests/test_read_tool_limits.py +0 -0
  962. {superqode-2.2.2 → superqode-2.2.3}/tests/test_reasoning_and_budget.py +0 -0
  963. {superqode-2.2.2 → superqode-2.2.3}/tests/test_recursive_eval_packs.py +0 -0
  964. {superqode-2.2.2 → superqode-2.2.3}/tests/test_release_metadata.py +0 -0
  965. {superqode-2.2.2 → superqode-2.2.3}/tests/test_rlm_code_integration.py +0 -0
  966. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_adk.py +0 -0
  967. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_antigravity_cli.py +0 -0
  968. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_antigravity_managed.py +0 -0
  969. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_antigravity_sdk.py +0 -0
  970. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_builtin.py +0 -0
  971. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_claude_agent_sdk.py +0 -0
  972. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_codex_sdk.py +0 -0
  973. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_copilot_sdk.py +0 -0
  974. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_devin_cli.py +0 -0
  975. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_dialog.py +0 -0
  976. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_openai_agents.py +0 -0
  977. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_openai_events.py +0 -0
  978. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_openai_hitl.py +0 -0
  979. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_openai_sandbox.py +0 -0
  980. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_protocol.py +0 -0
  981. {superqode-2.2.2 → superqode-2.2.3}/tests/test_runtime_pydanticai.py +0 -0
  982. {superqode-2.2.2 → superqode-2.2.3}/tests/test_sandbox_backends.py +0 -0
  983. {superqode-2.2.2 → superqode-2.2.3}/tests/test_sandbox_execution.py +0 -0
  984. {superqode-2.2.2 → superqode-2.2.3}/tests/test_search_roots.py +0 -0
  985. {superqode-2.2.2 → superqode-2.2.3}/tests/test_semantic_search.py +0 -0
  986. {superqode-2.2.2 → superqode-2.2.3}/tests/test_session_switchboard.py +0 -0
  987. {superqode-2.2.2 → superqode-2.2.3}/tests/test_shell_session.py +0 -0
  988. {superqode-2.2.2 → superqode-2.2.3}/tests/test_simple_login.py +0 -0
  989. {superqode-2.2.2 → superqode-2.2.3}/tests/test_simple_query_fastpath.py +0 -0
  990. {superqode-2.2.2 → superqode-2.2.3}/tests/test_skillopt.py +0 -0
  991. {superqode-2.2.2 → superqode-2.2.3}/tests/test_slash_runtime.py +0 -0
  992. {superqode-2.2.2 → superqode-2.2.3}/tests/test_spawn_harness_tool.py +0 -0
  993. {superqode-2.2.2 → superqode-2.2.3}/tests/test_status_bar_layout.py +0 -0
  994. {superqode-2.2.2 → superqode-2.2.3}/tests/test_steering_continue_reminders.py +0 -0
  995. {superqode-2.2.2 → superqode-2.2.3}/tests/test_streaming_tool_calls.py +0 -0
  996. {superqode-2.2.2 → superqode-2.2.3}/tests/test_subscription_billing_policy.py +0 -0
  997. {superqode-2.2.2 → superqode-2.2.3}/tests/test_subscription_login.py +0 -0
  998. {superqode-2.2.2 → superqode-2.2.3}/tests/test_subscription_login_consent.py +0 -0
  999. {superqode-2.2.2 → superqode-2.2.3}/tests/test_synthetic_gateways.py +0 -0
  1000. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tau_harness_adapter.py +0 -0
  1001. {superqode-2.2.2 → superqode-2.2.3}/tests/test_terminal_output_limits.py +0 -0
  1002. {superqode-2.2.2 → superqode-2.2.3}/tests/test_theme_contrast.py +0 -0
  1003. {superqode-2.2.2 → superqode-2.2.3}/tests/test_theme_picker.py +0 -0
  1004. {superqode-2.2.2 → superqode-2.2.3}/tests/test_theme_repaint.py +0 -0
  1005. {superqode-2.2.2 → superqode-2.2.3}/tests/test_todo_tools.py +0 -0
  1006. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tool_args_repair.py +0 -0
  1007. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tool_batch_safety.py +0 -0
  1008. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tool_bridge.py +0 -0
  1009. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tool_bridge_openai.py +0 -0
  1010. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tool_call_repair.py +0 -0
  1011. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tool_output_pruning.py +0 -0
  1012. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tool_tracking.py +0 -0
  1013. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tools.py +0 -0
  1014. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_change_summary.py +0 -0
  1015. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_chat_mode.py +0 -0
  1016. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_diagnostics.py +0 -0
  1017. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_exit.py +0 -0
  1018. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_feedback.py +0 -0
  1019. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_launch_performance.py +0 -0
  1020. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_llamacpp_connect.py +0 -0
  1021. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_markdown_cleanup.py +0 -0
  1022. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_mlx_connect.py +0 -0
  1023. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_mounted.py +0 -0
  1024. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_onboarding.py +0 -0
  1025. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_smoke.py +0 -0
  1026. {superqode-2.2.2 → superqode-2.2.3}/tests/test_tui_tool_display.py +0 -0
  1027. {superqode-2.2.2 → superqode-2.2.3}/tests/test_uhp_backend.py +0 -0
  1028. {superqode-2.2.2 → superqode-2.2.3}/tests/test_uhp_connect.py +0 -0
  1029. {superqode-2.2.2 → superqode-2.2.3}/tests/test_update_command.py +0 -0
  1030. {superqode-2.2.2 → superqode-2.2.3}/tests/test_vendor_cli_runtime.py +0 -0
  1031. {superqode-2.2.2 → superqode-2.2.3}/tests/test_version.py +0 -0
  1032. {superqode-2.2.2 → superqode-2.2.3}/tests/test_view_image.py +0 -0
  1033. {superqode-2.2.2 → superqode-2.2.3}/tests/test_web_server_auth.py +0 -0
  1034. {superqode-2.2.2 → superqode-2.2.3}/tests/test_workorders.py +0 -0
  1035. {superqode-2.2.2 → superqode-2.2.3}/tests/test_workspace.py +0 -0
  1036. {superqode-2.2.2 → superqode-2.2.3}/tests/test_zai_provider.py +0 -0
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.2.3] - 2026-09-13
11
+
12
+ Security fixes for the UHP client and the BYOK server bind shipped in 2.2.2.
13
+ Anyone who ran `superqode connect uhp` on 2.2.2 sent their model key to the
14
+ address they connected to, including on the anonymous discovery request, so
15
+ upgrading is worth doing before the next connect. No API changed and no
16
+ protocol behaviour changed: the Core conformance result is the same 38/40.
17
+
18
+ ### 🔐 UHP security
19
+
20
+ - The client sends `X-Provider-Api-Key` on a task submission only. It was
21
+ attached to every request, including the anonymous discovery and catalog
22
+ GETs, so `connect uhp --base-url <address>` handed that address the caller's
23
+ model key before the caller had decided to trust it. The key is also
24
+ withheld from a remote plaintext `http://` origin, with a warning.
25
+ - A caller's model key no longer races with another caller's. It is written to
26
+ every environment variable the provider reads, and BYOK turns are serialised
27
+ for as long as it is in the process environment, which LiteLLM reads
28
+ credentials from. Concurrent turns previously overwrote each other's key.
29
+ - `Dockerfile.uhp` no longer passes `--api-key` on the command line. The bearer
30
+ came from the environment either way, and the argument published it in
31
+ `/proc/1/cmdline`, which the bound harness's shell tool can read.
32
+ - On a remote bind each session gets its own directory under the working
33
+ directory, so callers cannot read each other's files or session transcripts.
34
+ A local bind still runs in the directory it was given.
35
+ - Request metadata can no longer set harness runtime controls such as
36
+ `agent_max_iterations`. Caller context is still passed through.
37
+ - Bearer comparison is constant time.
38
+
10
39
  ## [2.2.2] - 2026-09-12
11
40
 
12
41
  The installed CLI can complete a harness turn against a BYOK UHP host such as
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superqode
3
- Version: 2.2.2
3
+ Version: 2.2.3
4
4
  Summary: The harness layer for coding agents
5
5
  Author-email: Shashi Jagtap <info@super-agentic.ai>
6
6
  Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superqode"
3
- version = "2.2.2"
3
+ version = "2.2.3"
4
4
  description = "The harness layer for coding agents"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -38,7 +38,7 @@ __all__ = [
38
38
  "sidebar",
39
39
  ]
40
40
 
41
- __version__ = "2.2.2"
41
+ __version__ = "2.2.3"
42
42
 
43
43
  # Stable, lightweight public extension surface. Importing this package does
44
44
  # not discover or execute third-party extensions; discovery happens only when
@@ -13,6 +13,7 @@ from __future__ import annotations
13
13
 
14
14
  import base64
15
15
  import json
16
+ import logging
16
17
  import mimetypes
17
18
  import os
18
19
  import uuid
@@ -20,9 +21,12 @@ from collections.abc import AsyncIterator, Mapping, Sequence
20
21
  from dataclasses import dataclass, field
21
22
  from pathlib import Path
22
23
  from typing import Any
24
+ from urllib.parse import urlparse
23
25
 
24
26
  import httpx
25
27
 
28
+ logger = logging.getLogger(__name__)
29
+
26
30
  UHP_PROTOCOL_VERSION = "2026-08-11"
27
31
 
28
32
  #: Sent on every request so a server does not silently answer at another
@@ -34,8 +38,12 @@ VERSION_HEADER = "UHP-Version"
34
38
  IDEMPOTENCY_HEADER = "Idempotency-Key"
35
39
 
36
40
  #: Caller model key for a BYOK UHP server. SuperQode does not send its own.
41
+ #: A SuperQode extension, not part of UHP. Task submission only.
37
42
  PROVIDER_KEY_HEADER = "X-Provider-Api-Key"
38
43
 
44
+ #: Plaintext http is safe enough to carry a key to these.
45
+ _LOOPBACK_HOSTS = frozenset({"127.0.0.1", "::1", "localhost"})
46
+
39
47
 
40
48
  def _caller_provider_api_key() -> str:
41
49
  """Return the caller's model key for a BYOK UHP server, if present."""
@@ -494,7 +502,8 @@ class UHPClient:
494
502
  timeout, because a harness can work for minutes between events.
495
503
  headers: Extra headers merged into every request. A cookie header
496
504
  belongs here for a server that gates the API with a console
497
- session instead of a bearer token.
505
+ session instead of a bearer token. ``PROVIDER_KEY_HEADER`` is the
506
+ exception: it rides task submission only.
498
507
  client: An existing ``httpx.AsyncClient`` to borrow instead of creating
499
508
  one. A borrowed client is never closed by ``aclose``.
500
509
  """
@@ -511,19 +520,46 @@ class UHPClient:
511
520
  self.base_url = self._normalize_base_url(base_url)
512
521
  self.api_key = api_key
513
522
  self.timeout = timeout
514
- self._headers = {
523
+ merged = {
515
524
  "Accept": "application/json",
516
525
  VERSION_HEADER: UHP_PROTOCOL_VERSION,
517
526
  **dict(headers or {}),
518
527
  }
528
+ # Held aside, not merged: a model key rides task submission only.
529
+ self._provider_key = str(merged.pop(PROVIDER_KEY_HEADER, "") or "").strip()
530
+ self._headers = merged
519
531
  if api_key:
520
532
  self._headers["Authorization"] = f"Bearer {api_key}"
521
- provider_key = _caller_provider_api_key()
522
- if provider_key and PROVIDER_KEY_HEADER not in self._headers:
523
- self._headers[PROVIDER_KEY_HEADER] = provider_key
524
533
  self._client = client
525
534
  self._owns_client = client is None
526
535
 
536
+ def _origin_is_confidential(self) -> bool:
537
+ """Whether this base URL protects a credential in transit."""
538
+ parsed = urlparse(self.base_url)
539
+ if parsed.scheme == "https":
540
+ return True
541
+ return (parsed.hostname or "").lower() in _LOOPBACK_HOSTS
542
+
543
+ def _provider_key_headers(self) -> dict[str, str]:
544
+ """The caller's model key, for a task submission only.
545
+
546
+ Withheld from a plaintext origin, not refused there: a server reached
547
+ over http may not want the key at all, and one that does answers
548
+ ``missing_provider_key``.
549
+ """
550
+ key = self._provider_key or _caller_provider_api_key()
551
+ if not key:
552
+ return {}
553
+ if not self._origin_is_confidential():
554
+ logger.warning(
555
+ "Not sending %s to %s: the connection is plaintext http, which would put the "
556
+ "model key on the wire in clear. Use an https base URL if this server needs it.",
557
+ PROVIDER_KEY_HEADER,
558
+ self.base_url,
559
+ )
560
+ return {}
561
+ return {PROVIDER_KEY_HEADER: key}
562
+
527
563
  @staticmethod
528
564
  def _normalize_base_url(base_url: str) -> str:
529
565
  """Return the server root without a trailing slash or ``/v1`` suffix."""
@@ -816,7 +852,10 @@ class UHPClient:
816
852
  message, input_files=input_files, inline_files=inline_files
817
853
  )
818
854
  body = self.build_response_body(prepared, stream=False, **kwargs)
819
- headers = {IDEMPOTENCY_HEADER: idempotency_key or self.new_idempotency_key()}
855
+ headers = {
856
+ IDEMPOTENCY_HEADER: idempotency_key or self.new_idempotency_key(),
857
+ **self._provider_key_headers(),
858
+ }
820
859
  payload = await self._request("POST", "responses", json_body=body, headers=headers)
821
860
  if not isinstance(payload, Mapping):
822
861
  raise UHPServerError("UHP server returned no response object")
@@ -850,6 +889,7 @@ class UHPClient:
850
889
  **self._headers,
851
890
  "Accept": "text/event-stream",
852
891
  IDEMPOTENCY_HEADER: idempotency_key or self.new_idempotency_key(),
892
+ **self._provider_key_headers(),
853
893
  }
854
894
  pending_error: UHPError | None = None
855
895
  try:
@@ -13,12 +13,14 @@ session listing) are deferred.
13
13
  from __future__ import annotations
14
14
 
15
15
  import asyncio
16
+ import hmac
16
17
  import json
17
18
  import os
18
19
  import re
19
20
  import time
20
21
  import uuid
21
22
  from collections.abc import AsyncIterator, Awaitable, Callable, Mapping, Sequence
23
+ from contextlib import asynccontextmanager
22
24
  from dataclasses import dataclass, field
23
25
  from pathlib import Path
24
26
  from typing import Any
@@ -42,6 +44,20 @@ DISCOVERY_OBJECT = "uhp.discovery"
42
44
 
43
45
  IDEMPOTENCY_HEADER = "Idempotency-Key"
44
46
 
47
+ #: Runtime controls, not caller context. A request body may not set these.
48
+ RESERVED_METADATA_KEYS = frozenset(
49
+ {
50
+ "agent_max_iterations",
51
+ "delegation_depth",
52
+ "harness_digest",
53
+ "harness_source",
54
+ "provider_api_key",
55
+ }
56
+ )
57
+
58
+ #: Guards the caller key in os.environ, which the whole process shares.
59
+ _PROVIDER_ENV_LOCK = asyncio.Lock()
60
+
45
61
  HarnessRunner = Callable[["UHPRunRequest"], Awaitable["UHPRunResult"]]
46
62
 
47
63
 
@@ -167,6 +183,9 @@ class UHPServerConfig:
167
183
  public_catalog: bool = False
168
184
  #: Refuse a harness turn unless the caller sent PROVIDER_KEY_HEADER.
169
185
  require_caller_provider_key: bool = False
186
+ #: Per-session directory under working_directory, so callers on a shared
187
+ #: bind cannot read each other's files. Off locally: work in the project.
188
+ isolate_session_workspaces: bool = False
170
189
 
171
190
 
172
191
  def _package_version() -> str:
@@ -178,18 +197,58 @@ def _package_version() -> str:
178
197
  return "0.0.0"
179
198
 
180
199
 
181
- def _provider_key_env(provider: str) -> str:
182
- """Env var LiteLLM reads for this provider (caller BYOK)."""
200
+ def _provider_key_envs(provider: str) -> tuple[str, ...]:
201
+ """Every env var LiteLLM may read for this provider (caller BYOK).
202
+
203
+ All of them, not just the first: which one LiteLLM reads is its choice,
204
+ and Google alone has two.
205
+ """
183
206
  try:
184
207
  from superqode.providers.registry import PROVIDERS
185
208
 
186
209
  pdef = PROVIDERS.get(provider)
187
- names = getattr(pdef, "env_vars", None) or ()
210
+ names = tuple(str(name) for name in (getattr(pdef, "env_vars", None) or ()) if name)
188
211
  if names:
189
- return str(names[0])
212
+ return names
190
213
  except Exception:
191
214
  pass
192
- return f"{(provider or 'OPENAI').upper()}_API_KEY"
215
+ return (f"{(provider or 'OPENAI').upper()}_API_KEY",)
216
+
217
+
218
+ @asynccontextmanager
219
+ async def _caller_provider_key(token: str, env_names: Sequence[str]) -> AsyncIterator[None]:
220
+ """Hold one caller's model key in ``os.environ`` for the length of a turn.
221
+
222
+ Serialises BYOK turns: the environment is process-global, so overlapping
223
+ turns would otherwise send each other's key.
224
+ """
225
+ if not token:
226
+ yield
227
+ return
228
+ async with _PROVIDER_ENV_LOCK:
229
+ previous = {name: os.environ.get(name) for name in env_names}
230
+ for name in env_names:
231
+ os.environ[name] = token
232
+ try:
233
+ yield
234
+ finally:
235
+ for name, value in previous.items():
236
+ if value is None:
237
+ os.environ.pop(name, None)
238
+ else:
239
+ os.environ[name] = value
240
+
241
+
242
+ def _caller_metadata(body: Mapping[str, Any]) -> dict[str, Any]:
243
+ """Caller-supplied metadata with the runtime's own control keys removed."""
244
+ raw = body.get("metadata")
245
+ if not isinstance(raw, Mapping):
246
+ return {}
247
+ return {
248
+ str(key): value
249
+ for key, value in raw.items()
250
+ if str(key) not in RESERVED_METADATA_KEYS and not str(key).startswith("_")
251
+ }
193
252
 
194
253
 
195
254
  def harness_id_from_name(name: str) -> str:
@@ -706,7 +765,8 @@ class UHPServer:
706
765
  code="invalid_credential",
707
766
  message="Authorization must be a Bearer token.",
708
767
  )
709
- if token != expected:
768
+ # Bytes, because compare_digest rejects a non-ASCII str.
769
+ if not hmac.compare_digest(token.encode("utf-8"), expected.encode("utf-8")):
710
770
  return _error_envelope(
711
771
  error_type="authentication_error",
712
772
  code="invalid_credential",
@@ -714,6 +774,15 @@ class UHPServer:
714
774
  )
715
775
  return None
716
776
 
777
+ def _workspace_for(self, session_id: str) -> Path:
778
+ """The directory a turn runs in."""
779
+ root = Path(self.config.working_directory)
780
+ if not self.config.isolate_session_workspaces:
781
+ return root
782
+ workspace = root / "sessions" / session_id
783
+ workspace.mkdir(parents=True, exist_ok=True)
784
+ return workspace
785
+
717
786
  def _validate_harness_selection(
718
787
  self, body: Mapping[str, Any]
719
788
  ) -> tuple[int, dict[str, Any]] | None:
@@ -816,7 +885,7 @@ class UHPServer:
816
885
  prompt=prompt,
817
886
  model=model,
818
887
  provider=self.config.provider,
819
- working_directory=Path(self.config.working_directory),
888
+ working_directory=self._workspace_for(session_id),
820
889
  session_id=session_id,
821
890
  response_id=response_id,
822
891
  previous_response_id=previous_response_id,
@@ -827,7 +896,7 @@ class UHPServer:
827
896
  cancel_event=self._cancel_events[response_id],
828
897
  metadata={
829
898
  "harness_id": self.config.harness_id,
830
- **(dict(body["metadata"]) if isinstance(body.get("metadata"), Mapping) else {}),
899
+ **_caller_metadata(body),
831
900
  **({"provider_api_key": provider_api_key} if provider_api_key else {}),
832
901
  },
833
902
  )
@@ -1039,18 +1108,15 @@ class UHPServer:
1039
1108
  key: value for key, value in dict(request.metadata).items() if key != "provider_api_key"
1040
1109
  }
1041
1110
  token = str(request.metadata.get("provider_api_key") or "")
1042
- env_name = _provider_key_env(provider)
1043
- previous = os.environ.get(env_name)
1044
- if token:
1045
- os.environ[env_name] = token
1046
1111
  try:
1047
- result = await session.prompt(
1048
- prompt,
1049
- provider=provider,
1050
- model=model,
1051
- working_directory=request.working_directory,
1052
- metadata=run_metadata,
1053
- )
1112
+ async with _caller_provider_key(token, _provider_key_envs(provider)):
1113
+ result = await session.prompt(
1114
+ prompt,
1115
+ provider=provider,
1116
+ model=model,
1117
+ working_directory=request.working_directory,
1118
+ metadata=run_metadata,
1119
+ )
1054
1120
  except Exception:
1055
1121
  return UHPRunResult(
1056
1122
  status="failed",
@@ -1059,12 +1125,6 @@ class UHPServer:
1059
1125
  error_code="harness_error",
1060
1126
  usage=None,
1061
1127
  )
1062
- finally:
1063
- if token:
1064
- if previous is None:
1065
- os.environ.pop(env_name, None)
1066
- else:
1067
- os.environ[env_name] = previous
1068
1128
 
1069
1129
  if request.cancel_event and request.cancel_event.is_set():
1070
1130
  return UHPRunResult(
@@ -1087,8 +1147,12 @@ def create_uhp_server(
1087
1147
  runner: HarnessRunner | None = None,
1088
1148
  public_catalog: bool = False,
1089
1149
  require_caller_provider_key: bool = False,
1150
+ isolate_session_workspaces: bool | None = None,
1090
1151
  ) -> UHPServer:
1091
- """Build a UHP server bound to one SuperQode HarnessSpec."""
1152
+ """Build a UHP server bound to one SuperQode HarnessSpec.
1153
+
1154
+ ``isolate_session_workspaces`` defaults to whether the bind is BYOK.
1155
+ """
1092
1156
  from superqode.harness import get_harness_template, load_harness_spec
1093
1157
 
1094
1158
  if spec is None:
@@ -1121,5 +1185,10 @@ def create_uhp_server(
1121
1185
  conformance_class="core",
1122
1186
  public_catalog=public_catalog,
1123
1187
  require_caller_provider_key=require_caller_provider_key,
1188
+ isolate_session_workspaces=(
1189
+ require_caller_provider_key
1190
+ if isolate_session_workspaces is None
1191
+ else isolate_session_workspaces
1192
+ ),
1124
1193
  )
1125
1194
  return UHPServer(config, runner=runner, spec=loaded)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superqode
3
- Version: 2.2.2
3
+ Version: 2.2.3
4
4
  Summary: The harness layer for coding agents
5
5
  Author-email: Shashi Jagtap <info@super-agentic.ai>
6
6
  Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
@@ -14,6 +14,7 @@ from superqode.harness import (
14
14
  UHPHarnessProtocolAdapter,
15
15
  )
16
16
  from superqode.harness.uhp_client import (
17
+ PROVIDER_KEY_HEADER,
17
18
  UHPAuthenticationError,
18
19
  UHPError,
19
20
  UHPHarnessError,
@@ -1250,3 +1251,105 @@ def test_build_user_input_supports_inline_data_url():
1250
1251
  assert part["type"] == "input_file"
1251
1252
  assert part["filename"] == "note.txt"
1252
1253
  assert part["file_data"].startswith("data:text/plain;base64,")
1254
+
1255
+
1256
+ # ── the caller's model key travels on task submission only ─────────────────────
1257
+
1258
+
1259
+ def _recording_client(seen, *, base_url=BASE_URL):
1260
+ """A client that records the headers of every request it makes."""
1261
+
1262
+ def handler(request):
1263
+ seen.append((request.url.path, dict(request.headers)))
1264
+ if request.url.path.endswith("/uhp"):
1265
+ return httpx.Response(200, json={"object": "uhp.discovery", "protocol": "uhp"})
1266
+ if request.url.path.endswith("/harnesses"):
1267
+ return httpx.Response(200, json={"harnesses": [{"id": "chrn_a"}]})
1268
+ return httpx.Response(200, json=_response_payload())
1269
+
1270
+ transport = httpx.MockTransport(handler)
1271
+ return UHPClient(
1272
+ base_url,
1273
+ api_key="key-123",
1274
+ client=httpx.AsyncClient(transport=transport),
1275
+ )
1276
+
1277
+
1278
+ @pytest.mark.anyio
1279
+ async def test_provider_key_is_withheld_from_discovery_and_catalog(monkeypatch):
1280
+ """Discovery runs before the user has decided to trust the host."""
1281
+ monkeypatch.setenv("SUPERQODE_PROVIDER", "google")
1282
+ monkeypatch.setenv("GEMINI_API_KEY", "caller-gemini-key")
1283
+ seen = []
1284
+
1285
+ async with _recording_client(seen) as client:
1286
+ await client.discover()
1287
+ await client.list_harnesses()
1288
+
1289
+ assert seen, "no requests were recorded"
1290
+ for path, headers in seen:
1291
+ assert PROVIDER_KEY_HEADER.lower() not in headers, f"{path} carried the provider key"
1292
+
1293
+
1294
+ @pytest.mark.anyio
1295
+ async def test_provider_key_is_sent_on_task_submission(monkeypatch):
1296
+ monkeypatch.setenv("SUPERQODE_PROVIDER", "google")
1297
+ monkeypatch.setenv("GEMINI_API_KEY", "caller-gemini-key")
1298
+ seen = []
1299
+
1300
+ async with _recording_client(seen) as client:
1301
+ await client.create_response("run this")
1302
+
1303
+ path, headers = seen[-1]
1304
+ assert path.endswith("/responses")
1305
+ assert headers[PROVIDER_KEY_HEADER.lower()] == "caller-gemini-key"
1306
+
1307
+
1308
+ @pytest.mark.anyio
1309
+ async def test_provider_key_from_headers_argument_is_also_held_back(monkeypatch):
1310
+ """However the key arrived, it is a credential and not a transport header."""
1311
+ monkeypatch.delenv("GEMINI_API_KEY", raising=False)
1312
+ monkeypatch.delenv("GOOGLE_API_KEY", raising=False)
1313
+ seen = []
1314
+
1315
+ def handler(request):
1316
+ seen.append((request.url.path, dict(request.headers)))
1317
+ return httpx.Response(200, json={"object": "uhp.discovery", "protocol": "uhp"})
1318
+
1319
+ client = UHPClient(
1320
+ BASE_URL,
1321
+ headers={PROVIDER_KEY_HEADER: "explicit-key"},
1322
+ client=httpx.AsyncClient(transport=httpx.MockTransport(handler)),
1323
+ )
1324
+ async with client:
1325
+ await client.discover()
1326
+
1327
+ assert PROVIDER_KEY_HEADER.lower() not in seen[0][1]
1328
+
1329
+
1330
+ @pytest.mark.anyio
1331
+ async def test_provider_key_is_withheld_over_plaintext_http(monkeypatch, caplog):
1332
+ """Withheld, not fatal: an http server may not want the key at all."""
1333
+ monkeypatch.setenv("SUPERQODE_PROVIDER", "google")
1334
+ monkeypatch.setenv("GEMINI_API_KEY", "caller-gemini-key")
1335
+ seen = []
1336
+
1337
+ with caplog.at_level("WARNING"):
1338
+ async with _recording_client(seen, base_url="http://uhp.example.com") as client:
1339
+ await client.create_response("run this")
1340
+
1341
+ assert PROVIDER_KEY_HEADER.lower() not in seen[-1][1]
1342
+ assert "plaintext http" in caplog.text
1343
+
1344
+
1345
+ @pytest.mark.anyio
1346
+ async def test_plaintext_loopback_still_carries_the_key(monkeypatch):
1347
+ """HarnessRouter CE runs on loopback, where nothing leaves the machine."""
1348
+ monkeypatch.setenv("SUPERQODE_PROVIDER", "google")
1349
+ monkeypatch.setenv("GEMINI_API_KEY", "caller-gemini-key")
1350
+ seen = []
1351
+
1352
+ async with _recording_client(seen, base_url="http://127.0.0.1:3000") as client:
1353
+ await client.create_response("run this")
1354
+
1355
+ assert seen[-1][1][PROVIDER_KEY_HEADER.lower()] == "caller-gemini-key"
@@ -454,3 +454,145 @@ async def test_failed_harness_is_not_empty_completed():
454
454
  body += chunk
455
455
  assert "event: response.failed" in body
456
456
  assert "event: response.completed" not in body
457
+
458
+
459
+ # ── shared-bind hardening ──────────────────────────────────────────────────────
460
+
461
+
462
+ @pytest.mark.anyio
463
+ async def test_caller_metadata_cannot_set_runtime_controls():
464
+ """agent_max_iterations is the runtime's iteration ceiling, not the caller's."""
465
+ seen = {}
466
+
467
+ async def capture(request: UHPRunRequest) -> UHPRunResult:
468
+ seen.update(request.metadata)
469
+ return UHPRunResult(text="ok", model=request.model, status="completed")
470
+
471
+ server = _server(runner=capture)
472
+ transport = httpx.ASGITransport(app=server.app)
473
+ async with httpx.AsyncClient(transport=transport, base_url="http://test") as client:
474
+ response = await client.post(
475
+ "/v1/responses",
476
+ headers={VERSION_HEADER: UHP_PROTOCOL_VERSION, "Idempotency-Key": "meta"},
477
+ json={
478
+ "input": "hi",
479
+ "metadata": {
480
+ "agent_max_iterations": 999999,
481
+ "delegation_depth": 7,
482
+ "harness_source": "spoofed",
483
+ "_harness_store": "spoofed",
484
+ "project": "keep-me",
485
+ },
486
+ },
487
+ )
488
+
489
+ assert response.status_code == 200
490
+ assert "agent_max_iterations" not in seen
491
+ assert "delegation_depth" not in seen
492
+ assert "harness_source" not in seen
493
+ assert "_harness_store" not in seen
494
+ # Caller context that is not a runtime control still reaches the harness.
495
+ assert seen["project"] == "keep-me"
496
+
497
+
498
+ @pytest.mark.anyio
499
+ async def test_sessions_get_their_own_workspace_on_a_shared_bind(tmp_path):
500
+ """Two callers on one bind must not read each other's files or transcripts."""
501
+ seen = []
502
+
503
+ async def capture(request: UHPRunRequest) -> UHPRunResult:
504
+ seen.append(request.working_directory)
505
+ return UHPRunResult(text="ok", model=request.model, status="completed")
506
+
507
+ server = _server(runner=capture)
508
+ server.config.working_directory = tmp_path
509
+ server.config.isolate_session_workspaces = True
510
+ transport = httpx.ASGITransport(app=server.app)
511
+ async with httpx.AsyncClient(transport=transport, base_url="http://test") as client:
512
+ for key in ("one", "two"):
513
+ await client.post(
514
+ "/v1/responses",
515
+ headers={VERSION_HEADER: UHP_PROTOCOL_VERSION, "Idempotency-Key": key},
516
+ json={"input": "hi"},
517
+ )
518
+
519
+ assert len(seen) == 2
520
+ assert seen[0] != seen[1], "two sessions shared one working directory"
521
+ for path in seen:
522
+ assert path.is_dir()
523
+ assert tmp_path in path.parents
524
+
525
+
526
+ @pytest.mark.anyio
527
+ async def test_local_bind_keeps_the_working_directory_it_was_given(tmp_path):
528
+ """Working in the project is the point of a local bind, so nothing is nested."""
529
+ seen = []
530
+
531
+ async def capture(request: UHPRunRequest) -> UHPRunResult:
532
+ seen.append(request.working_directory)
533
+ return UHPRunResult(text="ok", model=request.model, status="completed")
534
+
535
+ server = _server(runner=capture)
536
+ server.config.working_directory = tmp_path
537
+ transport = httpx.ASGITransport(app=server.app)
538
+ async with httpx.AsyncClient(transport=transport, base_url="http://test") as client:
539
+ await client.post(
540
+ "/v1/responses",
541
+ headers={VERSION_HEADER: UHP_PROTOCOL_VERSION, "Idempotency-Key": "local"},
542
+ json={"input": "hi"},
543
+ )
544
+
545
+ assert seen == [tmp_path]
546
+
547
+
548
+ @pytest.mark.anyio
549
+ async def test_concurrent_byok_turns_never_see_another_caller_key(monkeypatch):
550
+ """Overlapping turns must not overwrite each other's key in os.environ."""
551
+ import os
552
+
553
+ from superqode.harness.uhp_server import _caller_provider_key
554
+
555
+ observed = []
556
+
557
+ async def turn(token: str) -> None:
558
+ async with _caller_provider_key(token, ("GOOGLE_API_KEY", "GEMINI_API_KEY")):
559
+ # Yield control mid-turn, which is where the race used to open.
560
+ await asyncio.sleep(0)
561
+ observed.append(
562
+ (token, os.environ.get("GOOGLE_API_KEY"), os.environ.get("GEMINI_API_KEY"))
563
+ )
564
+ await asyncio.sleep(0)
565
+
566
+ monkeypatch.delenv("GOOGLE_API_KEY", raising=False)
567
+ monkeypatch.delenv("GEMINI_API_KEY", raising=False)
568
+ await asyncio.gather(*(turn(f"key-{index}") for index in range(8)))
569
+
570
+ assert len(observed) == 8
571
+ for token, google, gemini in observed:
572
+ assert google == token, f"{token} saw GOOGLE_API_KEY={google}"
573
+ assert gemini == token, f"{token} saw GEMINI_API_KEY={gemini}"
574
+ # The environment is left exactly as it was found.
575
+ assert "GOOGLE_API_KEY" not in os.environ
576
+ assert "GEMINI_API_KEY" not in os.environ
577
+
578
+
579
+ def test_provider_key_envs_covers_every_slot_for_the_provider():
580
+ from superqode.harness.uhp_server import _provider_key_envs
581
+
582
+ google = _provider_key_envs("google")
583
+ assert "GOOGLE_API_KEY" in google and "GEMINI_API_KEY" in google
584
+ assert _provider_key_envs("nonesuch") == ("NONESUCH_API_KEY",)
585
+
586
+
587
+ def test_non_ascii_bearer_is_rejected_not_crashed():
588
+ """compare_digest raises on a non-ASCII str; Starlette decodes as latin-1.
589
+
590
+ Driven directly because httpx refuses to send such a header.
591
+ """
592
+ server = _server(api_key="secret")
593
+
594
+ envelope = server._check_auth("Bearer s\xe9cret")
595
+
596
+ assert envelope is not None
597
+ assert envelope["error"]["type"] == "authentication_error"
598
+ assert envelope["error"]["code"] == "invalid_credential"
File without changes
File without changes
File without changes
File without changes
File without changes