superqode 2.1.0__tar.gz → 2.2.1__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.
- {superqode-2.1.0 → superqode-2.2.1}/CHANGELOG.md +94 -0
- {superqode-2.1.0 → superqode-2.2.1}/PKG-INFO +29 -3
- {superqode-2.1.0 → superqode-2.2.1}/README.md +28 -2
- {superqode-2.1.0 → superqode-2.2.1}/pyproject.toml +1 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/__init__.py +1 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/client.py +31 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/conformance.py +6 -0
- superqode-2.2.1/src/superqode/a2a/context.py +132 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/inspect.py +4 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/server.py +59 -11
- superqode-2.2.1/src/superqode/a2a/trust.py +280 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp_discovery.py +2 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/acp_registry.py +7 -7
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/cagent.dev.toml +8 -9
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/codeassistant.dev.toml +8 -8
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/crow-ai.dev.toml +2 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/fount.dev.toml +2 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/goose.block.xyz.toml +2 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/llmlingagent.dev.toml +8 -9
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/poolside.ai.toml +2 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/qoder.com.toml +2 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/sigit.dev.toml +2 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/stakpak.dev.toml +7 -8
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/stdiobus.dev.toml +8 -4
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/vtcode.dev.toml +9 -10
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/registry.py +6 -6
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/constants.py +2 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/connect.py +12 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/harness_hub.py +42 -8
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/a2a_connect.py +56 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/connect.py +18 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/run_history.py +25 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/hub.py +23 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/serve.py +83 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/config/loader.py +11 -11
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/__init__.py +12 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/uhp.py +6 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/hub.py +600 -2
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/uhp_adapter.py +35 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/uhp_client.py +203 -7
- superqode-2.2.1/src/superqode/harness/uhp_server.py +1051 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/connection_profiles.py +177 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/harness_catalog.py +4 -4
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/a2a_connect.py +9 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/agent_store.py +1 -1
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/harness_hub.py +248 -62
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode.egg-info/PKG-INFO +29 -3
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode.egg-info/SOURCES.txt +6 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_bridge.py +88 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_connect.py +21 -0
- superqode-2.2.1/tests/test_a2a_context.py +69 -0
- superqode-2.2.1/tests/test_a2a_trust.py +125 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_cli_contract.py +11 -2
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_connect_harness_screen.py +1 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_connection_profiles.py +1 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_smoke.py +3 -1
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_uhp_client.py +117 -0
- superqode-2.2.1/tests/test_uhp_server.py +405 -0
- {superqode-2.1.0 → superqode-2.2.1}/LICENSE +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/MANIFEST.in +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/NOTICE +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/README.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/a2a/README.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/a2a/smoke_client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/bench/dspy-comprehension.manifest.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/bench/dspy-comprehension.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/bench/spec-core.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/bench/spec-deepagents.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/bench/spec-prime-agent.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/byok-acp-team.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/codex_sdk_quickstart.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/evals/omni-release.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/evals/omni-tiny.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/README.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/manifest-guard/context.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/manifest-guard/hooks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/manifest-guard/tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/packages/README.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/packages/broken-extension/src/superqode_example_broken/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/packages/policy-extension/src/superqode_example_policy/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/packages/skill-extension/src/superqode_example_skill/SKILL.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/packages/skill-extension/src/superqode_example_skill/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/packages/tool-extension/src/superqode_example_tool/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/packages/tool-extension-v2/src/superqode_example_tool/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/extensions/python-package/src/superqode_example_extension/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harness-packages/README.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harness-packages/hello-harness/src/superqode_hello_harness/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/coding.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/deepagents.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/deepseek-harness.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/ds4.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/gemma4.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/google-adk.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/local-recursive-dynamic.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/mcp-docs.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/no-tool.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/omni-tiny-local.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/omnigent-multi-agent.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/openai-agents.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/prime-agent.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/pydanticai.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/harnesses/rlm-code-lid.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/local-models-team.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/mcp/local_docs_server.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/omnigent-multi-agent.agent.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/qm-deployment-layer/README.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/qm-deployment-layer/sandbox/skills/superqode-harness/SKILL.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/INCIDENT.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/README.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/RUNBOOK.md +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/deploy_audit/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/deploy_audit/parser.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/deploy_audit/report.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/rlm-docker.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/rlm-monty.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/rlm-demo/tests/test_report.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/examples/simple-team.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/scripts/check_release_metadata.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/setup.cfg +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/connection.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/keys.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/limits.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/oauth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/presets.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/reply.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/security.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/shortlist.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/skills.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/types.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/understand.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/a2a/workflows.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/doctor.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/permission_screen.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/permission_store.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/render.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/server.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/session_store.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/slash.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/tool_call_context.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/acp/types.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/auto_memory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/command_safety.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/compaction.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/context_manager.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/edit_strategies.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/exec_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/hooks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/loop.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/loop_guard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/loop_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/network_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/output_handler.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/parallel_compare.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/peer_agents.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/plan_mode.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/reminders.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/rubric.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/session_manager.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/structured_output.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/summarization.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/system_prompts.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/terminal_output_limits.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/text_tool_calls.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/tool_args.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/tool_tracking.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent/utility_model.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent_output.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agent_stream.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/agentpool.phil65.github.io.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/ampcode.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/augmentcode.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/autodev.github.io.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/blackbox.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/bub.dev.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/claude.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/cline.bot.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/codebuddy.tencent.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/codex.openai.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/copilot.github.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/cortex.snowflake.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/cursor.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/deepagents-code.langchain.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/deepagents.langchain.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/devin.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/dirac.run.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/factory.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/fastagent.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/fx.sh.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/geminicli.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/glm.z.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/harnlang.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/hermes-agent.nousresearch.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/kilo.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/kiro.dev.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/minioncode.dev.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/mistral-vibe.mistral.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/openclaw.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/opencode.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/openhands.dev.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/pi.dev.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/primeintellect.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/qwenlm.github.io.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/data/x.ai.toml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/discovery.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/free_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/install_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/messaging.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/official_acp.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/persona.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/schema.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/agents/unified.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/async_utils.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/capabilities.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/css.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/harness_picker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/inputs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/actions_misc.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/agent_run.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/build_harness.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/clickable_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/codex.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/commands_impl.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/completion.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/dialogs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/events.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/explore.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/factory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/feedback.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/formatting.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_clipboard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_completion_helpers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_diff_review.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_exit_lifecycle.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_file_view.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_interaction_mode.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_mcp_attach.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_message_queue.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_permissions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_recipes_skills.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_share.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_startup.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_todos_plan.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_vim.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helper_wizard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/helpers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/huggingface.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/local_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/mcp.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/model_catalog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/pickers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/pipy_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/rlm_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/sidebar.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/slash_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/switchboard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/mixins/tour.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/navigation.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/outcomes.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/progress.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/prompt_stack.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/recipes.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/session_state.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/suggester.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/theme_bridge.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/welcome.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app/widgets.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app_enhanced.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/app_main.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/approval.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/atomic.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/auth/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/benchmarks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/channels/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/channels/config.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/channels/discord.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/channels/service.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/channels/slack.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/channels/telegram.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/claude.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/codex.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/a2a.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/a2a_keys.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/acp.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/agents.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/auth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/benchmark.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/config.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/daemon.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/factory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/gauge.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/_group.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/_helpers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/bench.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/candidates.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/evaluation.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/evidence.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/inbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/lifecycle.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/logbook.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/observability.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/optimization.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/promotion.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/protocol.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/replay.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/harness/worker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/local.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/memory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/plugins.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/profiles.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/providers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/sessions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/share.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/skillopt.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/skills.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/trust.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/uhp.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/update.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/commands/work.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/config/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/config/schema.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/core/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/danger.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/data/eval_fixtures/ci-dynamic-root-cause.log +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/data/eval_fixtures/ci-root-cause.log +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/data/eval_packs/local_dynamic_workflow_smoke.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/data/eval_packs/local_recursive_smoke.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/data/superqode-template.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/design_system.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/dialogs/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/dialogs/base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/dialogs/model.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/dialogs/provider.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/dialogs/runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/diff_view.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/enterprise.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/evaluation/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/evaluation/adapters.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/evaluation/behaviors.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/evaluation/engine.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/evaluation/scenarios.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/execution/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/execution/linter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/execution/modes.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/execution/resolver.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/execution/runner.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/extensions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/file_explorer.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/file_viewer.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/flash.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/gauge/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/gauge/levels.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/gauge/record.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/gauge/sources.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/governance.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/accelerator.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/agent_importer.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/approval_memory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/deepagents.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/dsh.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/managed.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/pipy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/prime_agent.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/pydanticai.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/rlm.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/rlm_code.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/backends/tau.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/bench.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/catalog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/compiler.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/conformance.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/context_handles.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/diagnostics.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/discovery.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/drift.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/eval.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/events.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/explain.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/hooks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/kernel.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/loader.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/mcp_bridge.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/model_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/model_routes.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/observability.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/omni.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/omnigent_importer.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/optimize.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/output.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/permissions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/pipy_adapter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/pipy_extensions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/promotion.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/protocol.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/protocol_adapters.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/protocol_controller.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/rlm_adapter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/rlm_code_adapter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/self_improve.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/spec.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/store.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/tau_adapter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/tau_management.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/templates.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/testing.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/wizard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/workflow.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/harness/workflow_presets.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/headless.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/history.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/airplane.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/bench.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/build.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/code_index.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/devstral.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/ds4.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/gemma4.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/glm.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/gpt-oss.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/kimi.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/laguna.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/minimax.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/qwen-coder.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/model-packs/qwen3.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/data/stack_matrix.yaml +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/doctor.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/engines.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/guardrails.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/hardware.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/inventory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/labs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/laguna.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/matrix.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/migrate.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/optimize.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/packs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/repo.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/servers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/setup.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/local/smoke.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/logging/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/logging/adapters.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/logging/formatter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/logging/integration.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/logging/sinks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/logging/unified_log.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/lsp/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/lsp/client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/main.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/auth_storage.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/config.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/elicitation.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/harness_server.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/hf_auth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/integration.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/oauth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/oauth_callback.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/sampling.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/search.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/mcp/types.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/memory/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/memory/config.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/memory/providers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/memory/types.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/notifications.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/permissions/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/permissions/rules.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/ai/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/ai/fake.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/ai/gateway.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/ai/models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/ai/transform.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/coding_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/compaction.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/config.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/event_stream.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/events.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/harness.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/harness_events.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/loop.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/messages.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/permissions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/prompt_templates.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/provider_events.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/resources.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/codec.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/entries.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/jsonl.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/memory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/repository.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/session/storage.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/signals.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/skills.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/stream.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/system_prompt.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/edit_diff.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/files.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/paths.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/search.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/shell.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/tools/truncate.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/types.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pipy/validation.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/plan.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/platform_locks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/plugins.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/project_trust.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/_builtin_profiles.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/acp_free_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/acp_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/acp_registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/apple_fm.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/catalog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/copilot_auth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/credentials.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/dynamic.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/env_introspect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/free_inference.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/gateway/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/gateway/base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/gateway/litellm_gateway.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/gateway/synthetic.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/grok_cli_auth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/health.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/convert.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/downloader.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/endpoints.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/fetch.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/hub.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/inference.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/live_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/_mlx_worker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/capabilities.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/context_probe.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/discovery.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/ds4.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/lmstudio.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/mlx.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/mlx_engine.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/mlx_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/ollama.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/sglang.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/smoke.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/tgi.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/tool_support.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/local/vllm.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/manager.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/model_specs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/models_dev.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/opencode_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/converters/messages.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/converters/tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/schema/models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/prime_agent.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/profiles.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/recommendations.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/subscription_env.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/subscription_login.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/uhp.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/providers/usage.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/pure_mode.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/py.typed +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rendering/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rendering/html_export.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rendering/markdown.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rendering/transcript_export.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/coding_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/config.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/context.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/identity.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/kernel.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/kernel_backend.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/kernel_docker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/kernel_monty.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/kernel_server.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/root_runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/root_worker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/subcalls.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/supervisor.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/worker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/rlm/worker_process.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/adk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/antigravity_cli.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/antigravity_managed.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/antigravity_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/antigravity_status.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/builtin.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/claude_agent_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/codex_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/copilot_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/devin_cli.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/devin_status.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/errors.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/openai_agents.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/openai_sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/openai_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/pydanticai.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/tool_bridge.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/tool_bridge_openai.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/tool_bridge_pydanticai.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/runtime/vendor_cli.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/safety/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/safety/sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/safety/warnings.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/sandbox/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/sandbox/backends.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/sandbox/execution.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/sandbox/local_sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/search_registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/server/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/server/api.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/server/web.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/session/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/session/factory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/session/persistence.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/session/share_artifacts.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/session/sharing.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/session/switchboard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/sidebar.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/skillopt.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/skills.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/stream_view.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/styles/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tool_call.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/agent_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/apply_patch.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/batch_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/compact_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/context_handle.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/context_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/core_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/diagnostics.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/diff_utils.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/display.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/dynamic_workflow.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/edit_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/enhanced_base.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/env_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/file_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/file_tracking.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/governed.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/harness_agent_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/image_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/lsp_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/mcp_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/monty_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/network_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/output_spill.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/peer_agent_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/permissions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/post_edit.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/question_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/request_permissions_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/search_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/semantic_search.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/shell_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/shell_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/skill_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/spawn_harness.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/todo_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/tool_search.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/validation.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tools/web_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tui_integration.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tui_widgets/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tui_widgets/widgets/progress.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/undo_manager.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/utils/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/utils/error_handling.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/utils/fuzzy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/agent_switcher.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/animation_manager.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/code_context.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/command_palette.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/connection_status.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/conversation_history.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/diff_indicator.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/enhanced_status_bar.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/enhanced_toast.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/file_browser.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/file_reference.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/leader_key.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/mode_switcher.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/model_picker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/outcome_screen.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/permission_preview.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/prompt.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/provider_connect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/pty_shell.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/resizable_sidebar.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/response_changes.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/response_display.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/rewind_overlay.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/rich_tool_display.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/sidebar_panels.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/slash_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/slash_complete.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/split_view.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/status_bar.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/superqode_display.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/theme_picker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/thinking.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/thinking_display.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/throbber.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/toast.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/uhp_connect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/widgets/unified_output.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/cockpit.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/integration.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/runner.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/store.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/usage.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workorders/worker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/__init__.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/artifacts.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/change_summary.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/coordinator.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/diff_tracker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/git_guard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/git_snapshot.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/manager.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/snapshot.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/watcher.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode/workspace/worktree.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode.egg-info/dependency_links.txt +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode.egg-info/entry_points.txt +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode.egg-info/requires.txt +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/src/superqode.egg-info/top_level.txt +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_030_candidate.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_conformance.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_keys.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_limits.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_oauth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_security.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_shortlist.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_a2a_understand.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_agent_dispatch.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_free_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_parent_tool_linking.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_permission_store.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_render.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_server.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_session_store.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_acp_slash.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_adaptive_compaction.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_agent_importer.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_agent_install_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_agent_loop_harness.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_agent_memory.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_agents_md_compat.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_agy_tui_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_app_main_contract.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_apply_patch.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_auth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_bash_spill.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_benchmarks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_catalog_freshness.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_change_summary.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_channels.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_cli_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_cli_connect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_cli_reference_coverage.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_clickable_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_command_safety.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_commands_runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_compaction.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_config_loader.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_config_runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_connect_setup.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_context_handles.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_context_probe.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_context_remaining.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_copilot_login_ux.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_copilot_tui_commands.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_create_skill_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_deepagents_model_spec.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_deferred_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_design_system_contrast.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_developer_workflow_docs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_ds4_local_client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_dsh_harness.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_dynamic_workflow_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_edit_line_number_strip.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_env_introspect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_execution_resolver.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_extensions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_final_parity_wave.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_free_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_governance.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_grok_cli_auth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_agent_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_backends.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_bench.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_bench_paths.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_catalog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_connect_catalog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_drift.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_eval_splits.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_examples.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_explain.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_hooks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_hub_catalog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_hub_screen.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_kernel.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_mcp_server.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_model_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_observability.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_omni.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_output.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_permissions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_promotion.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_protocol.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_seesaw_dimensions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_self_improve.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_spec.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_store.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_usage.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_wizard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_harness_workflow.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_headless.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_hf_fetch.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_hooks.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_install_script.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_integration_docs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_kimi_k3_provider.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_kimi_k3_routes.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_linter_runner.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_litellm_gateway.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_live_acp_registry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_live_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_airplane.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_build.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_code_index.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_labs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_migrate.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_model_optimizations.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_packs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_search.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_servers.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_setup.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_smoke.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_stack.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_tool_capabilities.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_local_tool_support.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_login_api.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_loop_guard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_managed_harness_backend.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_markdown_render.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mcp.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mcp_example_server.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mcp_integration.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mcp_live.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mcp_oauth_generalized.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mcp_tools_runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mcp_two_way.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_memory_recall.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_mlx_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_model_profiles.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_model_specs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_models_dev.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_monty_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_navigation_history.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_network_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_ollama_client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_omnigent_agent_session_smoke.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_omnigent_importer.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_openai_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_output_spill.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_parallel_compare.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_peer_agents.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_plugin_hook_wiring.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_plugins.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_policies_and_turndiff.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_post_edit_verify.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_prime_agent_client.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_prime_agent_harness.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_prime_agent_provider.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_prime_command_surface.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_prime_tui_rpc.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_progressive_discovery.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_progressive_reveals.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_project_trust.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_prompt_stack.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_provider_catalog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_provider_dynamic.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_provider_models.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_provider_recommendations.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_pure_mode_sessions.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_qm_deployment_layer.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_rate_limit_retry.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_read_tool_limits.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_reasoning_and_budget.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_recursive_eval_packs.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_release_metadata.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_rlm_code_integration.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_adk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_antigravity_cli.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_antigravity_managed.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_antigravity_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_builtin.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_claude_agent_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_codex_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_copilot_sdk.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_devin_cli.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_dialog.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_openai_agents.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_openai_events.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_openai_hitl.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_openai_sandbox.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_protocol.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_runtime_pydanticai.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_sandbox_backends.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_sandbox_execution.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_search_roots.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_semantic_search.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_session_switchboard.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_shell_session.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_simple_login.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_simple_query_fastpath.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_skillopt.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_slash_runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_spawn_harness_tool.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_status_bar_layout.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_steering_continue_reminders.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_streaming_tool_calls.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_subscription_billing_policy.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_subscription_login.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_subscription_login_consent.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_synthetic_gateways.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tau_harness_adapter.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_terminal_output_limits.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_theme_contrast.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_theme_picker.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_theme_repaint.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_todo_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tool_args_repair.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tool_batch_safety.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tool_bridge.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tool_bridge_openai.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tool_call_repair.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tool_output_pruning.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tool_tracking.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tools.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_change_summary.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_chat_mode.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_diagnostics.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_exit.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_feedback.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_launch_performance.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_llamacpp_connect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_markdown_cleanup.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_mlx_connect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_mounted.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_onboarding.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_tui_tool_display.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_uhp_backend.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_uhp_connect.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_update_command.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_vendor_cli_runtime.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_version.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_view_image.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_web_server_auth.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_workorders.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_workspace.py +0 -0
- {superqode-2.1.0 → superqode-2.2.1}/tests/test_zai_provider.py +0 -0
|
@@ -7,6 +7,100 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.2.1] - 2026-09-12
|
|
11
|
+
|
|
12
|
+
Local UHP for the package cut: SuperQode speaks it as a client (connect, run,
|
|
13
|
+
file upload and artifact download) and as a native Core server that binds one
|
|
14
|
+
HarnessSpec. Harness stop reasons map to UHP failed or incomplete instead of an
|
|
15
|
+
empty completed response. The same cut includes A2ABreak card-review and
|
|
16
|
+
contextId hardening. A public UHP host (GoDaddy) and Google Cloud infra stay for
|
|
17
|
+
2.3.0.
|
|
18
|
+
|
|
19
|
+
### 🧩 Unified Harness Protocol
|
|
20
|
+
|
|
21
|
+
- Client path: `superqode connect uhp` discovers a server and selects a harness;
|
|
22
|
+
`harness run uhp` runs tasks through the same session, event and evidence model
|
|
23
|
+
as a local harness.
|
|
24
|
+
- File upload and artifact download: `--file` / `input_files=` send local files
|
|
25
|
+
through `POST /v1/files`; `--download-dir` and `download_citations` write
|
|
26
|
+
`container_file_citation` artifacts back to disk.
|
|
27
|
+
- Native server: `superqode serve uhp --spec harness.yaml` exposes one configured
|
|
28
|
+
HarnessSpec over UHP Core. Complementary to HarnessRouter (a multi-backend
|
|
29
|
+
runner), not a substitute for it.
|
|
30
|
+
- Harness `stopped_reason` values such as `error`, `blocked` and `loop_detected`
|
|
31
|
+
map to UHP `failed`; `needs_approval` and `max_iterations` map to `incomplete`.
|
|
32
|
+
An empty provider failure is no longer reported as `completed`.
|
|
33
|
+
- The server advertises `conformance_class: core`. That names the surface it
|
|
34
|
+
implements; it is not a UHP conformance-suite certificate.
|
|
35
|
+
|
|
36
|
+
### 🔐 A2ABreak hardening
|
|
37
|
+
|
|
38
|
+
- Card review on connect/inspect surfaces SuperOptiX-aligned findings, and
|
|
39
|
+
`contextId` plus task ACL bind to the caller principal (protocol gaps, not
|
|
40
|
+
product CVEs).
|
|
41
|
+
|
|
42
|
+
## [2.2.0] - 2026-09-07
|
|
43
|
+
|
|
44
|
+
Every Harness Hub record now states the language its harness is implemented in,
|
|
45
|
+
taken from the project's own build manifest rather than its marketing, and that
|
|
46
|
+
fact is filterable from the terminal, the CLI and the website. The same pass
|
|
47
|
+
found install commands that fetched the wrong software and corrected them.
|
|
48
|
+
|
|
49
|
+
### 🔤 Implementation language
|
|
50
|
+
|
|
51
|
+
- Hub records carry `language`, `language_confidence` and `language_evidence`.
|
|
52
|
+
The schema moves to 1.6.
|
|
53
|
+
- "Confirmed" comes from a build manifest, GitHub's language breakdown, or a
|
|
54
|
+
statement by the vendor. "Inferred" is read off what a closed-source product
|
|
55
|
+
ships, such as an npm wrapper over platform binaries or Cargo target triples
|
|
56
|
+
in an installer, and every surface marks it as such.
|
|
57
|
+
- `superqode hub` prints a language column and takes `--language`, whose
|
|
58
|
+
choices come from the catalogue and so cannot drift from it.
|
|
59
|
+
- `superqode hub show` reports the language, how firmly it is known, and the
|
|
60
|
+
evidence behind it.
|
|
61
|
+
- `:hub` filters by language from named buttons that wrap across rows, so no
|
|
62
|
+
language sits off the right edge of an 80-column terminal.
|
|
63
|
+
- New `:connect by-language` screen. It browses every route by what the harness
|
|
64
|
+
is written in: SuperQode's own harnesses, vendor subscriptions, key harnesses
|
|
65
|
+
and the ACP registry.
|
|
66
|
+
|
|
67
|
+
### 🔭 Hub
|
|
68
|
+
|
|
69
|
+
- Inspecting a harness shows its language, the one command that launches it,
|
|
70
|
+
and a Links block carrying the official repository. Several entries repeat a
|
|
71
|
+
single URL across repository, homepage and docs; those now collapse to one
|
|
72
|
+
row instead of printing the same address three times.
|
|
73
|
+
- The preview pane keeps what you need to choose and start. Setup steps, tools,
|
|
74
|
+
policies and commands moved behind Inspect. Warnings stay in the preview,
|
|
75
|
+
since hiding a sandbox caveat behind a keypress is not a summary.
|
|
76
|
+
- ACP agents left `:hub`. `:connect acp` already reaches every one of them and
|
|
77
|
+
marks what is installed, so listing them twice made the Hub twice as long
|
|
78
|
+
without saying anything new.
|
|
79
|
+
- Presets left `:hub` too. They are tunings of the four built-in harnesses
|
|
80
|
+
rather than harnesses in their own right; `:harness switch <preset>` and the
|
|
81
|
+
preset menu still reach them.
|
|
82
|
+
- The Hub opens on All. It previously switched itself to Ready whenever
|
|
83
|
+
anything was installed, which read as a short catalogue rather than a
|
|
84
|
+
filtered one.
|
|
85
|
+
- Entries are ordered alphabetically with nothing promoted, and the list
|
|
86
|
+
returns to the top when the view changes.
|
|
87
|
+
|
|
88
|
+
### 🔧 Install commands and repository URLs
|
|
89
|
+
|
|
90
|
+
- Three commands installed unrelated software: `cargo install fount` fetched a
|
|
91
|
+
Fountain screenplay editor, `npm install -g crow-cli` a Crystal transpiler,
|
|
92
|
+
and `pipx install goose-ai` a placeholder package. `cagent` and `kimi-cli`
|
|
93
|
+
had the same collision on npm.
|
|
94
|
+
- Eight more named packages that do not exist: `qoder-cli`, `sigit`,
|
|
95
|
+
`vtcode-acp`, `@poolsideai/pool`, `cagent`, `stakpak`, `code-assistant` and
|
|
96
|
+
`stdio-bus`.
|
|
97
|
+
- Gemini CLI, Auggie and Kimi were published under the `@anthropic-ai/` scope,
|
|
98
|
+
which belongs to another vendor and carries no such packages. One of the
|
|
99
|
+
three was a live `npx` invocation rather than documentation.
|
|
100
|
+
- Seven repository URLs answered 404 or named the wrong project. OpenCode
|
|
101
|
+
pointed at the archived 2024 Go project, which also reported the wrong
|
|
102
|
+
language for it.
|
|
103
|
+
|
|
10
104
|
## [2.1.0] - 2026-09-06
|
|
11
105
|
|
|
12
106
|
Adds `sq gauge`, which writes an Agent Quality Record for a release decision.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superqode
|
|
3
|
-
Version: 2.1
|
|
3
|
+
Version: 2.2.1
|
|
4
4
|
Summary: The harness layer for coding agents
|
|
5
5
|
Author-email: Shashi Jagtap <info@super-agentic.ai>
|
|
6
6
|
Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
|
|
@@ -439,6 +439,14 @@ can call it today:
|
|
|
439
439
|
superqode connect a2a --url https://a2a.superqode.dev
|
|
440
440
|
```
|
|
441
441
|
|
|
442
|
+
Or use the A2A project's official CLI ([`a2a`](https://github.com/a2aproject/a2a-cli)):
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
a2a card get -a https://a2a.superqode.dev
|
|
446
|
+
a2a send -a https://a2a.superqode.dev \
|
|
447
|
+
"Which harness should we shortlist for a Python monorepo?"
|
|
448
|
+
```
|
|
449
|
+
|
|
442
450
|
It scores 100% of MUST and 100% of MAY against the
|
|
443
451
|
[Technology Compatibility Kit](https://github.com/a2aproject/a2a-tck) the A2A
|
|
444
452
|
project maintains under the Linux Foundation, on the JSON-RPC and HTTP+JSON
|
|
@@ -460,6 +468,23 @@ superqode a2a-keys issue "Acme Corp" --tier one-off --days 30
|
|
|
460
468
|
|
|
461
469
|
Read the [A2A guide](docs/providers/a2a.md).
|
|
462
470
|
|
|
471
|
+
## Serve a Harness Over UHP
|
|
472
|
+
|
|
473
|
+
The same install that drives a remote UHP server can also expose a local
|
|
474
|
+
HarnessSpec so other UHP clients call SuperQode:
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
superqode serve uhp --spec harness.yaml --port 8787
|
|
478
|
+
superqode connect uhp --base-url http://127.0.0.1:8787
|
|
479
|
+
superqode harness run uhp --prompt "summarise this repository"
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
`serve uhp` binds one HarnessSpec and advertises UHP Core. It is complementary
|
|
483
|
+
to HarnessRouter, which wraps third-party CLIs as a catalog. Core names the
|
|
484
|
+
surface SuperQode implements; it is not a conformance-suite certificate.
|
|
485
|
+
|
|
486
|
+
Read the [UHP guide](docs/providers/uhp.md).
|
|
487
|
+
|
|
463
488
|
## Harness Execution Model
|
|
464
489
|
|
|
465
490
|
```text
|
|
@@ -495,11 +520,12 @@ superqode harness graph <run-id> --json
|
|
|
495
520
|
|
|
496
521
|
| Guide | What it covers |
|
|
497
522
|
| --- | --- |
|
|
498
|
-
| [Website](https://superqode.dev) | Product, Hub, A2A
|
|
523
|
+
| [Website](https://superqode.dev) | Product, Hub, A2A and UHP |
|
|
499
524
|
| [Quick Start](https://docs.superqode.dev/getting-started/quickstart/) | Install, connect, and run your first task |
|
|
500
525
|
| [Harness Hub](https://docs.superqode.dev/harness-hub/) | Browsing, filtering, and the published catalog |
|
|
501
|
-
| [Connection Methods](docs/concepts/modes.md) | Local, ACP, BYOK, SDK, MCP, and
|
|
526
|
+
| [Connection Methods](docs/concepts/modes.md) | Local, ACP, BYOK, SDK, MCP, A2A, and UHP routes |
|
|
502
527
|
| [A2A Agents](docs/providers/a2a.md) | Serving a harness over A2A, skills, API keys, and the Agent Card |
|
|
528
|
+
| [UHP](docs/providers/uhp.md) | Client connect/run, file upload, and native `serve uhp` (Core class) |
|
|
503
529
|
| [Developer Workflows](docs/developer-workflows.md) | The complete TUI and CLI command set |
|
|
504
530
|
| [Harness System](docs/advanced/harness-system.md) | HarnessSpec fields, runtimes, and policy |
|
|
505
531
|
| [Harness Protocol](docs/advanced/harness-protocol.md) | The versioned session and evidence contract |
|
|
@@ -288,6 +288,14 @@ can call it today:
|
|
|
288
288
|
superqode connect a2a --url https://a2a.superqode.dev
|
|
289
289
|
```
|
|
290
290
|
|
|
291
|
+
Or use the A2A project's official CLI ([`a2a`](https://github.com/a2aproject/a2a-cli)):
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
a2a card get -a https://a2a.superqode.dev
|
|
295
|
+
a2a send -a https://a2a.superqode.dev \
|
|
296
|
+
"Which harness should we shortlist for a Python monorepo?"
|
|
297
|
+
```
|
|
298
|
+
|
|
291
299
|
It scores 100% of MUST and 100% of MAY against the
|
|
292
300
|
[Technology Compatibility Kit](https://github.com/a2aproject/a2a-tck) the A2A
|
|
293
301
|
project maintains under the Linux Foundation, on the JSON-RPC and HTTP+JSON
|
|
@@ -309,6 +317,23 @@ superqode a2a-keys issue "Acme Corp" --tier one-off --days 30
|
|
|
309
317
|
|
|
310
318
|
Read the [A2A guide](docs/providers/a2a.md).
|
|
311
319
|
|
|
320
|
+
## Serve a Harness Over UHP
|
|
321
|
+
|
|
322
|
+
The same install that drives a remote UHP server can also expose a local
|
|
323
|
+
HarnessSpec so other UHP clients call SuperQode:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
superqode serve uhp --spec harness.yaml --port 8787
|
|
327
|
+
superqode connect uhp --base-url http://127.0.0.1:8787
|
|
328
|
+
superqode harness run uhp --prompt "summarise this repository"
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
`serve uhp` binds one HarnessSpec and advertises UHP Core. It is complementary
|
|
332
|
+
to HarnessRouter, which wraps third-party CLIs as a catalog. Core names the
|
|
333
|
+
surface SuperQode implements; it is not a conformance-suite certificate.
|
|
334
|
+
|
|
335
|
+
Read the [UHP guide](docs/providers/uhp.md).
|
|
336
|
+
|
|
312
337
|
## Harness Execution Model
|
|
313
338
|
|
|
314
339
|
```text
|
|
@@ -344,11 +369,12 @@ superqode harness graph <run-id> --json
|
|
|
344
369
|
|
|
345
370
|
| Guide | What it covers |
|
|
346
371
|
| --- | --- |
|
|
347
|
-
| [Website](https://superqode.dev) | Product, Hub, A2A
|
|
372
|
+
| [Website](https://superqode.dev) | Product, Hub, A2A and UHP |
|
|
348
373
|
| [Quick Start](https://docs.superqode.dev/getting-started/quickstart/) | Install, connect, and run your first task |
|
|
349
374
|
| [Harness Hub](https://docs.superqode.dev/harness-hub/) | Browsing, filtering, and the published catalog |
|
|
350
|
-
| [Connection Methods](docs/concepts/modes.md) | Local, ACP, BYOK, SDK, MCP, and
|
|
375
|
+
| [Connection Methods](docs/concepts/modes.md) | Local, ACP, BYOK, SDK, MCP, A2A, and UHP routes |
|
|
351
376
|
| [A2A Agents](docs/providers/a2a.md) | Serving a harness over A2A, skills, API keys, and the Agent Card |
|
|
377
|
+
| [UHP](docs/providers/uhp.md) | Client connect/run, file upload, and native `serve uhp` (Core class) |
|
|
352
378
|
| [Developer Workflows](docs/developer-workflows.md) | The complete TUI and CLI command set |
|
|
353
379
|
| [Harness System](docs/advanced/harness-system.md) | HarnessSpec fields, runtimes, and policy |
|
|
354
380
|
| [Harness Protocol](docs/advanced/harness-protocol.md) | The versioned session and evidence contract |
|
|
@@ -214,6 +214,7 @@ class A2AClient:
|
|
|
214
214
|
fallback = self.agent_url
|
|
215
215
|
|
|
216
216
|
self.inspect.auth(auth_summary(data))
|
|
217
|
+
self._record_card_review(data)
|
|
217
218
|
selected, skipped = _select_interface(interfaces, fallback)
|
|
218
219
|
listed = interfaces if isinstance(interfaces, list) else []
|
|
219
220
|
note = ""
|
|
@@ -237,6 +238,36 @@ class A2AClient:
|
|
|
237
238
|
)
|
|
238
239
|
return card, binding, version
|
|
239
240
|
|
|
241
|
+
def _record_card_review(self, data: dict) -> None:
|
|
242
|
+
"""Record A2ABreak card-review findings. Never treat JWS as auth."""
|
|
243
|
+
from superqode.a2a.trust import (
|
|
244
|
+
origin_is_allowed,
|
|
245
|
+
parse_origin_allowlist,
|
|
246
|
+
record_card_review,
|
|
247
|
+
resolve_jws_trust_root,
|
|
248
|
+
review_agent_card,
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
allowed = getattr(self, "allowed_origins", None)
|
|
252
|
+
if allowed is None:
|
|
253
|
+
allowed = parse_origin_allowlist()
|
|
254
|
+
trust_root = getattr(self, "jws_trust_root", None)
|
|
255
|
+
if trust_root is None:
|
|
256
|
+
trust_root = resolve_jws_trust_root()
|
|
257
|
+
review = review_agent_card(
|
|
258
|
+
data,
|
|
259
|
+
origin=self.agent_url,
|
|
260
|
+
allowed_origins=tuple(allowed or ()),
|
|
261
|
+
jws_trust_root=str(trust_root or ""),
|
|
262
|
+
)
|
|
263
|
+
self._card_review = review
|
|
264
|
+
record_card_review(self.inspect, review)
|
|
265
|
+
if tuple(allowed or ()) and not origin_is_allowed(self.agent_url, tuple(allowed)):
|
|
266
|
+
raise A2AClientError(
|
|
267
|
+
f"Origin is not on the A2A allowlist: {self.agent_url}",
|
|
268
|
+
inspect=self.inspect,
|
|
269
|
+
)
|
|
270
|
+
|
|
240
271
|
async def _ensure_interface(self) -> tuple[str, str, str]:
|
|
241
272
|
if self._interface_url is None or self._binding is None or self._protocol_version is None:
|
|
242
273
|
await self.get_agent_card()
|
|
@@ -84,6 +84,8 @@ async def run_a2a_conformance(
|
|
|
84
84
|
send: bool = True,
|
|
85
85
|
http_client=None,
|
|
86
86
|
timeout: float = 180.0,
|
|
87
|
+
allowed_origins: tuple[str, ...] = (),
|
|
88
|
+
jws_trust_root: str = "",
|
|
87
89
|
) -> A2AConformanceReport:
|
|
88
90
|
"""Run the four checks against ``settings.url``."""
|
|
89
91
|
from superqode.a2a.client import A2AClient, A2AClientError
|
|
@@ -105,6 +107,10 @@ async def run_a2a_conformance(
|
|
|
105
107
|
client_key=settings.key or None,
|
|
106
108
|
timeout=timeout,
|
|
107
109
|
) as client:
|
|
110
|
+
if allowed_origins:
|
|
111
|
+
client.allowed_origins = allowed_origins
|
|
112
|
+
if jws_trust_root:
|
|
113
|
+
client.jws_trust_root = jws_trust_root
|
|
108
114
|
try:
|
|
109
115
|
card = await client.get_agent_card()
|
|
110
116
|
except A2AClientError as exc:
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""Principal-bound A2A context ownership (A2ABreak).
|
|
2
|
+
|
|
3
|
+
The A2A spec lets a client supply ``contextId`` and does not bind it to a
|
|
4
|
+
caller. SuperQode binds each context to the caller principal (API key id,
|
|
5
|
+
operator, opaque ``X-SuperQode-Caller-Key``, or per-caller anonymous
|
|
6
|
+
isolation) and refuses cross-principal reuse.
|
|
7
|
+
|
|
8
|
+
This is not the SuperOptiX cookie model. SuperQode already has API keys and
|
|
9
|
+
an operator token. Anonymous callers can send an opaque caller key, otherwise
|
|
10
|
+
they are isolated by the same address identity used for rate limits.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from superqode.a2a.keys import ANONYMOUS_TIER, OPERATOR_TIER
|
|
18
|
+
from superqode.a2a.limits import caller_identity
|
|
19
|
+
|
|
20
|
+
#: Opaque per-caller key for anonymous isolation. Not a SuperOptiX cookie.
|
|
21
|
+
CALLER_HEADER = "x-superqode-caller-key"
|
|
22
|
+
|
|
23
|
+
CONTEXT_OWNERSHIP_MESSAGE = (
|
|
24
|
+
"This contextId is bound to another caller. The A2A spec does not "
|
|
25
|
+
"assign context ownership; SuperQode binds each context to the "
|
|
26
|
+
"caller that created it."
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ContextOwnershipError(Exception):
|
|
31
|
+
"""Client-supplied contextId belongs to a different principal."""
|
|
32
|
+
|
|
33
|
+
def __init__(self, context_id: str) -> None:
|
|
34
|
+
super().__init__(CONTEXT_OWNERSHIP_MESSAGE)
|
|
35
|
+
self.context_id = context_id
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SuperQodeA2AUser:
|
|
39
|
+
"""Caller principal presented to the official A2A task store.
|
|
40
|
+
|
|
41
|
+
``user_name`` is the owner key the SDK uses for List, Get, Cancel, and
|
|
42
|
+
Subscribe. Anonymous callers still receive a non-empty name so they are
|
|
43
|
+
not collapsed into one shared bucket.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, name: str, *, authenticated: bool) -> None:
|
|
47
|
+
self._name = name
|
|
48
|
+
self._authenticated = authenticated
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def is_authenticated(self) -> bool:
|
|
52
|
+
return self._authenticated
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def user_name(self) -> str:
|
|
56
|
+
return self._name
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ContextOwnerStore:
|
|
60
|
+
"""In-process map of contextId to the principal that claimed it."""
|
|
61
|
+
|
|
62
|
+
def __init__(self) -> None:
|
|
63
|
+
self._owners: dict[str, str] = {}
|
|
64
|
+
|
|
65
|
+
def owner_of(self, context_id: str) -> str | None:
|
|
66
|
+
return self._owners.get(context_id)
|
|
67
|
+
|
|
68
|
+
def claim(
|
|
69
|
+
self,
|
|
70
|
+
context_id: str,
|
|
71
|
+
principal: str,
|
|
72
|
+
*,
|
|
73
|
+
stored_owner: str | None = None,
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Bind ``context_id`` to ``principal``, or reject a cross-principal reuse."""
|
|
76
|
+
existing = self._owners.get(context_id) or (stored_owner or "").strip() or None
|
|
77
|
+
if existing:
|
|
78
|
+
self._owners[context_id] = existing
|
|
79
|
+
if existing != principal:
|
|
80
|
+
raise ContextOwnershipError(context_id)
|
|
81
|
+
return
|
|
82
|
+
self._owners[context_id] = principal
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def valid_caller_key(value: str) -> bool:
|
|
86
|
+
"""Accept a short opaque token, the same shape SuperOptiX uses on the header."""
|
|
87
|
+
if not value or not (8 <= len(value) <= 128):
|
|
88
|
+
return False
|
|
89
|
+
return all(char.isalnum() or char in "-_" for char in value)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def request_principal(decision: Any, request: Any) -> str:
|
|
93
|
+
"""Resolve the principal for an HTTP request after access is decided."""
|
|
94
|
+
tier = str(getattr(decision, "tier", "") or ANONYMOUS_TIER)
|
|
95
|
+
key_id = str(getattr(decision, "key_id", "") or "")
|
|
96
|
+
if tier == OPERATOR_TIER:
|
|
97
|
+
return "operator"
|
|
98
|
+
if key_id:
|
|
99
|
+
return f"key:{key_id}"
|
|
100
|
+
header = ""
|
|
101
|
+
try:
|
|
102
|
+
header = (request.headers.get(CALLER_HEADER) or "").strip()
|
|
103
|
+
except AttributeError:
|
|
104
|
+
header = ""
|
|
105
|
+
if valid_caller_key(header):
|
|
106
|
+
return f"caller:{header}"
|
|
107
|
+
host = getattr(getattr(request, "client", None), "host", None)
|
|
108
|
+
try:
|
|
109
|
+
forwarded = request.headers.get("x-forwarded-for")
|
|
110
|
+
except AttributeError:
|
|
111
|
+
forwarded = None
|
|
112
|
+
return caller_identity("", host, forwarded)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def caller_principal(context: Any) -> str:
|
|
116
|
+
"""Return the principal recorded on an executor call context."""
|
|
117
|
+
call_context = getattr(context, "call_context", None)
|
|
118
|
+
state = getattr(call_context, "state", None) or {}
|
|
119
|
+
identity = str(state.get("identity") or "").strip()
|
|
120
|
+
if identity:
|
|
121
|
+
return identity
|
|
122
|
+
user = getattr(call_context, "user", None)
|
|
123
|
+
user_name = str(getattr(user, "user_name", "") or "").strip()
|
|
124
|
+
if user_name:
|
|
125
|
+
return user_name
|
|
126
|
+
key_id = str(state.get("key_id") or "").strip()
|
|
127
|
+
if key_id:
|
|
128
|
+
return f"key:{key_id}"
|
|
129
|
+
tier = str(state.get("tier") or ANONYMOUS_TIER)
|
|
130
|
+
if tier == OPERATOR_TIER:
|
|
131
|
+
return "operator"
|
|
132
|
+
return "anonymous:unknown"
|
|
@@ -97,6 +97,10 @@ class InspectLog:
|
|
|
97
97
|
def auth(self, summary: str, **detail: Any) -> None:
|
|
98
98
|
self.add("auth", summary, **detail)
|
|
99
99
|
|
|
100
|
+
def trust(self, summary: str, **detail: Any) -> None:
|
|
101
|
+
"""One Agent Card protocol-risk finding (A2ABreak)."""
|
|
102
|
+
self.add("trust", summary, **detail)
|
|
103
|
+
|
|
100
104
|
def lines(self) -> list[str]:
|
|
101
105
|
return [event.summary for event in self.events]
|
|
102
106
|
|
|
@@ -22,8 +22,15 @@ if TYPE_CHECKING:
|
|
|
22
22
|
from superqode.agent.loop import AgentConfig
|
|
23
23
|
from superqode.harness import HarnessProtocolController, HarnessSessionRef, HarnessSpec
|
|
24
24
|
|
|
25
|
+
from superqode.a2a.context import (
|
|
26
|
+
ContextOwnershipError,
|
|
27
|
+
ContextOwnerStore,
|
|
28
|
+
SuperQodeA2AUser,
|
|
29
|
+
caller_principal,
|
|
30
|
+
request_principal,
|
|
31
|
+
)
|
|
25
32
|
from superqode.a2a.keys import ANONYMOUS_TIER, AccessDecision, decide_access
|
|
26
|
-
from superqode.a2a.limits import RateLimiter, RateLimitPolicy
|
|
33
|
+
from superqode.a2a.limits import RateLimiter, RateLimitPolicy
|
|
27
34
|
|
|
28
35
|
|
|
29
36
|
#: The version reported in the Agent Card.
|
|
@@ -121,7 +128,7 @@ class A2AServerConfig(BaseModel):
|
|
|
121
128
|
#: Must resolve. Host platforms render this in their agent gallery, and a
|
|
122
129
|
#: dead URL shows as a broken image rather than as no image.
|
|
123
130
|
#: ``scripts/check_published_agent_card.py`` verifies it.
|
|
124
|
-
icon_url: str = "https://
|
|
131
|
+
icon_url: str = "https://superqode.dev/assets/superqode.png"
|
|
125
132
|
jsonrpc_path: str = "/"
|
|
126
133
|
#: Also advertise and serve the A2A 0.3 wire format. Gemini Enterprise,
|
|
127
134
|
#: Foundry Agent Service, and Agent Registry all still accept 0.3 cards,
|
|
@@ -197,6 +204,7 @@ class SuperQodeA2AExecutor:
|
|
|
197
204
|
self.config = config
|
|
198
205
|
self._sessions: dict[str, HarnessSessionRef] = {}
|
|
199
206
|
self._task_sessions: dict[str, HarnessSessionRef] = {}
|
|
207
|
+
self._owners = ContextOwnerStore()
|
|
200
208
|
self._session_lock = asyncio.Lock()
|
|
201
209
|
|
|
202
210
|
async def execute(self, context: Any, event_queue: Any) -> None:
|
|
@@ -216,6 +224,17 @@ class SuperQodeA2AExecutor:
|
|
|
216
224
|
await updater.start_work()
|
|
217
225
|
|
|
218
226
|
user_input = context.get_user_input()
|
|
227
|
+
principal = caller_principal(context)
|
|
228
|
+
try:
|
|
229
|
+
self._owners.claim(
|
|
230
|
+
context_id,
|
|
231
|
+
principal,
|
|
232
|
+
stored_owner=self._stored_owner(context_id),
|
|
233
|
+
)
|
|
234
|
+
except ContextOwnershipError as exc:
|
|
235
|
+
await updater.failed(updater.new_agent_message([sdk["Part"](text=str(exc))]))
|
|
236
|
+
return
|
|
237
|
+
|
|
219
238
|
if self._wants_shortlist(context, user_input):
|
|
220
239
|
await self._answer_shortlist(
|
|
221
240
|
updater,
|
|
@@ -246,7 +265,11 @@ class SuperQodeA2AExecutor:
|
|
|
246
265
|
)
|
|
247
266
|
return
|
|
248
267
|
|
|
249
|
-
|
|
268
|
+
try:
|
|
269
|
+
session = await self._session_for(context_id, principal)
|
|
270
|
+
except ContextOwnershipError as exc:
|
|
271
|
+
await updater.failed(updater.new_agent_message([sdk["Part"](text=str(exc))]))
|
|
272
|
+
return
|
|
250
273
|
self._task_sessions[task_id] = session
|
|
251
274
|
artifact_id = f"superqode-{task_id}"
|
|
252
275
|
content: list[str] = []
|
|
@@ -418,6 +441,10 @@ class SuperQodeA2AExecutor:
|
|
|
418
441
|
sdk = _a2a_sdk()
|
|
419
442
|
task_id = _required_id(context.task_id, "task")
|
|
420
443
|
context_id = _required_id(context.context_id, "context")
|
|
444
|
+
principal = caller_principal(context)
|
|
445
|
+
owner = self._owners.owner_of(context_id) or self._stored_owner(context_id)
|
|
446
|
+
if owner and owner != principal:
|
|
447
|
+
return
|
|
421
448
|
session = self._task_sessions.get(task_id)
|
|
422
449
|
if session is not None:
|
|
423
450
|
try:
|
|
@@ -428,7 +455,14 @@ class SuperQodeA2AExecutor:
|
|
|
428
455
|
pass
|
|
429
456
|
await sdk["TaskUpdater"](event_queue, task_id, context_id).cancel()
|
|
430
457
|
|
|
431
|
-
|
|
458
|
+
def _stored_owner(self, context_id: str) -> str | None:
|
|
459
|
+
record = self.controller.store.get_session(f"a2a-{context_id}")
|
|
460
|
+
if record is None:
|
|
461
|
+
return None
|
|
462
|
+
owner = str((record.metadata or {}).get("a2a_owner") or "").strip()
|
|
463
|
+
return owner or None
|
|
464
|
+
|
|
465
|
+
async def _session_for(self, context_id: str, principal: str) -> HarnessSessionRef:
|
|
432
466
|
from superqode.harness import HarnessCreateRequest
|
|
433
467
|
|
|
434
468
|
async with self._session_lock:
|
|
@@ -437,7 +471,11 @@ class SuperQodeA2AExecutor:
|
|
|
437
471
|
return cached
|
|
438
472
|
|
|
439
473
|
session_id = f"a2a-{context_id}"
|
|
440
|
-
|
|
474
|
+
stored = self.controller.store.get_session(session_id)
|
|
475
|
+
if stored is not None:
|
|
476
|
+
stored_owner = str((stored.metadata or {}).get("a2a_owner") or "").strip()
|
|
477
|
+
if stored_owner and stored_owner != principal:
|
|
478
|
+
raise ContextOwnershipError(context_id)
|
|
441
479
|
session = await self.controller.resume(session_id)
|
|
442
480
|
else:
|
|
443
481
|
descriptor = self.controller.descriptors()[0]
|
|
@@ -448,7 +486,11 @@ class SuperQodeA2AExecutor:
|
|
|
448
486
|
model=self.config.model,
|
|
449
487
|
working_directory=self.config.working_directory.resolve(),
|
|
450
488
|
session_id=session_id,
|
|
451
|
-
metadata={
|
|
489
|
+
metadata={
|
|
490
|
+
"transport": "a2a",
|
|
491
|
+
"a2a_context_id": context_id,
|
|
492
|
+
"a2a_owner": principal,
|
|
493
|
+
},
|
|
452
494
|
)
|
|
453
495
|
)
|
|
454
496
|
self._sessions[context_id] = session
|
|
@@ -600,11 +642,7 @@ class A2AServer:
|
|
|
600
642
|
content={"detail": f"Unauthorized: {decision.reason}"},
|
|
601
643
|
headers={"WWW-Authenticate": "Bearer"},
|
|
602
644
|
)
|
|
603
|
-
identity =
|
|
604
|
-
decision.key_id,
|
|
605
|
-
getattr(getattr(request, "client", None), "host", None),
|
|
606
|
-
request.headers.get("x-forwarded-for"),
|
|
607
|
-
)
|
|
645
|
+
identity = request_principal(decision, request)
|
|
608
646
|
limit = limiter.check(identity, decision.tier)
|
|
609
647
|
if not limit.allowed:
|
|
610
648
|
return sdk["JSONResponse"](
|
|
@@ -616,6 +654,7 @@ class A2AServer:
|
|
|
616
654
|
# Carried on the scope so the call-context builder, and through it
|
|
617
655
|
# the executor, can see which tier is asking.
|
|
618
656
|
request.state.superqode_access = decision
|
|
657
|
+
request.state.superqode_identity = identity
|
|
619
658
|
return await call_next(request)
|
|
620
659
|
|
|
621
660
|
if self._task_engine is not None:
|
|
@@ -879,8 +918,17 @@ def _AccessContextBuilder(sdk: dict[str, Any]) -> Any:
|
|
|
879
918
|
def build(self, request: Any) -> Any:
|
|
880
919
|
context = super().build(request)
|
|
881
920
|
decision = getattr(request.state, "superqode_access", None)
|
|
921
|
+
identity = str(getattr(request.state, "superqode_identity", "") or "").strip()
|
|
882
922
|
if isinstance(decision, AccessDecision):
|
|
883
923
|
context.state.update(decision.to_state())
|
|
924
|
+
if not identity and isinstance(decision, AccessDecision):
|
|
925
|
+
identity = request_principal(decision, request)
|
|
926
|
+
if identity:
|
|
927
|
+
context.state["identity"] = identity
|
|
928
|
+
authenticated = bool(
|
|
929
|
+
isinstance(decision, AccessDecision) and not decision.anonymous
|
|
930
|
+
)
|
|
931
|
+
context.user = SuperQodeA2AUser(identity, authenticated=authenticated)
|
|
884
932
|
return context
|
|
885
933
|
|
|
886
934
|
return _Builder()
|