alysis-code 0.13.7__tar.gz → 0.13.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {alysis_code-0.13.7 → alysis_code-0.13.8}/PKG-INFO +9 -3
- {alysis_code-0.13.7 → alysis_code-0.13.8}/README.md +8 -2
- {alysis_code-0.13.7 → alysis_code-0.13.8}/docs/CHANGELOG.md +39 -1
- {alysis_code-0.13.7 → alysis_code-0.13.8}/pyproject.toml +1 -1
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/__init__.py +1 -1
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/prompt_context.py +3 -11
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/session.py +12 -6
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/steering.py +66 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/tools_assembly.py +34 -7
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/core.py +66 -3
- alysis_code-0.13.8/src/alysis_code/cancellation.py +202 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/__init__.py +0 -12
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/commands.py +110 -221
- alysis_code-0.13.8/src/alysis_code/cli_impl/chat/forge_visibility.py +35 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/loop.py +383 -613
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +39 -8
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/rendering.py +5 -63
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat/state.py +3 -9
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat_resume.py +21 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/chat_slash_completer.py +9 -6
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_state.py +2 -9
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_status.py +48 -101
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_terminal.py +1 -30
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/cli_common.py +6 -32
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -18
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/prompt_helpers.py +7 -30
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/startup.py +5 -19
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/welcome.py +19 -30
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/app.py +781 -231
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/footer.py +11 -3
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/state.py +14 -19
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/surface.py +39 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/tool_output_offload.py +8 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/config.py +1 -2
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/feedback_report.py +262 -31
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/host_browser.py +24 -1
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/openai_compat.py +25 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/personas.py +1 -1
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/events.py +7 -7
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/rich_surface.py +2 -13
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/git.py +114 -6
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/registry.py +27 -4
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_command_analysis.py +49 -0
- alysis_code-0.13.7/src/alysis_code/cancellation.py +0 -53
- alysis_code-0.13.7/src/alysis_code/interactive_plan_mode.py +0 -26
- alysis_code-0.13.7/src/alysis_code/plan_mode.py +0 -393
- {alysis_code-0.13.7 → alysis_code-0.13.8}/.gitignore +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/LICENSE +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/NOTICE +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/__main__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/_build_info.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/account_login.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/acceptance_contract.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/blast_radius.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/cache_keepalive.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/completion_certificate.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/completion_gate.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/empty_response_stall.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/errors.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/llm_calls.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/mutation_classification.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/read_ledger.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/regression_baseline.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/reproduction_first.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/sensitive_output.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/subagent_execution.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/subagent_workspace.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/events.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/exploration.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/interventions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/read_cache.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn/snapshot.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn_contract.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/turn_path.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/verification.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/verification_commands.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent/verification_evidence.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_loop.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/base.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/builtins.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/host.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/registry.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/agent_runtimes/service.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/alysis_cloud.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/approval_scope.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/asset_read_core.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/budget_allocator.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/comprehender.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/index.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/ingestion.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/legacy_migration.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/models.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/ocr.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/owl/show-owl.sh +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/paths.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/plan_binding.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/planner_context.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/planner_tools.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/prompts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/replanner_context.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/surface.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/untrusted_content.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/usage_logger.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/worker_mirror.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/worker_section.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/assets/worker_tools.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/atomic_io.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/auth_diagnostics.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/background_runner.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/branding.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/budget_policy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/build_identity.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/builtin_hooks/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/bwrap_etc.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/capabilities.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/assets_cli.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/assets_modal.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/auth.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/config.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/forge.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/profile.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/report.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/root.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/server.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/skills.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/tools.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/commands/update.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/config_menu.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/forge.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/config.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/config_flow.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/content.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/owl.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/tips.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/clipboard.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/code_review.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/conversation_compactor.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/importance.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/compaction/settings.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/conflict_auto_resolver.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/context/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/crash_diagnostics.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/discovery.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/runtime.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/session.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/custom_tools/trust.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/diff_paths.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/direction_change.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/dispatch_timing.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/durable_service_manager.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/edit_discipline.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/error_text.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_budget.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_context.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_deadline.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/execution_shared.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/activation.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/install.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/manifest.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/models.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/paths.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/registry.json +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/registry.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/state.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/extensions/workspace_trust.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/failed_task_evidence.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/failure_category.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/file_classification.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/forge.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/forge_completion.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/forge_events.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/frontmatter_utils.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_evidence.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_ops.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_safe.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/git_worktrees.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/audit.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/config.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/dispatcher.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/models.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/hooks/trust.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/host_actions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/activity_events.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/approvals.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/artifacts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/change_ledger.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/context_blocks.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/event_stream.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/forge_protocol.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/forge_request_ledger.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/health.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/managed_browser.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/management_protocol.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/prompt_queue.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/protocol.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/resumable_swarm.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/session_search.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/stdio_bridge.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/structured_state.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/ide/swarm_protocol.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/integration_gate.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/interactive_input_guard.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/internal_artifacts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/knowledge_base.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/knowledge_capture.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/knowledge_librarian.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/language_policy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/litellm_static_provider.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/anthropic_messages.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/base.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/cache_capabilities.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/cache_control_blocks.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/cache_policy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/factory.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/gemini_generate_content.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/gemini_interactions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/metadata.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/openai_responses.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/protocols.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/provider_limits.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/request_plan.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/request_shape.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/streaming.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/temperature_compat.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/types.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm/usage_normalization.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/llm_error_display.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/logging_redaction.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/managed_host_deadline.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/client.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/config.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/errors.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/forge_scope.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/jsonrpc.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/manager.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/models.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/oauth.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/oauth_runtime.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/oauth_store.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/prompts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/resources.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/roots.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/server_requests.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/token_store.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/transport_http.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/transport_stdio.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/mcp/untrusted_content.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/merge_conflict_reviewer.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_metadata_policy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_metadata_utils.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_registry.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/model_router.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/permission_policy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/pipeline_facts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_assistant.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_reconciliation.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_repair.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/plan_validation.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/planning_constraints.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/policy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/preview_server.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/process_reaping.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/profile_presets.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/profiles.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/base.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/openai_codex.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/registry.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_auth/store.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_diagnostics.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_model_catalog.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_telemetry.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/provider_url.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/reasoning_contracts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/remote_sync.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/replanning.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/repo_scan.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/request_estimation.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/review_gate.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_lock.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_outcome.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_provenance.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/run_state.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/runtime_artifacts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/runtime_context_features.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/runtime_kind.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/mcp_sanitize.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/safe_http.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/safety/subagent_report.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/sandbox_doctor.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/sandbox_runner.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/sandbox_settings.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/serialized_paths.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/app.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/auth.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/job_config.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/settings.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/store.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/server/worker_runner.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/service_persistence.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/session_artifacts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/session_metrics.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/session_store.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/conventions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/discovery.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/eval_models.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/eval_runner.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/evals.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/install.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/loader.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/matching.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/models.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/paths.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/prompting.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/scaffold.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/selection.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/state.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/transactions.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/skills/validation.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/step_budget.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/subagent_labels.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/subagents.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/base.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/console.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/hidden_surface.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/noop_surface.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/styles.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/theme.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/surface/types.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_backend.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_orchestrator.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_scheduler.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_trace.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_worker.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/swarm_write_guard.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/task_dependencies.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/task_readiness.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/task_scope.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/terminal_manager.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/terminal_ownership.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/text_normalization.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/token_budget.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/README.md +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/__init__.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/artifacts.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/availability.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/fs.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/history.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/http_timeout.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/image_generation.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/repo_map.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/search.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/shell.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/symbols.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/test_discovery.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_dashscope.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_ddgs.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/tools/web_search_tavily.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/transport_retry.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/updates.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/usage_tracker.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_contract.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_failure_summary.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verification_repair.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/verify_gate.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/web_research.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/web_search_adapters.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/web_search_policy.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_binding.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_binding_ui.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_context.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_isolation.py +0 -0
- {alysis_code-0.13.7 → alysis_code-0.13.8}/src/alysis_code/workspace_provisioning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alysis-code
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.8
|
|
4
4
|
Summary: Open-source coding agent for hosted and local models.
|
|
5
5
|
Project-URL: Changelog, https://github.com/AlysisAi/alysis-code/blob/main/docs/CHANGELOG.md
|
|
6
6
|
Project-URL: Documentation, https://github.com/AlysisAi/alysis-code/tree/main/docs
|
|
@@ -152,8 +152,10 @@ sandbox only when explicitly configured with `verify_sandbox.mode="off"` or
|
|
|
152
152
|
|
|
153
153
|
Two layers control what the agent may do — one enforces, one focuses.
|
|
154
154
|
|
|
155
|
-
**Execution modes** are the enforcement layer. Choose one per command with `--mode`,
|
|
156
|
-
with `/
|
|
155
|
+
**Execution modes** are the enforcement layer. Choose one per command with `--mode`, select the
|
|
156
|
+
next message's permissions with `/permissions` or **Shift+Tab**, or set a default with
|
|
157
|
+
`alysis-code config set default_mode <mode>`. A selection leaves the active turn's permissions
|
|
158
|
+
unchanged until the next message starts:
|
|
157
159
|
|
|
158
160
|
| Mode | Behavior |
|
|
159
161
|
| --- | --- |
|
|
@@ -176,6 +178,10 @@ A persona is a convention, never a permission: it can keep or lower your executi
|
|
|
176
178
|
never raise it. Define your own in `.alysis_personas/*.md`.
|
|
177
179
|
[Learn more](https://alysiscode.com/docs/concepts/personas)
|
|
178
180
|
|
|
181
|
+
Use `/persona architect` for planning in chat, or `/forge` for a plan-driven execution workflow.
|
|
182
|
+
The legacy chat Plan Mode and its `/plan` commands have been removed; Forge retains its plan views
|
|
183
|
+
and editor. Persona changes made during a running turn apply after that turn finishes.
|
|
184
|
+
|
|
179
185
|
## Project Links
|
|
180
186
|
|
|
181
187
|
- [Website](https://alysiscode.com/)
|
|
@@ -93,8 +93,10 @@ sandbox only when explicitly configured with `verify_sandbox.mode="off"` or
|
|
|
93
93
|
|
|
94
94
|
Two layers control what the agent may do — one enforces, one focuses.
|
|
95
95
|
|
|
96
|
-
**Execution modes** are the enforcement layer. Choose one per command with `--mode`,
|
|
97
|
-
with `/
|
|
96
|
+
**Execution modes** are the enforcement layer. Choose one per command with `--mode`, select the
|
|
97
|
+
next message's permissions with `/permissions` or **Shift+Tab**, or set a default with
|
|
98
|
+
`alysis-code config set default_mode <mode>`. A selection leaves the active turn's permissions
|
|
99
|
+
unchanged until the next message starts:
|
|
98
100
|
|
|
99
101
|
| Mode | Behavior |
|
|
100
102
|
| --- | --- |
|
|
@@ -117,6 +119,10 @@ A persona is a convention, never a permission: it can keep or lower your executi
|
|
|
117
119
|
never raise it. Define your own in `.alysis_personas/*.md`.
|
|
118
120
|
[Learn more](https://alysiscode.com/docs/concepts/personas)
|
|
119
121
|
|
|
122
|
+
Use `/persona architect` for planning in chat, or `/forge` for a plan-driven execution workflow.
|
|
123
|
+
The legacy chat Plan Mode and its `/plan` commands have been removed; Forge retains its plan views
|
|
124
|
+
and editor. Persona changes made during a running turn apply after that turn finishes.
|
|
125
|
+
|
|
120
126
|
## Project Links
|
|
121
127
|
|
|
122
128
|
- [Website](https://alysiscode.com/)
|
|
@@ -8,6 +8,43 @@ Notable user-facing changes to Alysis Code are recorded here. This project follo
|
|
|
8
8
|
|
|
9
9
|
No user-facing changes yet.
|
|
10
10
|
|
|
11
|
+
## [0.13.8] - 2026-09-16
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Remove legacy chat Plan Mode, its draft/approve flow, and its prompts and toolbar
|
|
16
|
+
state. Use the Architect persona for planning in chat; Forge retains its plan views
|
|
17
|
+
and editor.
|
|
18
|
+
- Replace `/mode` with `/permissions`. Permission selections and Shift+Tab apply to
|
|
19
|
+
the next user message, with the pending choice visible beside the active permissions.
|
|
20
|
+
- Apply persona changes and approved persona-switch proposals only after the active
|
|
21
|
+
turn finishes. Preserve pending permission selections when resuming a conversation.
|
|
22
|
+
- Show pending steering messages and queued follow-ups. Shift+Left recalls the newest
|
|
23
|
+
queued message for editing. Interruptions preserve undelivered work and wait for the
|
|
24
|
+
current worker to finish before another turn starts.
|
|
25
|
+
- Read large Git diffs in complete pages with a content identifier that detects
|
|
26
|
+
changes between pages. The agent can select a path or inspect staged changes.
|
|
27
|
+
- Allow a background-process wait of up to 900 seconds, bounded by the remaining
|
|
28
|
+
run budget and returning early when its requested condition is met.
|
|
29
|
+
- Explain how to correct rejected verification commands, including how to use the
|
|
30
|
+
session's configured verification contract.
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- Keep plain assistant replies in conversation history so follow-up requests retain
|
|
35
|
+
the previous answer even when the provider returns no extra metadata.
|
|
36
|
+
- Redact credential fields inside nested JSON, tool arguments, feedback text, and
|
|
37
|
+
support bundles. Omit data that exceeds the safe redaction depth and non-UTF-8
|
|
38
|
+
diagnostic artifacts that cannot be sanitized reliably.
|
|
39
|
+
- Clean up incomplete support bundles after cancellation or I/O errors, support long
|
|
40
|
+
Windows export paths, and open report drafts without disrupting terminal output.
|
|
41
|
+
- Inspect Git changes without running configured diff programs, text converters,
|
|
42
|
+
filesystem monitors, or content filters. Worktree reads that require content
|
|
43
|
+
filters or submodule helpers return guidance for an approved shell command;
|
|
44
|
+
staged diffs and unaffected scoped paths remain available.
|
|
45
|
+
- Preserve hosted-account explanations for rolling usage limits, concurrent requests,
|
|
46
|
+
reserved credits, and temporary routing or capacity problems.
|
|
47
|
+
|
|
11
48
|
## [0.13.7] - 2026-09-11
|
|
12
49
|
|
|
13
50
|
### Added
|
|
@@ -271,7 +308,8 @@ Public launch and repository-layout refresh.
|
|
|
271
308
|
Release notes for versions before 0.9.8 remain available in the
|
|
272
309
|
[GitHub Releases archive](https://github.com/AlysisAi/alysis-code/releases).
|
|
273
310
|
|
|
274
|
-
[Unreleased]: https://github.com/AlysisAi/alysis-code/compare/v0.13.
|
|
311
|
+
[Unreleased]: https://github.com/AlysisAi/alysis-code/compare/v0.13.8...HEAD
|
|
312
|
+
[0.13.8]: https://github.com/AlysisAi/alysis-code/compare/v0.13.7...v0.13.8
|
|
275
313
|
[0.13.7]: https://github.com/AlysisAi/alysis-code/compare/v0.13.6.2...v0.13.7
|
|
276
314
|
[0.13.6.2]: https://github.com/AlysisAi/alysis-code/compare/v0.13.6.1...v0.13.6.2
|
|
277
315
|
[0.13.6.1]: https://github.com/AlysisAi/alysis-code/compare/v0.13.6...v0.13.6.1
|
|
@@ -22,7 +22,6 @@ from ..extensions.activation import (
|
|
|
22
22
|
from ..extensions.models import normalize_extension_id, plugin_slug_from_id
|
|
23
23
|
from ..extensions.state import load_global_state, load_project_state
|
|
24
24
|
from ..personas import DEFAULT_PERSONA, normalize_persona, persona_modes_enabled
|
|
25
|
-
from ..plan_mode import extract_approved_plan_user_message
|
|
26
25
|
from ..repo_scan import (
|
|
27
26
|
_MANIFEST_SPECS,
|
|
28
27
|
_README_NAMES,
|
|
@@ -1460,10 +1459,7 @@ def _build_repo_task_brief_message(
|
|
|
1460
1459
|
}:
|
|
1461
1460
|
return None
|
|
1462
1461
|
|
|
1463
|
-
clean = (
|
|
1464
|
-
extract_approved_plan_user_message(pending_instruction)
|
|
1465
|
-
or str(pending_instruction or "").strip()
|
|
1466
|
-
)
|
|
1462
|
+
clean = str(pending_instruction or "").strip()
|
|
1467
1463
|
if not clean or _is_host_managed_user_context_message(clean):
|
|
1468
1464
|
return None
|
|
1469
1465
|
if clean[:1] in {"/", ":"} and "\n" not in clean:
|
|
@@ -1828,11 +1824,10 @@ def refresh_session_task_brief_from_observed_turn(
|
|
|
1828
1824
|
return False
|
|
1829
1825
|
messages_obj, existing_index, current_content, inserted_placeholder = ensured
|
|
1830
1826
|
|
|
1831
|
-
|
|
1832
|
-
if not approved_plan_message and material_edit_count <= 0:
|
|
1827
|
+
if material_edit_count <= 0:
|
|
1833
1828
|
return inserted_placeholder
|
|
1834
1829
|
|
|
1835
|
-
clean =
|
|
1830
|
+
clean = str(instruction or "").strip()
|
|
1836
1831
|
if not clean or _is_host_managed_user_context_message(clean):
|
|
1837
1832
|
return inserted_placeholder
|
|
1838
1833
|
if clean[:1] in {"/", ":"} and "\n" not in clean:
|
|
@@ -2090,9 +2085,6 @@ def _build_user_message(
|
|
|
2090
2085
|
image_paths: list[str] | None,
|
|
2091
2086
|
) -> tuple[dict[str, Any], dict[str, Any]]:
|
|
2092
2087
|
log_payload: dict[str, Any] = {"content": instruction}
|
|
2093
|
-
display_content = extract_approved_plan_user_message(instruction)
|
|
2094
|
-
if display_content and display_content != instruction:
|
|
2095
|
-
log_payload["display_content"] = display_content
|
|
2096
2088
|
if not image_paths:
|
|
2097
2089
|
return {"role": "user", "content": instruction}, log_payload
|
|
2098
2090
|
|
|
@@ -552,7 +552,7 @@ class AgentSession:
|
|
|
552
552
|
persona: str = "code"
|
|
553
553
|
# The user's chosen execution mode remembered while a narrowing persona
|
|
554
554
|
# (architect/ask) is active, so switching back to code/debug restores it.
|
|
555
|
-
# None when the active persona narrows nothing. An explicit /
|
|
555
|
+
# None when the active persona narrows nothing. An explicit /permissions <exec>
|
|
556
556
|
# always wins and clears the restore point (and restores the write scope).
|
|
557
557
|
persona_restore_mode: str | None = None
|
|
558
558
|
# The user's base allow_write_globs snapshotted alongside
|
|
@@ -1292,15 +1292,21 @@ class AgentSession:
|
|
|
1292
1292
|
)
|
|
1293
1293
|
if rewrite_payload is not None:
|
|
1294
1294
|
self.store.append("final_summary_rewrite", rewrite_payload)
|
|
1295
|
-
|
|
1295
|
+
# Keep ordinary text replies in history so follow-up requests retain the
|
|
1296
|
+
# assistant turn even when the provider supplies no opaque metadata.
|
|
1297
|
+
assistant_message = (
|
|
1298
|
+
None if internal_fallback else {"role": "assistant", "content": emitted_text}
|
|
1299
|
+
)
|
|
1296
1300
|
if assistant_response is not None:
|
|
1297
|
-
|
|
1301
|
+
assistant_message = assistant_message_from_response(
|
|
1298
1302
|
assistant_response,
|
|
1299
1303
|
content=emitted_text,
|
|
1300
1304
|
)
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1305
|
+
extra_payload = (
|
|
1306
|
+
{"message": assistant_message}
|
|
1307
|
+
if assistant_message is not None and PROVIDER_METADATA_KEY in assistant_message
|
|
1308
|
+
else None
|
|
1309
|
+
)
|
|
1304
1310
|
if internal_fallback and self.subagent_depth > 0:
|
|
1305
1311
|
# A nested run's locally generated stop report is internal state. The
|
|
1306
1312
|
# nested surface forwards assistant messages up to the parent's panel,
|
|
@@ -15,13 +15,64 @@ steps, and must persist across resume.
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
from collections import deque
|
|
18
|
+
from dataclasses import dataclass
|
|
18
19
|
from threading import Event, RLock
|
|
20
|
+
from typing import Any
|
|
19
21
|
|
|
20
22
|
MAX_STEER_MESSAGE_CHARS = 4000
|
|
21
23
|
MAX_PENDING_STEER_MESSAGES = 16
|
|
24
|
+
MAX_PENDING_OPS = 16
|
|
22
25
|
_TRUNCATION_MARKER = " [truncated]"
|
|
23
26
|
|
|
24
27
|
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class ResolvedOperation:
|
|
30
|
+
"""A validated operation that is safe for worker-thread application."""
|
|
31
|
+
|
|
32
|
+
kind: str
|
|
33
|
+
payload: Any
|
|
34
|
+
display_label: str
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class OpsInbox:
|
|
38
|
+
"""Bounded, thread-safe FIFO for resolved mid-turn operations."""
|
|
39
|
+
|
|
40
|
+
__slots__ = ("_lock", "_operations")
|
|
41
|
+
|
|
42
|
+
def __init__(self) -> None:
|
|
43
|
+
self._lock = RLock()
|
|
44
|
+
self._operations: deque[ResolvedOperation] = deque()
|
|
45
|
+
|
|
46
|
+
def send(self, operation: ResolvedOperation) -> bool:
|
|
47
|
+
"""Queue ``operation`` or return False when the inbox is full."""
|
|
48
|
+
if not isinstance(operation, ResolvedOperation):
|
|
49
|
+
raise TypeError("operation must be a ResolvedOperation")
|
|
50
|
+
with self._lock:
|
|
51
|
+
if len(self._operations) >= MAX_PENDING_OPS:
|
|
52
|
+
return False
|
|
53
|
+
self._operations.append(operation)
|
|
54
|
+
return True
|
|
55
|
+
|
|
56
|
+
def drain(self) -> list[ResolvedOperation]:
|
|
57
|
+
"""Remove and return all pending operations, oldest first."""
|
|
58
|
+
with self._lock:
|
|
59
|
+
if not self._operations:
|
|
60
|
+
return []
|
|
61
|
+
operations = list(self._operations)
|
|
62
|
+
self._operations.clear()
|
|
63
|
+
return operations
|
|
64
|
+
|
|
65
|
+
def snapshot(self) -> list[ResolvedOperation]:
|
|
66
|
+
"""Return pending operations in FIFO order without removing them."""
|
|
67
|
+
with self._lock:
|
|
68
|
+
return list(self._operations)
|
|
69
|
+
|
|
70
|
+
def pending_count(self) -> int:
|
|
71
|
+
"""Return the number of operations waiting for application."""
|
|
72
|
+
with self._lock:
|
|
73
|
+
return len(self._operations)
|
|
74
|
+
|
|
75
|
+
|
|
25
76
|
def _normalize_steer_message(message: str) -> str:
|
|
26
77
|
normalized = str(message or "").strip()
|
|
27
78
|
if not normalized:
|
|
@@ -160,6 +211,21 @@ def wait_signal_digest(signals: list[dict[str, str]]) -> dict[str, object]:
|
|
|
160
211
|
}
|
|
161
212
|
|
|
162
213
|
|
|
214
|
+
def ops_inbox_for(session: object, *, create: bool = False) -> OpsInbox | None:
|
|
215
|
+
"""Return a session's ops inbox, optionally attaching one as an attribute."""
|
|
216
|
+
existing = getattr(session, "ops_inbox", None)
|
|
217
|
+
if isinstance(existing, OpsInbox):
|
|
218
|
+
return existing
|
|
219
|
+
if not create:
|
|
220
|
+
return None
|
|
221
|
+
inbox = OpsInbox()
|
|
222
|
+
try:
|
|
223
|
+
session.ops_inbox = inbox # type: ignore[attr-defined]
|
|
224
|
+
except Exception: # noqa: BLE001 - frozen or slotted sessions opt out
|
|
225
|
+
return None
|
|
226
|
+
return inbox
|
|
227
|
+
|
|
228
|
+
|
|
163
229
|
def steer_inbox_for(session: object, *, create: bool = False) -> SteerInbox | None:
|
|
164
230
|
"""Return a session's inbox, optionally attaching one as a plain attribute."""
|
|
165
231
|
existing = getattr(session, "steer_inbox", None)
|
|
@@ -154,6 +154,7 @@ from ..usage_tracker import UsageSummary
|
|
|
154
154
|
from ..verification_command_analysis import (
|
|
155
155
|
VerificationCommandEvidentiaryCapability,
|
|
156
156
|
analyze_verification_command,
|
|
157
|
+
verification_rejection_guidance,
|
|
157
158
|
)
|
|
158
159
|
from ..verify_gate import (
|
|
159
160
|
ResolvedVerifyCommands,
|
|
@@ -696,6 +697,11 @@ _READONLY_MAIN_SESSION_BUILTIN_TOOL_NAMES = frozenset(
|
|
|
696
697
|
_READONLY_TOP_LEVEL_WEB_TOOL_NAMES = frozenset({"web_fetch", "web_search"})
|
|
697
698
|
|
|
698
699
|
|
|
700
|
+
# Long builds can wait once instead of forcing repeated model calls. The wait
|
|
701
|
+
# still returns on completion, responds to cancellation, and is clamped to the
|
|
702
|
+
# remaining run budget by _clamp_shell_wait_seconds.
|
|
703
|
+
_MAX_SHELL_WAIT_SECONDS = 900.0
|
|
704
|
+
|
|
699
705
|
# Out-of-band channel for handing the turn's cancellation token to the shell
|
|
700
706
|
# wait path, mirroring _SUBAGENT_CANCELLATION_TOKEN_ARG. The key is an object()
|
|
701
707
|
# rather than a string so it can never collide with a model-supplied argument,
|
|
@@ -3076,6 +3082,15 @@ def build_tools(
|
|
|
3076
3082
|
)
|
|
3077
3083
|
trusted_shell_commands = trusted_shell_expression_command_set(current_selection)
|
|
3078
3084
|
|
|
3085
|
+
def _invalid_command_message(reason: str) -> str:
|
|
3086
|
+
# Keep the machine-readable reason token (anything parsing the error
|
|
3087
|
+
# still works) and append the concrete fix, so a rejection reads as
|
|
3088
|
+
# "here is how to make this a usable check" rather than as a test
|
|
3089
|
+
# failure the model tries to "repair" by rewriting working code.
|
|
3090
|
+
guidance = verification_rejection_guidance(reason)
|
|
3091
|
+
base = "verification command is invalid: " + reason
|
|
3092
|
+
return f"{base} -- {guidance}" if guidance else base
|
|
3093
|
+
|
|
3079
3094
|
def _validate_explicit_verify_candidate(command: str) -> None:
|
|
3080
3095
|
normalized_exact = " ".join(str(command or "").strip().split())
|
|
3081
3096
|
trusted = normalized_exact in trusted_shell_commands
|
|
@@ -3085,9 +3100,9 @@ def build_tools(
|
|
|
3085
3100
|
workspace_root=root,
|
|
3086
3101
|
)
|
|
3087
3102
|
if analysis.rejection_reason:
|
|
3088
|
-
raise VerifyError(
|
|
3103
|
+
raise VerifyError(_invalid_command_message(analysis.rejection_reason))
|
|
3089
3104
|
if _has_disallowed_shell_control_flow(command) and not trusted:
|
|
3090
|
-
raise VerifyError("
|
|
3105
|
+
raise VerifyError(_invalid_command_message("disallowed_shell_control_flow"))
|
|
3091
3106
|
|
|
3092
3107
|
selection_metadata = verification_selection_payload(
|
|
3093
3108
|
current_selection
|
|
@@ -3144,7 +3159,11 @@ def build_tools(
|
|
|
3144
3159
|
)
|
|
3145
3160
|
if incompatible_commands:
|
|
3146
3161
|
raise VerifyError(
|
|
3147
|
-
"verify_run commands must stay within the session's effective verification
|
|
3162
|
+
"verify_run commands must stay within the session's effective verification "
|
|
3163
|
+
"contract. Omit the `commands` argument to run the resolved contract "
|
|
3164
|
+
f"({', '.join(current_effective_verification_commands)}), or run your own "
|
|
3165
|
+
"command with shell_run -- a passing shell_run of the project's test command "
|
|
3166
|
+
"also counts as verification evidence."
|
|
3148
3167
|
)
|
|
3149
3168
|
commands = requested_commands
|
|
3150
3169
|
elif verify_cmd is not None and unavailable_verification_contract:
|
|
@@ -3188,13 +3207,15 @@ def build_tools(
|
|
|
3188
3207
|
workspace_root=root,
|
|
3189
3208
|
)
|
|
3190
3209
|
if analysis.rejection_reason:
|
|
3191
|
-
raise VerifyError(
|
|
3210
|
+
raise VerifyError(_invalid_command_message(analysis.rejection_reason))
|
|
3192
3211
|
if (
|
|
3193
3212
|
_has_disallowed_shell_control_flow(command)
|
|
3194
3213
|
and normalized_exact not in trusted_shell_commands
|
|
3195
3214
|
):
|
|
3196
3215
|
raise VerifyError(
|
|
3197
|
-
"verification commands must be single commands without shell control flow or
|
|
3216
|
+
"verification commands must be single commands without shell control flow or "
|
|
3217
|
+
"chaining. Pass just the test command (e.g. `pytest -q`); a leading "
|
|
3218
|
+
"`cd <dir> &&` is fine, but move other setup into a separate shell_run."
|
|
3198
3219
|
)
|
|
3199
3220
|
guard_verify(commands)
|
|
3200
3221
|
workspace_services = _workspace_services_before_verification()
|
|
@@ -3644,7 +3665,7 @@ def build_tools(
|
|
|
3644
3665
|
raise AgentRuntimeError(f"Invalid wait_seconds value: {raw_wait!r}") from exc
|
|
3645
3666
|
if wait_seconds < 0:
|
|
3646
3667
|
raise AgentRuntimeError("wait_seconds must be non-negative")
|
|
3647
|
-
return min(wait_seconds,
|
|
3668
|
+
return min(wait_seconds, _MAX_SHELL_WAIT_SECONDS)
|
|
3648
3669
|
|
|
3649
3670
|
def _coerce_shell_max_bytes(raw_max_bytes: Any) -> int | None:
|
|
3650
3671
|
if raw_max_bytes is None:
|
|
@@ -4315,7 +4336,13 @@ def build_tools(
|
|
|
4315
4336
|
|
|
4316
4337
|
_append_builtin_tool(
|
|
4317
4338
|
"git_diff",
|
|
4318
|
-
run=lambda
|
|
4339
|
+
run=lambda args: git_diff(
|
|
4340
|
+
root=root,
|
|
4341
|
+
path=args.get("path"),
|
|
4342
|
+
staged=bool(args.get("staged", False)),
|
|
4343
|
+
offset=args.get("offset", 0),
|
|
4344
|
+
diff_id=args.get("diff_id"),
|
|
4345
|
+
),
|
|
4319
4346
|
)
|
|
4320
4347
|
|
|
4321
4348
|
if git_backed_workspace:
|
|
@@ -165,7 +165,12 @@ from ..sensitive_output import (
|
|
|
165
165
|
redact_sensitive_tool_result,
|
|
166
166
|
sensitive_tool_boundary,
|
|
167
167
|
)
|
|
168
|
-
from ..steering import
|
|
168
|
+
from ..steering import (
|
|
169
|
+
build_steer_messages,
|
|
170
|
+
ops_inbox_for,
|
|
171
|
+
steer_inbox_for,
|
|
172
|
+
wait_signal_digest,
|
|
173
|
+
)
|
|
169
174
|
from ..subagent_execution import _SUBAGENT_PREASSIGNED_RUN_ID_ARG
|
|
170
175
|
from ..tools_assembly import (
|
|
171
176
|
_SHELL_CANCELLABLE_WAIT_TOOL_NAMES,
|
|
@@ -1698,9 +1703,16 @@ def run_turn(
|
|
|
1698
1703
|
self.messages = copy.deepcopy(pre_turn_messages)
|
|
1699
1704
|
_set_session_pinned_prefix_len(self, pre_turn_pinned_prefix_len)
|
|
1700
1705
|
if steered_pending_restore:
|
|
1706
|
+
restored_steers = list(steered_pending_restore)
|
|
1701
1707
|
rollback_inbox = steer_inbox_for(self)
|
|
1702
1708
|
if rollback_inbox is not None:
|
|
1703
|
-
rollback_inbox.restore_front(
|
|
1709
|
+
rollback_inbox.restore_front(restored_steers)
|
|
1710
|
+
notify_restored = getattr(self.surface, "on_steer_messages_restored", None)
|
|
1711
|
+
if callable(notify_restored):
|
|
1712
|
+
try:
|
|
1713
|
+
notify_restored(restored_steers)
|
|
1714
|
+
except Exception:
|
|
1715
|
+
pass
|
|
1704
1716
|
steered_pending_restore.clear()
|
|
1705
1717
|
self.store.append(
|
|
1706
1718
|
"warning",
|
|
@@ -3901,7 +3913,6 @@ def run_turn(
|
|
|
3901
3913
|
return _deadline_exhausted_result("step_loop", step=step)
|
|
3902
3914
|
_throw_if_cancelled()
|
|
3903
3915
|
steps_attempted = step
|
|
3904
|
-
stream_used = self.stream
|
|
3905
3916
|
step_ephemeral_suffix_system_messages: list[str] = []
|
|
3906
3917
|
remaining_tool_steps_after_this = None if turn_max_steps is None else turn_max_steps - step
|
|
3907
3918
|
if remaining_tool_steps_after_this == 0:
|
|
@@ -4084,6 +4095,55 @@ def run_turn(
|
|
|
4084
4095
|
# plain callable attribute keeps every chat() signature unchanged.
|
|
4085
4096
|
_on_text_delta.stream_restart = _on_stream_restart # type: ignore[attr-defined]
|
|
4086
4097
|
|
|
4098
|
+
# Apply resolved operations before user steering at the worker-thread
|
|
4099
|
+
# step boundary. The UI validates and queues these operations, but only
|
|
4100
|
+
# this worker owns mutations to state read by an active turn.
|
|
4101
|
+
ops_inbox = ops_inbox_for(self)
|
|
4102
|
+
if ops_inbox is not None:
|
|
4103
|
+
try:
|
|
4104
|
+
staged_operations = ops_inbox.drain()
|
|
4105
|
+
except Exception as exc: # noqa: BLE001 - staged ops cannot fail a turn
|
|
4106
|
+
self.store.append(
|
|
4107
|
+
"warning",
|
|
4108
|
+
{
|
|
4109
|
+
"warning": "staged_operation_delivery_failed",
|
|
4110
|
+
"step": step,
|
|
4111
|
+
"error": str(exc),
|
|
4112
|
+
},
|
|
4113
|
+
)
|
|
4114
|
+
else:
|
|
4115
|
+
apply_staged_operation = getattr(self, "apply_staged_operation", None)
|
|
4116
|
+
for staged_operation in staged_operations:
|
|
4117
|
+
label = str(staged_operation.display_label or staged_operation.kind).strip()
|
|
4118
|
+
try:
|
|
4119
|
+
if not callable(apply_staged_operation):
|
|
4120
|
+
raise RuntimeError("no staged-operation apply handler is attached")
|
|
4121
|
+
apply_staged_operation(staged_operation)
|
|
4122
|
+
except Exception as exc: # noqa: BLE001 - drop this op, keep turn alive
|
|
4123
|
+
self.store.append(
|
|
4124
|
+
"warning",
|
|
4125
|
+
{
|
|
4126
|
+
"warning": "staged_operation_apply_failed",
|
|
4127
|
+
"kind": staged_operation.kind,
|
|
4128
|
+
"step": step,
|
|
4129
|
+
"error": str(exc),
|
|
4130
|
+
},
|
|
4131
|
+
)
|
|
4132
|
+
_emit_surface_error(
|
|
4133
|
+
self.surface,
|
|
4134
|
+
"staged_operation_apply_failed",
|
|
4135
|
+
f"{label} - failed to apply: {exc}",
|
|
4136
|
+
True,
|
|
4137
|
+
)
|
|
4138
|
+
continue
|
|
4139
|
+
self.store.append(
|
|
4140
|
+
"staged_operation_applied",
|
|
4141
|
+
{"kind": staged_operation.kind, "step": step},
|
|
4142
|
+
)
|
|
4143
|
+
emit_info = getattr(self.surface, "emit_info", None)
|
|
4144
|
+
if callable(emit_info):
|
|
4145
|
+
emit_info(f"{label} - applied")
|
|
4146
|
+
|
|
4087
4147
|
# Drain user steering at the worker-thread step boundary. The previous
|
|
4088
4148
|
# step's tool results are already committed, so this cannot split tool
|
|
4089
4149
|
# call/result adjacency. It is also before compaction, so any replacement
|
|
@@ -4118,6 +4178,9 @@ def run_turn(
|
|
|
4118
4178
|
},
|
|
4119
4179
|
)
|
|
4120
4180
|
|
|
4181
|
+
# Streaming is a per-step setting. Read it only after staged operations
|
|
4182
|
+
# have applied so a mid-turn toggle affects this boundary's LLM call.
|
|
4183
|
+
stream_used = self.stream
|
|
4121
4184
|
request_messages = _request_messages_for_step(self.messages)
|
|
4122
4185
|
try:
|
|
4123
4186
|
if self.conversation_compactor is not None:
|