superqode 0.2.6__tar.gz → 0.2.8__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 (663) hide show
  1. {superqode-0.2.6 → superqode-0.2.8}/CHANGELOG.md +24 -0
  2. {superqode-0.2.6/src/superqode.egg-info → superqode-0.2.8}/PKG-INFO +2 -2
  3. {superqode-0.2.6 → superqode-0.2.8}/pyproject.toml +5 -2
  4. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/__init__.py +1 -1
  5. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/server.py +109 -13
  6. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/loop.py +58 -0
  7. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app/constants.py +13 -0
  8. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app_main.py +70 -16
  9. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/__init__.py +32 -0
  10. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/eval.py +186 -3
  11. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/kernel.py +42 -8
  12. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/loader.py +71 -0
  13. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/optimize.py +43 -4
  14. superqode-0.2.8/src/superqode/harness/self_improve.py +1363 -0
  15. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/spec.py +14 -0
  16. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/main.py +700 -0
  17. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/pure_mode.py +3 -0
  18. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/codex_sdk.py +53 -0
  19. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/slash_complete.py +33 -0
  20. {superqode-0.2.6 → superqode-0.2.8/src/superqode.egg-info}/PKG-INFO +2 -2
  21. {superqode-0.2.6 → superqode-0.2.8}/src/superqode.egg-info/SOURCES.txt +4 -0
  22. {superqode-0.2.6 → superqode-0.2.8}/src/superqode.egg-info/requires.txt +1 -1
  23. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_server.py +64 -2
  24. {superqode-0.2.6 → superqode-0.2.8}/tests/test_cli_commands.py +1 -1
  25. superqode-0.2.8/tests/test_harness_eval_splits.py +99 -0
  26. superqode-0.2.8/tests/test_harness_self_improve.py +377 -0
  27. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_spec.py +37 -0
  28. superqode-0.2.8/tests/test_harness_usage.py +159 -0
  29. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_smoke.py +18 -0
  30. {superqode-0.2.6 → superqode-0.2.8}/LICENSE +0 -0
  31. {superqode-0.2.6 → superqode-0.2.8}/MANIFEST.in +0 -0
  32. {superqode-0.2.6 → superqode-0.2.8}/README.md +0 -0
  33. {superqode-0.2.6 → superqode-0.2.8}/examples/README.md +0 -0
  34. {superqode-0.2.6 → superqode-0.2.8}/examples/byok-acp-team.yaml +0 -0
  35. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/coding.yaml +0 -0
  36. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/deepagents.yaml +0 -0
  37. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/ds4.yaml +0 -0
  38. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/gemma4.yaml +0 -0
  39. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/google-adk.yaml +0 -0
  40. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/local-recursive-dynamic.yaml +0 -0
  41. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/no-tool.yaml +0 -0
  42. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/omnigent-multi-agent.yaml +0 -0
  43. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/openai-agents.yaml +0 -0
  44. {superqode-0.2.6 → superqode-0.2.8}/examples/harnesses/pydanticai.yaml +0 -0
  45. {superqode-0.2.6 → superqode-0.2.8}/examples/local-models-team.yaml +0 -0
  46. {superqode-0.2.6 → superqode-0.2.8}/examples/omnigent-multi-agent.agent.yaml +0 -0
  47. {superqode-0.2.6 → superqode-0.2.8}/examples/simple-team.yaml +0 -0
  48. {superqode-0.2.6 → superqode-0.2.8}/setup.cfg +0 -0
  49. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/__init__.py +0 -0
  50. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/client.py +0 -0
  51. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/presets.py +0 -0
  52. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/registry.py +0 -0
  53. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/server.py +0 -0
  54. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/skills.py +0 -0
  55. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/tools.py +0 -0
  56. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/types.py +0 -0
  57. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/a2a/workflows.py +0 -0
  58. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/__init__.py +0 -0
  59. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/client.py +0 -0
  60. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/doctor.py +0 -0
  61. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/permission_screen.py +0 -0
  62. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/permission_store.py +0 -0
  63. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/render.py +0 -0
  64. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/session_store.py +0 -0
  65. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/slash.py +0 -0
  66. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/tool_call_context.py +0 -0
  67. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp/types.py +0 -0
  68. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/acp_discovery.py +0 -0
  69. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/__init__.py +0 -0
  70. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/auto_memory.py +0 -0
  71. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/command_safety.py +0 -0
  72. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/compaction.py +0 -0
  73. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/context_manager.py +0 -0
  74. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/edit_strategies.py +0 -0
  75. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/exec_policy.py +0 -0
  76. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/hooks.py +0 -0
  77. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/loop_guard.py +0 -0
  78. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/network_policy.py +0 -0
  79. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/output_handler.py +0 -0
  80. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/parallel_compare.py +0 -0
  81. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/peer_agents.py +0 -0
  82. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/plan_mode.py +0 -0
  83. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/reminders.py +0 -0
  84. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/rubric.py +0 -0
  85. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/session_manager.py +0 -0
  86. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/structured_output.py +0 -0
  87. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/summarization.py +0 -0
  88. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/system_prompts.py +0 -0
  89. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/terminal_output_limits.py +0 -0
  90. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/text_tool_calls.py +0 -0
  91. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/tool_args.py +0 -0
  92. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/tool_tracking.py +0 -0
  93. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent/utility_model.py +0 -0
  94. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent_output.py +0 -0
  95. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agent_stream.py +0 -0
  96. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/__init__.py +0 -0
  97. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/acp_registry.py +0 -0
  98. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/client.py +0 -0
  99. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/agentpool.phil65.github.io.toml +0 -0
  100. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/ampcode.com.toml +0 -0
  101. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/augmentcode.com.toml +0 -0
  102. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/autodev.github.io.toml +0 -0
  103. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/blackbox.ai.toml +0 -0
  104. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/bub.dev.toml +0 -0
  105. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/cagent.dev.toml +0 -0
  106. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/claude.com.toml +0 -0
  107. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/cline.bot.toml +0 -0
  108. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/codeassistant.dev.toml +0 -0
  109. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/codex.openai.com.toml +0 -0
  110. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/copilot.github.com.toml +0 -0
  111. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/crow-ai.dev.toml +0 -0
  112. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/cursor.com.toml +0 -0
  113. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/factory.ai.toml +0 -0
  114. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/fastagent.ai.toml +0 -0
  115. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/fount.dev.toml +0 -0
  116. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/geminicli.com.toml +0 -0
  117. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/goose.block.xyz.toml +0 -0
  118. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/hermes-agent.nousresearch.com.toml +0 -0
  119. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
  120. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
  121. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/kiro.dev.toml +0 -0
  122. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/llmlingagent.dev.toml +0 -0
  123. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/minioncode.dev.toml +0 -0
  124. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/mistral-vibe.mistral.ai.toml +0 -0
  125. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/openclaw.ai.toml +0 -0
  126. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/opencode.ai.toml +0 -0
  127. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/openhands.dev.toml +0 -0
  128. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/pi.dev.toml +0 -0
  129. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/poolside.ai.toml +0 -0
  130. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/qoder.com.toml +0 -0
  131. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/qwenlm.github.io.toml +0 -0
  132. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/sigit.dev.toml +0 -0
  133. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/stakpak.dev.toml +0 -0
  134. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/stdiobus.dev.toml +0 -0
  135. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/data/vtcode.dev.toml +0 -0
  136. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/discovery.py +0 -0
  137. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/free_models.py +0 -0
  138. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/messaging.py +0 -0
  139. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/official_acp.py +0 -0
  140. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/persona.py +0 -0
  141. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/registry.py +0 -0
  142. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/schema.py +0 -0
  143. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/agents/unified.py +0 -0
  144. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app/__init__.py +0 -0
  145. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app/css.py +0 -0
  146. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app/models.py +0 -0
  147. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app/suggester.py +0 -0
  148. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app/theme_bridge.py +0 -0
  149. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app/widgets.py +0 -0
  150. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/app_enhanced.py +0 -0
  151. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/approval.py +0 -0
  152. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/atomic.py +0 -0
  153. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/auth/__init__.py +0 -0
  154. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/benchmarks.py +0 -0
  155. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/channels/__init__.py +0 -0
  156. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/channels/config.py +0 -0
  157. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/channels/discord.py +0 -0
  158. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/channels/service.py +0 -0
  159. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/channels/slack.py +0 -0
  160. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/channels/telegram.py +0 -0
  161. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/claude.py +0 -0
  162. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/codex.py +0 -0
  163. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/__init__.py +0 -0
  164. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/a2a.py +0 -0
  165. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/acp.py +0 -0
  166. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/agents.py +0 -0
  167. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/auth.py +0 -0
  168. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/config.py +0 -0
  169. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/daemon.py +0 -0
  170. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/local.py +0 -0
  171. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/providers.py +0 -0
  172. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/runtime.py +0 -0
  173. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/serve.py +0 -0
  174. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/commands/sessions.py +0 -0
  175. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/config/__init__.py +0 -0
  176. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/config/loader.py +0 -0
  177. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/config/schema.py +0 -0
  178. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/core/__init__.py +0 -0
  179. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/danger.py +0 -0
  180. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/data/eval_fixtures/ci-dynamic-root-cause.log +0 -0
  181. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/data/eval_fixtures/ci-root-cause.log +0 -0
  182. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/data/eval_packs/local_dynamic_workflow_smoke.yaml +0 -0
  183. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/data/eval_packs/local_recursive_smoke.yaml +0 -0
  184. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/data/superqode-template.yaml +0 -0
  185. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/design_system.py +0 -0
  186. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/dialogs/__init__.py +0 -0
  187. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/dialogs/base.py +0 -0
  188. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/dialogs/model.py +0 -0
  189. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/dialogs/provider.py +0 -0
  190. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/dialogs/runtime.py +0 -0
  191. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/diff_view.py +0 -0
  192. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/enterprise.py +0 -0
  193. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/evaluation/__init__.py +0 -0
  194. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/evaluation/adapters.py +0 -0
  195. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/evaluation/behaviors.py +0 -0
  196. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/evaluation/engine.py +0 -0
  197. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/evaluation/scenarios.py +0 -0
  198. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/execution/__init__.py +0 -0
  199. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/execution/linter.py +0 -0
  200. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/execution/modes.py +0 -0
  201. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/execution/resolver.py +0 -0
  202. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/execution/runner.py +0 -0
  203. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/file_explorer.py +0 -0
  204. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/file_viewer.py +0 -0
  205. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/flash.py +0 -0
  206. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/accelerator.py +0 -0
  207. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/agent_importer.py +0 -0
  208. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/approval_memory.py +0 -0
  209. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/backends/__init__.py +0 -0
  210. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/backends/base.py +0 -0
  211. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/backends/deepagents.py +0 -0
  212. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/backends/managed.py +0 -0
  213. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/backends/pydanticai.py +0 -0
  214. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/backends/registry.py +0 -0
  215. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/backends/runtime.py +0 -0
  216. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/compiler.py +0 -0
  217. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/context_handles.py +0 -0
  218. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/diagnostics.py +0 -0
  219. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/events.py +0 -0
  220. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/explain.py +0 -0
  221. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/hooks.py +0 -0
  222. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/mcp_bridge.py +0 -0
  223. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/model_policy.py +0 -0
  224. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/observability.py +0 -0
  225. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/omnigent_importer.py +0 -0
  226. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/output.py +0 -0
  227. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/permissions.py +0 -0
  228. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/registry.py +0 -0
  229. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/sandbox.py +0 -0
  230. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/store.py +0 -0
  231. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/templates.py +0 -0
  232. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/testing.py +0 -0
  233. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/wizard.py +0 -0
  234. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/workflow.py +0 -0
  235. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/harness/workflow_presets.py +0 -0
  236. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/headless.py +0 -0
  237. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/history.py +0 -0
  238. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/__init__.py +0 -0
  239. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/airplane.py +0 -0
  240. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/bench.py +0 -0
  241. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/build.py +0 -0
  242. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/code_index.py +0 -0
  243. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/devstral.yaml +0 -0
  244. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/ds4.yaml +0 -0
  245. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/gemma4.yaml +0 -0
  246. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/glm.yaml +0 -0
  247. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/gpt-oss.yaml +0 -0
  248. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/minimax.yaml +0 -0
  249. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/qwen-coder.yaml +0 -0
  250. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/model-packs/qwen3.yaml +0 -0
  251. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/data/stack_matrix.yaml +0 -0
  252. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/doctor.py +0 -0
  253. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/engines.py +0 -0
  254. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/guardrails.py +0 -0
  255. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/hardware.py +0 -0
  256. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/inventory.py +0 -0
  257. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/labs.py +0 -0
  258. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/matrix.py +0 -0
  259. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/migrate.py +0 -0
  260. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/optimize.py +0 -0
  261. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/packs.py +0 -0
  262. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/repo.py +0 -0
  263. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/servers.py +0 -0
  264. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/setup.py +0 -0
  265. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/local/smoke.py +0 -0
  266. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/logging/__init__.py +0 -0
  267. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/logging/adapters.py +0 -0
  268. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/logging/formatter.py +0 -0
  269. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/logging/integration.py +0 -0
  270. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/logging/sinks.py +0 -0
  271. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/logging/unified_log.py +0 -0
  272. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/lsp/__init__.py +0 -0
  273. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/lsp/client.py +0 -0
  274. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/__init__.py +0 -0
  275. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/auth_storage.py +0 -0
  276. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/client.py +0 -0
  277. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/config.py +0 -0
  278. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/elicitation.py +0 -0
  279. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/harness_server.py +0 -0
  280. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/hf_auth.py +0 -0
  281. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/integration.py +0 -0
  282. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/oauth.py +0 -0
  283. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/oauth_callback.py +0 -0
  284. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/sampling.py +0 -0
  285. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/search.py +0 -0
  286. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/mcp/types.py +0 -0
  287. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/memory/__init__.py +0 -0
  288. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/memory/config.py +0 -0
  289. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/memory/providers.py +0 -0
  290. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/memory/types.py +0 -0
  291. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/notifications.py +0 -0
  292. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/permissions/__init__.py +0 -0
  293. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/permissions/rules.py +0 -0
  294. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/plan.py +0 -0
  295. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/plugins.py +0 -0
  296. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/project_trust.py +0 -0
  297. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/__init__.py +0 -0
  298. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/_builtin_profiles.py +0 -0
  299. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/acp_free_models.py +0 -0
  300. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/acp_models.py +0 -0
  301. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/acp_registry.py +0 -0
  302. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/apple_fm.py +0 -0
  303. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/catalog.py +0 -0
  304. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/connection_profiles.py +0 -0
  305. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/credentials.py +0 -0
  306. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/dynamic.py +0 -0
  307. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/env_introspect.py +0 -0
  308. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/free_inference.py +0 -0
  309. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/gateway/__init__.py +0 -0
  310. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/gateway/base.py +0 -0
  311. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/gateway/litellm_gateway.py +0 -0
  312. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
  313. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/gateway/synthetic.py +0 -0
  314. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/health.py +0 -0
  315. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/__init__.py +0 -0
  316. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/convert.py +0 -0
  317. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/downloader.py +0 -0
  318. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/endpoints.py +0 -0
  319. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/fetch.py +0 -0
  320. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/hub.py +0 -0
  321. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/inference.py +0 -0
  322. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
  323. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/live_models.py +0 -0
  324. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/__init__.py +0 -0
  325. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/_mlx_worker.py +0 -0
  326. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/base.py +0 -0
  327. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/context_probe.py +0 -0
  328. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/discovery.py +0 -0
  329. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/ds4.py +0 -0
  330. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/lmstudio.py +0 -0
  331. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/mlx.py +0 -0
  332. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/mlx_engine.py +0 -0
  333. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/mlx_tools.py +0 -0
  334. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/ollama.py +0 -0
  335. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/sglang.py +0 -0
  336. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/smoke.py +0 -0
  337. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/tgi.py +0 -0
  338. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/tool_support.py +0 -0
  339. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/local/vllm.py +0 -0
  340. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/manager.py +0 -0
  341. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/model_specs.py +0 -0
  342. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/models.py +0 -0
  343. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/models_dev.py +0 -0
  344. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/opencode_models.py +0 -0
  345. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/__init__.py +0 -0
  346. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
  347. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/converters/messages.py +0 -0
  348. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/converters/tools.py +0 -0
  349. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
  350. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/schema/models.py +0 -0
  351. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
  352. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
  353. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
  354. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
  355. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
  356. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
  357. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
  358. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/profiles.py +0 -0
  359. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/recommendations.py +0 -0
  360. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/registry.py +0 -0
  361. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/providers/usage.py +0 -0
  362. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/py.typed +0 -0
  363. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/rendering/__init__.py +0 -0
  364. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/rendering/html_export.py +0 -0
  365. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/rendering/markdown.py +0 -0
  366. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/rendering/transcript_export.py +0 -0
  367. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/__init__.py +0 -0
  368. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/adk.py +0 -0
  369. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/base.py +0 -0
  370. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/builtin.py +0 -0
  371. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/claude_agent_sdk.py +0 -0
  372. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/errors.py +0 -0
  373. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/openai_agents.py +0 -0
  374. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/openai_sandbox.py +0 -0
  375. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/openai_session.py +0 -0
  376. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/pydanticai.py +0 -0
  377. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/registry.py +0 -0
  378. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/tool_bridge.py +0 -0
  379. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/tool_bridge_openai.py +0 -0
  380. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/runtime/tool_bridge_pydanticai.py +0 -0
  381. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/safety/__init__.py +0 -0
  382. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/safety/sandbox.py +0 -0
  383. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/safety/warnings.py +0 -0
  384. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/sandbox/__init__.py +0 -0
  385. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/sandbox/backends.py +0 -0
  386. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/sandbox/execution.py +0 -0
  387. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/sandbox/local_sandbox.py +0 -0
  388. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/search_registry.py +0 -0
  389. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/server/__init__.py +0 -0
  390. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/server/api.py +0 -0
  391. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/server/web.py +0 -0
  392. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/session/__init__.py +0 -0
  393. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/session/factory.py +0 -0
  394. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/session/persistence.py +0 -0
  395. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/session/share_artifacts.py +0 -0
  396. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/session/sharing.py +0 -0
  397. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/session/switchboard.py +0 -0
  398. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/session.py +0 -0
  399. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/sidebar.py +0 -0
  400. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/skillopt.py +0 -0
  401. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/skills.py +0 -0
  402. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/stream_view.py +0 -0
  403. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/styles/__init__.py +0 -0
  404. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tool_call.py +0 -0
  405. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/__init__.py +0 -0
  406. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/agent_tools.py +0 -0
  407. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/apply_patch.py +0 -0
  408. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/base.py +0 -0
  409. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/batch_tool.py +0 -0
  410. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/compact_tool.py +0 -0
  411. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/context_handle.py +0 -0
  412. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/context_tools.py +0 -0
  413. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/diagnostics.py +0 -0
  414. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/diff_utils.py +0 -0
  415. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/display.py +0 -0
  416. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/dynamic_workflow.py +0 -0
  417. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/edit_tools.py +0 -0
  418. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/enhanced_base.py +0 -0
  419. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/env_policy.py +0 -0
  420. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/file_tools.py +0 -0
  421. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/file_tracking.py +0 -0
  422. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/harness_agent_session.py +0 -0
  423. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/image_tools.py +0 -0
  424. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/lsp_tools.py +0 -0
  425. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/mcp_tools.py +0 -0
  426. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/monty_tool.py +0 -0
  427. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/network_tools.py +0 -0
  428. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/output_spill.py +0 -0
  429. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/peer_agent_tools.py +0 -0
  430. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/permissions.py +0 -0
  431. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/post_edit.py +0 -0
  432. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/question_tool.py +0 -0
  433. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/request_permissions_tool.py +0 -0
  434. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/search_tools.py +0 -0
  435. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/semantic_search.py +0 -0
  436. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/shell_session.py +0 -0
  437. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/shell_tools.py +0 -0
  438. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/skill_tools.py +0 -0
  439. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/spawn_harness.py +0 -0
  440. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/todo_tools.py +0 -0
  441. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/tool_search.py +0 -0
  442. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/validation.py +0 -0
  443. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tools/web_tools.py +0 -0
  444. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tui_integration.py +0 -0
  445. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tui_widgets/__init__.py +0 -0
  446. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
  447. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tui_widgets/widgets/progress.py +0 -0
  448. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
  449. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/undo_manager.py +0 -0
  450. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/utils/__init__.py +0 -0
  451. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/utils/error_handling.py +0 -0
  452. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/utils/fuzzy.py +0 -0
  453. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/__init__.py +0 -0
  454. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/agent_store.py +0 -0
  455. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/agent_switcher.py +0 -0
  456. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/animation_manager.py +0 -0
  457. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/code_context.py +0 -0
  458. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/command_palette.py +0 -0
  459. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/connection_status.py +0 -0
  460. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/conversation_history.py +0 -0
  461. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/diff_indicator.py +0 -0
  462. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/enhanced_status_bar.py +0 -0
  463. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/enhanced_toast.py +0 -0
  464. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/file_browser.py +0 -0
  465. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/file_reference.py +0 -0
  466. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/leader_key.py +0 -0
  467. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/mode_switcher.py +0 -0
  468. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/model_picker.py +0 -0
  469. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/permission_preview.py +0 -0
  470. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/prompt.py +0 -0
  471. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/provider_connect.py +0 -0
  472. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/pty_shell.py +0 -0
  473. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/resizable_sidebar.py +0 -0
  474. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/response_changes.py +0 -0
  475. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/response_display.py +0 -0
  476. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/rewind_overlay.py +0 -0
  477. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/rich_tool_display.py +0 -0
  478. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/sidebar_panels.py +0 -0
  479. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/slash_commands.py +0 -0
  480. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/split_view.py +0 -0
  481. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/status_bar.py +0 -0
  482. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/superqode_display.py +0 -0
  483. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/theme_picker.py +0 -0
  484. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/thinking.py +0 -0
  485. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/thinking_display.py +0 -0
  486. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/throbber.py +0 -0
  487. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/toast.py +0 -0
  488. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/widgets/unified_output.py +0 -0
  489. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/__init__.py +0 -0
  490. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/artifacts.py +0 -0
  491. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/change_summary.py +0 -0
  492. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/coordinator.py +0 -0
  493. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/diff_tracker.py +0 -0
  494. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/git_guard.py +0 -0
  495. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/git_snapshot.py +0 -0
  496. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/manager.py +0 -0
  497. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/snapshot.py +0 -0
  498. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/watcher.py +0 -0
  499. {superqode-0.2.6 → superqode-0.2.8}/src/superqode/workspace/worktree.py +0 -0
  500. {superqode-0.2.6 → superqode-0.2.8}/src/superqode.egg-info/dependency_links.txt +0 -0
  501. {superqode-0.2.6 → superqode-0.2.8}/src/superqode.egg-info/entry_points.txt +0 -0
  502. {superqode-0.2.6 → superqode-0.2.8}/src/superqode.egg-info/top_level.txt +0 -0
  503. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_client.py +0 -0
  504. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_free_models.py +0 -0
  505. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_parent_tool_linking.py +0 -0
  506. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_permission_store.py +0 -0
  507. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_registry.py +0 -0
  508. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_render.py +0 -0
  509. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_session_store.py +0 -0
  510. {superqode-0.2.6 → superqode-0.2.8}/tests/test_acp_slash.py +0 -0
  511. {superqode-0.2.6 → superqode-0.2.8}/tests/test_adaptive_compaction.py +0 -0
  512. {superqode-0.2.6 → superqode-0.2.8}/tests/test_agent_importer.py +0 -0
  513. {superqode-0.2.6 → superqode-0.2.8}/tests/test_agent_loop_harness.py +0 -0
  514. {superqode-0.2.6 → superqode-0.2.8}/tests/test_agent_memory.py +0 -0
  515. {superqode-0.2.6 → superqode-0.2.8}/tests/test_agents_md_compat.py +0 -0
  516. {superqode-0.2.6 → superqode-0.2.8}/tests/test_apply_patch.py +0 -0
  517. {superqode-0.2.6 → superqode-0.2.8}/tests/test_auth.py +0 -0
  518. {superqode-0.2.6 → superqode-0.2.8}/tests/test_bash_spill.py +0 -0
  519. {superqode-0.2.6 → superqode-0.2.8}/tests/test_benchmarks.py +0 -0
  520. {superqode-0.2.6 → superqode-0.2.8}/tests/test_change_summary.py +0 -0
  521. {superqode-0.2.6 → superqode-0.2.8}/tests/test_channels.py +0 -0
  522. {superqode-0.2.6 → superqode-0.2.8}/tests/test_cli_connect.py +0 -0
  523. {superqode-0.2.6 → superqode-0.2.8}/tests/test_cli_reference_coverage.py +0 -0
  524. {superqode-0.2.6 → superqode-0.2.8}/tests/test_command_safety.py +0 -0
  525. {superqode-0.2.6 → superqode-0.2.8}/tests/test_commands_runtime.py +0 -0
  526. {superqode-0.2.6 → superqode-0.2.8}/tests/test_compaction.py +0 -0
  527. {superqode-0.2.6 → superqode-0.2.8}/tests/test_config_loader.py +0 -0
  528. {superqode-0.2.6 → superqode-0.2.8}/tests/test_config_runtime.py +0 -0
  529. {superqode-0.2.6 → superqode-0.2.8}/tests/test_connect_setup.py +0 -0
  530. {superqode-0.2.6 → superqode-0.2.8}/tests/test_connection_profiles.py +0 -0
  531. {superqode-0.2.6 → superqode-0.2.8}/tests/test_context_handles.py +0 -0
  532. {superqode-0.2.6 → superqode-0.2.8}/tests/test_context_probe.py +0 -0
  533. {superqode-0.2.6 → superqode-0.2.8}/tests/test_context_remaining.py +0 -0
  534. {superqode-0.2.6 → superqode-0.2.8}/tests/test_create_skill_tool.py +0 -0
  535. {superqode-0.2.6 → superqode-0.2.8}/tests/test_deferred_tools.py +0 -0
  536. {superqode-0.2.6 → superqode-0.2.8}/tests/test_developer_workflow_docs.py +0 -0
  537. {superqode-0.2.6 → superqode-0.2.8}/tests/test_ds4_local_client.py +0 -0
  538. {superqode-0.2.6 → superqode-0.2.8}/tests/test_dynamic_workflow_tool.py +0 -0
  539. {superqode-0.2.6 → superqode-0.2.8}/tests/test_edit_line_number_strip.py +0 -0
  540. {superqode-0.2.6 → superqode-0.2.8}/tests/test_env_introspect.py +0 -0
  541. {superqode-0.2.6 → superqode-0.2.8}/tests/test_execution_resolver.py +0 -0
  542. {superqode-0.2.6 → superqode-0.2.8}/tests/test_final_parity_wave.py +0 -0
  543. {superqode-0.2.6 → superqode-0.2.8}/tests/test_free_models.py +0 -0
  544. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_agent_session.py +0 -0
  545. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_backends.py +0 -0
  546. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_examples.py +0 -0
  547. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_explain.py +0 -0
  548. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_hooks.py +0 -0
  549. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_kernel.py +0 -0
  550. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_mcp_server.py +0 -0
  551. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_model_policy.py +0 -0
  552. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_observability.py +0 -0
  553. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_output.py +0 -0
  554. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_permissions.py +0 -0
  555. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_sandbox.py +0 -0
  556. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_seesaw_dimensions.py +0 -0
  557. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_store.py +0 -0
  558. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_wizard.py +0 -0
  559. {superqode-0.2.6 → superqode-0.2.8}/tests/test_harness_workflow.py +0 -0
  560. {superqode-0.2.6 → superqode-0.2.8}/tests/test_headless.py +0 -0
  561. {superqode-0.2.6 → superqode-0.2.8}/tests/test_hf_fetch.py +0 -0
  562. {superqode-0.2.6 → superqode-0.2.8}/tests/test_hooks.py +0 -0
  563. {superqode-0.2.6 → superqode-0.2.8}/tests/test_linter_runner.py +0 -0
  564. {superqode-0.2.6 → superqode-0.2.8}/tests/test_litellm_gateway.py +0 -0
  565. {superqode-0.2.6 → superqode-0.2.8}/tests/test_live_models.py +0 -0
  566. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_airplane.py +0 -0
  567. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_build.py +0 -0
  568. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_code_index.py +0 -0
  569. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_labs.py +0 -0
  570. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_migrate.py +0 -0
  571. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_model_optimizations.py +0 -0
  572. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_packs.py +0 -0
  573. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_sandbox.py +0 -0
  574. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_search.py +0 -0
  575. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_servers.py +0 -0
  576. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_setup.py +0 -0
  577. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_smoke.py +0 -0
  578. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_stack.py +0 -0
  579. {superqode-0.2.6 → superqode-0.2.8}/tests/test_local_tool_support.py +0 -0
  580. {superqode-0.2.6 → superqode-0.2.8}/tests/test_login_api.py +0 -0
  581. {superqode-0.2.6 → superqode-0.2.8}/tests/test_loop_guard.py +0 -0
  582. {superqode-0.2.6 → superqode-0.2.8}/tests/test_managed_harness_backend.py +0 -0
  583. {superqode-0.2.6 → superqode-0.2.8}/tests/test_markdown_render.py +0 -0
  584. {superqode-0.2.6 → superqode-0.2.8}/tests/test_mcp.py +0 -0
  585. {superqode-0.2.6 → superqode-0.2.8}/tests/test_mcp_integration.py +0 -0
  586. {superqode-0.2.6 → superqode-0.2.8}/tests/test_mcp_live.py +0 -0
  587. {superqode-0.2.6 → superqode-0.2.8}/tests/test_mcp_oauth_generalized.py +0 -0
  588. {superqode-0.2.6 → superqode-0.2.8}/tests/test_mcp_tools_runtime.py +0 -0
  589. {superqode-0.2.6 → superqode-0.2.8}/tests/test_mcp_two_way.py +0 -0
  590. {superqode-0.2.6 → superqode-0.2.8}/tests/test_memory_recall.py +0 -0
  591. {superqode-0.2.6 → superqode-0.2.8}/tests/test_mlx_tools.py +0 -0
  592. {superqode-0.2.6 → superqode-0.2.8}/tests/test_model_profiles.py +0 -0
  593. {superqode-0.2.6 → superqode-0.2.8}/tests/test_model_specs.py +0 -0
  594. {superqode-0.2.6 → superqode-0.2.8}/tests/test_monty_tool.py +0 -0
  595. {superqode-0.2.6 → superqode-0.2.8}/tests/test_network_policy.py +0 -0
  596. {superqode-0.2.6 → superqode-0.2.8}/tests/test_ollama_client.py +0 -0
  597. {superqode-0.2.6 → superqode-0.2.8}/tests/test_omnigent_agent_session_smoke.py +0 -0
  598. {superqode-0.2.6 → superqode-0.2.8}/tests/test_omnigent_importer.py +0 -0
  599. {superqode-0.2.6 → superqode-0.2.8}/tests/test_openai_session.py +0 -0
  600. {superqode-0.2.6 → superqode-0.2.8}/tests/test_output_spill.py +0 -0
  601. {superqode-0.2.6 → superqode-0.2.8}/tests/test_parallel_compare.py +0 -0
  602. {superqode-0.2.6 → superqode-0.2.8}/tests/test_peer_agents.py +0 -0
  603. {superqode-0.2.6 → superqode-0.2.8}/tests/test_plugin_hook_wiring.py +0 -0
  604. {superqode-0.2.6 → superqode-0.2.8}/tests/test_plugins.py +0 -0
  605. {superqode-0.2.6 → superqode-0.2.8}/tests/test_policies_and_turndiff.py +0 -0
  606. {superqode-0.2.6 → superqode-0.2.8}/tests/test_post_edit_verify.py +0 -0
  607. {superqode-0.2.6 → superqode-0.2.8}/tests/test_project_trust.py +0 -0
  608. {superqode-0.2.6 → superqode-0.2.8}/tests/test_provider_catalog.py +0 -0
  609. {superqode-0.2.6 → superqode-0.2.8}/tests/test_provider_dynamic.py +0 -0
  610. {superqode-0.2.6 → superqode-0.2.8}/tests/test_provider_models.py +0 -0
  611. {superqode-0.2.6 → superqode-0.2.8}/tests/test_provider_recommendations.py +0 -0
  612. {superqode-0.2.6 → superqode-0.2.8}/tests/test_pure_mode_sessions.py +0 -0
  613. {superqode-0.2.6 → superqode-0.2.8}/tests/test_rate_limit_retry.py +0 -0
  614. {superqode-0.2.6 → superqode-0.2.8}/tests/test_read_tool_limits.py +0 -0
  615. {superqode-0.2.6 → superqode-0.2.8}/tests/test_reasoning_and_budget.py +0 -0
  616. {superqode-0.2.6 → superqode-0.2.8}/tests/test_recursive_eval_packs.py +0 -0
  617. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_adk.py +0 -0
  618. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_builtin.py +0 -0
  619. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_claude_agent_sdk.py +0 -0
  620. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_codex_sdk.py +0 -0
  621. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_dialog.py +0 -0
  622. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_openai_agents.py +0 -0
  623. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_openai_events.py +0 -0
  624. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_openai_hitl.py +0 -0
  625. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_openai_sandbox.py +0 -0
  626. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_protocol.py +0 -0
  627. {superqode-0.2.6 → superqode-0.2.8}/tests/test_runtime_pydanticai.py +0 -0
  628. {superqode-0.2.6 → superqode-0.2.8}/tests/test_sandbox_backends.py +0 -0
  629. {superqode-0.2.6 → superqode-0.2.8}/tests/test_sandbox_execution.py +0 -0
  630. {superqode-0.2.6 → superqode-0.2.8}/tests/test_search_roots.py +0 -0
  631. {superqode-0.2.6 → superqode-0.2.8}/tests/test_semantic_search.py +0 -0
  632. {superqode-0.2.6 → superqode-0.2.8}/tests/test_session_switchboard.py +0 -0
  633. {superqode-0.2.6 → superqode-0.2.8}/tests/test_shell_session.py +0 -0
  634. {superqode-0.2.6 → superqode-0.2.8}/tests/test_simple_login.py +0 -0
  635. {superqode-0.2.6 → superqode-0.2.8}/tests/test_simple_query_fastpath.py +0 -0
  636. {superqode-0.2.6 → superqode-0.2.8}/tests/test_skillopt.py +0 -0
  637. {superqode-0.2.6 → superqode-0.2.8}/tests/test_slash_runtime.py +0 -0
  638. {superqode-0.2.6 → superqode-0.2.8}/tests/test_spawn_harness_tool.py +0 -0
  639. {superqode-0.2.6 → superqode-0.2.8}/tests/test_steering_continue_reminders.py +0 -0
  640. {superqode-0.2.6 → superqode-0.2.8}/tests/test_synthetic_gateways.py +0 -0
  641. {superqode-0.2.6 → superqode-0.2.8}/tests/test_terminal_output_limits.py +0 -0
  642. {superqode-0.2.6 → superqode-0.2.8}/tests/test_theme_picker.py +0 -0
  643. {superqode-0.2.6 → superqode-0.2.8}/tests/test_todo_tools.py +0 -0
  644. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tool_args_repair.py +0 -0
  645. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tool_batch_safety.py +0 -0
  646. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tool_bridge.py +0 -0
  647. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tool_bridge_openai.py +0 -0
  648. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tool_call_repair.py +0 -0
  649. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tool_output_pruning.py +0 -0
  650. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tool_tracking.py +0 -0
  651. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tools.py +0 -0
  652. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_change_summary.py +0 -0
  653. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_chat_mode.py +0 -0
  654. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_exit.py +0 -0
  655. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_llamacpp_connect.py +0 -0
  656. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_markdown_cleanup.py +0 -0
  657. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_mlx_connect.py +0 -0
  658. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_mounted.py +0 -0
  659. {superqode-0.2.6 → superqode-0.2.8}/tests/test_tui_tool_display.py +0 -0
  660. {superqode-0.2.6 → superqode-0.2.8}/tests/test_version.py +0 -0
  661. {superqode-0.2.6 → superqode-0.2.8}/tests/test_view_image.py +0 -0
  662. {superqode-0.2.6 → superqode-0.2.8}/tests/test_web_server_auth.py +0 -0
  663. {superqode-0.2.6 → superqode-0.2.8}/tests/test_workspace.py +0 -0
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.8] - 2026-07-07
11
+
12
+ ### Added
13
+
14
+ - **Self-improving harness loop** - Added `harness mine-failures`, `harness logbook`, and `harness improve` workflows for mining failures, maintaining repo-local harness memory, exporting bounded improvement projects, and feeding evidence into candidate generation.
15
+ - **Candidate audit and ledger** - Added `harness audit-candidate` plus `harness candidates list/show/export` to record accepted and rejected harness candidates, detect protected-surface edits, permission widening, weakened checks, duplicate rejected edits, and missing held-out gates.
16
+ - **Held-in / held-out eval splits** - Added split-aware eval tasks and `harness eval --split {all,held-in,held-out}` so candidate improvements can be gated separately from training/proposal tasks.
17
+ - **Harness usage metrics** - Harness runs and eval scorecards now aggregate token, latency, and cost metrics where providers expose them.
18
+ - **Self-improvement docs** - Documented the end-to-end loop, optimization policy fields, candidate audit gates, candidate ledger, and logbook pruning.
19
+
20
+ ### Changed
21
+
22
+ - **Release metadata** - Bumped the package version, runtime `__version__`, lockfile package entry, and ACP registry metadata to `0.2.8`.
23
+
24
+ ## [0.2.7] - 2026-07-05
25
+
26
+ ### Fixed
27
+
28
+ - **Fresh installs with agent-client-protocol 0.11** - `superqode serve acp` failed to start on new installs after the `agent-client-protocol` library released 0.11.0, which removed `session/set_model` and its schema types from the protocol. The ACP server now works on both 0.10 and 0.11, and the dependency is capped at `<0.12` so future protocol changes cannot break released artifacts.
29
+
30
+ ### Changed
31
+
32
+ - **Release metadata** - Bumped the package version and runtime `__version__` to `0.2.7`.
33
+
10
34
  ## [0.2.6] - 2026-07-04
11
35
 
12
36
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superqode
3
- Version: 0.2.6
3
+ Version: 0.2.8
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>
@@ -22,7 +22,7 @@ License-File: LICENSE
22
22
  Requires-Dist: pyyaml>=6.0.3
23
23
  Requires-Dist: click>=8.0.0
24
24
  Requires-Dist: litellm>=1.83.14
25
- Requires-Dist: agent-client-protocol>=0.10.0
25
+ Requires-Dist: agent-client-protocol<0.12,>=0.10.0
26
26
  Requires-Dist: prompt_toolkit>=3.0.52
27
27
  Requires-Dist: rich>=15.0.0
28
28
  Requires-Dist: textual>=0.47.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superqode"
3
- version = "0.2.6"
3
+ version = "0.2.8"
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"
@@ -25,7 +25,10 @@ dependencies = [
25
25
  "pyyaml>=6.0.3",
26
26
  "click>=8.0.0",
27
27
  "litellm>=1.83.14",
28
- "agent-client-protocol>=0.10.0",
28
+ # Actively evolving protocol library: 0.11 removed session/set_model and its
29
+ # schema types. Code supports 0.10 and 0.11; cap to avoid surprise breakage
30
+ # in released artifacts.
31
+ "agent-client-protocol>=0.10.0,<0.12",
29
32
  "prompt_toolkit>=3.0.52",
30
33
  "rich>=15.0.0",
31
34
  "textual>=0.47.0",
@@ -30,4 +30,4 @@ __all__ = [
30
30
  "sidebar",
31
31
  ]
32
32
 
33
- __version__ = "0.2.6"
33
+ __version__ = "0.2.8"
@@ -31,7 +31,6 @@ from acp import (
31
31
  InitializeResponse,
32
32
  NewSessionResponse,
33
33
  PromptResponse,
34
- SetSessionModelResponse,
35
34
  run_agent,
36
35
  start_tool_call,
37
36
  text_block,
@@ -47,6 +46,7 @@ from acp.schema import (
47
46
  PermissionOption,
48
47
  PromptCapabilities,
49
48
  TerminalAuthMethod,
49
+ ToolCallLocation,
50
50
  ToolCallUpdate,
51
51
  )
52
52
 
@@ -99,6 +99,74 @@ def _tool_kind(name: str) -> str:
99
99
  return "other"
100
100
 
101
101
 
102
+ # Argument keys that carry the tool's target, by role. Cover both snake_case and
103
+ # camelCase spellings since specs and external runtimes disagree on convention.
104
+ _PATH_ARG_KEYS = ("file_path", "filePath", "path", "file", "abs_path", "filename", "target_file")
105
+ _COMMAND_ARG_KEYS = ("command", "cmd", "script")
106
+ _PATTERN_ARG_KEYS = ("pattern", "query", "regex", "search")
107
+ _URL_ARG_KEYS = ("url", "uri")
108
+
109
+ _TITLE_LIMIT = 120
110
+
111
+
112
+ def _first_str(args: dict[str, Any], keys: tuple[str, ...]) -> str:
113
+ for key in keys:
114
+ value = args.get(key)
115
+ if isinstance(value, str) and value.strip():
116
+ return value.strip()
117
+ return ""
118
+
119
+
120
+ def _clip_title(text: str) -> str:
121
+ text = " ".join(text.split())
122
+ if len(text) <= _TITLE_LIMIT:
123
+ return text
124
+ return text[: _TITLE_LIMIT - 1] + "…"
125
+
126
+
127
+ def _tool_title(name: str, arguments: Any) -> str:
128
+ """Human-readable tool_call title: verb + target, not just the tool name.
129
+
130
+ Editors surface ``title`` directly (Zed, JetBrains) while ``raw_input`` is
131
+ hidden behind an expander, so the file path / command must be in the title.
132
+ """
133
+ args = arguments if isinstance(arguments, dict) else {}
134
+ kind = _tool_kind(name)
135
+ path = _first_str(args, _PATH_ARG_KEYS)
136
+ if kind == "execute":
137
+ command = _first_str(args, _COMMAND_ARG_KEYS)
138
+ return _clip_title(command) if command else name
139
+ if kind == "read" and path:
140
+ return _clip_title(f"Read {path}")
141
+ if kind == "edit" and path:
142
+ verb = "Write" if "write" in name.lower() or "create" in name.lower() else "Edit"
143
+ return _clip_title(f"{verb} {path}")
144
+ if kind == "search":
145
+ pattern = _first_str(args, _PATTERN_ARG_KEYS)
146
+ if pattern:
147
+ return _clip_title(f"Search {pattern}" + (f" in {path}" if path else ""))
148
+ if kind == "fetch":
149
+ url = _first_str(args, _URL_ARG_KEYS)
150
+ if url:
151
+ return _clip_title(f"Fetch {url}")
152
+ if path:
153
+ return _clip_title(f"{name} {path}")
154
+ return name
155
+
156
+
157
+ def _tool_locations(arguments: Any) -> list[ToolCallLocation] | None:
158
+ """File locations for follow-the-agent UIs, when the arguments name a path."""
159
+ args = arguments if isinstance(arguments, dict) else {}
160
+ path = _first_str(args, _PATH_ARG_KEYS)
161
+ if not path:
162
+ return None
163
+ location = ToolCallLocation(path=path)
164
+ line = args.get("line") or args.get("start_line") or args.get("offset")
165
+ if isinstance(line, int) and line > 0:
166
+ location.line = line
167
+ return [location]
168
+
169
+
102
170
  def _prompt_to_text(blocks: list[Any] | None) -> str:
103
171
  """Flatten ACP prompt content blocks into one harness prompt string."""
104
172
  parts: list[str] = []
@@ -324,10 +392,13 @@ class SuperQodeAcpAgent:
324
392
  self._sessions.pop(session_id, None)
325
393
  return None
326
394
 
327
- async def set_session_model(
328
- self, model_id: str, session_id: str, **kwargs: Any
329
- ) -> SetSessionModelResponse:
330
- """Switch the session's model; accepts `provider/model` or bare model ids."""
395
+ async def set_session_model(self, model_id: str, session_id: str, **kwargs: Any) -> None:
396
+ """Switch the session's model; accepts `provider/model` or bare model ids.
397
+
398
+ Returns None so the handler works across agent-client-protocol versions:
399
+ 0.10 accepts None for session/set_model, and 0.11 removed the method from
400
+ the protocol (clients on 0.11 simply never route it here).
401
+ """
331
402
  from superqode.providers.model_specs import split_provider_model_ref
332
403
 
333
404
  state = self._sessions.get(session_id)
@@ -339,7 +410,7 @@ class SuperQodeAcpAgent:
339
410
  state.model = parsed.model
340
411
  else:
341
412
  state.model = str(model_id)
342
- return SetSessionModelResponse()
413
+ return None
343
414
 
344
415
  async def cancel(self, session_id: str, **kwargs: Any) -> None:
345
416
  state = self._sessions.get(session_id)
@@ -428,32 +499,55 @@ class SuperQodeAcpAgent:
428
499
  await self._send_update(session_id, update_agent_thought_text(text))
429
500
  elif event_type == "tool_call":
430
501
  name = str(data.get("tool_name") or "tool")
502
+ arguments = data.get("arguments")
431
503
  call_id = tracker.start(name)
432
504
  await self._send_update(
433
505
  session_id,
434
506
  start_tool_call(
435
507
  call_id,
436
- name,
508
+ _tool_title(name, arguments),
437
509
  kind=_tool_kind(name),
438
510
  status="in_progress",
439
- raw_input=data.get("arguments"),
511
+ locations=_tool_locations(arguments),
512
+ raw_input=arguments,
440
513
  ),
441
514
  )
442
515
  elif event_type == "tool_result":
443
516
  name = str(data.get("tool_name") or "tool")
444
517
  call_id = tracker.finish(name)
445
- if call_id is None:
446
- return
447
518
  success = data.get("success", True)
448
519
  output = data.get("output") if success else (data.get("error") or data.get("output"))
449
520
  content = []
450
521
  if output:
451
522
  content.append(tool_content(text_block(_clip(output))))
523
+ status = "completed" if success else "failed"
524
+ if call_id is None:
525
+ # Runtimes like codex-sdk report tools only on completion; synthesize
526
+ # the tool_call rather than dropping the result on the floor.
527
+ arguments = data.get("arguments") or {
528
+ key: data[key] for key in ("command", "path") if data.get(key)
529
+ }
530
+ call_id = tracker.start(name)
531
+ tracker.finish(name)
532
+ await self._send_update(
533
+ session_id,
534
+ start_tool_call(
535
+ call_id,
536
+ _tool_title(name, arguments),
537
+ kind=_tool_kind(name),
538
+ status=status,
539
+ locations=_tool_locations(arguments),
540
+ raw_input=arguments or None,
541
+ content=content or None,
542
+ raw_output=output,
543
+ ),
544
+ )
545
+ return
452
546
  await self._send_update(
453
547
  session_id,
454
548
  update_tool_call(
455
549
  call_id,
456
- status="completed" if success else "failed",
550
+ status=status,
457
551
  content=content or None,
458
552
  raw_output=output,
459
553
  ),
@@ -470,6 +564,7 @@ class SuperQodeAcpAgent:
470
564
  return True
471
565
  item = dict(pending[0])
472
566
  tool_name = str(item.get("tool_name") or "tool")
567
+ arguments = item.get("arguments")
473
568
  call_id = str(item.get("tool_call_id") or tracker.start(tool_name))
474
569
  response = await self._conn.request_permission(
475
570
  options=[
@@ -482,10 +577,11 @@ class SuperQodeAcpAgent:
482
577
  session_id=session.session_id,
483
578
  tool_call=ToolCallUpdate(
484
579
  tool_call_id=call_id,
485
- title=tool_name,
580
+ title=_tool_title(tool_name, arguments),
486
581
  kind=_tool_kind(tool_name),
487
582
  status="pending",
488
- raw_input=item.get("arguments"),
583
+ locations=_tool_locations(arguments),
584
+ raw_input=arguments,
489
585
  ),
490
586
  )
491
587
  outcome = getattr(response, "outcome", None)
@@ -605,6 +605,11 @@ class AgentResponse:
605
605
  # and any schema-validation errors (empty list means valid).
606
606
  structured_output: Optional[Any] = None
607
607
  schema_errors: Optional[List[str]] = None
608
+ input_tokens: Optional[int] = None
609
+ output_tokens: Optional[int] = None
610
+ total_tokens: Optional[int] = None
611
+ cost_usd: Optional[float] = None
612
+ cost_currency: Optional[str] = None
608
613
 
609
614
 
610
615
  class ToolApprovalRequired(RuntimeError):
@@ -1991,8 +1996,60 @@ class AgentLoop:
1991
1996
  from .hooks import SESSION_START, STOP, USER_PROMPT_SUBMIT
1992
1997
 
1993
1998
  lifecycle_ctx = self._lifecycle_context()
1999
+ usage_input_tokens = 0
2000
+ usage_output_tokens = 0
2001
+ usage_total_tokens = 0
2002
+ usage_cost = 0.0
2003
+ usage_seen = False
2004
+ cost_seen = False
2005
+ cost_currency = "USD"
2006
+
2007
+ def _record_gateway_usage(gateway_response) -> None:
2008
+ nonlocal usage_input_tokens
2009
+ nonlocal usage_output_tokens
2010
+ nonlocal usage_total_tokens
2011
+ nonlocal usage_cost
2012
+ nonlocal usage_seen
2013
+ nonlocal cost_seen
2014
+ nonlocal cost_currency
2015
+ usage = getattr(gateway_response, "usage", None)
2016
+ if usage is not None:
2017
+ prompt_tokens = int(getattr(usage, "prompt_tokens", 0) or 0)
2018
+ completion_tokens = int(getattr(usage, "completion_tokens", 0) or 0)
2019
+ total_tokens = int(getattr(usage, "total_tokens", 0) or 0)
2020
+ if total_tokens <= 0:
2021
+ total_tokens = prompt_tokens + completion_tokens
2022
+ usage_input_tokens += prompt_tokens
2023
+ usage_output_tokens += completion_tokens
2024
+ usage_total_tokens += total_tokens
2025
+ usage_seen = True
2026
+ cost = getattr(gateway_response, "cost", None)
2027
+ if cost is not None:
2028
+ input_cost = float(getattr(cost, "input_cost", 0.0) or 0.0)
2029
+ output_cost = float(getattr(cost, "output_cost", 0.0) or 0.0)
2030
+ total_cost = float(getattr(cost, "total_cost", 0.0) or 0.0)
2031
+ if total_cost == 0.0 and (input_cost or output_cost):
2032
+ total_cost = input_cost + output_cost
2033
+ usage_cost += total_cost
2034
+ cost_currency = str(getattr(cost, "currency", None) or cost_currency or "USD")
2035
+ cost_seen = True
1994
2036
 
1995
2037
  async def _finish(response: AgentResponse) -> AgentResponse:
2038
+ if usage_seen:
2039
+ response.input_tokens = (
2040
+ usage_input_tokens if response.input_tokens is None else response.input_tokens
2041
+ )
2042
+ response.output_tokens = (
2043
+ usage_output_tokens if response.output_tokens is None else response.output_tokens
2044
+ )
2045
+ response.total_tokens = (
2046
+ usage_total_tokens if response.total_tokens is None else response.total_tokens
2047
+ )
2048
+ if cost_seen:
2049
+ response.cost_usd = usage_cost if response.cost_usd is None else response.cost_usd
2050
+ response.cost_currency = (
2051
+ cost_currency if response.cost_currency is None else response.cost_currency
2052
+ )
1996
2053
  self.run_active = False
1997
2054
  await self.hooks.fire(STOP, self._lifecycle_context(), response)
1998
2055
  # Opt-in automatic memory extraction, off the hot path.
@@ -2156,6 +2213,7 @@ class AgentLoop:
2156
2213
  error=str(e),
2157
2214
  )
2158
2215
  )
2216
+ _record_gateway_usage(response)
2159
2217
  await self.hooks.fire(AFTER_LLM_CALL, lifecycle_ctx, response)
2160
2218
 
2161
2219
  # Extract thinking content if available
@@ -371,6 +371,7 @@ COMMANDS = [
371
371
  ":serve web",
372
372
  ":serve harness",
373
373
  ":serve api",
374
+ ":serve acp",
374
375
  ":profiles",
375
376
  ":profiles list",
376
377
  ":doctor",
@@ -587,6 +588,18 @@ COMMANDS = [
587
588
  ":harness observability",
588
589
  ":harness observability status",
589
590
  ":harness observability export",
591
+ ":harness mine-failures",
592
+ ":harness logbook",
593
+ ":harness logbook update",
594
+ ":harness logbook show",
595
+ ":harness logbook export",
596
+ ":harness logbook prune",
597
+ ":harness audit-candidate",
598
+ ":harness candidates",
599
+ ":harness candidates list",
600
+ ":harness candidates show",
601
+ ":harness candidates export",
602
+ ":harness improve",
590
603
  ":harness optimize",
591
604
  ":harness optimize-inspect",
592
605
  ":harness optimize-ledger",
@@ -11703,7 +11703,7 @@ class SuperQodeApp(App):
11703
11703
  self._show_harness_events(log, subargs)
11704
11704
  return
11705
11705
 
11706
- if sub in ("optimize", "optimize-inspect", "optimize-ledger"):
11706
+ if sub in ("improve", "optimize", "optimize-inspect", "optimize-ledger"):
11707
11707
  try:
11708
11708
  tokens = shlex.split(subargs or "")
11709
11709
  except ValueError as exc:
@@ -11714,16 +11714,22 @@ class SuperQodeApp(App):
11714
11714
  "Usage: :harness optimize --spec <path> --tasks <path> [--export-only]"
11715
11715
  )
11716
11716
  return
11717
+ if sub == "improve" and not tokens:
11718
+ log.add_info(
11719
+ "Usage: :harness improve --spec <path> --tasks <path> [--from-failures failures.json] [--export-only]"
11720
+ )
11721
+ return
11717
11722
  if sub in {"optimize-inspect", "optimize-ledger"} and not tokens:
11718
11723
  log.add_info(f"Usage: :harness {sub} <run_dir>")
11719
11724
  return
11720
- self.run_worker(
11721
- self._superqode_cli_cmd(["harness", sub, *tokens], log, "Harness optimization")
11722
- )
11725
+ label = "Harness self-improvement" if sub == "improve" else "Harness optimization"
11726
+ self.run_worker(self._superqode_cli_cmd(["harness", sub, *tokens], log, label))
11723
11727
  return
11724
11728
 
11725
11729
  cli_backed_harness_subcommands = {
11730
+ "audit-candidate",
11726
11731
  "auto-bench",
11732
+ "candidates",
11727
11733
  "compile",
11728
11734
  "diff",
11729
11735
  "drain",
@@ -11734,6 +11740,8 @@ class SuperQodeApp(App):
11734
11740
  "import-omnigent",
11735
11741
  "inbox",
11736
11742
  "list-backends",
11743
+ "logbook",
11744
+ "mine-failures",
11737
11745
  "registry",
11738
11746
  "run",
11739
11747
  "test",
@@ -11767,7 +11775,7 @@ class SuperQodeApp(App):
11767
11775
 
11768
11776
  if not path:
11769
11777
  log.add_info(
11770
- "Usage: :harness <spec.yaml> | :harness wizard [name] --starter <template> --output <path> [--load] | :harness inspect | :harness doctor | :harness graph | :harness replay <run_id> | :harness fork <run_id> | :harness evidence <run_id> | :harness runs | :harness optimize --spec <path> --tasks <path> | :harness optimize-inspect <run_dir> | :harness optimize-ledger <run_dir> | :harness templates | :harness off"
11778
+ "Usage: :harness <spec.yaml> | :harness wizard [name] --starter <template> --output <path> [--load] | :harness inspect | :harness doctor | :harness graph | :harness replay <run_id> | :harness fork <run_id> | :harness evidence <run_id> | :harness runs | :harness mine-failures --eval-result eval.json | :harness audit-candidate --base <path> --candidate <path> | :harness candidates list | :harness improve --spec <path> --tasks <path> | :harness optimize --spec <path> --tasks <path> | :harness optimize-inspect <run_dir> | :harness optimize-ledger <run_dir> | :harness templates | :harness off"
11771
11779
  )
11772
11780
  return
11773
11781
 
@@ -21415,6 +21423,7 @@ class SuperQodeApp(App):
21415
21423
  "shell": "▸",
21416
21424
  "terminal": "▸",
21417
21425
  "exec": "▸",
21426
+ "run": "▸",
21418
21427
  "search": "⌕",
21419
21428
  "grep": "⌕",
21420
21429
  "find": "⌕",
@@ -21449,24 +21458,49 @@ class SuperQodeApp(App):
21449
21458
  pass
21450
21459
  return p
21451
21460
 
21461
+ def _first_arg(*keys: str) -> str:
21462
+ for key in keys:
21463
+ value = tool_input.get(key)
21464
+ if isinstance(value, str) and value.strip():
21465
+ return value.strip()
21466
+ return ""
21467
+
21468
+ # Cover snake_case and camelCase: harness tools, ACP agents, and the
21469
+ # codex-sdk runtime all spell these keys differently.
21452
21470
  file_path = _relpath(
21453
- tool_input.get("filePath", tool_input.get("path", tool_input.get("file", "")))
21471
+ _first_arg(
21472
+ "filePath", "file_path", "path", "file", "abs_path", "filename", "target_file"
21473
+ )
21454
21474
  )
21455
21475
 
21456
- if tool_lower in ("read", "write", "edit", "patch", "create") and file_path:
21476
+ # Substring matching ("read_file", "Read file", "edit" all count as reads/
21477
+ # edits); exact-name matching left every external agent in the generic branch.
21478
+ def _matches(*fragments: str) -> bool:
21479
+ return any(fragment in tool_lower for fragment in fragments)
21480
+
21481
+ if _matches("read", "write", "edit", "patch", "create") and file_path:
21457
21482
  return f"{icon} {file_path}"
21458
- if tool_lower in ("bash", "shell", "terminal", "exec"):
21459
- cmd = tool_input.get("command", "")
21460
- return f"{icon} {cmd}"
21461
- if tool_lower in ("search", "grep", "find"):
21462
- query = tool_input.get("pattern", tool_input.get("query", tool_input.get("search", "")))
21463
- return f"{icon} {query}"
21464
- if tool_lower in ("list", "ls", "glob"):
21465
- path = _relpath(tool_input.get("path", tool_input.get("directory", ".")))
21466
- return f"{icon} {path}"
21483
+ if _matches("bash", "shell", "terminal", "exec", "command", "run"):
21484
+ cmd = _first_arg("command", "cmd", "script")
21485
+ if cmd:
21486
+ return f"{icon} {cmd}"
21487
+ if _matches("search", "grep", "find"):
21488
+ query = _first_arg("pattern", "query", "search", "regex")
21489
+ if query:
21490
+ return f"{icon} {query}"
21491
+ if _matches("list", "ls", "glob", "tree"):
21492
+ path = _relpath(_first_arg("path", "directory", "dir_path"))
21493
+ if path:
21494
+ return f"{icon} {path}"
21467
21495
  if tool_lower == "todo_write":
21468
21496
  todos = tool_input.get("todos", [])
21469
21497
  return f"{icon} todo list ({len(todos)} items)"
21498
+ if _matches("fetch", "web", "http"):
21499
+ url = _first_arg("url", "uri")
21500
+ if url:
21501
+ return f"{icon} {url}"
21502
+ if file_path:
21503
+ return f"{icon} {tool_name} {file_path}"
21470
21504
 
21471
21505
  # Generic: show a short hint of the first argument value, not full JSON.
21472
21506
  if tool_input:
@@ -30202,6 +30236,26 @@ class SuperQodeApp(App):
30202
30236
  "Show run evidence, changes, checks, and result receipt",
30203
30237
  ),
30204
30238
  (":harness events <run_id>", "Show persisted event timeline for a harness run"),
30239
+ (
30240
+ ":harness mine-failures --eval-result eval.json",
30241
+ "Mine structured self-improvement failures from harness JSON",
30242
+ ),
30243
+ (
30244
+ ":harness logbook show",
30245
+ "Show the file-backed self-improvement logbook",
30246
+ ),
30247
+ (
30248
+ ":harness audit-candidate --base <path> --candidate <path>",
30249
+ "Audit protected surfaces, eval gates, and reward-hacking risk",
30250
+ ),
30251
+ (
30252
+ ":harness candidates list",
30253
+ "Show accepted and rejected self-improvement candidates",
30254
+ ),
30255
+ (
30256
+ ":harness improve --spec <path> --tasks <path>",
30257
+ "Improve a HarnessSpec from mined failures and logbook memory",
30258
+ ),
30205
30259
  (
30206
30260
  ":harness optimize --spec <path> --tasks <path>",
30207
30261
  "Optimize a HarnessSpec through optional metaharness",
@@ -41,6 +41,7 @@ from .spec import (
41
41
  HooksSpec,
42
42
  ModelPolicySpec,
43
43
  ObservabilitySpec,
44
+ OptimizationSpec,
44
45
  PermissionRuleSpec,
45
46
  RecursionSpec,
46
47
  RemoteHarnessSpec,
@@ -196,6 +197,8 @@ _LAZY_IMPORTS = {
196
197
  "HARNESS_DIMENSIONS": (".testing", "HARNESS_DIMENSIONS"),
197
198
  "dimension_for_category": (".testing", "dimension_for_category"),
198
199
  "eval_pack_path": (".eval", "eval_pack_path"),
200
+ "eval_task_split_counts": (".eval", "eval_task_split_counts"),
201
+ "filter_eval_tasks": (".eval", "filter_eval_tasks"),
199
202
  "list_eval_packs": (".eval", "list_eval_packs"),
200
203
  "load_eval_tasks": (".eval", "load_eval_tasks"),
201
204
  "run_harness_eval": (".eval", "run_harness_eval"),
@@ -212,6 +215,23 @@ _LAZY_IMPORTS = {
212
215
  "render_optimize_payload": (".optimize", "render_optimize_payload"),
213
216
  "render_metaharness_summary": (".optimize", "render_metaharness_summary"),
214
217
  "render_metaharness_ledger": (".optimize", "render_metaharness_ledger"),
218
+ "DEFAULT_LOGBOOK_DIR": (".self_improve", "DEFAULT_LOGBOOK_DIR"),
219
+ "DEFAULT_CANDIDATE_LEDGER_PATH": (".self_improve", "DEFAULT_CANDIDATE_LEDGER_PATH"),
220
+ "append_self_improve_evidence": (".self_improve", "append_self_improve_evidence"),
221
+ "audit_harness_candidate": (".self_improve", "audit_harness_candidate"),
222
+ "candidate_ledger_to_markdown": (".self_improve", "candidate_ledger_to_markdown"),
223
+ "logbook_to_markdown": (".self_improve", "logbook_to_markdown"),
224
+ "mine_harness_failures": (".self_improve", "mine_harness_failures"),
225
+ "prune_logbook": (".self_improve", "prune_logbook"),
226
+ "read_candidate_ledger": (".self_improve", "read_candidate_ledger"),
227
+ "read_logbook": (".self_improve", "read_logbook"),
228
+ "record_candidate_audit": (".self_improve", "record_candidate_audit"),
229
+ "render_candidate_audit": (".self_improve", "render_candidate_audit"),
230
+ "render_candidate_ledger": (".self_improve", "render_candidate_ledger"),
231
+ "render_failure_report": (".self_improve", "render_failure_report"),
232
+ "render_logbook": (".self_improve", "render_logbook"),
233
+ "update_logbook_from_failures": (".self_improve", "update_logbook_from_failures"),
234
+ "write_failure_report": (".self_improve", "write_failure_report"),
215
235
  }
216
236
 
217
237
 
@@ -240,6 +260,7 @@ __all__ = [
240
260
  "ModelPolicySpec",
241
261
  "PermissionRuleSpec",
242
262
  "ObservabilitySpec",
263
+ "OptimizationSpec",
243
264
  "RecursionSpec",
244
265
  "RemoteHarnessSpec",
245
266
  "RuntimeSpec",
@@ -387,6 +408,8 @@ __all__ = [
387
408
  "dimension_for_category",
388
409
  "harness_eval_regressions",
389
410
  "eval_pack_path",
411
+ "eval_task_split_counts",
412
+ "filter_eval_tasks",
390
413
  "list_eval_packs",
391
414
  "load_eval_tasks",
392
415
  "run_harness_eval",
@@ -402,6 +425,15 @@ __all__ = [
402
425
  "render_optimize_payload",
403
426
  "render_metaharness_summary",
404
427
  "render_metaharness_ledger",
428
+ "DEFAULT_LOGBOOK_DIR",
429
+ "append_self_improve_evidence",
430
+ "logbook_to_markdown",
431
+ "mine_harness_failures",
432
+ "read_logbook",
433
+ "render_failure_report",
434
+ "render_logbook",
435
+ "update_logbook_from_failures",
436
+ "write_failure_report",
405
437
  "omnigent_agent_to_harness_spec",
406
438
  "spec_from_headless_profile",
407
439
  # Performance