superqode 0.2.1__tar.gz → 0.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. {superqode-0.2.1 → superqode-0.2.3}/CHANGELOG.md +9 -2
  2. {superqode-0.2.1/src/superqode.egg-info → superqode-0.2.3}/PKG-INFO +22 -3
  3. {superqode-0.2.1 → superqode-0.2.3}/README.md +21 -2
  4. {superqode-0.2.1 → superqode-0.2.3}/pyproject.toml +1 -1
  5. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/__init__.py +1 -1
  6. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app_main.py +37 -5
  7. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/pure_mode.py +58 -6
  8. {superqode-0.2.1 → superqode-0.2.3/src/superqode.egg-info}/PKG-INFO +22 -3
  9. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_kernel.py +99 -0
  10. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_smoke.py +86 -0
  11. {superqode-0.2.1 → superqode-0.2.3}/LICENSE +0 -0
  12. {superqode-0.2.1 → superqode-0.2.3}/MANIFEST.in +0 -0
  13. {superqode-0.2.1 → superqode-0.2.3}/examples/README.md +0 -0
  14. {superqode-0.2.1 → superqode-0.2.3}/examples/byok-acp-team.yaml +0 -0
  15. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/coding.yaml +0 -0
  16. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/deepagents.yaml +0 -0
  17. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/ds4.yaml +0 -0
  18. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/gemma4.yaml +0 -0
  19. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/google-adk.yaml +0 -0
  20. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/local-recursive-dynamic.yaml +0 -0
  21. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/no-tool.yaml +0 -0
  22. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/omnigent-multi-agent.yaml +0 -0
  23. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/openai-agents.yaml +0 -0
  24. {superqode-0.2.1 → superqode-0.2.3}/examples/harnesses/pydanticai.yaml +0 -0
  25. {superqode-0.2.1 → superqode-0.2.3}/examples/local-models-team.yaml +0 -0
  26. {superqode-0.2.1 → superqode-0.2.3}/examples/omnigent-multi-agent.agent.yaml +0 -0
  27. {superqode-0.2.1 → superqode-0.2.3}/examples/simple-team.yaml +0 -0
  28. {superqode-0.2.1 → superqode-0.2.3}/setup.cfg +0 -0
  29. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/__init__.py +0 -0
  30. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/client.py +0 -0
  31. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/presets.py +0 -0
  32. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/registry.py +0 -0
  33. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/server.py +0 -0
  34. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/skills.py +0 -0
  35. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/tools.py +0 -0
  36. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/types.py +0 -0
  37. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/a2a/workflows.py +0 -0
  38. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/__init__.py +0 -0
  39. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/client.py +0 -0
  40. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/doctor.py +0 -0
  41. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/permission_screen.py +0 -0
  42. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/permission_store.py +0 -0
  43. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/render.py +0 -0
  44. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/session_store.py +0 -0
  45. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/slash.py +0 -0
  46. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/tool_call_context.py +0 -0
  47. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp/types.py +0 -0
  48. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/acp_discovery.py +0 -0
  49. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/__init__.py +0 -0
  50. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/auto_memory.py +0 -0
  51. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/command_safety.py +0 -0
  52. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/compaction.py +0 -0
  53. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/context_manager.py +0 -0
  54. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/edit_strategies.py +0 -0
  55. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/exec_policy.py +0 -0
  56. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/hooks.py +0 -0
  57. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/loop.py +0 -0
  58. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/loop_guard.py +0 -0
  59. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/network_policy.py +0 -0
  60. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/output_handler.py +0 -0
  61. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/parallel_compare.py +0 -0
  62. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/peer_agents.py +0 -0
  63. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/plan_mode.py +0 -0
  64. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/reminders.py +0 -0
  65. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/rubric.py +0 -0
  66. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/session_manager.py +0 -0
  67. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/structured_output.py +0 -0
  68. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/summarization.py +0 -0
  69. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/system_prompts.py +0 -0
  70. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/terminal_output_limits.py +0 -0
  71. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/text_tool_calls.py +0 -0
  72. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/tool_args.py +0 -0
  73. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/tool_tracking.py +0 -0
  74. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent/utility_model.py +0 -0
  75. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent_output.py +0 -0
  76. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agent_stream.py +0 -0
  77. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/__init__.py +0 -0
  78. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/acp_registry.py +0 -0
  79. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/client.py +0 -0
  80. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/agentpool.phil65.github.io.toml +0 -0
  81. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/ampcode.com.toml +0 -0
  82. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/augmentcode.com.toml +0 -0
  83. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/autodev.github.io.toml +0 -0
  84. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/blackbox.ai.toml +0 -0
  85. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/bub.dev.toml +0 -0
  86. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/cagent.dev.toml +0 -0
  87. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/claude.com.toml +0 -0
  88. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/cline.bot.toml +0 -0
  89. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/codeassistant.dev.toml +0 -0
  90. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/codex.openai.com.toml +0 -0
  91. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/copilot.github.com.toml +0 -0
  92. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/crow-ai.dev.toml +0 -0
  93. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/cursor.com.toml +0 -0
  94. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/factory.ai.toml +0 -0
  95. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/fastagent.ai.toml +0 -0
  96. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/fount.dev.toml +0 -0
  97. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/geminicli.com.toml +0 -0
  98. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/goose.block.xyz.toml +0 -0
  99. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/hermes-agent.nousresearch.com.toml +0 -0
  100. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
  101. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
  102. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/kiro.dev.toml +0 -0
  103. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/llmlingagent.dev.toml +0 -0
  104. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/minioncode.dev.toml +0 -0
  105. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/mistral-vibe.mistral.ai.toml +0 -0
  106. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/openclaw.ai.toml +0 -0
  107. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/opencode.ai.toml +0 -0
  108. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/openhands.dev.toml +0 -0
  109. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/pi.dev.toml +0 -0
  110. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/poolside.ai.toml +0 -0
  111. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/qoder.com.toml +0 -0
  112. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/qwenlm.github.io.toml +0 -0
  113. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/sigit.dev.toml +0 -0
  114. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/stakpak.dev.toml +0 -0
  115. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/stdiobus.dev.toml +0 -0
  116. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/data/vtcode.dev.toml +0 -0
  117. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/discovery.py +0 -0
  118. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/free_models.py +0 -0
  119. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/messaging.py +0 -0
  120. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/official_acp.py +0 -0
  121. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/persona.py +0 -0
  122. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/registry.py +0 -0
  123. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/schema.py +0 -0
  124. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/agents/unified.py +0 -0
  125. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/__init__.py +0 -0
  126. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/constants.py +0 -0
  127. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/css.py +0 -0
  128. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/models.py +0 -0
  129. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/suggester.py +0 -0
  130. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/theme_bridge.py +0 -0
  131. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app/widgets.py +0 -0
  132. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/app_enhanced.py +0 -0
  133. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/approval.py +0 -0
  134. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/atomic.py +0 -0
  135. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/auth/__init__.py +0 -0
  136. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/benchmarks.py +0 -0
  137. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/__init__.py +0 -0
  138. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/config.py +0 -0
  139. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/discord.py +0 -0
  140. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/service.py +0 -0
  141. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/slack.py +0 -0
  142. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/channels/telegram.py +0 -0
  143. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/claude.py +0 -0
  144. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/codex.py +0 -0
  145. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/__init__.py +0 -0
  146. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/a2a.py +0 -0
  147. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/acp.py +0 -0
  148. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/agents.py +0 -0
  149. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/auth.py +0 -0
  150. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/config.py +0 -0
  151. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/daemon.py +0 -0
  152. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/local.py +0 -0
  153. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/providers.py +0 -0
  154. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/runtime.py +0 -0
  155. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/serve.py +0 -0
  156. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/commands/sessions.py +0 -0
  157. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/config/__init__.py +0 -0
  158. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/config/loader.py +0 -0
  159. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/config/schema.py +0 -0
  160. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/core/__init__.py +0 -0
  161. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/danger.py +0 -0
  162. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_fixtures/ci-dynamic-root-cause.log +0 -0
  163. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_fixtures/ci-root-cause.log +0 -0
  164. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_packs/local_dynamic_workflow_smoke.yaml +0 -0
  165. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/eval_packs/local_recursive_smoke.yaml +0 -0
  166. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/data/superqode-template.yaml +0 -0
  167. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/design_system.py +0 -0
  168. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/__init__.py +0 -0
  169. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/base.py +0 -0
  170. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/model.py +0 -0
  171. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/provider.py +0 -0
  172. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/dialogs/runtime.py +0 -0
  173. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/diff_view.py +0 -0
  174. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/enterprise.py +0 -0
  175. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/__init__.py +0 -0
  176. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/adapters.py +0 -0
  177. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/behaviors.py +0 -0
  178. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/engine.py +0 -0
  179. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/evaluation/scenarios.py +0 -0
  180. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/__init__.py +0 -0
  181. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/linter.py +0 -0
  182. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/modes.py +0 -0
  183. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/resolver.py +0 -0
  184. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/execution/runner.py +0 -0
  185. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/file_explorer.py +0 -0
  186. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/file_viewer.py +0 -0
  187. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/flash.py +0 -0
  188. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/__init__.py +0 -0
  189. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/accelerator.py +0 -0
  190. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/agent_importer.py +0 -0
  191. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/approval_memory.py +0 -0
  192. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/__init__.py +0 -0
  193. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/base.py +0 -0
  194. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/deepagents.py +0 -0
  195. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/managed.py +0 -0
  196. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/pydanticai.py +0 -0
  197. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/registry.py +0 -0
  198. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/backends/runtime.py +0 -0
  199. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/compiler.py +0 -0
  200. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/context_handles.py +0 -0
  201. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/diagnostics.py +0 -0
  202. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/eval.py +0 -0
  203. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/events.py +0 -0
  204. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/explain.py +0 -0
  205. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/hooks.py +0 -0
  206. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/kernel.py +0 -0
  207. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/loader.py +0 -0
  208. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/mcp_bridge.py +0 -0
  209. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/model_policy.py +0 -0
  210. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/observability.py +0 -0
  211. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/omnigent_importer.py +0 -0
  212. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/optimize.py +0 -0
  213. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/output.py +0 -0
  214. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/permissions.py +0 -0
  215. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/registry.py +0 -0
  216. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/sandbox.py +0 -0
  217. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/spec.py +0 -0
  218. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/store.py +0 -0
  219. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/templates.py +0 -0
  220. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/testing.py +0 -0
  221. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/wizard.py +0 -0
  222. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/workflow.py +0 -0
  223. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/harness/workflow_presets.py +0 -0
  224. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/headless.py +0 -0
  225. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/history.py +0 -0
  226. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/__init__.py +0 -0
  227. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/airplane.py +0 -0
  228. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/bench.py +0 -0
  229. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/build.py +0 -0
  230. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/code_index.py +0 -0
  231. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/devstral.yaml +0 -0
  232. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/ds4.yaml +0 -0
  233. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/gemma4.yaml +0 -0
  234. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/glm.yaml +0 -0
  235. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/gpt-oss.yaml +0 -0
  236. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/minimax.yaml +0 -0
  237. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/qwen-coder.yaml +0 -0
  238. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/model-packs/qwen3.yaml +0 -0
  239. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/data/stack_matrix.yaml +0 -0
  240. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/doctor.py +0 -0
  241. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/engines.py +0 -0
  242. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/guardrails.py +0 -0
  243. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/hardware.py +0 -0
  244. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/inventory.py +0 -0
  245. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/labs.py +0 -0
  246. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/matrix.py +0 -0
  247. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/migrate.py +0 -0
  248. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/optimize.py +0 -0
  249. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/packs.py +0 -0
  250. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/repo.py +0 -0
  251. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/servers.py +0 -0
  252. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/setup.py +0 -0
  253. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/local/smoke.py +0 -0
  254. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/__init__.py +0 -0
  255. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/adapters.py +0 -0
  256. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/formatter.py +0 -0
  257. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/integration.py +0 -0
  258. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/sinks.py +0 -0
  259. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/logging/unified_log.py +0 -0
  260. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/lsp/__init__.py +0 -0
  261. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/lsp/client.py +0 -0
  262. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/main.py +0 -0
  263. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/__init__.py +0 -0
  264. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/auth_storage.py +0 -0
  265. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/client.py +0 -0
  266. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/config.py +0 -0
  267. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/elicitation.py +0 -0
  268. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/harness_server.py +0 -0
  269. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/hf_auth.py +0 -0
  270. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/integration.py +0 -0
  271. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/oauth.py +0 -0
  272. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/oauth_callback.py +0 -0
  273. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/sampling.py +0 -0
  274. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/search.py +0 -0
  275. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/mcp/types.py +0 -0
  276. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/__init__.py +0 -0
  277. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/config.py +0 -0
  278. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/providers.py +0 -0
  279. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/memory/types.py +0 -0
  280. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/notifications.py +0 -0
  281. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/permissions/__init__.py +0 -0
  282. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/permissions/rules.py +0 -0
  283. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/plan.py +0 -0
  284. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/plugins.py +0 -0
  285. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/project_trust.py +0 -0
  286. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/__init__.py +0 -0
  287. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/_builtin_profiles.py +0 -0
  288. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/acp_free_models.py +0 -0
  289. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/acp_models.py +0 -0
  290. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/acp_registry.py +0 -0
  291. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/apple_fm.py +0 -0
  292. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/catalog.py +0 -0
  293. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/connection_profiles.py +0 -0
  294. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/credentials.py +0 -0
  295. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/dynamic.py +0 -0
  296. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/env_introspect.py +0 -0
  297. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/free_inference.py +0 -0
  298. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/__init__.py +0 -0
  299. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/base.py +0 -0
  300. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/litellm_gateway.py +0 -0
  301. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
  302. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/gateway/synthetic.py +0 -0
  303. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/health.py +0 -0
  304. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/__init__.py +0 -0
  305. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/convert.py +0 -0
  306. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/downloader.py +0 -0
  307. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/endpoints.py +0 -0
  308. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/fetch.py +0 -0
  309. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/hub.py +0 -0
  310. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/inference.py +0 -0
  311. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
  312. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/live_models.py +0 -0
  313. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/__init__.py +0 -0
  314. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/_mlx_worker.py +0 -0
  315. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/base.py +0 -0
  316. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/context_probe.py +0 -0
  317. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/discovery.py +0 -0
  318. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/ds4.py +0 -0
  319. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/lmstudio.py +0 -0
  320. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/mlx.py +0 -0
  321. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/mlx_engine.py +0 -0
  322. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/mlx_tools.py +0 -0
  323. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/ollama.py +0 -0
  324. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/sglang.py +0 -0
  325. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/smoke.py +0 -0
  326. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/tgi.py +0 -0
  327. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/tool_support.py +0 -0
  328. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/local/vllm.py +0 -0
  329. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/manager.py +0 -0
  330. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/model_specs.py +0 -0
  331. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/models.py +0 -0
  332. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/models_dev.py +0 -0
  333. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/opencode_models.py +0 -0
  334. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/__init__.py +0 -0
  335. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
  336. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/converters/messages.py +0 -0
  337. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/converters/tools.py +0 -0
  338. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
  339. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/schema/models.py +0 -0
  340. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
  341. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
  342. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
  343. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
  344. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
  345. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
  346. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
  347. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/profiles.py +0 -0
  348. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/recommendations.py +0 -0
  349. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/registry.py +0 -0
  350. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/providers/usage.py +0 -0
  351. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/py.typed +0 -0
  352. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/__init__.py +0 -0
  353. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/html_export.py +0 -0
  354. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/markdown.py +0 -0
  355. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/rendering/transcript_export.py +0 -0
  356. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/__init__.py +0 -0
  357. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/adk.py +0 -0
  358. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/base.py +0 -0
  359. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/builtin.py +0 -0
  360. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/claude_agent_sdk.py +0 -0
  361. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/codex_sdk.py +0 -0
  362. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/errors.py +0 -0
  363. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/openai_agents.py +0 -0
  364. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/openai_sandbox.py +0 -0
  365. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/openai_session.py +0 -0
  366. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/pydanticai.py +0 -0
  367. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/registry.py +0 -0
  368. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/tool_bridge.py +0 -0
  369. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/tool_bridge_openai.py +0 -0
  370. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/runtime/tool_bridge_pydanticai.py +0 -0
  371. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/safety/__init__.py +0 -0
  372. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/safety/sandbox.py +0 -0
  373. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/safety/warnings.py +0 -0
  374. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/__init__.py +0 -0
  375. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/backends.py +0 -0
  376. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/execution.py +0 -0
  377. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sandbox/local_sandbox.py +0 -0
  378. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/search_registry.py +0 -0
  379. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/server/__init__.py +0 -0
  380. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/server/api.py +0 -0
  381. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/server/web.py +0 -0
  382. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/__init__.py +0 -0
  383. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/factory.py +0 -0
  384. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/persistence.py +0 -0
  385. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/share_artifacts.py +0 -0
  386. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/sharing.py +0 -0
  387. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session/switchboard.py +0 -0
  388. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/session.py +0 -0
  389. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/sidebar.py +0 -0
  390. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/skillopt.py +0 -0
  391. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/skills.py +0 -0
  392. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/stream_view.py +0 -0
  393. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/styles/__init__.py +0 -0
  394. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tool_call.py +0 -0
  395. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/__init__.py +0 -0
  396. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/agent_tools.py +0 -0
  397. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/apply_patch.py +0 -0
  398. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/base.py +0 -0
  399. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/batch_tool.py +0 -0
  400. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/compact_tool.py +0 -0
  401. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/context_handle.py +0 -0
  402. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/context_tools.py +0 -0
  403. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/diagnostics.py +0 -0
  404. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/diff_utils.py +0 -0
  405. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/display.py +0 -0
  406. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/dynamic_workflow.py +0 -0
  407. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/edit_tools.py +0 -0
  408. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/enhanced_base.py +0 -0
  409. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/env_policy.py +0 -0
  410. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/file_tools.py +0 -0
  411. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/file_tracking.py +0 -0
  412. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/harness_agent_session.py +0 -0
  413. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/image_tools.py +0 -0
  414. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/lsp_tools.py +0 -0
  415. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/mcp_tools.py +0 -0
  416. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/monty_tool.py +0 -0
  417. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/network_tools.py +0 -0
  418. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/output_spill.py +0 -0
  419. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/peer_agent_tools.py +0 -0
  420. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/permissions.py +0 -0
  421. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/post_edit.py +0 -0
  422. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/question_tool.py +0 -0
  423. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/request_permissions_tool.py +0 -0
  424. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/search_tools.py +0 -0
  425. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/semantic_search.py +0 -0
  426. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/shell_session.py +0 -0
  427. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/shell_tools.py +0 -0
  428. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/skill_tools.py +0 -0
  429. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/spawn_harness.py +0 -0
  430. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/todo_tools.py +0 -0
  431. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/tool_search.py +0 -0
  432. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/validation.py +0 -0
  433. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tools/web_tools.py +0 -0
  434. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_integration.py +0 -0
  435. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/__init__.py +0 -0
  436. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
  437. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/widgets/progress.py +0 -0
  438. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
  439. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/undo_manager.py +0 -0
  440. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/utils/__init__.py +0 -0
  441. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/utils/error_handling.py +0 -0
  442. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/utils/fuzzy.py +0 -0
  443. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/__init__.py +0 -0
  444. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/agent_store.py +0 -0
  445. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/agent_switcher.py +0 -0
  446. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/animation_manager.py +0 -0
  447. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/code_context.py +0 -0
  448. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/command_palette.py +0 -0
  449. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/connection_status.py +0 -0
  450. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/conversation_history.py +0 -0
  451. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/diff_indicator.py +0 -0
  452. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/enhanced_status_bar.py +0 -0
  453. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/enhanced_toast.py +0 -0
  454. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/file_browser.py +0 -0
  455. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/file_reference.py +0 -0
  456. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/leader_key.py +0 -0
  457. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/mode_switcher.py +0 -0
  458. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/model_picker.py +0 -0
  459. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/permission_preview.py +0 -0
  460. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/prompt.py +0 -0
  461. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/provider_connect.py +0 -0
  462. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/pty_shell.py +0 -0
  463. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/resizable_sidebar.py +0 -0
  464. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/response_changes.py +0 -0
  465. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/response_display.py +0 -0
  466. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/rewind_overlay.py +0 -0
  467. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/rich_tool_display.py +0 -0
  468. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/sidebar_panels.py +0 -0
  469. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/slash_commands.py +0 -0
  470. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/slash_complete.py +0 -0
  471. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/split_view.py +0 -0
  472. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/status_bar.py +0 -0
  473. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/superqode_display.py +0 -0
  474. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/theme_picker.py +0 -0
  475. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/thinking.py +0 -0
  476. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/thinking_display.py +0 -0
  477. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/throbber.py +0 -0
  478. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/toast.py +0 -0
  479. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/widgets/unified_output.py +0 -0
  480. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/__init__.py +0 -0
  481. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/artifacts.py +0 -0
  482. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/change_summary.py +0 -0
  483. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/coordinator.py +0 -0
  484. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/diff_tracker.py +0 -0
  485. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/git_guard.py +0 -0
  486. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/git_snapshot.py +0 -0
  487. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/manager.py +0 -0
  488. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/snapshot.py +0 -0
  489. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/watcher.py +0 -0
  490. {superqode-0.2.1 → superqode-0.2.3}/src/superqode/workspace/worktree.py +0 -0
  491. {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/SOURCES.txt +0 -0
  492. {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/dependency_links.txt +0 -0
  493. {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/entry_points.txt +0 -0
  494. {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/requires.txt +0 -0
  495. {superqode-0.2.1 → superqode-0.2.3}/src/superqode.egg-info/top_level.txt +0 -0
  496. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_client.py +0 -0
  497. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_free_models.py +0 -0
  498. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_parent_tool_linking.py +0 -0
  499. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_permission_store.py +0 -0
  500. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_registry.py +0 -0
  501. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_render.py +0 -0
  502. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_session_store.py +0 -0
  503. {superqode-0.2.1 → superqode-0.2.3}/tests/test_acp_slash.py +0 -0
  504. {superqode-0.2.1 → superqode-0.2.3}/tests/test_adaptive_compaction.py +0 -0
  505. {superqode-0.2.1 → superqode-0.2.3}/tests/test_agent_importer.py +0 -0
  506. {superqode-0.2.1 → superqode-0.2.3}/tests/test_agent_loop_harness.py +0 -0
  507. {superqode-0.2.1 → superqode-0.2.3}/tests/test_agent_memory.py +0 -0
  508. {superqode-0.2.1 → superqode-0.2.3}/tests/test_agents_md_compat.py +0 -0
  509. {superqode-0.2.1 → superqode-0.2.3}/tests/test_apply_patch.py +0 -0
  510. {superqode-0.2.1 → superqode-0.2.3}/tests/test_auth.py +0 -0
  511. {superqode-0.2.1 → superqode-0.2.3}/tests/test_bash_spill.py +0 -0
  512. {superqode-0.2.1 → superqode-0.2.3}/tests/test_benchmarks.py +0 -0
  513. {superqode-0.2.1 → superqode-0.2.3}/tests/test_change_summary.py +0 -0
  514. {superqode-0.2.1 → superqode-0.2.3}/tests/test_channels.py +0 -0
  515. {superqode-0.2.1 → superqode-0.2.3}/tests/test_cli_commands.py +0 -0
  516. {superqode-0.2.1 → superqode-0.2.3}/tests/test_cli_connect.py +0 -0
  517. {superqode-0.2.1 → superqode-0.2.3}/tests/test_cli_reference_coverage.py +0 -0
  518. {superqode-0.2.1 → superqode-0.2.3}/tests/test_command_safety.py +0 -0
  519. {superqode-0.2.1 → superqode-0.2.3}/tests/test_commands_runtime.py +0 -0
  520. {superqode-0.2.1 → superqode-0.2.3}/tests/test_compaction.py +0 -0
  521. {superqode-0.2.1 → superqode-0.2.3}/tests/test_config_loader.py +0 -0
  522. {superqode-0.2.1 → superqode-0.2.3}/tests/test_config_runtime.py +0 -0
  523. {superqode-0.2.1 → superqode-0.2.3}/tests/test_connect_setup.py +0 -0
  524. {superqode-0.2.1 → superqode-0.2.3}/tests/test_connection_profiles.py +0 -0
  525. {superqode-0.2.1 → superqode-0.2.3}/tests/test_context_handles.py +0 -0
  526. {superqode-0.2.1 → superqode-0.2.3}/tests/test_context_probe.py +0 -0
  527. {superqode-0.2.1 → superqode-0.2.3}/tests/test_context_remaining.py +0 -0
  528. {superqode-0.2.1 → superqode-0.2.3}/tests/test_create_skill_tool.py +0 -0
  529. {superqode-0.2.1 → superqode-0.2.3}/tests/test_deferred_tools.py +0 -0
  530. {superqode-0.2.1 → superqode-0.2.3}/tests/test_developer_workflow_docs.py +0 -0
  531. {superqode-0.2.1 → superqode-0.2.3}/tests/test_ds4_local_client.py +0 -0
  532. {superqode-0.2.1 → superqode-0.2.3}/tests/test_dynamic_workflow_tool.py +0 -0
  533. {superqode-0.2.1 → superqode-0.2.3}/tests/test_edit_line_number_strip.py +0 -0
  534. {superqode-0.2.1 → superqode-0.2.3}/tests/test_env_introspect.py +0 -0
  535. {superqode-0.2.1 → superqode-0.2.3}/tests/test_execution_resolver.py +0 -0
  536. {superqode-0.2.1 → superqode-0.2.3}/tests/test_final_parity_wave.py +0 -0
  537. {superqode-0.2.1 → superqode-0.2.3}/tests/test_free_models.py +0 -0
  538. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_agent_session.py +0 -0
  539. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_backends.py +0 -0
  540. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_examples.py +0 -0
  541. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_explain.py +0 -0
  542. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_hooks.py +0 -0
  543. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_mcp_server.py +0 -0
  544. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_model_policy.py +0 -0
  545. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_observability.py +0 -0
  546. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_output.py +0 -0
  547. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_permissions.py +0 -0
  548. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_sandbox.py +0 -0
  549. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_seesaw_dimensions.py +0 -0
  550. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_spec.py +0 -0
  551. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_store.py +0 -0
  552. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_wizard.py +0 -0
  553. {superqode-0.2.1 → superqode-0.2.3}/tests/test_harness_workflow.py +0 -0
  554. {superqode-0.2.1 → superqode-0.2.3}/tests/test_headless.py +0 -0
  555. {superqode-0.2.1 → superqode-0.2.3}/tests/test_hf_fetch.py +0 -0
  556. {superqode-0.2.1 → superqode-0.2.3}/tests/test_hooks.py +0 -0
  557. {superqode-0.2.1 → superqode-0.2.3}/tests/test_linter_runner.py +0 -0
  558. {superqode-0.2.1 → superqode-0.2.3}/tests/test_litellm_gateway.py +0 -0
  559. {superqode-0.2.1 → superqode-0.2.3}/tests/test_live_models.py +0 -0
  560. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_airplane.py +0 -0
  561. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_build.py +0 -0
  562. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_code_index.py +0 -0
  563. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_labs.py +0 -0
  564. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_migrate.py +0 -0
  565. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_model_optimizations.py +0 -0
  566. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_packs.py +0 -0
  567. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_sandbox.py +0 -0
  568. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_search.py +0 -0
  569. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_servers.py +0 -0
  570. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_setup.py +0 -0
  571. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_smoke.py +0 -0
  572. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_stack.py +0 -0
  573. {superqode-0.2.1 → superqode-0.2.3}/tests/test_local_tool_support.py +0 -0
  574. {superqode-0.2.1 → superqode-0.2.3}/tests/test_login_api.py +0 -0
  575. {superqode-0.2.1 → superqode-0.2.3}/tests/test_loop_guard.py +0 -0
  576. {superqode-0.2.1 → superqode-0.2.3}/tests/test_managed_harness_backend.py +0 -0
  577. {superqode-0.2.1 → superqode-0.2.3}/tests/test_markdown_render.py +0 -0
  578. {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp.py +0 -0
  579. {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_integration.py +0 -0
  580. {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_live.py +0 -0
  581. {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_oauth_generalized.py +0 -0
  582. {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_tools_runtime.py +0 -0
  583. {superqode-0.2.1 → superqode-0.2.3}/tests/test_mcp_two_way.py +0 -0
  584. {superqode-0.2.1 → superqode-0.2.3}/tests/test_memory_recall.py +0 -0
  585. {superqode-0.2.1 → superqode-0.2.3}/tests/test_mlx_tools.py +0 -0
  586. {superqode-0.2.1 → superqode-0.2.3}/tests/test_model_profiles.py +0 -0
  587. {superqode-0.2.1 → superqode-0.2.3}/tests/test_model_specs.py +0 -0
  588. {superqode-0.2.1 → superqode-0.2.3}/tests/test_monty_tool.py +0 -0
  589. {superqode-0.2.1 → superqode-0.2.3}/tests/test_network_policy.py +0 -0
  590. {superqode-0.2.1 → superqode-0.2.3}/tests/test_ollama_client.py +0 -0
  591. {superqode-0.2.1 → superqode-0.2.3}/tests/test_omnigent_agent_session_smoke.py +0 -0
  592. {superqode-0.2.1 → superqode-0.2.3}/tests/test_omnigent_importer.py +0 -0
  593. {superqode-0.2.1 → superqode-0.2.3}/tests/test_openai_session.py +0 -0
  594. {superqode-0.2.1 → superqode-0.2.3}/tests/test_output_spill.py +0 -0
  595. {superqode-0.2.1 → superqode-0.2.3}/tests/test_parallel_compare.py +0 -0
  596. {superqode-0.2.1 → superqode-0.2.3}/tests/test_peer_agents.py +0 -0
  597. {superqode-0.2.1 → superqode-0.2.3}/tests/test_plugin_hook_wiring.py +0 -0
  598. {superqode-0.2.1 → superqode-0.2.3}/tests/test_plugins.py +0 -0
  599. {superqode-0.2.1 → superqode-0.2.3}/tests/test_policies_and_turndiff.py +0 -0
  600. {superqode-0.2.1 → superqode-0.2.3}/tests/test_post_edit_verify.py +0 -0
  601. {superqode-0.2.1 → superqode-0.2.3}/tests/test_project_trust.py +0 -0
  602. {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_catalog.py +0 -0
  603. {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_dynamic.py +0 -0
  604. {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_models.py +0 -0
  605. {superqode-0.2.1 → superqode-0.2.3}/tests/test_provider_recommendations.py +0 -0
  606. {superqode-0.2.1 → superqode-0.2.3}/tests/test_pure_mode_sessions.py +0 -0
  607. {superqode-0.2.1 → superqode-0.2.3}/tests/test_rate_limit_retry.py +0 -0
  608. {superqode-0.2.1 → superqode-0.2.3}/tests/test_read_tool_limits.py +0 -0
  609. {superqode-0.2.1 → superqode-0.2.3}/tests/test_reasoning_and_budget.py +0 -0
  610. {superqode-0.2.1 → superqode-0.2.3}/tests/test_recursive_eval_packs.py +0 -0
  611. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_adk.py +0 -0
  612. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_builtin.py +0 -0
  613. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_claude_agent_sdk.py +0 -0
  614. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_codex_sdk.py +0 -0
  615. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_dialog.py +0 -0
  616. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_agents.py +0 -0
  617. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_events.py +0 -0
  618. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_hitl.py +0 -0
  619. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_openai_sandbox.py +0 -0
  620. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_protocol.py +0 -0
  621. {superqode-0.2.1 → superqode-0.2.3}/tests/test_runtime_pydanticai.py +0 -0
  622. {superqode-0.2.1 → superqode-0.2.3}/tests/test_sandbox_backends.py +0 -0
  623. {superqode-0.2.1 → superqode-0.2.3}/tests/test_sandbox_execution.py +0 -0
  624. {superqode-0.2.1 → superqode-0.2.3}/tests/test_search_roots.py +0 -0
  625. {superqode-0.2.1 → superqode-0.2.3}/tests/test_semantic_search.py +0 -0
  626. {superqode-0.2.1 → superqode-0.2.3}/tests/test_session_switchboard.py +0 -0
  627. {superqode-0.2.1 → superqode-0.2.3}/tests/test_shell_session.py +0 -0
  628. {superqode-0.2.1 → superqode-0.2.3}/tests/test_simple_login.py +0 -0
  629. {superqode-0.2.1 → superqode-0.2.3}/tests/test_simple_query_fastpath.py +0 -0
  630. {superqode-0.2.1 → superqode-0.2.3}/tests/test_skillopt.py +0 -0
  631. {superqode-0.2.1 → superqode-0.2.3}/tests/test_slash_runtime.py +0 -0
  632. {superqode-0.2.1 → superqode-0.2.3}/tests/test_spawn_harness_tool.py +0 -0
  633. {superqode-0.2.1 → superqode-0.2.3}/tests/test_steering_continue_reminders.py +0 -0
  634. {superqode-0.2.1 → superqode-0.2.3}/tests/test_synthetic_gateways.py +0 -0
  635. {superqode-0.2.1 → superqode-0.2.3}/tests/test_terminal_output_limits.py +0 -0
  636. {superqode-0.2.1 → superqode-0.2.3}/tests/test_theme_picker.py +0 -0
  637. {superqode-0.2.1 → superqode-0.2.3}/tests/test_todo_tools.py +0 -0
  638. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_args_repair.py +0 -0
  639. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_batch_safety.py +0 -0
  640. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_bridge.py +0 -0
  641. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_bridge_openai.py +0 -0
  642. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_call_repair.py +0 -0
  643. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_output_pruning.py +0 -0
  644. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tool_tracking.py +0 -0
  645. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tools.py +0 -0
  646. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_change_summary.py +0 -0
  647. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_chat_mode.py +0 -0
  648. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_exit.py +0 -0
  649. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_llamacpp_connect.py +0 -0
  650. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_markdown_cleanup.py +0 -0
  651. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_mlx_connect.py +0 -0
  652. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_mounted.py +0 -0
  653. {superqode-0.2.1 → superqode-0.2.3}/tests/test_tui_tool_display.py +0 -0
  654. {superqode-0.2.1 → superqode-0.2.3}/tests/test_version.py +0 -0
  655. {superqode-0.2.1 → superqode-0.2.3}/tests/test_view_image.py +0 -0
  656. {superqode-0.2.1 → superqode-0.2.3}/tests/test_web_server_auth.py +0 -0
  657. {superqode-0.2.1 → superqode-0.2.3}/tests/test_workspace.py +0 -0
@@ -7,20 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [0.2.1] - 2026-06-24
10
+ ## [0.2.3] - 2026-06-24
11
11
 
12
12
  ### Added
13
13
 
14
14
  - **TUI harness wizard** - Added a step-by-step `:harness wizard` flow for creating starter HarnessSpec files from the TUI, plus `:harness init` / flag shortcuts using the same wizard builder as the CLI.
15
15
  - **TUI CLI parity** - Exposed the remaining CLI command surface in the TUI command list and routed unsupported subcommands through the CLI runner so CLI-only workflows can be launched from the TUI.
16
+ - **First harness documentation** - Documented the TUI and CLI wizard path for creating, loading, checking, and running a first HarnessSpec in a few steps.
16
17
 
17
18
  ### Fixed
18
19
 
19
20
  - **Smoke script source checkout support** - Made the Omnigent agent-session smoke script import SuperQode reliably when run directly from a checkout.
21
+ - **Harness model routing** - Made `model_policy.primary` override the active TUI connection for harness runs while preserving valid Ollama model tags such as `*-mlx`.
22
+ - **Harness wizard defaults** - Made Enter-through defaults in the TUI wizard create a runnable Qwen local harness with an explicit `ollama/qwen3-coder` model policy.
23
+ - **Harness wizard final prompt** - Treated `yes`/`no` typed on the output-file step as the final load answer so the wizard no longer stores `yes` as a filename and loops back to the output prompt.
24
+ - **Harness wizard output paths** - Picked the next available default output path such as `harness-2.yaml` when `harness.yaml` already exists, preventing default runs from bouncing back to the output prompt.
25
+ - **Harness wizard loading** - Fixed the final “Load this harness now?” step so loaded harnesses remain visible after reconnect/disconnect state changes, and stale `SUPERQODE_HARNESS` paths no longer crash Pure Mode startup.
26
+ - **Harness streaming** - Forwarded builtin harness `model_delta` events through Pure Mode so TUI harness runs no longer report `chunks=0` when the model did stream content.
20
27
 
21
28
  ### Changed
22
29
 
23
- - **Release metadata** - Bumped the package version and runtime `__version__` to `0.2.1`.
30
+ - **Release metadata** - Bumped the package version and runtime `__version__` to `0.2.3`.
24
31
 
25
32
  ## [0.2.0] - 2026-06-23
26
33
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superqode
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: SuperQode: harness engineering framework for coding agents, optimized for local and open models
5
5
  Author-email: Shashi Jagtap <info@super-agentic.ai>
6
6
  Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
@@ -230,7 +230,7 @@ Inside the TUI, the local-first MVP path is:
230
230
  | File | Purpose | Created by |
231
231
  | --- | --- | --- |
232
232
  | `superqode.yaml` | Project configuration: providers, endpoints, MCP, memory, defaults | `superqode config init` or `:init` |
233
- | `harness.yaml` | Portable agent run contract | `superqode harness init ...` |
233
+ | `harness.yaml` | Portable agent run contract | `:harness wizard`, `superqode harness wizard`, or `superqode harness init ...` |
234
234
  | `superqode.local.yaml` | Local-first HarnessSpec generated for this machine | `:local init` or `superqode local init --repo .` |
235
235
  | `superqode.airplane.yaml` | Strict no-network HarnessSpec for offline local work | `:local airplane prepare` or `superqode local airplane prepare` |
236
236
 
@@ -242,7 +242,26 @@ superqode --print "inspect this repository and suggest the smallest next step"
242
242
 
243
243
  ### Your First Harness Run
244
244
 
245
- A harness is the repeatable contract for how an agent run behaves. Start with the default coding harness:
245
+ A harness is the repeatable contract for how an agent run behaves. In the TUI, create and load your first harness without writing YAML:
246
+
247
+ ```text
248
+ :connect local
249
+ :harness wizard
250
+ ```
251
+
252
+ Press Enter through the defaults for a runnable local coding harness, choose an output file, and answer `yes` when asked whether to load it. If `harness.yaml` already exists, the wizard uses the next available path such as `harness-2.yaml`.
253
+
254
+ For the CLI path, start with the interactive wizard or the default coding template:
255
+
256
+ ```bash
257
+ cd your-project
258
+ superqode harness wizard
259
+ superqode harness explain --spec harness.yaml
260
+ superqode harness doctor --spec harness.yaml
261
+ superqode harness run --spec harness.yaml --prompt "summarize the architecture"
262
+ ```
263
+
264
+ Template shortcut:
246
265
 
247
266
  ```bash
248
267
  cd your-project
@@ -102,7 +102,7 @@ Inside the TUI, the local-first MVP path is:
102
102
  | File | Purpose | Created by |
103
103
  | --- | --- | --- |
104
104
  | `superqode.yaml` | Project configuration: providers, endpoints, MCP, memory, defaults | `superqode config init` or `:init` |
105
- | `harness.yaml` | Portable agent run contract | `superqode harness init ...` |
105
+ | `harness.yaml` | Portable agent run contract | `:harness wizard`, `superqode harness wizard`, or `superqode harness init ...` |
106
106
  | `superqode.local.yaml` | Local-first HarnessSpec generated for this machine | `:local init` or `superqode local init --repo .` |
107
107
  | `superqode.airplane.yaml` | Strict no-network HarnessSpec for offline local work | `:local airplane prepare` or `superqode local airplane prepare` |
108
108
 
@@ -114,7 +114,26 @@ superqode --print "inspect this repository and suggest the smallest next step"
114
114
 
115
115
  ### Your First Harness Run
116
116
 
117
- A harness is the repeatable contract for how an agent run behaves. Start with the default coding harness:
117
+ A harness is the repeatable contract for how an agent run behaves. In the TUI, create and load your first harness without writing YAML:
118
+
119
+ ```text
120
+ :connect local
121
+ :harness wizard
122
+ ```
123
+
124
+ Press Enter through the defaults for a runnable local coding harness, choose an output file, and answer `yes` when asked whether to load it. If `harness.yaml` already exists, the wizard uses the next available path such as `harness-2.yaml`.
125
+
126
+ For the CLI path, start with the interactive wizard or the default coding template:
127
+
128
+ ```bash
129
+ cd your-project
130
+ superqode harness wizard
131
+ superqode harness explain --spec harness.yaml
132
+ superqode harness doctor --spec harness.yaml
133
+ superqode harness run --spec harness.yaml --prompt "summarize the architecture"
134
+ ```
135
+
136
+ Template shortcut:
118
137
 
119
138
  ```bash
120
139
  cd your-project
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superqode"
3
- version = "0.2.1"
3
+ version = "0.2.3"
4
4
  description = "SuperQode: harness engineering framework for coding agents, optimized for local and open models"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -30,4 +30,4 @@ __all__ = [
30
30
  "sidebar",
31
31
  ]
32
32
 
33
- __version__ = "0.2.1"
33
+ __version__ = "0.2.3"
@@ -12007,7 +12007,7 @@ class SuperQodeApp(App):
12007
12007
  "tool_call_format": "auto",
12008
12008
  "workflow_preset": "single",
12009
12009
  },
12010
- "output": "harness.yaml",
12010
+ "output": self._default_harness_wizard_output(),
12011
12011
  "load": True,
12012
12012
  "force": False,
12013
12013
  }
@@ -12042,7 +12042,11 @@ class SuperQodeApp(App):
12042
12042
  answers["name"] = raw
12043
12043
  self._harness_wizard_next(state, "starter")
12044
12044
  elif step == "starter":
12045
- starter = self._harness_wizard_choice(raw, [key for key, _ in self._wizard_starters()])
12045
+ starter = self._harness_wizard_choice(
12046
+ raw,
12047
+ [key for key, _ in self._wizard_starters()],
12048
+ default=str(answers.get("starter") or "qwen-coding"),
12049
+ )
12046
12050
  if starter is None:
12047
12051
  log.add_error("Choose a starter by number or name.")
12048
12052
  self._render_harness_wizard_step(log)
@@ -12126,6 +12130,11 @@ class SuperQodeApp(App):
12126
12130
  answers["workflow_preset"] = choice
12127
12131
  self._harness_wizard_next(state, "output")
12128
12132
  elif step == "output":
12133
+ load_answer = self._parse_yes_no(raw) if raw else None
12134
+ if load_answer is not None:
12135
+ state["load"] = load_answer
12136
+ self._finish_harness_wizard_flow(log)
12137
+ return True
12129
12138
  if raw:
12130
12139
  state["output"] = raw
12131
12140
  self._harness_wizard_next(state, "load")
@@ -12157,6 +12166,17 @@ class SuperQodeApp(App):
12157
12166
  state.setdefault("history", []).append(state["step"])
12158
12167
  state["step"] = next_step
12159
12168
 
12169
+ @staticmethod
12170
+ def _default_harness_wizard_output() -> str:
12171
+ base = Path("harness.yaml")
12172
+ if not base.exists():
12173
+ return str(base)
12174
+ for index in range(2, 1000):
12175
+ candidate = Path(f"harness-{index}.yaml")
12176
+ if not candidate.exists():
12177
+ return str(candidate)
12178
+ return "harness-new.yaml"
12179
+
12160
12180
  @staticmethod
12161
12181
  def _parse_yes_no(raw: str) -> bool | None:
12162
12182
  lowered = raw.strip().lower()
@@ -12270,11 +12290,11 @@ class SuperQodeApp(App):
12270
12290
  default = " (default)" if key == "single" else ""
12271
12291
  t.append(f" {index}. {key:<22} {label}{default}\n", style=THEME["text"])
12272
12292
  elif step == "output":
12273
- t.append(" Step 9/9 Output file\n", style=f"bold {THEME['cyan']}")
12293
+ t.append(" Step 9/10 Output file\n", style=f"bold {THEME['cyan']}")
12274
12294
  t.append(f" Default: {state['output']}\n", style=THEME["muted"])
12275
12295
  t.append(" Example: harness.yaml\n", style=THEME["text"])
12276
12296
  elif step == "load":
12277
- t.append(" Final Load this harness now?\n", style=f"bold {THEME['cyan']}")
12297
+ t.append(" Step 10/10 Load this harness now?\n", style=f"bold {THEME['cyan']}")
12278
12298
  t.append(" Default: yes\n", style=THEME["muted"])
12279
12299
  t.append(" Answer: yes or no\n", style=THEME["text"])
12280
12300
 
@@ -12289,7 +12309,10 @@ class SuperQodeApp(App):
12289
12309
  load_after_write = bool(state.get("load", True))
12290
12310
 
12291
12311
  if output.exists() and not state.get("force", False):
12292
- log.add_error(f"{output} already exists. Type a different output path or cancel.")
12312
+ state["output"] = self._default_harness_wizard_output()
12313
+ log.add_error(
12314
+ f"{output} already exists. Suggested next available path: {state['output']}"
12315
+ )
12293
12316
  state["step"] = "output"
12294
12317
  self._render_harness_wizard_step(log)
12295
12318
  return
@@ -14849,6 +14872,15 @@ class SuperQodeApp(App):
14849
14872
 
14850
14873
  provider = self._pure_mode.session.provider
14851
14874
  model = self._pure_mode.session.model
14875
+ if getattr(self._pure_mode, "harness_enabled", False) and hasattr(
14876
+ self._pure_mode, "_resolve_harness_route"
14877
+ ):
14878
+ try:
14879
+ provider, model = self._pure_mode._resolve_harness_route()
14880
+ except Exception:
14881
+ # Let the run path raise the user-facing error with full context.
14882
+ provider = self._pure_mode.session.provider
14883
+ model = self._pure_mode.session.model
14852
14884
  plan_mode_for_run = bool(getattr(self, "_active_plan_mode_for_current_message", False))
14853
14885
  if plan_mode_for_run:
14854
14886
  text = (
@@ -22,7 +22,11 @@ from .agent.system_prompts import SystemPromptLevel
22
22
  from .agent.session_manager import SessionManager, SessionMetadata
23
23
  from .tools.base import ToolRegistry, ToolResult
24
24
  from .providers.gateway.litellm_gateway import LiteLLMGateway
25
- from .providers.model_specs import normalize_model_for_provider, normalize_provider_id
25
+ from .providers.model_specs import (
26
+ normalize_model_for_provider,
27
+ normalize_provider_id,
28
+ split_provider_model_ref,
29
+ )
26
30
  from .providers.registry import PROVIDERS, ProviderTier, ProviderCategory
27
31
  from .runtime import AgentRuntime, create_runtime, resolve_runtime_name
28
32
 
@@ -87,6 +91,8 @@ class PureMode:
87
91
  path = os.getenv("SUPERQODE_HARNESS", "").strip()
88
92
  if not path:
89
93
  return
94
+ if not Path(path).expanduser().exists():
95
+ return
90
96
  self.load_harness(path)
91
97
 
92
98
  def load_harness(self, path: str | Path):
@@ -99,6 +105,7 @@ class PureMode:
99
105
  self._harness_kernel = None
100
106
  self._harness_session = None
101
107
  self._harness_session_id = ""
108
+ self._sync_harness_session_fields()
102
109
  return self._harness_spec
103
110
 
104
111
  def set_harness(self, spec, *, path: str | Path | None = None) -> None:
@@ -108,6 +115,7 @@ class PureMode:
108
115
  self._harness_kernel = None
109
116
  self._harness_session = None
110
117
  self._harness_session_id = ""
118
+ self._sync_harness_session_fields()
111
119
 
112
120
  def clear_harness(self) -> None:
113
121
  """Return to direct runtime mode."""
@@ -116,11 +124,52 @@ class PureMode:
116
124
  self._harness_kernel = None
117
125
  self._harness_session = None
118
126
  self._harness_session_id = ""
127
+ self.session.harness_name = ""
128
+ self.session.harness_path = ""
129
+ self.session.harness_flavor = ""
130
+ self.session.harness_runtime = ""
131
+
132
+ def _sync_harness_session_fields(self) -> None:
133
+ """Mirror the loaded HarnessSpec into user-visible session status."""
134
+ if self._harness_spec is None:
135
+ self.session.harness_name = ""
136
+ self.session.harness_path = ""
137
+ self.session.harness_flavor = ""
138
+ self.session.harness_runtime = ""
139
+ return
140
+ self.session.harness_name = self._harness_spec.name
141
+ self.session.harness_path = self._harness_path
142
+ self.session.harness_flavor = self._harness_spec.flavor.value
143
+ self.session.harness_runtime = self._harness_spec.runtime.backend
119
144
 
120
145
  @property
121
146
  def harness_enabled(self) -> bool:
122
147
  return self._harness_spec is not None
123
148
 
149
+ def _resolve_harness_route(self) -> tuple[str, str]:
150
+ """Return the provider/model the active harness should run against."""
151
+ provider = self.session.provider
152
+ model = self.session.model
153
+ if self._harness_spec is None:
154
+ return provider, model
155
+
156
+ primary = str(getattr(self._harness_spec.model_policy, "primary", "") or "").strip()
157
+ configured_provider = str(
158
+ getattr(self._harness_spec.model_policy, "config", {}).get("provider") or ""
159
+ ).strip()
160
+ if primary:
161
+ parsed = split_provider_model_ref(primary, default_provider=configured_provider)
162
+ provider = normalize_provider_id(parsed.provider or configured_provider or provider)
163
+ model = normalize_model_for_provider(provider, parsed.model or primary)
164
+
165
+ self._validate_harness_route(provider, model)
166
+ return provider, model
167
+
168
+ @staticmethod
169
+ def _validate_harness_route(provider: str, model: str) -> None:
170
+ """Catch common local provider/model mismatches before streaming."""
171
+ return
172
+
124
173
  def get_providers_for_picker(self) -> List[Dict[str, Any]]:
125
174
  """Get providers formatted for the TUI picker."""
126
175
  providers = []
@@ -271,6 +320,7 @@ class PureMode:
271
320
  self._harness_kernel = None
272
321
  self._harness_session = None
273
322
  self._harness_session_id = ""
323
+ self._sync_harness_session_fields()
274
324
 
275
325
  def set_system_level(self, level: SystemPromptLevel):
276
326
  """Change the system prompt level."""
@@ -282,11 +332,12 @@ class PureMode:
282
332
  async def run(self, prompt: str, plan_mode: Optional[bool] = None) -> AgentResponse:
283
333
  """Run a task in Pure Mode."""
284
334
  if self._harness_spec is not None:
335
+ provider, model = self._resolve_harness_route()
285
336
  session = await self._ensure_harness_session()
286
337
  result = await session.prompt(
287
338
  prompt,
288
- provider=self.session.provider,
289
- model=self.session.model,
339
+ provider=provider,
340
+ model=model,
290
341
  working_directory=self.session.working_directory,
291
342
  runtime=self._harness_spec.runtime.backend,
292
343
  )
@@ -336,15 +387,16 @@ class PureMode:
336
387
  async def run_streaming(self, prompt: str, plan_mode: Optional[bool] = None):
337
388
  """Run a task with streaming output."""
338
389
  if self._harness_spec is not None:
390
+ provider, model = self._resolve_harness_route()
339
391
  session = await self._ensure_harness_session()
340
392
  async for event in session.stream(
341
393
  prompt,
342
- provider=self.session.provider,
343
- model=self.session.model,
394
+ provider=provider,
395
+ model=model,
344
396
  working_directory=self.session.working_directory,
345
397
  runtime=self._harness_spec.runtime.backend,
346
398
  ):
347
- if event.type != "delta":
399
+ if event.type not in {"delta", "model_delta"}:
348
400
  continue
349
401
  chunk = str(event.data.get("text", ""))
350
402
  if self.on_stream_chunk:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superqode
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: SuperQode: harness engineering framework for coding agents, optimized for local and open models
5
5
  Author-email: Shashi Jagtap <info@super-agentic.ai>
6
6
  Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
@@ -230,7 +230,7 @@ Inside the TUI, the local-first MVP path is:
230
230
  | File | Purpose | Created by |
231
231
  | --- | --- | --- |
232
232
  | `superqode.yaml` | Project configuration: providers, endpoints, MCP, memory, defaults | `superqode config init` or `:init` |
233
- | `harness.yaml` | Portable agent run contract | `superqode harness init ...` |
233
+ | `harness.yaml` | Portable agent run contract | `:harness wizard`, `superqode harness wizard`, or `superqode harness init ...` |
234
234
  | `superqode.local.yaml` | Local-first HarnessSpec generated for this machine | `:local init` or `superqode local init --repo .` |
235
235
  | `superqode.airplane.yaml` | Strict no-network HarnessSpec for offline local work | `:local airplane prepare` or `superqode local airplane prepare` |
236
236
 
@@ -242,7 +242,26 @@ superqode --print "inspect this repository and suggest the smallest next step"
242
242
 
243
243
  ### Your First Harness Run
244
244
 
245
- A harness is the repeatable contract for how an agent run behaves. Start with the default coding harness:
245
+ A harness is the repeatable contract for how an agent run behaves. In the TUI, create and load your first harness without writing YAML:
246
+
247
+ ```text
248
+ :connect local
249
+ :harness wizard
250
+ ```
251
+
252
+ Press Enter through the defaults for a runnable local coding harness, choose an output file, and answer `yes` when asked whether to load it. If `harness.yaml` already exists, the wizard uses the next available path such as `harness-2.yaml`.
253
+
254
+ For the CLI path, start with the interactive wizard or the default coding template:
255
+
256
+ ```bash
257
+ cd your-project
258
+ superqode harness wizard
259
+ superqode harness explain --spec harness.yaml
260
+ superqode harness doctor --spec harness.yaml
261
+ superqode harness run --spec harness.yaml --prompt "summarize the architecture"
262
+ ```
263
+
264
+ Template shortcut:
246
265
 
247
266
  ```bash
248
267
  cd your-project
@@ -1,5 +1,6 @@
1
1
  """Tests for the minimal v2 HarnessKernel."""
2
2
 
3
+ from dataclasses import replace
3
4
  from pathlib import Path
4
5
 
5
6
  from pydantic import BaseModel
@@ -10,6 +11,7 @@ from superqode.harness import (
10
11
  FileHarnessStore,
11
12
  HarnessBackendResult,
12
13
  HarnessFlavor,
14
+ ModelPolicySpec,
13
15
  get_harness_template,
14
16
  init_harness,
15
17
  )
@@ -151,6 +153,16 @@ class FakeApprovalBackend(FakeBackend):
151
153
  )
152
154
 
153
155
 
156
+ class FakeModelDeltaBackend:
157
+ async def stream(self, request):
158
+ from superqode.harness import HarnessEvent
159
+
160
+ yield HarnessEvent(type="model_request", data={"runtime": "fake"})
161
+ yield HarnessEvent(type="model_delta", data={"text": "hello"})
162
+ yield HarnessEvent(type="model_delta", data={"text": "-streamed"})
163
+ yield HarnessEvent(type="end", data={"runtime": "fake"})
164
+
165
+
154
166
  @pytest.mark.asyncio
155
167
  async def test_no_tool_kernel_runs_with_empty_registry(monkeypatch, tmp_path: Path):
156
168
  backend = FakeBackend()
@@ -308,6 +320,93 @@ async def test_pure_mode_can_stream_through_harness_spec(monkeypatch, tmp_path:
308
320
  assert status["harness"]["name"] == spec.name
309
321
 
310
322
 
323
+ @pytest.mark.asyncio
324
+ async def test_pure_mode_harness_primary_overrides_active_connection(monkeypatch, tmp_path: Path):
325
+ from superqode.pure_mode import PureMode
326
+
327
+ created = {}
328
+
329
+ def fake_create_runtime(name, **kwargs):
330
+ created["config"] = kwargs["config"]
331
+ return FakeRuntime(**kwargs)
332
+
333
+ monkeypatch.setattr("superqode.harness.backends.runtime.create_runtime", fake_create_runtime)
334
+ spec = replace(
335
+ get_harness_template("no-tool"),
336
+ model_policy=ModelPolicySpec(primary="mlx/qwen3.6:35b-mlx"),
337
+ )
338
+ pure = PureMode()
339
+ pure.set_harness(spec)
340
+ assert pure.connect("ollama", "qwen3.6:35b-a3b", working_directory=tmp_path)
341
+
342
+ chunks = [chunk async for chunk in pure.run_streaming("hello")]
343
+
344
+ assert "".join(chunks) == "hello-streamed"
345
+ assert created["config"].provider == "mlx"
346
+ assert created["config"].model == "qwen3.6:35b-mlx"
347
+
348
+
349
+ def test_pure_mode_harness_allows_ollama_mlx_tagged_model(tmp_path: Path):
350
+ from superqode.pure_mode import PureMode
351
+
352
+ pure = PureMode()
353
+ pure.set_harness(get_harness_template("no-tool"))
354
+ assert pure.connect("ollama", "qwen3.6:35b-mlx", working_directory=tmp_path)
355
+
356
+ provider, model = pure._resolve_harness_route()
357
+
358
+ assert provider == "ollama"
359
+ assert model == "qwen3.6:35b-mlx"
360
+
361
+
362
+ def test_pure_mode_set_harness_updates_visible_status(tmp_path: Path):
363
+ from superqode.pure_mode import PureMode
364
+
365
+ spec = get_harness_template("qwen-coding")
366
+ pure = PureMode()
367
+ pure.set_harness(spec, path=tmp_path / "harness.yaml")
368
+
369
+ status = pure.get_status()["harness"]
370
+ assert status["enabled"] is True
371
+ assert status["name"] == "qwen-coding"
372
+ assert status["path"].endswith("harness.yaml")
373
+ assert status["flavor"] == "coding"
374
+ assert status["runtime"] == "builtin"
375
+
376
+
377
+ def test_pure_mode_disconnect_preserves_loaded_harness_status(tmp_path: Path):
378
+ from superqode.pure_mode import PureMode
379
+
380
+ spec = get_harness_template("qwen-coding")
381
+ pure = PureMode()
382
+ pure.set_harness(spec, path=tmp_path / "harness.yaml")
383
+ assert pure.connect("ollama", "qwen3-coder", working_directory=tmp_path)
384
+
385
+ pure.disconnect()
386
+
387
+ status = pure.get_status()["harness"]
388
+ assert status["enabled"] is True
389
+ assert status["name"] == "qwen-coding"
390
+ assert status["path"].endswith("harness.yaml")
391
+
392
+
393
+ @pytest.mark.asyncio
394
+ async def test_pure_mode_harness_stream_forwards_model_delta_events(monkeypatch, tmp_path: Path):
395
+ from superqode.pure_mode import PureMode
396
+
397
+ monkeypatch.setattr(
398
+ "superqode.harness.kernel.create_harness_backend",
399
+ lambda name: FakeModelDeltaBackend(),
400
+ )
401
+ pure = PureMode()
402
+ pure.set_harness(get_harness_template("qwen-coding"), path=tmp_path / "harness.yaml")
403
+ assert pure.connect("ollama", "qwen3-coder", working_directory=tmp_path)
404
+
405
+ chunks = [chunk async for chunk in pure.run_streaming("hello")]
406
+
407
+ assert chunks == ["hello", "-streamed"]
408
+
409
+
311
410
  @pytest.mark.asyncio
312
411
  async def test_pure_mode_resumes_harness_approval(monkeypatch, tmp_path: Path):
313
412
  from superqode.pure_mode import PureMode
@@ -1213,6 +1213,92 @@ def test_tui_harness_wizard_guided_steps_write_and_load_spec(tmp_path, monkeypat
1213
1213
  assert app._pure_mode.harness_enabled
1214
1214
 
1215
1215
 
1216
+ def test_tui_harness_wizard_enter_defaults_create_runnable_spec(tmp_path, monkeypatch):
1217
+ monkeypatch.chdir(tmp_path)
1218
+ app = make_app()
1219
+ log = FakeLog()
1220
+ app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
1221
+
1222
+ app._harness_cmd("wizard", log)
1223
+ for _ in range(10):
1224
+ app._handle_harness_wizard_input("", log)
1225
+
1226
+ spec = load_harness_spec(tmp_path / "harness.yaml")
1227
+ assert spec.name == "my-harness"
1228
+ assert spec.metadata["template"] == "qwen-coding"
1229
+ assert spec.model_policy.primary == "ollama/qwen3-coder"
1230
+ assert spec.model_policy.pack == "qwen-coder"
1231
+ assert app._awaiting_harness_wizard is False
1232
+ assert app._pure_mode is not None
1233
+ assert app._pure_mode.harness_enabled
1234
+
1235
+
1236
+ def test_tui_harness_wizard_final_yes_loads_and_exits(tmp_path, monkeypatch):
1237
+ monkeypatch.chdir(tmp_path)
1238
+ app = make_app()
1239
+ log = FakeLog()
1240
+ app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
1241
+
1242
+ app._harness_cmd("wizard", log)
1243
+ for _ in range(9):
1244
+ app._handle_harness_wizard_input("", log)
1245
+ assert "Load this harness now" in render_plain(log.items[-1])
1246
+
1247
+ app._handle_harness_wizard_input("yes", log)
1248
+
1249
+ assert app._awaiting_harness_wizard is False
1250
+ assert app._harness_wizard_state is None
1251
+ assert app._pure_mode is not None
1252
+ status = app._pure_mode.get_status()["harness"]
1253
+ assert status["enabled"] is True
1254
+ assert status["name"] == "my-harness"
1255
+ assert status["path"].endswith("harness.yaml")
1256
+ rendered = "\n".join(render_plain(item) if not isinstance(item, str) else item for item in log.items)
1257
+ assert "Loaded harness my-harness" in rendered
1258
+
1259
+
1260
+ def test_tui_harness_wizard_yes_on_output_step_loads_default_path(tmp_path, monkeypatch):
1261
+ monkeypatch.chdir(tmp_path)
1262
+ app = make_app()
1263
+ log = FakeLog()
1264
+ app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
1265
+
1266
+ app._harness_cmd("wizard", log)
1267
+ for _ in range(8):
1268
+ app._handle_harness_wizard_input("", log)
1269
+ assert "Output file" in render_plain(log.items[-1])
1270
+
1271
+ app._handle_harness_wizard_input("yes", log)
1272
+
1273
+ assert (tmp_path / "harness.yaml").exists()
1274
+ assert not (tmp_path / "yes").exists()
1275
+ assert app._awaiting_harness_wizard is False
1276
+ assert app._harness_wizard_state is None
1277
+ assert app._pure_mode is not None
1278
+ status = app._pure_mode.get_status()["harness"]
1279
+ assert status["enabled"] is True
1280
+ assert status["path"].endswith("harness.yaml")
1281
+
1282
+
1283
+ def test_tui_harness_wizard_defaults_use_next_available_output(tmp_path, monkeypatch):
1284
+ monkeypatch.chdir(tmp_path)
1285
+ (tmp_path / "harness.yaml").write_text("existing: true\n")
1286
+ app = make_app()
1287
+ log = FakeLog()
1288
+ app._show_command_output = lambda target_log, content, clear_log=True: target_log.write(content)
1289
+
1290
+ app._harness_cmd("wizard", log)
1291
+ for _ in range(10):
1292
+ app._handle_harness_wizard_input("", log)
1293
+
1294
+ assert (tmp_path / "harness-2.yaml").exists()
1295
+ assert (tmp_path / "harness.yaml").read_text() == "existing: true\n"
1296
+ assert app._awaiting_harness_wizard is False
1297
+ status = app._pure_mode.get_status()["harness"]
1298
+ assert status["enabled"] is True
1299
+ assert status["path"].endswith("harness-2.yaml")
1300
+
1301
+
1216
1302
  def test_tui_help_surfaces_developer_workflows():
1217
1303
  app = make_app()
1218
1304
  log = FakeLog()
File without changes
File without changes
File without changes
File without changes