superqode 2.2.2__tar.gz → 2.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1036) hide show
  1. {superqode-2.2.2 → superqode-2.2.4}/CHANGELOG.md +49 -0
  2. {superqode-2.2.2 → superqode-2.2.4}/PKG-INFO +4 -1
  3. {superqode-2.2.2 → superqode-2.2.4}/pyproject.toml +8 -1
  4. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/__init__.py +1 -1
  5. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/serve.py +14 -11
  6. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/uhp_client.py +46 -6
  7. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/uhp_server.py +108 -28
  8. {superqode-2.2.2 → superqode-2.2.4}/src/superqode.egg-info/PKG-INFO +4 -1
  9. {superqode-2.2.2 → superqode-2.2.4}/src/superqode.egg-info/requires.txt +4 -0
  10. {superqode-2.2.2 → superqode-2.2.4}/tests/test_uhp_client.py +103 -0
  11. {superqode-2.2.2 → superqode-2.2.4}/tests/test_uhp_server.py +163 -0
  12. {superqode-2.2.2 → superqode-2.2.4}/LICENSE +0 -0
  13. {superqode-2.2.2 → superqode-2.2.4}/MANIFEST.in +0 -0
  14. {superqode-2.2.2 → superqode-2.2.4}/NOTICE +0 -0
  15. {superqode-2.2.2 → superqode-2.2.4}/README.md +0 -0
  16. {superqode-2.2.2 → superqode-2.2.4}/examples/README.md +0 -0
  17. {superqode-2.2.2 → superqode-2.2.4}/examples/a2a/README.md +0 -0
  18. {superqode-2.2.2 → superqode-2.2.4}/examples/a2a/smoke_client.py +0 -0
  19. {superqode-2.2.2 → superqode-2.2.4}/examples/bench/dspy-comprehension.manifest.yaml +0 -0
  20. {superqode-2.2.2 → superqode-2.2.4}/examples/bench/dspy-comprehension.yaml +0 -0
  21. {superqode-2.2.2 → superqode-2.2.4}/examples/bench/spec-core.yaml +0 -0
  22. {superqode-2.2.2 → superqode-2.2.4}/examples/bench/spec-deepagents.yaml +0 -0
  23. {superqode-2.2.2 → superqode-2.2.4}/examples/bench/spec-prime-agent.yaml +0 -0
  24. {superqode-2.2.2 → superqode-2.2.4}/examples/byok-acp-team.yaml +0 -0
  25. {superqode-2.2.2 → superqode-2.2.4}/examples/codex_sdk_quickstart.py +0 -0
  26. {superqode-2.2.2 → superqode-2.2.4}/examples/evals/omni-release.yaml +0 -0
  27. {superqode-2.2.2 → superqode-2.2.4}/examples/evals/omni-tiny.yaml +0 -0
  28. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/README.md +0 -0
  29. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/manifest-guard/context.md +0 -0
  30. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/manifest-guard/hooks.py +0 -0
  31. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/manifest-guard/tools.py +0 -0
  32. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/packages/README.md +0 -0
  33. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/packages/broken-extension/src/superqode_example_broken/__init__.py +0 -0
  34. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/packages/policy-extension/src/superqode_example_policy/__init__.py +0 -0
  35. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/packages/skill-extension/src/superqode_example_skill/SKILL.md +0 -0
  36. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/packages/skill-extension/src/superqode_example_skill/__init__.py +0 -0
  37. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/packages/tool-extension/src/superqode_example_tool/__init__.py +0 -0
  38. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/packages/tool-extension-v2/src/superqode_example_tool/__init__.py +0 -0
  39. {superqode-2.2.2 → superqode-2.2.4}/examples/extensions/python-package/src/superqode_example_extension/__init__.py +0 -0
  40. {superqode-2.2.2 → superqode-2.2.4}/examples/harness-packages/README.md +0 -0
  41. {superqode-2.2.2 → superqode-2.2.4}/examples/harness-packages/hello-harness/src/superqode_hello_harness/__init__.py +0 -0
  42. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/coding.yaml +0 -0
  43. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/deepagents.yaml +0 -0
  44. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/deepseek-harness.yaml +0 -0
  45. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/ds4.yaml +0 -0
  46. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/gemma4.yaml +0 -0
  47. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/google-adk.yaml +0 -0
  48. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/local-recursive-dynamic.yaml +0 -0
  49. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/mcp-docs.yaml +0 -0
  50. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/no-tool.yaml +0 -0
  51. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/omni-tiny-local.yaml +0 -0
  52. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/omnigent-multi-agent.yaml +0 -0
  53. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/openai-agents.yaml +0 -0
  54. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/prime-agent.yaml +0 -0
  55. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/pydanticai.yaml +0 -0
  56. {superqode-2.2.2 → superqode-2.2.4}/examples/harnesses/rlm-code-lid.yaml +0 -0
  57. {superqode-2.2.2 → superqode-2.2.4}/examples/local-models-team.yaml +0 -0
  58. {superqode-2.2.2 → superqode-2.2.4}/examples/mcp/local_docs_server.py +0 -0
  59. {superqode-2.2.2 → superqode-2.2.4}/examples/omnigent-multi-agent.agent.yaml +0 -0
  60. {superqode-2.2.2 → superqode-2.2.4}/examples/qm-deployment-layer/README.md +0 -0
  61. {superqode-2.2.2 → superqode-2.2.4}/examples/qm-deployment-layer/sandbox/skills/superqode-harness/SKILL.md +0 -0
  62. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/INCIDENT.md +0 -0
  63. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/README.md +0 -0
  64. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/RUNBOOK.md +0 -0
  65. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/deploy_audit/__init__.py +0 -0
  66. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/deploy_audit/parser.py +0 -0
  67. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/deploy_audit/report.py +0 -0
  68. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/rlm-docker.yaml +0 -0
  69. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/rlm-monty.yaml +0 -0
  70. {superqode-2.2.2 → superqode-2.2.4}/examples/rlm-demo/tests/test_report.py +0 -0
  71. {superqode-2.2.2 → superqode-2.2.4}/examples/simple-team.yaml +0 -0
  72. {superqode-2.2.2 → superqode-2.2.4}/scripts/check_release_metadata.py +0 -0
  73. {superqode-2.2.2 → superqode-2.2.4}/setup.cfg +0 -0
  74. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/__init__.py +0 -0
  75. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/client.py +0 -0
  76. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/conformance.py +0 -0
  77. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/connection.py +0 -0
  78. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/context.py +0 -0
  79. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/inspect.py +0 -0
  80. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/keys.py +0 -0
  81. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/limits.py +0 -0
  82. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/oauth.py +0 -0
  83. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/presets.py +0 -0
  84. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/registry.py +0 -0
  85. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/reply.py +0 -0
  86. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/security.py +0 -0
  87. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/server.py +0 -0
  88. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/shortlist.py +0 -0
  89. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/skills.py +0 -0
  90. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/tools.py +0 -0
  91. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/trust.py +0 -0
  92. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/types.py +0 -0
  93. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/understand.py +0 -0
  94. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/a2a/workflows.py +0 -0
  95. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/__init__.py +0 -0
  96. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/client.py +0 -0
  97. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/doctor.py +0 -0
  98. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/permission_screen.py +0 -0
  99. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/permission_store.py +0 -0
  100. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/render.py +0 -0
  101. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/server.py +0 -0
  102. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/session_store.py +0 -0
  103. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/slash.py +0 -0
  104. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/tool_call_context.py +0 -0
  105. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp/types.py +0 -0
  106. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/acp_discovery.py +0 -0
  107. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/__init__.py +0 -0
  108. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/auto_memory.py +0 -0
  109. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/command_safety.py +0 -0
  110. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/compaction.py +0 -0
  111. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/context_manager.py +0 -0
  112. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/edit_strategies.py +0 -0
  113. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/exec_policy.py +0 -0
  114. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/hooks.py +0 -0
  115. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/loop.py +0 -0
  116. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/loop_guard.py +0 -0
  117. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/loop_policy.py +0 -0
  118. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/network_policy.py +0 -0
  119. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/output_handler.py +0 -0
  120. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/parallel_compare.py +0 -0
  121. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/peer_agents.py +0 -0
  122. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/plan_mode.py +0 -0
  123. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/reminders.py +0 -0
  124. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/rubric.py +0 -0
  125. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/session_manager.py +0 -0
  126. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/structured_output.py +0 -0
  127. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/summarization.py +0 -0
  128. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/system_prompts.py +0 -0
  129. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/terminal_output_limits.py +0 -0
  130. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/text_tool_calls.py +0 -0
  131. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/tool_args.py +0 -0
  132. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/tool_tracking.py +0 -0
  133. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent/utility_model.py +0 -0
  134. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent_output.py +0 -0
  135. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agent_stream.py +0 -0
  136. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/__init__.py +0 -0
  137. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/acp_registry.py +0 -0
  138. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/client.py +0 -0
  139. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/agentpool.phil65.github.io.toml +0 -0
  140. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/ampcode.com.toml +0 -0
  141. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/augmentcode.com.toml +0 -0
  142. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/autodev.github.io.toml +0 -0
  143. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/blackbox.ai.toml +0 -0
  144. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/bub.dev.toml +0 -0
  145. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/cagent.dev.toml +0 -0
  146. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/claude.com.toml +0 -0
  147. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/cline.bot.toml +0 -0
  148. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/codeassistant.dev.toml +0 -0
  149. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/codebuddy.tencent.com.toml +0 -0
  150. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/codex.openai.com.toml +0 -0
  151. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/copilot.github.com.toml +0 -0
  152. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/cortex.snowflake.com.toml +0 -0
  153. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/crow-ai.dev.toml +0 -0
  154. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/cursor.com.toml +0 -0
  155. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/deepagents-code.langchain.com.toml +0 -0
  156. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/deepagents.langchain.com.toml +0 -0
  157. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/devin.ai.toml +0 -0
  158. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/dirac.run.toml +0 -0
  159. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/factory.ai.toml +0 -0
  160. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/fastagent.ai.toml +0 -0
  161. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/fount.dev.toml +0 -0
  162. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/fx.sh.toml +0 -0
  163. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/geminicli.com.toml +0 -0
  164. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/glm.z.ai.toml +0 -0
  165. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/goose.block.xyz.toml +0 -0
  166. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/harnlang.com.toml +0 -0
  167. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/hermes-agent.nousresearch.com.toml +0 -0
  168. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
  169. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/kilo.ai.toml +0 -0
  170. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
  171. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/kiro.dev.toml +0 -0
  172. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/llmlingagent.dev.toml +0 -0
  173. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/minioncode.dev.toml +0 -0
  174. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/mistral-vibe.mistral.ai.toml +0 -0
  175. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/openclaw.ai.toml +0 -0
  176. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/opencode.ai.toml +0 -0
  177. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/openhands.dev.toml +0 -0
  178. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/pi.dev.toml +0 -0
  179. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/poolside.ai.toml +0 -0
  180. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/primeintellect.ai.toml +0 -0
  181. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/qoder.com.toml +0 -0
  182. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/qwenlm.github.io.toml +0 -0
  183. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/sigit.dev.toml +0 -0
  184. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/stakpak.dev.toml +0 -0
  185. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/stdiobus.dev.toml +0 -0
  186. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/vtcode.dev.toml +0 -0
  187. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/data/x.ai.toml +0 -0
  188. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/discovery.py +0 -0
  189. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/free_models.py +0 -0
  190. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/install_commands.py +0 -0
  191. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/messaging.py +0 -0
  192. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/official_acp.py +0 -0
  193. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/persona.py +0 -0
  194. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/registry.py +0 -0
  195. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/schema.py +0 -0
  196. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/agents/unified.py +0 -0
  197. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/__init__.py +0 -0
  198. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/async_utils.py +0 -0
  199. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/capabilities.py +0 -0
  200. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/constants.py +0 -0
  201. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/css.py +0 -0
  202. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/harness_picker.py +0 -0
  203. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/inputs.py +0 -0
  204. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/__init__.py +0 -0
  205. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/actions_misc.py +0 -0
  206. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/agent_run.py +0 -0
  207. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/build_harness.py +0 -0
  208. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/clickable_commands.py +0 -0
  209. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/codex.py +0 -0
  210. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/commands_impl.py +0 -0
  211. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/completion.py +0 -0
  212. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/connect.py +0 -0
  213. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/dialogs.py +0 -0
  214. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/events.py +0 -0
  215. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/explore.py +0 -0
  216. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/factory.py +0 -0
  217. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/feedback.py +0 -0
  218. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/formatting.py +0 -0
  219. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/harness_hub.py +0 -0
  220. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_clipboard.py +0 -0
  221. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_completion_helpers.py +0 -0
  222. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_diff_review.py +0 -0
  223. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_exit_lifecycle.py +0 -0
  224. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_file_view.py +0 -0
  225. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_interaction_mode.py +0 -0
  226. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_mcp_attach.py +0 -0
  227. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_message_queue.py +0 -0
  228. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_permissions.py +0 -0
  229. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_recipes_skills.py +0 -0
  230. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_share.py +0 -0
  231. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_startup.py +0 -0
  232. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_todos_plan.py +0 -0
  233. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_vim.py +0 -0
  234. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helper_wizard.py +0 -0
  235. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/helpers.py +0 -0
  236. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/huggingface.py +0 -0
  237. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/local_models.py +0 -0
  238. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/mcp.py +0 -0
  239. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/model_catalog.py +0 -0
  240. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/pickers.py +0 -0
  241. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/pipy_commands.py +0 -0
  242. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/rlm_commands.py +0 -0
  243. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/sidebar.py +0 -0
  244. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/slash_commands.py +0 -0
  245. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/switchboard.py +0 -0
  246. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/mixins/tour.py +0 -0
  247. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/models.py +0 -0
  248. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/navigation.py +0 -0
  249. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/outcomes.py +0 -0
  250. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/progress.py +0 -0
  251. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/prompt_stack.py +0 -0
  252. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/recipes.py +0 -0
  253. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/session_state.py +0 -0
  254. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/suggester.py +0 -0
  255. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/theme_bridge.py +0 -0
  256. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/welcome.py +0 -0
  257. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app/widgets.py +0 -0
  258. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app_enhanced.py +0 -0
  259. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/app_main.py +0 -0
  260. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/approval.py +0 -0
  261. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/atomic.py +0 -0
  262. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/auth/__init__.py +0 -0
  263. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/benchmarks.py +0 -0
  264. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/channels/__init__.py +0 -0
  265. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/channels/config.py +0 -0
  266. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/channels/discord.py +0 -0
  267. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/channels/service.py +0 -0
  268. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/channels/slack.py +0 -0
  269. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/channels/telegram.py +0 -0
  270. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/claude.py +0 -0
  271. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/codex.py +0 -0
  272. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/__init__.py +0 -0
  273. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/a2a.py +0 -0
  274. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/a2a_connect.py +0 -0
  275. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/a2a_keys.py +0 -0
  276. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/acp.py +0 -0
  277. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/agents.py +0 -0
  278. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/auth.py +0 -0
  279. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/benchmark.py +0 -0
  280. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/config.py +0 -0
  281. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/connect.py +0 -0
  282. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/daemon.py +0 -0
  283. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/factory.py +0 -0
  284. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/gauge.py +0 -0
  285. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/__init__.py +0 -0
  286. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/_group.py +0 -0
  287. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/_helpers.py +0 -0
  288. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/bench.py +0 -0
  289. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/candidates.py +0 -0
  290. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/evaluation.py +0 -0
  291. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/evidence.py +0 -0
  292. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/inbox.py +0 -0
  293. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/lifecycle.py +0 -0
  294. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/logbook.py +0 -0
  295. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/observability.py +0 -0
  296. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/optimization.py +0 -0
  297. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/promotion.py +0 -0
  298. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/protocol.py +0 -0
  299. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/registry.py +0 -0
  300. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/replay.py +0 -0
  301. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/run_history.py +0 -0
  302. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/harness/worker.py +0 -0
  303. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/hub.py +0 -0
  304. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/local.py +0 -0
  305. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/memory.py +0 -0
  306. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/models.py +0 -0
  307. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/plugins.py +0 -0
  308. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/policy.py +0 -0
  309. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/profiles.py +0 -0
  310. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/providers.py +0 -0
  311. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/runtime.py +0 -0
  312. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/sandbox.py +0 -0
  313. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/sessions.py +0 -0
  314. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/share.py +0 -0
  315. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/skillopt.py +0 -0
  316. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/skills.py +0 -0
  317. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/tools.py +0 -0
  318. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/trust.py +0 -0
  319. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/uhp.py +0 -0
  320. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/update.py +0 -0
  321. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/commands/work.py +0 -0
  322. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/config/__init__.py +0 -0
  323. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/config/loader.py +0 -0
  324. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/config/schema.py +0 -0
  325. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/core/__init__.py +0 -0
  326. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/danger.py +0 -0
  327. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/data/eval_fixtures/ci-dynamic-root-cause.log +0 -0
  328. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/data/eval_fixtures/ci-root-cause.log +0 -0
  329. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/data/eval_packs/local_dynamic_workflow_smoke.yaml +0 -0
  330. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/data/eval_packs/local_recursive_smoke.yaml +0 -0
  331. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/data/superqode-template.yaml +0 -0
  332. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/design_system.py +0 -0
  333. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/dialogs/__init__.py +0 -0
  334. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/dialogs/base.py +0 -0
  335. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/dialogs/model.py +0 -0
  336. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/dialogs/provider.py +0 -0
  337. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/dialogs/runtime.py +0 -0
  338. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/diff_view.py +0 -0
  339. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/enterprise.py +0 -0
  340. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/evaluation/__init__.py +0 -0
  341. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/evaluation/adapters.py +0 -0
  342. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/evaluation/behaviors.py +0 -0
  343. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/evaluation/engine.py +0 -0
  344. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/evaluation/scenarios.py +0 -0
  345. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/execution/__init__.py +0 -0
  346. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/execution/linter.py +0 -0
  347. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/execution/modes.py +0 -0
  348. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/execution/resolver.py +0 -0
  349. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/execution/runner.py +0 -0
  350. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/extensions.py +0 -0
  351. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/file_explorer.py +0 -0
  352. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/file_viewer.py +0 -0
  353. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/flash.py +0 -0
  354. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/gauge/__init__.py +0 -0
  355. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/gauge/levels.py +0 -0
  356. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/gauge/record.py +0 -0
  357. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/gauge/sources.py +0 -0
  358. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/governance.py +0 -0
  359. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/__init__.py +0 -0
  360. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/accelerator.py +0 -0
  361. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/agent_importer.py +0 -0
  362. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/approval_memory.py +0 -0
  363. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/__init__.py +0 -0
  364. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/base.py +0 -0
  365. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/deepagents.py +0 -0
  366. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/dsh.py +0 -0
  367. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/managed.py +0 -0
  368. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/pipy.py +0 -0
  369. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/prime_agent.py +0 -0
  370. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/pydanticai.py +0 -0
  371. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/registry.py +0 -0
  372. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/rlm.py +0 -0
  373. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/rlm_code.py +0 -0
  374. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/runtime.py +0 -0
  375. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/tau.py +0 -0
  376. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/backends/uhp.py +0 -0
  377. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/bench.py +0 -0
  378. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/catalog.py +0 -0
  379. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/compiler.py +0 -0
  380. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/conformance.py +0 -0
  381. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/context_handles.py +0 -0
  382. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/diagnostics.py +0 -0
  383. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/discovery.py +0 -0
  384. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/drift.py +0 -0
  385. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/eval.py +0 -0
  386. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/events.py +0 -0
  387. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/explain.py +0 -0
  388. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/hooks.py +0 -0
  389. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/hub.py +0 -0
  390. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/kernel.py +0 -0
  391. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/loader.py +0 -0
  392. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/mcp_bridge.py +0 -0
  393. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/model_policy.py +0 -0
  394. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/model_routes.py +0 -0
  395. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/observability.py +0 -0
  396. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/omni.py +0 -0
  397. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/omnigent_importer.py +0 -0
  398. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/optimize.py +0 -0
  399. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/output.py +0 -0
  400. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/permissions.py +0 -0
  401. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/pipy_adapter.py +0 -0
  402. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/pipy_extensions.py +0 -0
  403. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/promotion.py +0 -0
  404. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/protocol.py +0 -0
  405. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/protocol_adapters.py +0 -0
  406. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/protocol_controller.py +0 -0
  407. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/registry.py +0 -0
  408. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/rlm_adapter.py +0 -0
  409. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/rlm_code_adapter.py +0 -0
  410. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/sandbox.py +0 -0
  411. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/self_improve.py +0 -0
  412. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/spec.py +0 -0
  413. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/store.py +0 -0
  414. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/tau_adapter.py +0 -0
  415. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/tau_management.py +0 -0
  416. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/templates.py +0 -0
  417. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/testing.py +0 -0
  418. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/uhp_adapter.py +0 -0
  419. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/wizard.py +0 -0
  420. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/workflow.py +0 -0
  421. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/harness/workflow_presets.py +0 -0
  422. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/headless.py +0 -0
  423. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/history.py +0 -0
  424. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/__init__.py +0 -0
  425. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/airplane.py +0 -0
  426. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/bench.py +0 -0
  427. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/build.py +0 -0
  428. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/code_index.py +0 -0
  429. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/devstral.yaml +0 -0
  430. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/ds4.yaml +0 -0
  431. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/gemma4.yaml +0 -0
  432. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/glm.yaml +0 -0
  433. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/gpt-oss.yaml +0 -0
  434. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/kimi.yaml +0 -0
  435. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/laguna.yaml +0 -0
  436. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/minimax.yaml +0 -0
  437. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/qwen-coder.yaml +0 -0
  438. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/model-packs/qwen3.yaml +0 -0
  439. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/data/stack_matrix.yaml +0 -0
  440. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/doctor.py +0 -0
  441. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/engines.py +0 -0
  442. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/guardrails.py +0 -0
  443. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/hardware.py +0 -0
  444. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/inventory.py +0 -0
  445. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/labs.py +0 -0
  446. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/laguna.py +0 -0
  447. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/matrix.py +0 -0
  448. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/migrate.py +0 -0
  449. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/optimize.py +0 -0
  450. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/packs.py +0 -0
  451. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/repo.py +0 -0
  452. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/servers.py +0 -0
  453. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/setup.py +0 -0
  454. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/local/smoke.py +0 -0
  455. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/logging/__init__.py +0 -0
  456. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/logging/adapters.py +0 -0
  457. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/logging/formatter.py +0 -0
  458. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/logging/integration.py +0 -0
  459. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/logging/sinks.py +0 -0
  460. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/logging/unified_log.py +0 -0
  461. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/lsp/__init__.py +0 -0
  462. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/lsp/client.py +0 -0
  463. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/main.py +0 -0
  464. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/__init__.py +0 -0
  465. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/auth_storage.py +0 -0
  466. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/client.py +0 -0
  467. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/config.py +0 -0
  468. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/elicitation.py +0 -0
  469. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/harness_server.py +0 -0
  470. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/hf_auth.py +0 -0
  471. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/integration.py +0 -0
  472. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/oauth.py +0 -0
  473. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/oauth_callback.py +0 -0
  474. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/sampling.py +0 -0
  475. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/search.py +0 -0
  476. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/mcp/types.py +0 -0
  477. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/memory/__init__.py +0 -0
  478. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/memory/config.py +0 -0
  479. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/memory/providers.py +0 -0
  480. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/memory/types.py +0 -0
  481. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/notifications.py +0 -0
  482. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/permissions/__init__.py +0 -0
  483. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/permissions/rules.py +0 -0
  484. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/__init__.py +0 -0
  485. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/ai/__init__.py +0 -0
  486. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/ai/fake.py +0 -0
  487. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/ai/gateway.py +0 -0
  488. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/ai/models.py +0 -0
  489. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/ai/transform.py +0 -0
  490. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/coding_session.py +0 -0
  491. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/compaction.py +0 -0
  492. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/config.py +0 -0
  493. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/event_stream.py +0 -0
  494. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/events.py +0 -0
  495. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/harness.py +0 -0
  496. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/harness_events.py +0 -0
  497. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/loop.py +0 -0
  498. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/messages.py +0 -0
  499. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/permissions.py +0 -0
  500. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/prompt_templates.py +0 -0
  501. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/provider_events.py +0 -0
  502. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/resources.py +0 -0
  503. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/__init__.py +0 -0
  504. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/codec.py +0 -0
  505. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/entries.py +0 -0
  506. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/jsonl.py +0 -0
  507. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/memory.py +0 -0
  508. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/repository.py +0 -0
  509. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/session.py +0 -0
  510. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/session/storage.py +0 -0
  511. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/signals.py +0 -0
  512. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/skills.py +0 -0
  513. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/stream.py +0 -0
  514. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/system_prompt.py +0 -0
  515. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/__init__.py +0 -0
  516. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/base.py +0 -0
  517. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/edit_diff.py +0 -0
  518. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/files.py +0 -0
  519. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/paths.py +0 -0
  520. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/registry.py +0 -0
  521. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/search.py +0 -0
  522. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/shell.py +0 -0
  523. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/tools/truncate.py +0 -0
  524. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/types.py +0 -0
  525. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pipy/validation.py +0 -0
  526. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/plan.py +0 -0
  527. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/platform_locks.py +0 -0
  528. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/plugins.py +0 -0
  529. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/project_trust.py +0 -0
  530. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/__init__.py +0 -0
  531. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/_builtin_profiles.py +0 -0
  532. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/acp_free_models.py +0 -0
  533. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/acp_models.py +0 -0
  534. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/acp_registry.py +0 -0
  535. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/apple_fm.py +0 -0
  536. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/catalog.py +0 -0
  537. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/connection_profiles.py +0 -0
  538. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/copilot_auth.py +0 -0
  539. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/credentials.py +0 -0
  540. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/dynamic.py +0 -0
  541. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/env_introspect.py +0 -0
  542. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/free_inference.py +0 -0
  543. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/gateway/__init__.py +0 -0
  544. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/gateway/base.py +0 -0
  545. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/gateway/litellm_gateway.py +0 -0
  546. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
  547. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/gateway/synthetic.py +0 -0
  548. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/grok_cli_auth.py +0 -0
  549. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/harness_catalog.py +0 -0
  550. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/health.py +0 -0
  551. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/__init__.py +0 -0
  552. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/convert.py +0 -0
  553. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/downloader.py +0 -0
  554. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/endpoints.py +0 -0
  555. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/fetch.py +0 -0
  556. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/hub.py +0 -0
  557. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/inference.py +0 -0
  558. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
  559. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/live_models.py +0 -0
  560. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/__init__.py +0 -0
  561. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/_mlx_worker.py +0 -0
  562. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/base.py +0 -0
  563. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/capabilities.py +0 -0
  564. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/context_probe.py +0 -0
  565. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/discovery.py +0 -0
  566. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/ds4.py +0 -0
  567. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/lmstudio.py +0 -0
  568. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/mlx.py +0 -0
  569. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/mlx_engine.py +0 -0
  570. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/mlx_tools.py +0 -0
  571. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/ollama.py +0 -0
  572. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/sglang.py +0 -0
  573. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/smoke.py +0 -0
  574. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/tgi.py +0 -0
  575. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/tool_support.py +0 -0
  576. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/local/vllm.py +0 -0
  577. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/manager.py +0 -0
  578. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/model_specs.py +0 -0
  579. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/models.py +0 -0
  580. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/models_dev.py +0 -0
  581. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/opencode_models.py +0 -0
  582. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/__init__.py +0 -0
  583. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
  584. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/converters/messages.py +0 -0
  585. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/converters/tools.py +0 -0
  586. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
  587. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/schema/models.py +0 -0
  588. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
  589. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
  590. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
  591. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
  592. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
  593. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
  594. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
  595. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/prime_agent.py +0 -0
  596. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/profiles.py +0 -0
  597. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/recommendations.py +0 -0
  598. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/registry.py +0 -0
  599. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/subscription_env.py +0 -0
  600. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/subscription_login.py +0 -0
  601. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/uhp.py +0 -0
  602. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/providers/usage.py +0 -0
  603. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/pure_mode.py +0 -0
  604. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/py.typed +0 -0
  605. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rendering/__init__.py +0 -0
  606. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rendering/html_export.py +0 -0
  607. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rendering/markdown.py +0 -0
  608. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rendering/transcript_export.py +0 -0
  609. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/__init__.py +0 -0
  610. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/coding_session.py +0 -0
  611. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/config.py +0 -0
  612. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/context.py +0 -0
  613. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/identity.py +0 -0
  614. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/kernel.py +0 -0
  615. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/kernel_backend.py +0 -0
  616. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/kernel_docker.py +0 -0
  617. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/kernel_monty.py +0 -0
  618. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/kernel_server.py +0 -0
  619. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/policy.py +0 -0
  620. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/root_runtime.py +0 -0
  621. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/root_worker.py +0 -0
  622. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/sandbox.py +0 -0
  623. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/subcalls.py +0 -0
  624. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/supervisor.py +0 -0
  625. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/worker.py +0 -0
  626. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/rlm/worker_process.py +0 -0
  627. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/__init__.py +0 -0
  628. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/adk.py +0 -0
  629. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/antigravity_cli.py +0 -0
  630. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/antigravity_managed.py +0 -0
  631. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/antigravity_sdk.py +0 -0
  632. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/antigravity_status.py +0 -0
  633. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/base.py +0 -0
  634. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/builtin.py +0 -0
  635. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/claude_agent_sdk.py +0 -0
  636. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/codex_sdk.py +0 -0
  637. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/copilot_sdk.py +0 -0
  638. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/devin_cli.py +0 -0
  639. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/devin_status.py +0 -0
  640. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/errors.py +0 -0
  641. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/openai_agents.py +0 -0
  642. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/openai_sandbox.py +0 -0
  643. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/openai_session.py +0 -0
  644. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/pydanticai.py +0 -0
  645. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/registry.py +0 -0
  646. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/tool_bridge.py +0 -0
  647. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/tool_bridge_openai.py +0 -0
  648. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/tool_bridge_pydanticai.py +0 -0
  649. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/runtime/vendor_cli.py +0 -0
  650. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/safety/__init__.py +0 -0
  651. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/safety/sandbox.py +0 -0
  652. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/safety/warnings.py +0 -0
  653. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/sandbox/__init__.py +0 -0
  654. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/sandbox/backends.py +0 -0
  655. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/sandbox/execution.py +0 -0
  656. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/sandbox/local_sandbox.py +0 -0
  657. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/search_registry.py +0 -0
  658. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/server/__init__.py +0 -0
  659. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/server/api.py +0 -0
  660. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/server/web.py +0 -0
  661. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/session/__init__.py +0 -0
  662. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/session/factory.py +0 -0
  663. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/session/persistence.py +0 -0
  664. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/session/share_artifacts.py +0 -0
  665. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/session/sharing.py +0 -0
  666. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/session/switchboard.py +0 -0
  667. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/session.py +0 -0
  668. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/sidebar.py +0 -0
  669. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/skillopt.py +0 -0
  670. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/skills.py +0 -0
  671. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/stream_view.py +0 -0
  672. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/styles/__init__.py +0 -0
  673. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tool_call.py +0 -0
  674. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/__init__.py +0 -0
  675. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/agent_tools.py +0 -0
  676. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/apply_patch.py +0 -0
  677. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/base.py +0 -0
  678. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/batch_tool.py +0 -0
  679. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/compact_tool.py +0 -0
  680. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/context_handle.py +0 -0
  681. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/context_tools.py +0 -0
  682. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/core_tools.py +0 -0
  683. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/diagnostics.py +0 -0
  684. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/diff_utils.py +0 -0
  685. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/display.py +0 -0
  686. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/dynamic_workflow.py +0 -0
  687. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/edit_tools.py +0 -0
  688. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/enhanced_base.py +0 -0
  689. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/env_policy.py +0 -0
  690. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/file_tools.py +0 -0
  691. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/file_tracking.py +0 -0
  692. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/governed.py +0 -0
  693. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/harness_agent_session.py +0 -0
  694. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/image_tools.py +0 -0
  695. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/lsp_tools.py +0 -0
  696. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/mcp_tools.py +0 -0
  697. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/monty_tool.py +0 -0
  698. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/network_tools.py +0 -0
  699. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/output_spill.py +0 -0
  700. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/peer_agent_tools.py +0 -0
  701. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/permissions.py +0 -0
  702. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/post_edit.py +0 -0
  703. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/question_tool.py +0 -0
  704. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/request_permissions_tool.py +0 -0
  705. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/search_tools.py +0 -0
  706. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/semantic_search.py +0 -0
  707. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/shell_session.py +0 -0
  708. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/shell_tools.py +0 -0
  709. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/skill_tools.py +0 -0
  710. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/spawn_harness.py +0 -0
  711. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/todo_tools.py +0 -0
  712. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/tool_search.py +0 -0
  713. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/validation.py +0 -0
  714. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tools/web_tools.py +0 -0
  715. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tui_integration.py +0 -0
  716. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tui_widgets/__init__.py +0 -0
  717. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
  718. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tui_widgets/widgets/progress.py +0 -0
  719. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
  720. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/undo_manager.py +0 -0
  721. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/utils/__init__.py +0 -0
  722. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/utils/error_handling.py +0 -0
  723. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/utils/fuzzy.py +0 -0
  724. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/__init__.py +0 -0
  725. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/a2a_connect.py +0 -0
  726. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/agent_store.py +0 -0
  727. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/agent_switcher.py +0 -0
  728. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/animation_manager.py +0 -0
  729. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/code_context.py +0 -0
  730. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/command_palette.py +0 -0
  731. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/connection_status.py +0 -0
  732. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/conversation_history.py +0 -0
  733. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/diff_indicator.py +0 -0
  734. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/enhanced_status_bar.py +0 -0
  735. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/enhanced_toast.py +0 -0
  736. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/file_browser.py +0 -0
  737. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/file_reference.py +0 -0
  738. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/harness_hub.py +0 -0
  739. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/leader_key.py +0 -0
  740. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/mode_switcher.py +0 -0
  741. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/model_picker.py +0 -0
  742. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/outcome_screen.py +0 -0
  743. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/permission_preview.py +0 -0
  744. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/prompt.py +0 -0
  745. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/provider_connect.py +0 -0
  746. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/pty_shell.py +0 -0
  747. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/resizable_sidebar.py +0 -0
  748. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/response_changes.py +0 -0
  749. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/response_display.py +0 -0
  750. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/rewind_overlay.py +0 -0
  751. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/rich_tool_display.py +0 -0
  752. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/sidebar_panels.py +0 -0
  753. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/slash_commands.py +0 -0
  754. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/slash_complete.py +0 -0
  755. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/split_view.py +0 -0
  756. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/status_bar.py +0 -0
  757. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/superqode_display.py +0 -0
  758. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/theme_picker.py +0 -0
  759. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/thinking.py +0 -0
  760. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/thinking_display.py +0 -0
  761. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/throbber.py +0 -0
  762. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/toast.py +0 -0
  763. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/uhp_connect.py +0 -0
  764. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/widgets/unified_output.py +0 -0
  765. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/__init__.py +0 -0
  766. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/cockpit.py +0 -0
  767. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/integration.py +0 -0
  768. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/models.py +0 -0
  769. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/runner.py +0 -0
  770. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/store.py +0 -0
  771. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/usage.py +0 -0
  772. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workorders/worker.py +0 -0
  773. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/__init__.py +0 -0
  774. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/artifacts.py +0 -0
  775. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/change_summary.py +0 -0
  776. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/coordinator.py +0 -0
  777. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/diff_tracker.py +0 -0
  778. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/git_guard.py +0 -0
  779. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/git_snapshot.py +0 -0
  780. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/manager.py +0 -0
  781. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/snapshot.py +0 -0
  782. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/watcher.py +0 -0
  783. {superqode-2.2.2 → superqode-2.2.4}/src/superqode/workspace/worktree.py +0 -0
  784. {superqode-2.2.2 → superqode-2.2.4}/src/superqode.egg-info/SOURCES.txt +0 -0
  785. {superqode-2.2.2 → superqode-2.2.4}/src/superqode.egg-info/dependency_links.txt +0 -0
  786. {superqode-2.2.2 → superqode-2.2.4}/src/superqode.egg-info/entry_points.txt +0 -0
  787. {superqode-2.2.2 → superqode-2.2.4}/src/superqode.egg-info/top_level.txt +0 -0
  788. {superqode-2.2.2 → superqode-2.2.4}/tests/test_030_candidate.py +0 -0
  789. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_bridge.py +0 -0
  790. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_conformance.py +0 -0
  791. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_connect.py +0 -0
  792. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_context.py +0 -0
  793. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_keys.py +0 -0
  794. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_limits.py +0 -0
  795. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_oauth.py +0 -0
  796. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_security.py +0 -0
  797. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_shortlist.py +0 -0
  798. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_trust.py +0 -0
  799. {superqode-2.2.2 → superqode-2.2.4}/tests/test_a2a_understand.py +0 -0
  800. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_agent_dispatch.py +0 -0
  801. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_client.py +0 -0
  802. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_free_models.py +0 -0
  803. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_parent_tool_linking.py +0 -0
  804. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_permission_store.py +0 -0
  805. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_registry.py +0 -0
  806. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_render.py +0 -0
  807. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_server.py +0 -0
  808. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_session_store.py +0 -0
  809. {superqode-2.2.2 → superqode-2.2.4}/tests/test_acp_slash.py +0 -0
  810. {superqode-2.2.2 → superqode-2.2.4}/tests/test_adaptive_compaction.py +0 -0
  811. {superqode-2.2.2 → superqode-2.2.4}/tests/test_agent_importer.py +0 -0
  812. {superqode-2.2.2 → superqode-2.2.4}/tests/test_agent_install_commands.py +0 -0
  813. {superqode-2.2.2 → superqode-2.2.4}/tests/test_agent_loop_harness.py +0 -0
  814. {superqode-2.2.2 → superqode-2.2.4}/tests/test_agent_memory.py +0 -0
  815. {superqode-2.2.2 → superqode-2.2.4}/tests/test_agents_md_compat.py +0 -0
  816. {superqode-2.2.2 → superqode-2.2.4}/tests/test_agy_tui_commands.py +0 -0
  817. {superqode-2.2.2 → superqode-2.2.4}/tests/test_app_main_contract.py +0 -0
  818. {superqode-2.2.2 → superqode-2.2.4}/tests/test_apply_patch.py +0 -0
  819. {superqode-2.2.2 → superqode-2.2.4}/tests/test_auth.py +0 -0
  820. {superqode-2.2.2 → superqode-2.2.4}/tests/test_bash_spill.py +0 -0
  821. {superqode-2.2.2 → superqode-2.2.4}/tests/test_benchmarks.py +0 -0
  822. {superqode-2.2.2 → superqode-2.2.4}/tests/test_catalog_freshness.py +0 -0
  823. {superqode-2.2.2 → superqode-2.2.4}/tests/test_change_summary.py +0 -0
  824. {superqode-2.2.2 → superqode-2.2.4}/tests/test_channels.py +0 -0
  825. {superqode-2.2.2 → superqode-2.2.4}/tests/test_cli_commands.py +0 -0
  826. {superqode-2.2.2 → superqode-2.2.4}/tests/test_cli_connect.py +0 -0
  827. {superqode-2.2.2 → superqode-2.2.4}/tests/test_cli_contract.py +0 -0
  828. {superqode-2.2.2 → superqode-2.2.4}/tests/test_cli_reference_coverage.py +0 -0
  829. {superqode-2.2.2 → superqode-2.2.4}/tests/test_clickable_commands.py +0 -0
  830. {superqode-2.2.2 → superqode-2.2.4}/tests/test_command_safety.py +0 -0
  831. {superqode-2.2.2 → superqode-2.2.4}/tests/test_commands_runtime.py +0 -0
  832. {superqode-2.2.2 → superqode-2.2.4}/tests/test_compaction.py +0 -0
  833. {superqode-2.2.2 → superqode-2.2.4}/tests/test_config_loader.py +0 -0
  834. {superqode-2.2.2 → superqode-2.2.4}/tests/test_config_runtime.py +0 -0
  835. {superqode-2.2.2 → superqode-2.2.4}/tests/test_connect_harness_screen.py +0 -0
  836. {superqode-2.2.2 → superqode-2.2.4}/tests/test_connect_setup.py +0 -0
  837. {superqode-2.2.2 → superqode-2.2.4}/tests/test_connection_profiles.py +0 -0
  838. {superqode-2.2.2 → superqode-2.2.4}/tests/test_context_handles.py +0 -0
  839. {superqode-2.2.2 → superqode-2.2.4}/tests/test_context_probe.py +0 -0
  840. {superqode-2.2.2 → superqode-2.2.4}/tests/test_context_remaining.py +0 -0
  841. {superqode-2.2.2 → superqode-2.2.4}/tests/test_copilot_login_ux.py +0 -0
  842. {superqode-2.2.2 → superqode-2.2.4}/tests/test_copilot_tui_commands.py +0 -0
  843. {superqode-2.2.2 → superqode-2.2.4}/tests/test_create_skill_tool.py +0 -0
  844. {superqode-2.2.2 → superqode-2.2.4}/tests/test_deepagents_model_spec.py +0 -0
  845. {superqode-2.2.2 → superqode-2.2.4}/tests/test_deferred_tools.py +0 -0
  846. {superqode-2.2.2 → superqode-2.2.4}/tests/test_design_system_contrast.py +0 -0
  847. {superqode-2.2.2 → superqode-2.2.4}/tests/test_developer_workflow_docs.py +0 -0
  848. {superqode-2.2.2 → superqode-2.2.4}/tests/test_ds4_local_client.py +0 -0
  849. {superqode-2.2.2 → superqode-2.2.4}/tests/test_dsh_harness.py +0 -0
  850. {superqode-2.2.2 → superqode-2.2.4}/tests/test_dynamic_workflow_tool.py +0 -0
  851. {superqode-2.2.2 → superqode-2.2.4}/tests/test_edit_line_number_strip.py +0 -0
  852. {superqode-2.2.2 → superqode-2.2.4}/tests/test_env_introspect.py +0 -0
  853. {superqode-2.2.2 → superqode-2.2.4}/tests/test_execution_resolver.py +0 -0
  854. {superqode-2.2.2 → superqode-2.2.4}/tests/test_extensions.py +0 -0
  855. {superqode-2.2.2 → superqode-2.2.4}/tests/test_final_parity_wave.py +0 -0
  856. {superqode-2.2.2 → superqode-2.2.4}/tests/test_free_models.py +0 -0
  857. {superqode-2.2.2 → superqode-2.2.4}/tests/test_governance.py +0 -0
  858. {superqode-2.2.2 → superqode-2.2.4}/tests/test_grok_cli_auth.py +0 -0
  859. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_agent_session.py +0 -0
  860. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_backends.py +0 -0
  861. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_bench.py +0 -0
  862. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_bench_paths.py +0 -0
  863. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_catalog.py +0 -0
  864. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_connect_catalog.py +0 -0
  865. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_drift.py +0 -0
  866. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_eval_splits.py +0 -0
  867. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_examples.py +0 -0
  868. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_explain.py +0 -0
  869. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_hooks.py +0 -0
  870. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_hub_catalog.py +0 -0
  871. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_hub_screen.py +0 -0
  872. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_kernel.py +0 -0
  873. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_mcp_server.py +0 -0
  874. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_model_policy.py +0 -0
  875. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_observability.py +0 -0
  876. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_omni.py +0 -0
  877. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_output.py +0 -0
  878. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_permissions.py +0 -0
  879. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_promotion.py +0 -0
  880. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_protocol.py +0 -0
  881. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_sandbox.py +0 -0
  882. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_seesaw_dimensions.py +0 -0
  883. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_self_improve.py +0 -0
  884. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_spec.py +0 -0
  885. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_store.py +0 -0
  886. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_usage.py +0 -0
  887. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_wizard.py +0 -0
  888. {superqode-2.2.2 → superqode-2.2.4}/tests/test_harness_workflow.py +0 -0
  889. {superqode-2.2.2 → superqode-2.2.4}/tests/test_headless.py +0 -0
  890. {superqode-2.2.2 → superqode-2.2.4}/tests/test_hf_fetch.py +0 -0
  891. {superqode-2.2.2 → superqode-2.2.4}/tests/test_hooks.py +0 -0
  892. {superqode-2.2.2 → superqode-2.2.4}/tests/test_install_script.py +0 -0
  893. {superqode-2.2.2 → superqode-2.2.4}/tests/test_integration_docs.py +0 -0
  894. {superqode-2.2.2 → superqode-2.2.4}/tests/test_kimi_k3_provider.py +0 -0
  895. {superqode-2.2.2 → superqode-2.2.4}/tests/test_kimi_k3_routes.py +0 -0
  896. {superqode-2.2.2 → superqode-2.2.4}/tests/test_linter_runner.py +0 -0
  897. {superqode-2.2.2 → superqode-2.2.4}/tests/test_litellm_gateway.py +0 -0
  898. {superqode-2.2.2 → superqode-2.2.4}/tests/test_live_acp_registry.py +0 -0
  899. {superqode-2.2.2 → superqode-2.2.4}/tests/test_live_models.py +0 -0
  900. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_airplane.py +0 -0
  901. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_build.py +0 -0
  902. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_code_index.py +0 -0
  903. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_labs.py +0 -0
  904. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_migrate.py +0 -0
  905. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_model_optimizations.py +0 -0
  906. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_packs.py +0 -0
  907. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_sandbox.py +0 -0
  908. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_search.py +0 -0
  909. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_servers.py +0 -0
  910. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_setup.py +0 -0
  911. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_smoke.py +0 -0
  912. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_stack.py +0 -0
  913. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_tool_capabilities.py +0 -0
  914. {superqode-2.2.2 → superqode-2.2.4}/tests/test_local_tool_support.py +0 -0
  915. {superqode-2.2.2 → superqode-2.2.4}/tests/test_login_api.py +0 -0
  916. {superqode-2.2.2 → superqode-2.2.4}/tests/test_loop_guard.py +0 -0
  917. {superqode-2.2.2 → superqode-2.2.4}/tests/test_managed_harness_backend.py +0 -0
  918. {superqode-2.2.2 → superqode-2.2.4}/tests/test_markdown_render.py +0 -0
  919. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mcp.py +0 -0
  920. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mcp_example_server.py +0 -0
  921. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mcp_integration.py +0 -0
  922. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mcp_live.py +0 -0
  923. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mcp_oauth_generalized.py +0 -0
  924. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mcp_tools_runtime.py +0 -0
  925. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mcp_two_way.py +0 -0
  926. {superqode-2.2.2 → superqode-2.2.4}/tests/test_memory_recall.py +0 -0
  927. {superqode-2.2.2 → superqode-2.2.4}/tests/test_mlx_tools.py +0 -0
  928. {superqode-2.2.2 → superqode-2.2.4}/tests/test_model_profiles.py +0 -0
  929. {superqode-2.2.2 → superqode-2.2.4}/tests/test_model_specs.py +0 -0
  930. {superqode-2.2.2 → superqode-2.2.4}/tests/test_models_dev.py +0 -0
  931. {superqode-2.2.2 → superqode-2.2.4}/tests/test_monty_tool.py +0 -0
  932. {superqode-2.2.2 → superqode-2.2.4}/tests/test_navigation_history.py +0 -0
  933. {superqode-2.2.2 → superqode-2.2.4}/tests/test_network_policy.py +0 -0
  934. {superqode-2.2.2 → superqode-2.2.4}/tests/test_ollama_client.py +0 -0
  935. {superqode-2.2.2 → superqode-2.2.4}/tests/test_omnigent_agent_session_smoke.py +0 -0
  936. {superqode-2.2.2 → superqode-2.2.4}/tests/test_omnigent_importer.py +0 -0
  937. {superqode-2.2.2 → superqode-2.2.4}/tests/test_openai_session.py +0 -0
  938. {superqode-2.2.2 → superqode-2.2.4}/tests/test_output_spill.py +0 -0
  939. {superqode-2.2.2 → superqode-2.2.4}/tests/test_parallel_compare.py +0 -0
  940. {superqode-2.2.2 → superqode-2.2.4}/tests/test_peer_agents.py +0 -0
  941. {superqode-2.2.2 → superqode-2.2.4}/tests/test_plugin_hook_wiring.py +0 -0
  942. {superqode-2.2.2 → superqode-2.2.4}/tests/test_plugins.py +0 -0
  943. {superqode-2.2.2 → superqode-2.2.4}/tests/test_policies_and_turndiff.py +0 -0
  944. {superqode-2.2.2 → superqode-2.2.4}/tests/test_post_edit_verify.py +0 -0
  945. {superqode-2.2.2 → superqode-2.2.4}/tests/test_prime_agent_client.py +0 -0
  946. {superqode-2.2.2 → superqode-2.2.4}/tests/test_prime_agent_harness.py +0 -0
  947. {superqode-2.2.2 → superqode-2.2.4}/tests/test_prime_agent_provider.py +0 -0
  948. {superqode-2.2.2 → superqode-2.2.4}/tests/test_prime_command_surface.py +0 -0
  949. {superqode-2.2.2 → superqode-2.2.4}/tests/test_prime_tui_rpc.py +0 -0
  950. {superqode-2.2.2 → superqode-2.2.4}/tests/test_progressive_discovery.py +0 -0
  951. {superqode-2.2.2 → superqode-2.2.4}/tests/test_progressive_reveals.py +0 -0
  952. {superqode-2.2.2 → superqode-2.2.4}/tests/test_project_trust.py +0 -0
  953. {superqode-2.2.2 → superqode-2.2.4}/tests/test_prompt_stack.py +0 -0
  954. {superqode-2.2.2 → superqode-2.2.4}/tests/test_provider_catalog.py +0 -0
  955. {superqode-2.2.2 → superqode-2.2.4}/tests/test_provider_dynamic.py +0 -0
  956. {superqode-2.2.2 → superqode-2.2.4}/tests/test_provider_models.py +0 -0
  957. {superqode-2.2.2 → superqode-2.2.4}/tests/test_provider_recommendations.py +0 -0
  958. {superqode-2.2.2 → superqode-2.2.4}/tests/test_pure_mode_sessions.py +0 -0
  959. {superqode-2.2.2 → superqode-2.2.4}/tests/test_qm_deployment_layer.py +0 -0
  960. {superqode-2.2.2 → superqode-2.2.4}/tests/test_rate_limit_retry.py +0 -0
  961. {superqode-2.2.2 → superqode-2.2.4}/tests/test_read_tool_limits.py +0 -0
  962. {superqode-2.2.2 → superqode-2.2.4}/tests/test_reasoning_and_budget.py +0 -0
  963. {superqode-2.2.2 → superqode-2.2.4}/tests/test_recursive_eval_packs.py +0 -0
  964. {superqode-2.2.2 → superqode-2.2.4}/tests/test_release_metadata.py +0 -0
  965. {superqode-2.2.2 → superqode-2.2.4}/tests/test_rlm_code_integration.py +0 -0
  966. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_adk.py +0 -0
  967. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_antigravity_cli.py +0 -0
  968. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_antigravity_managed.py +0 -0
  969. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_antigravity_sdk.py +0 -0
  970. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_builtin.py +0 -0
  971. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_claude_agent_sdk.py +0 -0
  972. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_codex_sdk.py +0 -0
  973. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_copilot_sdk.py +0 -0
  974. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_devin_cli.py +0 -0
  975. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_dialog.py +0 -0
  976. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_openai_agents.py +0 -0
  977. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_openai_events.py +0 -0
  978. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_openai_hitl.py +0 -0
  979. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_openai_sandbox.py +0 -0
  980. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_protocol.py +0 -0
  981. {superqode-2.2.2 → superqode-2.2.4}/tests/test_runtime_pydanticai.py +0 -0
  982. {superqode-2.2.2 → superqode-2.2.4}/tests/test_sandbox_backends.py +0 -0
  983. {superqode-2.2.2 → superqode-2.2.4}/tests/test_sandbox_execution.py +0 -0
  984. {superqode-2.2.2 → superqode-2.2.4}/tests/test_search_roots.py +0 -0
  985. {superqode-2.2.2 → superqode-2.2.4}/tests/test_semantic_search.py +0 -0
  986. {superqode-2.2.2 → superqode-2.2.4}/tests/test_session_switchboard.py +0 -0
  987. {superqode-2.2.2 → superqode-2.2.4}/tests/test_shell_session.py +0 -0
  988. {superqode-2.2.2 → superqode-2.2.4}/tests/test_simple_login.py +0 -0
  989. {superqode-2.2.2 → superqode-2.2.4}/tests/test_simple_query_fastpath.py +0 -0
  990. {superqode-2.2.2 → superqode-2.2.4}/tests/test_skillopt.py +0 -0
  991. {superqode-2.2.2 → superqode-2.2.4}/tests/test_slash_runtime.py +0 -0
  992. {superqode-2.2.2 → superqode-2.2.4}/tests/test_spawn_harness_tool.py +0 -0
  993. {superqode-2.2.2 → superqode-2.2.4}/tests/test_status_bar_layout.py +0 -0
  994. {superqode-2.2.2 → superqode-2.2.4}/tests/test_steering_continue_reminders.py +0 -0
  995. {superqode-2.2.2 → superqode-2.2.4}/tests/test_streaming_tool_calls.py +0 -0
  996. {superqode-2.2.2 → superqode-2.2.4}/tests/test_subscription_billing_policy.py +0 -0
  997. {superqode-2.2.2 → superqode-2.2.4}/tests/test_subscription_login.py +0 -0
  998. {superqode-2.2.2 → superqode-2.2.4}/tests/test_subscription_login_consent.py +0 -0
  999. {superqode-2.2.2 → superqode-2.2.4}/tests/test_synthetic_gateways.py +0 -0
  1000. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tau_harness_adapter.py +0 -0
  1001. {superqode-2.2.2 → superqode-2.2.4}/tests/test_terminal_output_limits.py +0 -0
  1002. {superqode-2.2.2 → superqode-2.2.4}/tests/test_theme_contrast.py +0 -0
  1003. {superqode-2.2.2 → superqode-2.2.4}/tests/test_theme_picker.py +0 -0
  1004. {superqode-2.2.2 → superqode-2.2.4}/tests/test_theme_repaint.py +0 -0
  1005. {superqode-2.2.2 → superqode-2.2.4}/tests/test_todo_tools.py +0 -0
  1006. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tool_args_repair.py +0 -0
  1007. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tool_batch_safety.py +0 -0
  1008. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tool_bridge.py +0 -0
  1009. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tool_bridge_openai.py +0 -0
  1010. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tool_call_repair.py +0 -0
  1011. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tool_output_pruning.py +0 -0
  1012. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tool_tracking.py +0 -0
  1013. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tools.py +0 -0
  1014. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_change_summary.py +0 -0
  1015. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_chat_mode.py +0 -0
  1016. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_diagnostics.py +0 -0
  1017. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_exit.py +0 -0
  1018. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_feedback.py +0 -0
  1019. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_launch_performance.py +0 -0
  1020. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_llamacpp_connect.py +0 -0
  1021. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_markdown_cleanup.py +0 -0
  1022. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_mlx_connect.py +0 -0
  1023. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_mounted.py +0 -0
  1024. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_onboarding.py +0 -0
  1025. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_smoke.py +0 -0
  1026. {superqode-2.2.2 → superqode-2.2.4}/tests/test_tui_tool_display.py +0 -0
  1027. {superqode-2.2.2 → superqode-2.2.4}/tests/test_uhp_backend.py +0 -0
  1028. {superqode-2.2.2 → superqode-2.2.4}/tests/test_uhp_connect.py +0 -0
  1029. {superqode-2.2.2 → superqode-2.2.4}/tests/test_update_command.py +0 -0
  1030. {superqode-2.2.2 → superqode-2.2.4}/tests/test_vendor_cli_runtime.py +0 -0
  1031. {superqode-2.2.2 → superqode-2.2.4}/tests/test_version.py +0 -0
  1032. {superqode-2.2.2 → superqode-2.2.4}/tests/test_view_image.py +0 -0
  1033. {superqode-2.2.2 → superqode-2.2.4}/tests/test_web_server_auth.py +0 -0
  1034. {superqode-2.2.2 → superqode-2.2.4}/tests/test_workorders.py +0 -0
  1035. {superqode-2.2.2 → superqode-2.2.4}/tests/test_workspace.py +0 -0
  1036. {superqode-2.2.2 → superqode-2.2.4}/tests/test_zai_provider.py +0 -0
@@ -7,6 +7,55 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.2.4] - 2026-09-13
11
+
12
+ Hosting a UHP harness gets its own install extra, so `serve uhp` no longer
13
+ asks for the A2A stack. `scripts/run_uhp_conformance.sh` runs the HarnessRouter
14
+ conformance suite against a local bind.
15
+
16
+ ### 🧩 Unified Harness Protocol
17
+
18
+ - New `superqode[uhp]` extra: FastAPI and uvicorn, the two packages
19
+ `serve uhp` needs. Hosting a UHP harness no longer means installing
20
+ `superqode[a2a]` and its unrelated A2A stack. The client needs neither,
21
+ because httpx and httpx-sse are core dependencies.
22
+ - `serve uhp` without those packages now names the extra to install. It exited
23
+ with a raw `ModuleNotFoundError` traceback.
24
+ - `Dockerfile.uhp` installs `.[uhp]` instead of `.[a2a]`.
25
+ - `scripts/run_uhp_conformance.sh` stands up a local bind and runs the
26
+ HarnessRouter conformance suite against it, in a scratch directory. The
27
+ suite is a stock UHP client and does not send `X-Provider-Api-Key`, so a
28
+ BYOK bind cannot be measured directly.
29
+
30
+ ## [2.2.3] - 2026-09-13
31
+
32
+ Security fixes for the UHP client and the BYOK server bind shipped in 2.2.2.
33
+ Anyone who ran `superqode connect uhp` on 2.2.2 sent their model key to the
34
+ address they connected to, including on the anonymous discovery request, so
35
+ upgrading is worth doing before the next connect. No API changed and no
36
+ protocol behaviour changed: the Core conformance result is the same 38/40.
37
+
38
+ ### 🔐 UHP security
39
+
40
+ - The client sends `X-Provider-Api-Key` on a task submission only. It was
41
+ attached to every request, including the anonymous discovery and catalog
42
+ GETs, so `connect uhp --base-url <address>` handed that address the caller's
43
+ model key before the caller had decided to trust it. The key is also
44
+ withheld from a remote plaintext `http://` origin, with a warning.
45
+ - A caller's model key no longer races with another caller's. It is written to
46
+ every environment variable the provider reads, and BYOK turns are serialised
47
+ for as long as it is in the process environment, which LiteLLM reads
48
+ credentials from. Concurrent turns previously overwrote each other's key.
49
+ - `Dockerfile.uhp` no longer passes `--api-key` on the command line. The bearer
50
+ came from the environment either way, and the argument published it in
51
+ `/proc/1/cmdline`, which the bound harness's shell tool can read.
52
+ - On a remote bind each session gets its own directory under the working
53
+ directory, so callers cannot read each other's files or session transcripts.
54
+ A local bind still runs in the directory it was given.
55
+ - Request metadata can no longer set harness runtime controls such as
56
+ `agent_max_iterations`. Caller context is still passed through.
57
+ - Bearer comparison is constant time.
58
+
10
59
  ## [2.2.2] - 2026-09-12
11
60
 
12
61
  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.4
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>
@@ -66,6 +66,9 @@ Provides-Extra: a2a
66
66
  Requires-Dist: a2a-sdk[fastapi,sqlite]<2.0.0,>=1.1.2; extra == "a2a"
67
67
  Requires-Dist: fastapi>=0.115.0; extra == "a2a"
68
68
  Requires-Dist: uvicorn>=0.32.0; extra == "a2a"
69
+ Provides-Extra: uhp
70
+ Requires-Dist: fastapi>=0.115.0; extra == "uhp"
71
+ Requires-Dist: uvicorn>=0.32.0; extra == "uhp"
69
72
  Provides-Extra: adk
70
73
  Requires-Dist: google-adk<3.0,>=2.1.0; extra == "adk"
71
74
  Provides-Extra: openai-agents
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superqode"
3
- version = "2.2.2"
3
+ version = "2.2.4"
4
4
  description = "The harness layer for coding agents"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -113,6 +113,13 @@ a2a = [
113
113
  "fastapi>=0.115.0",
114
114
  "uvicorn>=0.32.0",
115
115
  ]
116
+ uhp = [
117
+ # `serve uhp` only. The UHP client needs nothing extra: httpx and
118
+ # httpx-sse are core. Deliberately no a2a-sdk, so hosting a UHP harness
119
+ # does not drag in an unrelated protocol stack.
120
+ "fastapi>=0.115.0",
121
+ "uvicorn>=0.32.0",
122
+ ]
116
123
  adk = [
117
124
  "google-adk>=2.1.0,<3.0",
118
125
  ]
@@ -38,7 +38,7 @@ __all__ = [
38
38
  "sidebar",
39
39
  ]
40
40
 
41
- __version__ = "2.2.2"
41
+ __version__ = "2.2.4"
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
@@ -375,7 +375,7 @@ def serve_uhp(
375
375
  This is SuperQode's own harness speaking UHP — complementary to
376
376
  HarnessRouter, not a multi-backend runner replacement.
377
377
  """
378
- from superqode.harness.uhp_server import create_uhp_server
378
+ from superqode.harness.uhp_server import MissingUHPServerDependency, create_uhp_server
379
379
 
380
380
  is_loopback = host in {"127.0.0.1", "localhost", "::1"}
381
381
  if not is_loopback and not allow_remote:
@@ -387,16 +387,19 @@ def serve_uhp(
387
387
  "the caller's X-Provider-Api-Key."
388
388
  )
389
389
 
390
- server = create_uhp_server(
391
- spec=spec_path,
392
- provider=provider,
393
- model=model_name,
394
- working_directory=working_dir.resolve(),
395
- api_key=api_key,
396
- harness_id=harness_id,
397
- public_catalog=allow_remote,
398
- require_caller_provider_key=allow_remote,
399
- )
390
+ try:
391
+ server = create_uhp_server(
392
+ spec=spec_path,
393
+ provider=provider,
394
+ model=model_name,
395
+ working_directory=working_dir.resolve(),
396
+ api_key=api_key,
397
+ harness_id=harness_id,
398
+ public_catalog=allow_remote,
399
+ require_caller_provider_key=allow_remote,
400
+ )
401
+ except MissingUHPServerDependency as exc:
402
+ raise click.ClickException(str(exc)) from exc
400
403
  console.print(
401
404
  f"[cyan]Serving SuperQode UHP {server.discovery_document()['default_version']} "
402
405
  f"on http://{host}:{port}[/cyan]"
@@ -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,9 +44,27 @@ 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
 
64
+ class MissingUHPServerDependency(RuntimeError):
65
+ """Serving UHP needs the `uhp` extra; the client does not."""
66
+
67
+
48
68
  @dataclass(frozen=True)
49
69
  class UHPRunRequest:
50
70
  """Inputs handed to the bound harness runner."""
@@ -167,6 +187,9 @@ class UHPServerConfig:
167
187
  public_catalog: bool = False
168
188
  #: Refuse a harness turn unless the caller sent PROVIDER_KEY_HEADER.
169
189
  require_caller_provider_key: bool = False
190
+ #: Per-session directory under working_directory, so callers on a shared
191
+ #: bind cannot read each other's files. Off locally: work in the project.
192
+ isolate_session_workspaces: bool = False
170
193
 
171
194
 
172
195
  def _package_version() -> str:
@@ -178,18 +201,58 @@ def _package_version() -> str:
178
201
  return "0.0.0"
179
202
 
180
203
 
181
- def _provider_key_env(provider: str) -> str:
182
- """Env var LiteLLM reads for this provider (caller BYOK)."""
204
+ def _provider_key_envs(provider: str) -> tuple[str, ...]:
205
+ """Every env var LiteLLM may read for this provider (caller BYOK).
206
+
207
+ All of them, not just the first: which one LiteLLM reads is its choice,
208
+ and Google alone has two.
209
+ """
183
210
  try:
184
211
  from superqode.providers.registry import PROVIDERS
185
212
 
186
213
  pdef = PROVIDERS.get(provider)
187
- names = getattr(pdef, "env_vars", None) or ()
214
+ names = tuple(str(name) for name in (getattr(pdef, "env_vars", None) or ()) if name)
188
215
  if names:
189
- return str(names[0])
216
+ return names
190
217
  except Exception:
191
218
  pass
192
- return f"{(provider or 'OPENAI').upper()}_API_KEY"
219
+ return (f"{(provider or 'OPENAI').upper()}_API_KEY",)
220
+
221
+
222
+ @asynccontextmanager
223
+ async def _caller_provider_key(token: str, env_names: Sequence[str]) -> AsyncIterator[None]:
224
+ """Hold one caller's model key in ``os.environ`` for the length of a turn.
225
+
226
+ Serialises BYOK turns: the environment is process-global, so overlapping
227
+ turns would otherwise send each other's key.
228
+ """
229
+ if not token:
230
+ yield
231
+ return
232
+ async with _PROVIDER_ENV_LOCK:
233
+ previous = {name: os.environ.get(name) for name in env_names}
234
+ for name in env_names:
235
+ os.environ[name] = token
236
+ try:
237
+ yield
238
+ finally:
239
+ for name, value in previous.items():
240
+ if value is None:
241
+ os.environ.pop(name, None)
242
+ else:
243
+ os.environ[name] = value
244
+
245
+
246
+ def _caller_metadata(body: Mapping[str, Any]) -> dict[str, Any]:
247
+ """Caller-supplied metadata with the runtime's own control keys removed."""
248
+ raw = body.get("metadata")
249
+ if not isinstance(raw, Mapping):
250
+ return {}
251
+ return {
252
+ str(key): value
253
+ for key, value in raw.items()
254
+ if str(key) not in RESERVED_METADATA_KEYS and not str(key).startswith("_")
255
+ }
193
256
 
194
257
 
195
258
  def harness_id_from_name(name: str) -> str:
@@ -372,8 +435,15 @@ class UHPServer:
372
435
  # -- FastAPI app ------------------------------------------------------------
373
436
 
374
437
  def _build_app(self) -> Any:
375
- from fastapi import FastAPI
376
- from fastapi.responses import JSONResponse, StreamingResponse
438
+ try:
439
+ from fastapi import FastAPI
440
+ from fastapi.responses import JSONResponse, StreamingResponse
441
+ except ModuleNotFoundError as exc: # pragma: no cover - install-shape error
442
+ raise MissingUHPServerDependency(
443
+ "Serving UHP needs FastAPI and uvicorn, which are not installed.\n"
444
+ " pip install 'superqode[uhp]'\n"
445
+ "The UHP client works without them."
446
+ ) from exc
377
447
 
378
448
  app = FastAPI(
379
449
  title="SuperQode UHP Server",
@@ -706,7 +776,8 @@ class UHPServer:
706
776
  code="invalid_credential",
707
777
  message="Authorization must be a Bearer token.",
708
778
  )
709
- if token != expected:
779
+ # Bytes, because compare_digest rejects a non-ASCII str.
780
+ if not hmac.compare_digest(token.encode("utf-8"), expected.encode("utf-8")):
710
781
  return _error_envelope(
711
782
  error_type="authentication_error",
712
783
  code="invalid_credential",
@@ -714,6 +785,15 @@ class UHPServer:
714
785
  )
715
786
  return None
716
787
 
788
+ def _workspace_for(self, session_id: str) -> Path:
789
+ """The directory a turn runs in."""
790
+ root = Path(self.config.working_directory)
791
+ if not self.config.isolate_session_workspaces:
792
+ return root
793
+ workspace = root / "sessions" / session_id
794
+ workspace.mkdir(parents=True, exist_ok=True)
795
+ return workspace
796
+
717
797
  def _validate_harness_selection(
718
798
  self, body: Mapping[str, Any]
719
799
  ) -> tuple[int, dict[str, Any]] | None:
@@ -816,7 +896,7 @@ class UHPServer:
816
896
  prompt=prompt,
817
897
  model=model,
818
898
  provider=self.config.provider,
819
- working_directory=Path(self.config.working_directory),
899
+ working_directory=self._workspace_for(session_id),
820
900
  session_id=session_id,
821
901
  response_id=response_id,
822
902
  previous_response_id=previous_response_id,
@@ -827,7 +907,7 @@ class UHPServer:
827
907
  cancel_event=self._cancel_events[response_id],
828
908
  metadata={
829
909
  "harness_id": self.config.harness_id,
830
- **(dict(body["metadata"]) if isinstance(body.get("metadata"), Mapping) else {}),
910
+ **_caller_metadata(body),
831
911
  **({"provider_api_key": provider_api_key} if provider_api_key else {}),
832
912
  },
833
913
  )
@@ -1039,18 +1119,15 @@ class UHPServer:
1039
1119
  key: value for key, value in dict(request.metadata).items() if key != "provider_api_key"
1040
1120
  }
1041
1121
  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
1122
  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
- )
1123
+ async with _caller_provider_key(token, _provider_key_envs(provider)):
1124
+ result = await session.prompt(
1125
+ prompt,
1126
+ provider=provider,
1127
+ model=model,
1128
+ working_directory=request.working_directory,
1129
+ metadata=run_metadata,
1130
+ )
1054
1131
  except Exception:
1055
1132
  return UHPRunResult(
1056
1133
  status="failed",
@@ -1059,12 +1136,6 @@ class UHPServer:
1059
1136
  error_code="harness_error",
1060
1137
  usage=None,
1061
1138
  )
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
1139
 
1069
1140
  if request.cancel_event and request.cancel_event.is_set():
1070
1141
  return UHPRunResult(
@@ -1087,8 +1158,12 @@ def create_uhp_server(
1087
1158
  runner: HarnessRunner | None = None,
1088
1159
  public_catalog: bool = False,
1089
1160
  require_caller_provider_key: bool = False,
1161
+ isolate_session_workspaces: bool | None = None,
1090
1162
  ) -> UHPServer:
1091
- """Build a UHP server bound to one SuperQode HarnessSpec."""
1163
+ """Build a UHP server bound to one SuperQode HarnessSpec.
1164
+
1165
+ ``isolate_session_workspaces`` defaults to whether the bind is BYOK.
1166
+ """
1092
1167
  from superqode.harness import get_harness_template, load_harness_spec
1093
1168
 
1094
1169
  if spec is None:
@@ -1121,5 +1196,10 @@ def create_uhp_server(
1121
1196
  conformance_class="core",
1122
1197
  public_catalog=public_catalog,
1123
1198
  require_caller_provider_key=require_caller_provider_key,
1199
+ isolate_session_workspaces=(
1200
+ require_caller_provider_key
1201
+ if isolate_session_workspaces is None
1202
+ else isolate_session_workspaces
1203
+ ),
1124
1204
  )
1125
1205
  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.4
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>
@@ -66,6 +66,9 @@ Provides-Extra: a2a
66
66
  Requires-Dist: a2a-sdk[fastapi,sqlite]<2.0.0,>=1.1.2; extra == "a2a"
67
67
  Requires-Dist: fastapi>=0.115.0; extra == "a2a"
68
68
  Requires-Dist: uvicorn>=0.32.0; extra == "a2a"
69
+ Provides-Extra: uhp
70
+ Requires-Dist: fastapi>=0.115.0; extra == "uhp"
71
+ Requires-Dist: uvicorn>=0.32.0; extra == "uhp"
69
72
  Provides-Extra: adk
70
73
  Requires-Dist: google-adk<3.0,>=2.1.0; extra == "adk"
71
74
  Provides-Extra: openai-agents
@@ -151,6 +151,10 @@ coverage>=7.0.0
151
151
  bandit>=1.8.0
152
152
  httpx>=0.28.1
153
153
 
154
+ [uhp]
155
+ fastapi>=0.115.0
156
+ uvicorn>=0.32.0
157
+
154
158
  [ui-testing]
155
159
  selenium>=4.27.0
156
160
  playwright>=1.49.0
@@ -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"