alysis-code 0.14.3__tar.gz → 0.14.6__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.14.3 → alysis_code-0.14.6}/PKG-INFO +11 -1
- {alysis_code-0.14.3 → alysis_code-0.14.6}/README.md +10 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/docs/CHANGELOG.md +41 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/pyproject.toml +1 -1
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/__init__.py +1 -1
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/config.py +21 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/git_evidence.py +50 -2
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/git_safe.py +23 -11
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/activity_events.py +14 -2
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/artifacts.py +3 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/change_ledger.py +51 -32
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/context_blocks.py +23 -8
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/event_stream.py +74 -21
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/forge_protocol.py +37 -17
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/health.py +3 -0
- alysis_code-0.14.6/src/alysis_code/ide/parent_watchdog.py +111 -0
- alysis_code-0.14.6/src/alysis_code/ide/provider_switch.py +65 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/stdio_bridge.py +631 -57
- {alysis_code-0.14.3 → alysis_code-0.14.6}/.gitignore +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/LICENSE +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/NOTICE +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/__main__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/_build_info.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/account_login.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/acceptance_contract.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/anytime_checkpoint.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/blast_radius.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/cache_keepalive.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/checkpoint_worker.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/completion_certificate.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/completion_gate.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/empty_response_stall.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/errors.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/llm_calls.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/mutation_classification.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_context.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_families.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/prompt_guidance.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/read_ledger.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/regression_baseline.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/reproduction_first.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/sensitive_output.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/session.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/steering.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/subagent_execution.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/subagent_workspace.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/task_evidence.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/task_state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/tools_assembly.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/core.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/events.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/exploration.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/interventions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/read_cache.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/snapshot.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn/subagent_progress.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn_contract.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/turn_path.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/verification.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/verification_commands.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/verification_evidence.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent/verification_result.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_loop.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/base.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/builtins.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/codex_cli.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/host.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/registry.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agent_runtimes/service.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agentbox_client.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/agentbox_integration.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/alysis_cloud.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/approval_scope.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/asset_read_core.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/budget_allocator.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/comprehender.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/index.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/ingestion.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/legacy_migration.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/local_tools.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/models.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/ocr.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-000.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-001.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-002.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-003.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-004.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-005.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-006.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-007.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-008.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-009.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-010.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-011.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-012.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-013.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-014.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-015.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-016.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-017.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-018.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-019.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/ascii/f-020.txt +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/index.html +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/owl/show-owl.sh +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/paths.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/plan_binding.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/planner_context.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/planner_tools.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/prompts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/replanner_context.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/surface.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/untrusted_content.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/usage_logger.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/worker_mirror.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/worker_section.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/assets/worker_tools.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/atomic_io.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/auth_diagnostics.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/background_runner.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/branding.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/budget_policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/build_identity.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/builtin_hooks/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/builtin_hooks/notify_done_windows.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/bwrap_etc.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cancellation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/capabilities.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/chatgpt_codex_static_provider.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/checkpoint_settings.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/assets_cli.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/assets_modal.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/commands.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/forge_visibility.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/loop.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/mid_turn_policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/rendering.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat/state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat_resume.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/chat_slash_completer.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/_shared.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/auth.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_resume_helpers.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_status.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_terminal.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/chat_tui_panels.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/cli_common.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/cli_surface.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/config.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/conventions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/execution_helpers.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/extensions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge_asset_view.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/forge_helpers.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/hooks.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/ide_bridge.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/mcp.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/profile.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/prompt_helpers.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/report.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/root.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/sandbox.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/server.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/sessions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/skills.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/startup.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/tools.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/update.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/commands/welcome.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/config_menu.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/forge.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/forge_recovery.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/setup_wizard.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/app.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/attachments.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/composer.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config_flow.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/config_overlay.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/content.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/footer.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/forge_status.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/links.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/markdown.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/owl.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/plan_meta.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/selection_bindings.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/setup_app.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/setup_flow.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/subagent_identity.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/subagent_panel.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/surface.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/tips.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/transcript.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/update_prompt.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/cli_impl/tui/workspace_guard.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/clipboard.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/code_review.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/compaction/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/compaction/conversation_compactor.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/compaction/importance.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/compaction/settings.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/compaction/tool_output_offload.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/conflict_auto_resolver.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/consumer_verification.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/context/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/context/tool_schema_budgeter.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/crash_diagnostics.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/custom_tools/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/custom_tools/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/custom_tools/discovery.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/custom_tools/runtime.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/custom_tools/session.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/custom_tools/trust.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/diff_paths.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/direction_change.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/dispatch_timing.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/durable_service_manager.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/edit_discipline.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/error_text.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/execution_budget.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/execution_context.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/execution_deadline.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/execution_shared.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/activation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/install.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/manifest.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/models.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/paths.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/registry.json +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/registry.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/extensions/workspace_trust.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/failed_task_evidence.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/failure_category.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/feedback_report.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/file_classification.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/forge.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/forge_completion.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/forge_events.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/frontmatter_utils.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/git_ops.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/git_worktrees.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/hooks/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/hooks/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/hooks/audit.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/hooks/config.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/hooks/dispatcher.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/hooks/models.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/hooks/trust.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/host_actions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/host_browser.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/approvals.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/browser_egress_proxy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/cdp_websocket_transport.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/forge_request_ledger.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/managed_browser.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/management_protocol.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/mcp_oauth_coordinator.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/mcp_oauth_lifecycle.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/prompt_queue.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/protocol.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/resumable_swarm.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/session_search.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/structured_state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/ide/swarm_protocol.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/integration_gate.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/interactive_input_guard.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/internal_artifacts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/knowledge_base.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/knowledge_capture.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/knowledge_librarian.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/language_policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/litellm_static_provider.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/anthropic_messages.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/base.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/cache_capabilities.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/cache_control_blocks.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/cache_policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/factory.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/gemini_generate_content.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/gemini_interactions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/http_cancellation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/metadata.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/openai_compat.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/openai_responses.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/protocols.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/provider_limits.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/request_plan.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/request_shape.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/streaming.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/temperature_compat.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/tool_call_markup.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/types.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm/usage_normalization.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/llm_error_display.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/logging_redaction.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/managed_host_deadline.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/client.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/config.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/errors.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/forge_scope.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/jsonrpc.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/manager.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/models.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth_runtime.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/oauth_store.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/prompts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/resources.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/roots.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/server_requests.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/token_store.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/transport_http.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/transport_stdio.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/mcp/untrusted_content.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/merge_conflict_reviewer.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_catalog/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.json +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_metadata_policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_metadata_utils.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_registry.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/model_router.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/permission_policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/personas.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/pipeline_facts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/plan_assistant.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/plan_reconciliation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/plan_repair.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/plan_validation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/planning_constraints.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/preview_server.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/private_artifact_io.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/process_reaping.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/profile_presets.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/profiles.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/prompt_guidance_catalog.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_auth/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_auth/base.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_auth/openai_codex.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_auth/registry.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_auth/store.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_diagnostics.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_model_catalog.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_telemetry.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/provider_url.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/reasoning_contracts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/remote_sync.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/replanning.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/repo_scan.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/request_estimation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/review_gate.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/run_lock.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/run_outcome.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/run_provenance.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/run_state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/runtime_artifacts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/runtime_context_features.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/runtime_kind.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/safety/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/safety/mcp_sanitize.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/safety/safe_http.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/safety/subagent_report.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/sandbox_doctor.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/sandbox_runner.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/sandbox_settings.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/serialized_paths.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/server/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/server/app.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/server/auth.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/server/job_config.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/server/settings.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/server/store.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/server/worker_runner.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/service_persistence.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/session_artifacts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/session_metrics.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/session_store.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/address-pr-comments/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/code-review/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/commit/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/debug/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/fix-ci/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/release-notes/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/security-review/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/bundled/skill-creator/SKILL.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/conventions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/discovery.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/eval_models.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/eval_runner.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/evals.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/install.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/loader.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/matching.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/models.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/paths.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/prompting.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/scaffold.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/state.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/transactions.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/skills/validation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/step_budget.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/subagent_labels.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/subagents.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/base.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/console.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/events.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/hidden_surface.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/noop_surface.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/rich_surface.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/styles.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/theme.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/surface/types.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/swarm_backend.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/swarm_orchestrator.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/swarm_scheduler.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/swarm_trace.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/swarm_worker.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/swarm_write_guard.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/task_dependencies.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/task_readiness.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/task_scope.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/terminal_manager.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/terminal_ownership.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/text_normalization.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/token_budget.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/README.md +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/__init__.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/artifacts.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/availability.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/capability_readiness.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/fs.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/git.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/history.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/http_timeout.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/image_generation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/registry.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/repo_map.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/search.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/shell.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/symbols.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/test_discovery.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/web.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/web_search.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_dashscope.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_ddgs.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_provider_adapters.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/tools/web_search_tavily.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/transport_retry.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/updates.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/usage_tracker.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/verification_command_analysis.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/verification_contract.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/verification_failure_summary.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/verification_repair.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/verify_gate.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/web_research.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/web_search_adapters.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/web_search_policy.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/workspace_binding.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/workspace_binding_ui.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/workspace_context.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/src/alysis_code/workspace_isolation.py +0 -0
- {alysis_code-0.14.3 → alysis_code-0.14.6}/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.14.
|
|
3
|
+
Version: 0.14.6
|
|
4
4
|
Summary: Local CLI coding agent powered by any API.
|
|
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
|
|
@@ -196,6 +196,8 @@ Persona changes made during a running turn apply after that turn finishes.
|
|
|
196
196
|
|
|
197
197
|
Apache-2.0. You're free to use, modify, and distribute this code, including commercially, as long as
|
|
198
198
|
you keep the attribution and license notices. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
|
|
199
|
+
The shared editor sidebar includes MIT-licensed adaptations from Kilo Code/OpenCode; retain its
|
|
200
|
+
[third-party notices](extensions/shared-ui/THIRD_PARTY_NOTICES.txt).
|
|
199
201
|
|
|
200
202
|
## FAQ
|
|
201
203
|
|
|
@@ -218,3 +220,11 @@ More questions? See the [full FAQ](https://alysiscode.com/docs/faq).
|
|
|
218
220
|
---
|
|
219
221
|
|
|
220
222
|
**Join the community** — [X](https://x.com/alysiscode) | [GitHub Issues](https://github.com/AlysisAi/alysis-code/issues)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
## Editor integrations
|
|
226
|
+
|
|
227
|
+
[VS Code](extensions/vscode-alysis/README.md) uses the shared Alysis sidebar and Python IDE bridge.
|
|
228
|
+
[JetBrains](extensions/jetbrains-alysis/README.md) is a development preview with a smaller feature set.
|
|
229
|
+
The VS Code Marketplace pre-release is pending production signing and acceptance; see the
|
|
230
|
+
[IDE release status](docs/vscode-marketplace-launch.md) before installing component packages.
|
|
@@ -135,6 +135,8 @@ Persona changes made during a running turn apply after that turn finishes.
|
|
|
135
135
|
|
|
136
136
|
Apache-2.0. You're free to use, modify, and distribute this code, including commercially, as long as
|
|
137
137
|
you keep the attribution and license notices. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
|
|
138
|
+
The shared editor sidebar includes MIT-licensed adaptations from Kilo Code/OpenCode; retain its
|
|
139
|
+
[third-party notices](extensions/shared-ui/THIRD_PARTY_NOTICES.txt).
|
|
138
140
|
|
|
139
141
|
## FAQ
|
|
140
142
|
|
|
@@ -157,3 +159,11 @@ More questions? See the [full FAQ](https://alysiscode.com/docs/faq).
|
|
|
157
159
|
---
|
|
158
160
|
|
|
159
161
|
**Join the community** — [X](https://x.com/alysiscode) | [GitHub Issues](https://github.com/AlysisAi/alysis-code/issues)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
## Editor integrations
|
|
165
|
+
|
|
166
|
+
[VS Code](extensions/vscode-alysis/README.md) uses the shared Alysis sidebar and Python IDE bridge.
|
|
167
|
+
[JetBrains](extensions/jetbrains-alysis/README.md) is a development preview with a smaller feature set.
|
|
168
|
+
The VS Code Marketplace pre-release is pending production signing and acceptance; see the
|
|
169
|
+
[IDE release status](docs/vscode-marketplace-launch.md) before installing component packages.
|
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.14.6 — final VSIX attestation and startup validation
|
|
4
|
+
|
|
5
|
+
- Give each final VSIX dependency report an RFC 4122 document ID accepted by
|
|
6
|
+
GitHub's attestation parser. Derive it from the exact package bytes so promotion
|
|
7
|
+
can reproduce the signed report without changing its identity.
|
|
8
|
+
- Wait for startup runtime validation before reporting installed runtime evidence,
|
|
9
|
+
so a fresh installation does not report the bundled CLI as temporarily unavailable.
|
|
10
|
+
|
|
11
|
+
All six 0.14.5 native runtimes and their assembled manifest passed signing, but
|
|
12
|
+
final VSIX attestation failed before installation testing. This replacement
|
|
13
|
+
preserves the existing tags; Marketplace pre-release 0.3.0 still requires the
|
|
14
|
+
documented installation, acceptance, and promotion gates.
|
|
15
|
+
|
|
16
|
+
## 0.14.5 — native managed-runtime packaging
|
|
17
|
+
|
|
18
|
+
- Pin the six bundled runtimes to checksum-verified CPython 3.12.15 distributions,
|
|
19
|
+
including their observed OpenSSL and Expat versions in each dependency SBOM.
|
|
20
|
+
- Build Linux executables with shared-library-capable Python on the existing
|
|
21
|
+
glibc 2.28 baseline, and build tested, static OpenSSL 3.5.9 for Windows ARM64
|
|
22
|
+
and Intel macOS cryptography.
|
|
23
|
+
- Sign embedded macOS libraries during packaging and verify notarization using
|
|
24
|
+
Apple's documented check for standalone code. Preserve Windows API paths in Git Bash.
|
|
25
|
+
- Add an unsigned native build and executable smoke check for all six targets.
|
|
26
|
+
|
|
27
|
+
This source version prepares a replacement candidate after the protected `v0.14.4`
|
|
28
|
+
native build failed. Marketplace pre-release 0.3.0 remains subject to the documented
|
|
29
|
+
signing, installation, acceptance, and promotion gates.
|
|
30
|
+
|
|
31
|
+
## 0.14.4 — IDE integrations and release tooling
|
|
32
|
+
|
|
33
|
+
- Add the VS Code 0.3.0 integration with a shared sidebar, provider management, bounded editor
|
|
34
|
+
context, reviewed changes, recovery checkpoints, and native host actions.
|
|
35
|
+
- Add shared UI transport and a JetBrains development preview using the same Python IDE bridge.
|
|
36
|
+
- Isolate provider credentials, handle physical workspace paths, and keep unit tests portable.
|
|
37
|
+
- Add six-target managed-runtime packaging, Azure OIDC Windows signing verification, Apple
|
|
38
|
+
notarization/provenance contracts, and protected evidence and Marketplace promotion workflows.
|
|
39
|
+
- Update pinned sandbox build inputs; fresh image scans remain required.
|
|
40
|
+
|
|
41
|
+
This is a CLI/source release. Production signed VSIX packages and Marketplace publication remain
|
|
42
|
+
pending the [documented signing and acceptance gates](vscode-marketplace-launch.md).
|
|
43
|
+
|
|
3
44
|
Notable user-facing changes to Alysis Code are recorded here. This project follows
|
|
4
45
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and uses
|
|
5
46
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html) while the public API remains pre-1.0.
|
|
@@ -1511,6 +1511,9 @@ def resolve_profile_api_key(
|
|
|
1511
1511
|
profile = get_profile(cfg, profile_name)
|
|
1512
1512
|
if profile is None:
|
|
1513
1513
|
return ApiKeyResolution(key=None, source="missing")
|
|
1514
|
+
ide_key = _resolve_ide_profile_api_key(cfg, profile_name)
|
|
1515
|
+
if ide_key.key:
|
|
1516
|
+
return ide_key
|
|
1514
1517
|
stored_profile_key = _resolve_stored_profile_api_key(cfg, profile_name)
|
|
1515
1518
|
if stored_profile_key.key:
|
|
1516
1519
|
return stored_profile_key
|
|
@@ -1531,6 +1534,21 @@ def resolve_profile_api_key(
|
|
|
1531
1534
|
return ApiKeyResolution(key=None, source="missing")
|
|
1532
1535
|
|
|
1533
1536
|
|
|
1537
|
+
def _resolve_ide_profile_api_key(cfg: AppConfig, profile_name: str) -> ApiKeyResolution:
|
|
1538
|
+
"""Honor an IDE's explicitly supplied profile key without overwriting CLI credentials."""
|
|
1539
|
+
from .profiles import get_profile
|
|
1540
|
+
|
|
1541
|
+
profile = get_profile(cfg, profile_name)
|
|
1542
|
+
if profile is not None:
|
|
1543
|
+
# Match the extension's encoding; plain env-var names can collide between two profiles.
|
|
1544
|
+
encoded = profile.name.encode("utf-8").hex().upper()
|
|
1545
|
+
env_name = f"ALYSIS_IDE_PROFILE_{encoded}_API_KEY"
|
|
1546
|
+
key = str(os.environ.get(env_name) or "").strip()
|
|
1547
|
+
if key:
|
|
1548
|
+
return ApiKeyResolution(key=key, source=f"env:{env_name}")
|
|
1549
|
+
return ApiKeyResolution(key=None, source="missing")
|
|
1550
|
+
|
|
1551
|
+
|
|
1534
1552
|
def _resolve_stored_profile_api_key(cfg: AppConfig, profile_name: str) -> ApiKeyResolution:
|
|
1535
1553
|
from .profiles import get_profile
|
|
1536
1554
|
|
|
@@ -1552,6 +1570,9 @@ def resolve_api_key(
|
|
|
1552
1570
|
if profile_name is None:
|
|
1553
1571
|
profile_name = str((effective_cfg.extra_fields or {}).get("active_profile") or "").strip()
|
|
1554
1572
|
if profile_name:
|
|
1573
|
+
ide_key = _resolve_ide_profile_api_key(effective_cfg, profile_name)
|
|
1574
|
+
if ide_key.key:
|
|
1575
|
+
return ide_key
|
|
1555
1576
|
stored_profile_key = _resolve_stored_profile_api_key(effective_cfg, profile_name)
|
|
1556
1577
|
if stored_profile_key.key:
|
|
1557
1578
|
return stored_profile_key
|
|
@@ -11,7 +11,7 @@ from typing import Any, Literal
|
|
|
11
11
|
|
|
12
12
|
from .file_classification import classify_path, is_generated_or_vendor_path
|
|
13
13
|
from .git_ops import GitOpsError
|
|
14
|
-
from .git_safe import build_git_cmd, build_git_process_env
|
|
14
|
+
from .git_safe import build_git_cmd, build_git_process_env, configured_git_filter_drivers
|
|
15
15
|
from .runtime_artifacts import is_runtime_artifact_path
|
|
16
16
|
|
|
17
17
|
PatchCaptureStatus = Literal["complete", "partial", "failed"]
|
|
@@ -445,11 +445,13 @@ def _snapshot_git(
|
|
|
445
445
|
args: list[str],
|
|
446
446
|
*,
|
|
447
447
|
env: dict[str, str] | None = None,
|
|
448
|
+
input_text: str | None = None,
|
|
448
449
|
) -> str:
|
|
449
450
|
try:
|
|
450
451
|
result = subprocess.run(
|
|
451
452
|
build_git_cmd(root, args, env=env, disable_filters=True),
|
|
452
453
|
env=build_git_process_env(env),
|
|
454
|
+
input=input_text.encode("utf-8") if input_text is not None else None,
|
|
453
455
|
capture_output=True,
|
|
454
456
|
check=False,
|
|
455
457
|
)
|
|
@@ -504,17 +506,63 @@ def _check_snapshot_files(root: Path, *, excluded_paths: tuple[str, ...]) -> Non
|
|
|
504
506
|
raise WorkspaceSnapshotError("unsupported_workspace_file", paths=tuple(sorted(unsupported)))
|
|
505
507
|
|
|
506
508
|
|
|
509
|
+
def _check_snapshot_filters(root: Path, *, pathspecs: list[str]) -> None:
|
|
510
|
+
# Git status may recognize a size change without converting file content.
|
|
511
|
+
# Resolve attributes against the actual index before a HEAD-based temporary
|
|
512
|
+
# index can lose an index-only .gitattributes fallback.
|
|
513
|
+
try:
|
|
514
|
+
drivers = configured_git_filter_drivers(root)
|
|
515
|
+
except (OSError, subprocess.TimeoutExpired) as exc:
|
|
516
|
+
raise WorkspaceSnapshotError("workspace_snapshot_unreadable") from exc
|
|
517
|
+
if not drivers:
|
|
518
|
+
return
|
|
519
|
+
paths = _snapshot_git(
|
|
520
|
+
root,
|
|
521
|
+
[
|
|
522
|
+
"--no-optional-locks",
|
|
523
|
+
"ls-files",
|
|
524
|
+
"--cached",
|
|
525
|
+
"--others",
|
|
526
|
+
"--exclude-standard",
|
|
527
|
+
"-z",
|
|
528
|
+
"--",
|
|
529
|
+
*pathspecs,
|
|
530
|
+
],
|
|
531
|
+
)
|
|
532
|
+
attributes = _snapshot_git(
|
|
533
|
+
root, ["check-attr", "-z", "--stdin", "filter"], input_text=paths
|
|
534
|
+
).split("\0")
|
|
535
|
+
if attributes[-1] != "" or (len(attributes) - 1) % 3:
|
|
536
|
+
raise WorkspaceSnapshotError("workspace_snapshot_unreadable")
|
|
537
|
+
affected = tuple(
|
|
538
|
+
sorted(
|
|
539
|
+
{
|
|
540
|
+
attributes[index]
|
|
541
|
+
for index in range(0, len(attributes) - 1, 3)
|
|
542
|
+
if attributes[index + 2] in drivers
|
|
543
|
+
}
|
|
544
|
+
)
|
|
545
|
+
)
|
|
546
|
+
if affected:
|
|
547
|
+
raise WorkspaceSnapshotError(
|
|
548
|
+
"workspace_snapshot_git_failed",
|
|
549
|
+
paths=affected,
|
|
550
|
+
detail="Git snapshot refused: external Git filters are disabled for isolated workspaces",
|
|
551
|
+
)
|
|
552
|
+
|
|
553
|
+
|
|
507
554
|
def _working_tree_snapshot(
|
|
508
555
|
root: Path, *, base_ref: str, excluded_paths: tuple[str, ...] = ()
|
|
509
556
|
) -> str:
|
|
510
557
|
_check_snapshot_files(root, excluded_paths=excluded_paths)
|
|
558
|
+
pathspecs = [".", *(f":(top,exclude,literal){path}" for path in excluded_paths)]
|
|
559
|
+
_check_snapshot_filters(root, pathspecs=pathspecs)
|
|
511
560
|
# A separate index preserves both staged and unstaged parent work. Git handles
|
|
512
561
|
# binary data, modes, names and ignored paths; no filename classifier is used.
|
|
513
562
|
with tempfile.TemporaryDirectory(prefix="alysis-git-snapshot-") as scratch:
|
|
514
563
|
env = build_git_process_env()
|
|
515
564
|
env["GIT_INDEX_FILE"] = os.fspath(Path(scratch) / "index")
|
|
516
565
|
_snapshot_git(root, ["read-tree", base_ref], env=env)
|
|
517
|
-
pathspecs = [".", *(f":(top,exclude,literal){path}" for path in excluded_paths)]
|
|
518
566
|
_snapshot_git(root, ["add", "--all", "--", *pathspecs], env=env)
|
|
519
567
|
tree = _snapshot_git(root, ["write-tree"], env=env).strip()
|
|
520
568
|
gitlinks = tuple(
|
|
@@ -77,11 +77,29 @@ def _disabled_filter_config(
|
|
|
77
77
|
returned command, so unused drivers do not prevent ordinary repositories from
|
|
78
78
|
working. Re-read for every command: a child can introduce filter configuration.
|
|
79
79
|
"""
|
|
80
|
+
drivers = configured_git_filter_drivers(root, extra_config=config, env=env)
|
|
81
|
+
overrides: dict[str, str] = {}
|
|
82
|
+
for driver in drivers:
|
|
83
|
+
# Empty all three commands, including the long-running process protocol.
|
|
84
|
+
# required=true makes an attempted conversion fail instead of passing
|
|
85
|
+
# through bytes that might differ from the real filter's representation.
|
|
86
|
+
overrides.update({f"filter.{driver}.{kind}": "" for kind in ("clean", "smudge", "process")})
|
|
87
|
+
overrides[f"filter.{driver}.required"] = "true"
|
|
88
|
+
return overrides
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def configured_git_filter_drivers(
|
|
92
|
+
root: Path,
|
|
93
|
+
*,
|
|
94
|
+
extra_config: dict[str, str] | None = None,
|
|
95
|
+
env: Mapping[str, str] | None = None,
|
|
96
|
+
) -> tuple[str, ...]:
|
|
97
|
+
"""Read effective nonempty filter commands without invoking any driver."""
|
|
80
98
|
result = subprocess.run(
|
|
81
99
|
build_git_cmd(
|
|
82
100
|
root,
|
|
83
101
|
["config", "--null", "--get-regexp", r"^filter\..*\.(clean|smudge|process)$"],
|
|
84
|
-
extra_config=
|
|
102
|
+
extra_config=extra_config,
|
|
85
103
|
env=env,
|
|
86
104
|
),
|
|
87
105
|
env=build_git_process_env(env),
|
|
@@ -90,7 +108,7 @@ def _disabled_filter_config(
|
|
|
90
108
|
timeout=5,
|
|
91
109
|
)
|
|
92
110
|
if result.returncode == 1: # No configured filter commands.
|
|
93
|
-
return
|
|
111
|
+
return ()
|
|
94
112
|
if result.returncode != 0:
|
|
95
113
|
raise OSError("Could not inspect Git filter configuration")
|
|
96
114
|
values: dict[str, str] = {}
|
|
@@ -100,12 +118,6 @@ def _disabled_filter_config(
|
|
|
100
118
|
if not separator:
|
|
101
119
|
raise OSError("Could not read Git filter configuration")
|
|
102
120
|
values[key] = value
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
# Empty all three commands, including the long-running process protocol.
|
|
107
|
-
# required=true makes an attempted conversion fail instead of passing
|
|
108
|
-
# through bytes that might differ from the real filter's representation.
|
|
109
|
-
overrides.update({f"{driver}.{kind}": "" for kind in ("clean", "smudge", "process")})
|
|
110
|
-
overrides[f"{driver}.required"] = "true"
|
|
111
|
-
return overrides
|
|
121
|
+
return tuple(
|
|
122
|
+
sorted({key[len("filter.") :].rsplit(".", 1)[0] for key, value in values.items() if value})
|
|
123
|
+
)
|
|
@@ -25,7 +25,7 @@ ActivityKind: TypeAlias = Literal[
|
|
|
25
25
|
"other",
|
|
26
26
|
]
|
|
27
27
|
ActivityStatus: TypeAlias = Literal[
|
|
28
|
-
"queued", "running", "succeeded", "failed", "cancelled", "blocked"
|
|
28
|
+
"queued", "running", "succeeded", "failed", "cancelled", "blocked", "completed_unverified"
|
|
29
29
|
]
|
|
30
30
|
|
|
31
31
|
MAX_ACTIVITY_TEXT_CHARS = 500
|
|
@@ -47,7 +47,15 @@ ACTIVITY_KINDS = (
|
|
|
47
47
|
"plan",
|
|
48
48
|
"other",
|
|
49
49
|
)
|
|
50
|
-
ACTIVITY_STATUSES = (
|
|
50
|
+
ACTIVITY_STATUSES = (
|
|
51
|
+
"queued",
|
|
52
|
+
"running",
|
|
53
|
+
"succeeded",
|
|
54
|
+
"failed",
|
|
55
|
+
"cancelled",
|
|
56
|
+
"blocked",
|
|
57
|
+
"completed_unverified",
|
|
58
|
+
)
|
|
51
59
|
|
|
52
60
|
_SAFE_METADATA_KEYS = frozenset(
|
|
53
61
|
{
|
|
@@ -64,6 +72,8 @@ _SAFE_METADATA_KEYS = frozenset(
|
|
|
64
72
|
"step",
|
|
65
73
|
"truncated",
|
|
66
74
|
"worker_id",
|
|
75
|
+
"task_outcome",
|
|
76
|
+
"verified_success",
|
|
67
77
|
}
|
|
68
78
|
)
|
|
69
79
|
_INTERNAL_NAME_PATTERN = re.compile(r"(?:^|[._:/-])(?:rs|internal)(?:[._:/-]|$)", re.I)
|
|
@@ -335,6 +345,8 @@ def _normalize_status(status: str) -> ActivityStatus:
|
|
|
335
345
|
return "queued"
|
|
336
346
|
if normalized in {"running", "started", "in_progress", "progress"}:
|
|
337
347
|
return "running"
|
|
348
|
+
if normalized == "completed_unverified":
|
|
349
|
+
return "completed_unverified"
|
|
338
350
|
if normalized in {"done", "completed", "complete", "success", "succeeded", "ok"}:
|
|
339
351
|
return "succeeded"
|
|
340
352
|
if normalized in {"cancelled", "canceled", "interrupted"}:
|
|
@@ -4,6 +4,7 @@ from dataclasses import dataclass
|
|
|
4
4
|
from pathlib import Path, PurePosixPath
|
|
5
5
|
from typing import Any
|
|
6
6
|
|
|
7
|
+
from ..session_artifacts import ARTIFACT_HANDLE_INDEX_DIR
|
|
7
8
|
from .protocol import ProtocolError, redact_secrets
|
|
8
9
|
|
|
9
10
|
DEFAULT_MAX_ARTIFACT_BYTES = 64 * 1024
|
|
@@ -50,6 +51,8 @@ class ArtifactStore:
|
|
|
50
51
|
except OSError:
|
|
51
52
|
continue
|
|
52
53
|
for path in entries:
|
|
54
|
+
if depth == 0 and path.name == ARTIFACT_HANDLE_INDEX_DIR:
|
|
55
|
+
continue
|
|
53
56
|
if path.is_symlink():
|
|
54
57
|
continue
|
|
55
58
|
if path.is_dir():
|
|
@@ -60,6 +60,27 @@ class StaleWorkspaceError(ChangeLedgerError):
|
|
|
60
60
|
"""The workspace no longer matches the state being reversed."""
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
def _checkpoint_storage_directory(workspace_root: Path, storage_root: Path | None = None) -> Path:
|
|
64
|
+
workspace = workspace_root.expanduser().resolve(strict=True)
|
|
65
|
+
workspace_key = hashlib.sha256(
|
|
66
|
+
os.path.normcase(os.fspath(workspace)).encode("utf-8")
|
|
67
|
+
).hexdigest()[:24]
|
|
68
|
+
override = str(env_get("ALYSIS_DATA_DIR") or "").strip()
|
|
69
|
+
default_data_dir = Path(override).expanduser() if override else canonical_user_data_dir()
|
|
70
|
+
base = (storage_root or default_data_dir / "checkpoints").expanduser().resolve()
|
|
71
|
+
try:
|
|
72
|
+
base.relative_to(workspace)
|
|
73
|
+
except ValueError:
|
|
74
|
+
return base / workspace_key
|
|
75
|
+
raise ChangeLedgerError("Checkpoint storage must be outside the workspace.")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def checkpoint_storage_exists(workspace_root: Path) -> bool:
|
|
79
|
+
"""Check for durable checkpoint state without initializing storage or launching Git."""
|
|
80
|
+
storage = _checkpoint_storage_directory(workspace_root)
|
|
81
|
+
return (storage / "ledger.sqlite3").exists() or (storage / "objects.git").exists()
|
|
82
|
+
|
|
83
|
+
|
|
63
84
|
@dataclass(frozen=True)
|
|
64
85
|
class ChangeRecord:
|
|
65
86
|
status: str
|
|
@@ -119,19 +140,7 @@ class ChangeLedger:
|
|
|
119
140
|
self.workspace_root = workspace_root.expanduser().resolve(strict=True)
|
|
120
141
|
if not self.workspace_root.is_dir():
|
|
121
142
|
raise ChangeLedgerError("Checkpoint workspace must be a directory.")
|
|
122
|
-
|
|
123
|
-
os.path.normcase(os.fspath(self.workspace_root)).encode("utf-8")
|
|
124
|
-
).hexdigest()[:24]
|
|
125
|
-
override = str(env_get("ALYSIS_DATA_DIR") or "").strip()
|
|
126
|
-
default_data_dir = Path(override).expanduser() if override else canonical_user_data_dir()
|
|
127
|
-
base = (storage_root or default_data_dir / "checkpoints").expanduser().resolve()
|
|
128
|
-
try:
|
|
129
|
-
base.relative_to(self.workspace_root)
|
|
130
|
-
except ValueError:
|
|
131
|
-
pass
|
|
132
|
-
else:
|
|
133
|
-
raise ChangeLedgerError("Checkpoint storage must be outside the workspace.")
|
|
134
|
-
self.storage_dir = base / workspace_key
|
|
143
|
+
self.storage_dir = _checkpoint_storage_directory(self.workspace_root, storage_root)
|
|
135
144
|
self.git_dir = self.storage_dir / "objects.git"
|
|
136
145
|
self.index_dir = self.storage_dir / "indexes"
|
|
137
146
|
self.database_path = self.storage_dir / "ledger.sqlite3"
|
|
@@ -434,15 +443,25 @@ class ChangeLedger:
|
|
|
434
443
|
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
|
435
444
|
self.index_dir.mkdir(parents=True, exist_ok=True)
|
|
436
445
|
if not self.git_dir.exists():
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
446
|
+
try:
|
|
447
|
+
result = subprocess.run(
|
|
448
|
+
["git", "init", "--bare", "--quiet", os.fspath(self.git_dir)],
|
|
449
|
+
capture_output=True,
|
|
450
|
+
timeout=self.git_timeout_seconds,
|
|
451
|
+
check=False,
|
|
452
|
+
env=build_git_process_env(),
|
|
453
|
+
)
|
|
454
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
455
|
+
raise ChangeLedgerError(
|
|
456
|
+
"Checkpoint storage could not start Git. Install Git and check that it can run."
|
|
457
|
+
) from None
|
|
444
458
|
if result.returncode != 0:
|
|
445
459
|
raise ChangeLedgerError("Unable to initialize external checkpoint storage.")
|
|
460
|
+
self._object_hash_name = (
|
|
461
|
+
self._git(["rev-parse", "--show-object-format"], check=True).stdout.decode().strip()
|
|
462
|
+
)
|
|
463
|
+
if self._object_hash_name not in {"sha1", "sha256"}:
|
|
464
|
+
raise ChangeLedgerError("Unsupported checkpoint Git object format.")
|
|
446
465
|
info_dir = self.git_dir / "info"
|
|
447
466
|
info_dir.mkdir(parents=True, exist_ok=True)
|
|
448
467
|
exclude_path = info_dir / "exclude"
|
|
@@ -1397,6 +1416,16 @@ class ChangeLedger:
|
|
|
1397
1416
|
path = _safe_workspace_path(self.workspace_root, rel_path)
|
|
1398
1417
|
return self._path_identity(path)
|
|
1399
1418
|
|
|
1419
|
+
def _blob_oid(self, data: bytes) -> str:
|
|
1420
|
+
# Equivalent to `git hash-object --stdin` (no path or filters). Baseline
|
|
1421
|
+
# capture checks every file twice; spawning Git for each hash adds
|
|
1422
|
+
# thousands of process launches in a normal repository, especially costly
|
|
1423
|
+
# on Windows. Keep the existing before/after stat and content checks.
|
|
1424
|
+
digest = hashlib.new(self._object_hash_name, usedforsecurity=False)
|
|
1425
|
+
digest.update(f"blob {len(data)}\0".encode("ascii"))
|
|
1426
|
+
digest.update(data)
|
|
1427
|
+
return digest.hexdigest()
|
|
1428
|
+
|
|
1400
1429
|
def _path_identity(self, path: Path) -> tuple[str, str] | None:
|
|
1401
1430
|
if not os.path.lexists(path):
|
|
1402
1431
|
return None
|
|
@@ -1406,12 +1435,7 @@ class ChangeLedger:
|
|
|
1406
1435
|
after = path.lstat()
|
|
1407
1436
|
if _stat_fingerprint(before) != _stat_fingerprint(after):
|
|
1408
1437
|
return "unstable", "unstable"
|
|
1409
|
-
|
|
1410
|
-
self._git(["hash-object", "--stdin"], input_bytes=data, check=True)
|
|
1411
|
-
.stdout.decode()
|
|
1412
|
-
.strip()
|
|
1413
|
-
)
|
|
1414
|
-
return "120000", oid
|
|
1438
|
+
return "120000", self._blob_oid(data)
|
|
1415
1439
|
if not path.is_file():
|
|
1416
1440
|
return "040000", "directory"
|
|
1417
1441
|
try:
|
|
@@ -1423,13 +1447,8 @@ class ChangeLedger:
|
|
|
1423
1447
|
return "unstable", "unstable"
|
|
1424
1448
|
if _stat_fingerprint(before) != _stat_fingerprint(after):
|
|
1425
1449
|
return "unstable", "unstable"
|
|
1426
|
-
oid = (
|
|
1427
|
-
self._git(["hash-object", "--stdin"], input_bytes=data, check=True)
|
|
1428
|
-
.stdout.decode()
|
|
1429
|
-
.strip()
|
|
1430
|
-
)
|
|
1431
1450
|
executable = bool(after.st_mode & stat.S_IXUSR) and os.name != "nt"
|
|
1432
|
-
return ("100755" if executable else "100644"),
|
|
1451
|
+
return ("100755" if executable else "100644"), self._blob_oid(data)
|
|
1433
1452
|
|
|
1434
1453
|
def _session_git_env(self, session_id: str) -> dict[str, str]:
|
|
1435
1454
|
env = build_git_process_env()
|
|
@@ -271,6 +271,14 @@ def sanitize_context_blocks(
|
|
|
271
271
|
kinds: list[ContextKind] = []
|
|
272
272
|
any_truncated = bool(dropped)
|
|
273
273
|
|
|
274
|
+
# A single context block whose path is git-ignored, or that resolved outside the workspace, must
|
|
275
|
+
# not abort the whole turn: the IDE attaches whatever the user has open, and a git-ignored editor
|
|
276
|
+
# among many is the common case that used to fail the entire message. Such a block is DROPPED —
|
|
277
|
+
# its content is still excluded, which is the point of the ignore policy — and the rest proceed.
|
|
278
|
+
# A policy that *throws* (path_policy_failed) stays fail-closed and still raises, because an
|
|
279
|
+
# unevaluable policy is an internal fault, not ordinary user content; likewise a sensitive-path
|
|
280
|
+
# deny and every structural/format error still raise.
|
|
281
|
+
droppable_reasons = {"ignored_path", "path_outside_workspace"}
|
|
274
282
|
for index, raw_block in enumerate(raw_blocks[:accepted_count]):
|
|
275
283
|
if not isinstance(raw_block, Mapping):
|
|
276
284
|
raise ContextValidationError(
|
|
@@ -278,14 +286,21 @@ def sanitize_context_blocks(
|
|
|
278
286
|
"Each context block must be an object.",
|
|
279
287
|
block_index=index,
|
|
280
288
|
)
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
+
try:
|
|
290
|
+
block = _normalize_block(
|
|
291
|
+
raw_block,
|
|
292
|
+
roots=roots,
|
|
293
|
+
limits=active_limits,
|
|
294
|
+
is_ignored=is_ignored,
|
|
295
|
+
path_policy=path_policy,
|
|
296
|
+
block_index=index,
|
|
297
|
+
)
|
|
298
|
+
except ContextValidationError as error:
|
|
299
|
+
if error.code in droppable_reasons:
|
|
300
|
+
dropped += 1
|
|
301
|
+
any_truncated = True
|
|
302
|
+
continue
|
|
303
|
+
raise
|
|
289
304
|
fitted, did_truncate = _fit_block(block, active_limits.max_block_bytes)
|
|
290
305
|
normalized.append(fitted)
|
|
291
306
|
kinds.append(fitted["type"])
|