alysis-code 0.13.0__py3-none-any.whl
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/__init__.py +3 -0
- alysis_code/__main__.py +4 -0
- alysis_code/_build_info.py +14 -0
- alysis_code/account_login.py +468 -0
- alysis_code/agent/README.md +35 -0
- alysis_code/agent/__init__.py +11 -0
- alysis_code/agent/acceptance_contract.py +2217 -0
- alysis_code/agent/blast_radius.py +1403 -0
- alysis_code/agent/cache_keepalive.py +227 -0
- alysis_code/agent/completion_certificate.py +366 -0
- alysis_code/agent/completion_gate.py +306 -0
- alysis_code/agent/empty_response_stall.py +403 -0
- alysis_code/agent/errors.py +28 -0
- alysis_code/agent/llm_calls.py +475 -0
- alysis_code/agent/mutation_classification.py +227 -0
- alysis_code/agent/prompt_context.py +2508 -0
- alysis_code/agent/read_ledger.py +253 -0
- alysis_code/agent/regression_baseline.py +642 -0
- alysis_code/agent/reproduction_first.py +610 -0
- alysis_code/agent/sensitive_output.py +629 -0
- alysis_code/agent/session.py +3218 -0
- alysis_code/agent/steering.py +191 -0
- alysis_code/agent/subagent_execution.py +5177 -0
- alysis_code/agent/subagent_workspace.py +666 -0
- alysis_code/agent/tools_assembly.py +4728 -0
- alysis_code/agent/turn/__init__.py +101 -0
- alysis_code/agent/turn/core.py +8483 -0
- alysis_code/agent/turn/events.py +113 -0
- alysis_code/agent/turn/exploration.py +590 -0
- alysis_code/agent/turn/interventions.py +65 -0
- alysis_code/agent/turn/read_cache.py +420 -0
- alysis_code/agent/turn/snapshot.py +179 -0
- alysis_code/agent/turn_contract.py +661 -0
- alysis_code/agent/turn_path.py +129 -0
- alysis_code/agent/verification.py +2885 -0
- alysis_code/agent/verification_commands.py +512 -0
- alysis_code/agent/verification_evidence.py +738 -0
- alysis_code/agent_loop.py +693 -0
- alysis_code/agent_runtimes/__init__.py +51 -0
- alysis_code/agent_runtimes/base.py +114 -0
- alysis_code/agent_runtimes/builtins.py +129 -0
- alysis_code/agent_runtimes/codex_cli.py +664 -0
- alysis_code/agent_runtimes/host.py +263 -0
- alysis_code/agent_runtimes/registry.py +64 -0
- alysis_code/agent_runtimes/service.py +150 -0
- alysis_code/agentbox_client.py +416 -0
- alysis_code/agentbox_integration.py +310 -0
- alysis_code/alysis_cloud.py +152 -0
- alysis_code/approval_scope.py +276 -0
- alysis_code/assets/README.md +33 -0
- alysis_code/assets/__init__.py +126 -0
- alysis_code/assets/asset_read_core.py +281 -0
- alysis_code/assets/budget_allocator.py +456 -0
- alysis_code/assets/comprehender.py +759 -0
- alysis_code/assets/index.py +654 -0
- alysis_code/assets/ingestion.py +275 -0
- alysis_code/assets/legacy_migration.py +413 -0
- alysis_code/assets/models.py +263 -0
- alysis_code/assets/ocr.py +239 -0
- alysis_code/assets/owl/ascii/f-000.txt +13 -0
- alysis_code/assets/owl/ascii/f-001.txt +13 -0
- alysis_code/assets/owl/ascii/f-002.txt +13 -0
- alysis_code/assets/owl/ascii/f-003.txt +13 -0
- alysis_code/assets/owl/ascii/f-004.txt +13 -0
- alysis_code/assets/owl/ascii/f-005.txt +13 -0
- alysis_code/assets/owl/ascii/f-006.txt +13 -0
- alysis_code/assets/owl/ascii/f-007.txt +13 -0
- alysis_code/assets/owl/ascii/f-008.txt +13 -0
- alysis_code/assets/owl/ascii/f-009.txt +13 -0
- alysis_code/assets/owl/ascii/f-010.txt +13 -0
- alysis_code/assets/owl/ascii/f-011.txt +13 -0
- alysis_code/assets/owl/ascii/f-012.txt +13 -0
- alysis_code/assets/owl/ascii/f-013.txt +13 -0
- alysis_code/assets/owl/ascii/f-014.txt +13 -0
- alysis_code/assets/owl/ascii/f-015.txt +13 -0
- alysis_code/assets/owl/ascii/f-016.txt +13 -0
- alysis_code/assets/owl/ascii/f-017.txt +13 -0
- alysis_code/assets/owl/ascii/f-018.txt +13 -0
- alysis_code/assets/owl/ascii/f-019.txt +13 -0
- alysis_code/assets/owl/ascii/f-020.txt +13 -0
- alysis_code/assets/owl/index.html +98 -0
- alysis_code/assets/owl/show-owl.sh +761 -0
- alysis_code/assets/paths.py +49 -0
- alysis_code/assets/plan_binding.py +326 -0
- alysis_code/assets/planner_context.py +466 -0
- alysis_code/assets/planner_tools.py +184 -0
- alysis_code/assets/prompts.py +101 -0
- alysis_code/assets/replanner_context.py +239 -0
- alysis_code/assets/surface.py +521 -0
- alysis_code/assets/untrusted_content.py +48 -0
- alysis_code/assets/usage_logger.py +94 -0
- alysis_code/assets/worker_mirror.py +428 -0
- alysis_code/assets/worker_section.py +303 -0
- alysis_code/assets/worker_tools.py +468 -0
- alysis_code/atomic_io.py +83 -0
- alysis_code/auth_diagnostics.py +272 -0
- alysis_code/background_runner.py +366 -0
- alysis_code/branding.py +270 -0
- alysis_code/budget_policy.py +390 -0
- alysis_code/build_identity.py +465 -0
- alysis_code/builtin_hooks/__init__.py +7 -0
- alysis_code/builtin_hooks/notify_done_windows.py +65 -0
- alysis_code/bwrap_etc.py +76 -0
- alysis_code/cancellation.py +41 -0
- alysis_code/capabilities.py +137 -0
- alysis_code/chatgpt_codex_static_provider.py +133 -0
- alysis_code/cli.py +51 -0
- alysis_code/cli_impl/__init__.py +1 -0
- alysis_code/cli_impl/assets_cli.py +537 -0
- alysis_code/cli_impl/assets_modal.py +412 -0
- alysis_code/cli_impl/chat/__init__.py +156 -0
- alysis_code/cli_impl/chat/commands.py +2616 -0
- alysis_code/cli_impl/chat/loop.py +4508 -0
- alysis_code/cli_impl/chat/mid_turn_policy.py +125 -0
- alysis_code/cli_impl/chat/rendering.py +444 -0
- alysis_code/cli_impl/chat/state.py +124 -0
- alysis_code/cli_impl/chat_resume.py +830 -0
- alysis_code/cli_impl/chat_slash_completer.py +258 -0
- alysis_code/cli_impl/commands/__init__.py +11 -0
- alysis_code/cli_impl/commands/_shared.py +89 -0
- alysis_code/cli_impl/commands/auth.py +623 -0
- alysis_code/cli_impl/commands/chat_resume_helpers.py +1531 -0
- alysis_code/cli_impl/commands/chat_state.py +158 -0
- alysis_code/cli_impl/commands/chat_status.py +1248 -0
- alysis_code/cli_impl/commands/chat_terminal.py +942 -0
- alysis_code/cli_impl/commands/chat_tui_panels.py +1018 -0
- alysis_code/cli_impl/commands/cli_common.py +1223 -0
- alysis_code/cli_impl/commands/cli_surface.py +77 -0
- alysis_code/cli_impl/commands/config.py +131 -0
- alysis_code/cli_impl/commands/conventions.py +85 -0
- alysis_code/cli_impl/commands/execution_helpers.py +350 -0
- alysis_code/cli_impl/commands/extensions.py +401 -0
- alysis_code/cli_impl/commands/forge.py +1282 -0
- alysis_code/cli_impl/commands/forge_asset_view.py +121 -0
- alysis_code/cli_impl/commands/forge_helpers.py +1215 -0
- alysis_code/cli_impl/commands/hooks.py +737 -0
- alysis_code/cli_impl/commands/ide_bridge.py +31 -0
- alysis_code/cli_impl/commands/mcp.py +700 -0
- alysis_code/cli_impl/commands/profile.py +453 -0
- alysis_code/cli_impl/commands/prompt_helpers.py +307 -0
- alysis_code/cli_impl/commands/report.py +88 -0
- alysis_code/cli_impl/commands/root.py +1118 -0
- alysis_code/cli_impl/commands/sandbox.py +184 -0
- alysis_code/cli_impl/commands/server.py +54 -0
- alysis_code/cli_impl/commands/sessions.py +252 -0
- alysis_code/cli_impl/commands/skills.py +404 -0
- alysis_code/cli_impl/commands/startup.py +946 -0
- alysis_code/cli_impl/commands/tools.py +335 -0
- alysis_code/cli_impl/commands/update.py +364 -0
- alysis_code/cli_impl/commands/welcome.py +972 -0
- alysis_code/cli_impl/config_menu.py +3882 -0
- alysis_code/cli_impl/forge.py +4509 -0
- alysis_code/cli_impl/forge_recovery.py +485 -0
- alysis_code/cli_impl/setup_wizard.py +2409 -0
- alysis_code/cli_impl/tui/__init__.py +58 -0
- alysis_code/cli_impl/tui/app.py +4551 -0
- alysis_code/cli_impl/tui/config.py +32 -0
- alysis_code/cli_impl/tui/config_flow.py +2754 -0
- alysis_code/cli_impl/tui/config_overlay.py +566 -0
- alysis_code/cli_impl/tui/content.py +78 -0
- alysis_code/cli_impl/tui/footer.py +218 -0
- alysis_code/cli_impl/tui/forge_status.py +136 -0
- alysis_code/cli_impl/tui/markdown.py +244 -0
- alysis_code/cli_impl/tui/owl.py +109 -0
- alysis_code/cli_impl/tui/plan_meta.py +477 -0
- alysis_code/cli_impl/tui/setup_app.py +519 -0
- alysis_code/cli_impl/tui/setup_flow.py +1622 -0
- alysis_code/cli_impl/tui/state.py +101 -0
- alysis_code/cli_impl/tui/subagent_identity.py +66 -0
- alysis_code/cli_impl/tui/subagent_panel.py +186 -0
- alysis_code/cli_impl/tui/surface.py +796 -0
- alysis_code/cli_impl/tui/transcript.py +514 -0
- alysis_code/cli_impl/tui/update_prompt.py +79 -0
- alysis_code/cli_impl/tui/workspace_guard.py +384 -0
- alysis_code/clipboard.py +172 -0
- alysis_code/code_review.py +1211 -0
- alysis_code/compaction/__init__.py +28 -0
- alysis_code/compaction/conversation_compactor.py +2932 -0
- alysis_code/compaction/importance.py +177 -0
- alysis_code/compaction/settings.py +297 -0
- alysis_code/compaction/tool_output_offload.py +447 -0
- alysis_code/config.py +3509 -0
- alysis_code/conflict_auto_resolver.py +895 -0
- alysis_code/context/__init__.py +1 -0
- alysis_code/context/tool_schema_budgeter.py +220 -0
- alysis_code/crash_diagnostics.py +282 -0
- alysis_code/custom_tools/README.md +34 -0
- alysis_code/custom_tools/__init__.py +43 -0
- alysis_code/custom_tools/discovery.py +903 -0
- alysis_code/custom_tools/runtime.py +1516 -0
- alysis_code/custom_tools/session.py +227 -0
- alysis_code/custom_tools/trust.py +232 -0
- alysis_code/diff_paths.py +113 -0
- alysis_code/direction_change.py +293 -0
- alysis_code/dispatch_timing.py +306 -0
- alysis_code/durable_service_manager.py +1236 -0
- alysis_code/edit_discipline.py +659 -0
- alysis_code/error_text.py +73 -0
- alysis_code/execution_budget.py +411 -0
- alysis_code/execution_context.py +915 -0
- alysis_code/execution_deadline.py +1065 -0
- alysis_code/execution_shared.py +1904 -0
- alysis_code/extensions/README.md +30 -0
- alysis_code/extensions/__init__.py +93 -0
- alysis_code/extensions/activation.py +138 -0
- alysis_code/extensions/install.py +1436 -0
- alysis_code/extensions/manifest.py +487 -0
- alysis_code/extensions/models.py +74 -0
- alysis_code/extensions/paths.py +56 -0
- alysis_code/extensions/registry.json +4 -0
- alysis_code/extensions/registry.py +52 -0
- alysis_code/extensions/state.py +83 -0
- alysis_code/extensions/workspace_trust.py +101 -0
- alysis_code/failed_task_evidence.py +369 -0
- alysis_code/failure_category.py +315 -0
- alysis_code/feedback_report.py +1647 -0
- alysis_code/file_classification.py +485 -0
- alysis_code/forge.py +2064 -0
- alysis_code/forge_completion.py +362 -0
- alysis_code/forge_events.py +475 -0
- alysis_code/frontmatter_utils.py +95 -0
- alysis_code/git_evidence.py +1181 -0
- alysis_code/git_ops.py +560 -0
- alysis_code/git_safe.py +62 -0
- alysis_code/git_worktrees.py +190 -0
- alysis_code/hooks/README.md +33 -0
- alysis_code/hooks/__init__.py +67 -0
- alysis_code/hooks/audit.py +171 -0
- alysis_code/hooks/config.py +225 -0
- alysis_code/hooks/dispatcher.py +1110 -0
- alysis_code/hooks/models.py +447 -0
- alysis_code/hooks/trust.py +202 -0
- alysis_code/host_actions.py +543 -0
- alysis_code/host_browser.py +103 -0
- alysis_code/ide/__init__.py +5 -0
- alysis_code/ide/activity_events.py +399 -0
- alysis_code/ide/approvals.py +337 -0
- alysis_code/ide/artifacts.py +153 -0
- alysis_code/ide/browser_egress_proxy.py +1076 -0
- alysis_code/ide/cdp_websocket_transport.py +1192 -0
- alysis_code/ide/change_ledger.py +1721 -0
- alysis_code/ide/context_blocks.py +979 -0
- alysis_code/ide/event_stream.py +531 -0
- alysis_code/ide/forge_protocol.py +3112 -0
- alysis_code/ide/forge_request_ledger.py +737 -0
- alysis_code/ide/health.py +965 -0
- alysis_code/ide/managed_browser.py +2251 -0
- alysis_code/ide/management_protocol.py +3414 -0
- alysis_code/ide/mcp_oauth_coordinator.py +744 -0
- alysis_code/ide/mcp_oauth_lifecycle.py +1504 -0
- alysis_code/ide/prompt_queue.py +1070 -0
- alysis_code/ide/protocol.py +191 -0
- alysis_code/ide/resumable_swarm.py +1543 -0
- alysis_code/ide/session_search.py +295 -0
- alysis_code/ide/stdio_bridge.py +9935 -0
- alysis_code/ide/structured_state.py +1579 -0
- alysis_code/ide/swarm_protocol.py +816 -0
- alysis_code/integration_gate.py +506 -0
- alysis_code/interactive_input_guard.py +39 -0
- alysis_code/interactive_plan_mode.py +26 -0
- alysis_code/internal_artifacts.py +179 -0
- alysis_code/knowledge_base.py +1409 -0
- alysis_code/knowledge_capture.py +1190 -0
- alysis_code/knowledge_librarian.py +605 -0
- alysis_code/language_policy.py +34 -0
- alysis_code/litellm_static_provider.py +535 -0
- alysis_code/llm/__init__.py +1 -0
- alysis_code/llm/anthropic_messages.py +2288 -0
- alysis_code/llm/base.py +71 -0
- alysis_code/llm/cache_capabilities.py +985 -0
- alysis_code/llm/cache_control_blocks.py +244 -0
- alysis_code/llm/cache_policy.py +388 -0
- alysis_code/llm/factory.py +373 -0
- alysis_code/llm/gemini_generate_content.py +2652 -0
- alysis_code/llm/gemini_interactions.py +739 -0
- alysis_code/llm/metadata.py +450 -0
- alysis_code/llm/openai_compat.py +2947 -0
- alysis_code/llm/openai_responses.py +2604 -0
- alysis_code/llm/protocols.py +609 -0
- alysis_code/llm/provider_limits.py +525 -0
- alysis_code/llm/request_plan.py +389 -0
- alysis_code/llm/request_shape.py +238 -0
- alysis_code/llm/streaming.py +108 -0
- alysis_code/llm/temperature_compat.py +78 -0
- alysis_code/llm/types.py +195 -0
- alysis_code/llm/usage_normalization.py +222 -0
- alysis_code/llm_error_display.py +315 -0
- alysis_code/logging_redaction.py +326 -0
- alysis_code/managed_host_deadline.py +196 -0
- alysis_code/mcp/README.md +33 -0
- alysis_code/mcp/__init__.py +24 -0
- alysis_code/mcp/client.py +1137 -0
- alysis_code/mcp/config.py +597 -0
- alysis_code/mcp/errors.py +113 -0
- alysis_code/mcp/forge_scope.py +154 -0
- alysis_code/mcp/jsonrpc.py +214 -0
- alysis_code/mcp/manager.py +2308 -0
- alysis_code/mcp/models.py +666 -0
- alysis_code/mcp/oauth.py +972 -0
- alysis_code/mcp/oauth_runtime.py +310 -0
- alysis_code/mcp/oauth_store.py +276 -0
- alysis_code/mcp/prompts.py +329 -0
- alysis_code/mcp/resources.py +295 -0
- alysis_code/mcp/roots.py +106 -0
- alysis_code/mcp/server_requests.py +75 -0
- alysis_code/mcp/token_store.py +859 -0
- alysis_code/mcp/transport_http.py +1338 -0
- alysis_code/mcp/transport_stdio.py +1267 -0
- alysis_code/mcp/untrusted_content.py +119 -0
- alysis_code/merge_conflict_reviewer.py +729 -0
- alysis_code/model_catalog/__init__.py +1 -0
- alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +186 -0
- alysis_code/model_catalog/litellm_model_prices_snapshot.json +44715 -0
- alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +17 -0
- alysis_code/model_metadata_policy.py +223 -0
- alysis_code/model_metadata_utils.py +103 -0
- alysis_code/model_registry.py +1420 -0
- alysis_code/model_router.py +147 -0
- alysis_code/permission_policy.py +1016 -0
- alysis_code/personas.py +451 -0
- alysis_code/pipeline_facts.py +233 -0
- alysis_code/plan_assistant.py +4763 -0
- alysis_code/plan_mode.py +393 -0
- alysis_code/plan_reconciliation.py +1228 -0
- alysis_code/plan_repair.py +652 -0
- alysis_code/plan_validation.py +1099 -0
- alysis_code/planning_constraints.py +904 -0
- alysis_code/policy.py +95 -0
- alysis_code/preview_server.py +457 -0
- alysis_code/process_reaping.py +566 -0
- alysis_code/profile_presets.py +1834 -0
- alysis_code/profiles.py +666 -0
- alysis_code/provider_auth/__init__.py +29 -0
- alysis_code/provider_auth/base.py +99 -0
- alysis_code/provider_auth/openai_codex.py +951 -0
- alysis_code/provider_auth/registry.py +76 -0
- alysis_code/provider_auth/store.py +125 -0
- alysis_code/provider_diagnostics.py +1209 -0
- alysis_code/provider_model_catalog.py +685 -0
- alysis_code/provider_telemetry.py +1699 -0
- alysis_code/provider_url.py +75 -0
- alysis_code/reasoning_contracts.py +911 -0
- alysis_code/remote_sync.py +350 -0
- alysis_code/replanning.py +1195 -0
- alysis_code/repo_scan.py +1152 -0
- alysis_code/request_estimation.py +296 -0
- alysis_code/review_gate.py +617 -0
- alysis_code/run_lock.py +1141 -0
- alysis_code/run_outcome.py +58 -0
- alysis_code/run_provenance.py +774 -0
- alysis_code/run_state.py +445 -0
- alysis_code/runtime_artifacts.py +116 -0
- alysis_code/runtime_context_features.py +78 -0
- alysis_code/runtime_kind.py +52 -0
- alysis_code/safety/__init__.py +11 -0
- alysis_code/safety/mcp_sanitize.py +29 -0
- alysis_code/safety/safe_http.py +297 -0
- alysis_code/safety/subagent_report.py +184 -0
- alysis_code/sandbox_doctor.py +682 -0
- alysis_code/sandbox_runner.py +1025 -0
- alysis_code/sandbox_settings.py +423 -0
- alysis_code/serialized_paths.py +355 -0
- alysis_code/server/__init__.py +3 -0
- alysis_code/server/app.py +367 -0
- alysis_code/server/auth.py +34 -0
- alysis_code/server/job_config.py +30 -0
- alysis_code/server/settings.py +215 -0
- alysis_code/server/store.py +193 -0
- alysis_code/server/worker_runner.py +657 -0
- alysis_code/service_persistence.py +355 -0
- alysis_code/session_artifacts.py +108 -0
- alysis_code/session_metrics.py +331 -0
- alysis_code/session_store.py +624 -0
- alysis_code/skills/README.md +34 -0
- alysis_code/skills/__init__.py +104 -0
- alysis_code/skills/conventions.py +84 -0
- alysis_code/skills/discovery.py +176 -0
- alysis_code/skills/eval_models.py +232 -0
- alysis_code/skills/eval_runner.py +372 -0
- alysis_code/skills/evals.py +1344 -0
- alysis_code/skills/install.py +293 -0
- alysis_code/skills/loader.py +118 -0
- alysis_code/skills/matching.py +103 -0
- alysis_code/skills/models.py +71 -0
- alysis_code/skills/paths.py +56 -0
- alysis_code/skills/prompting.py +500 -0
- alysis_code/skills/scaffold.py +142 -0
- alysis_code/skills/state.py +441 -0
- alysis_code/skills/transactions.py +125 -0
- alysis_code/skills/validation.py +304 -0
- alysis_code/step_budget.py +238 -0
- alysis_code/subagent_labels.py +49 -0
- alysis_code/subagents.py +1072 -0
- alysis_code/surface/__init__.py +80 -0
- alysis_code/surface/base.py +305 -0
- alysis_code/surface/console.py +387 -0
- alysis_code/surface/events.py +372 -0
- alysis_code/surface/hidden_surface.py +529 -0
- alysis_code/surface/noop_surface.py +219 -0
- alysis_code/surface/rich_surface.py +1555 -0
- alysis_code/surface/styles.py +67 -0
- alysis_code/surface/theme.py +455 -0
- alysis_code/surface/types.py +100 -0
- alysis_code/swarm_backend.py +926 -0
- alysis_code/swarm_orchestrator.py +4020 -0
- alysis_code/swarm_scheduler.py +441 -0
- alysis_code/swarm_trace.py +429 -0
- alysis_code/swarm_worker.py +2119 -0
- alysis_code/swarm_write_guard.py +348 -0
- alysis_code/task_dependencies.py +170 -0
- alysis_code/task_readiness.py +992 -0
- alysis_code/task_scope.py +2148 -0
- alysis_code/terminal_manager.py +762 -0
- alysis_code/terminal_ownership.py +460 -0
- alysis_code/text_normalization.py +30 -0
- alysis_code/token_budget.py +97 -0
- alysis_code/tools/README.md +34 -0
- alysis_code/tools/__init__.py +1 -0
- alysis_code/tools/artifacts.py +127 -0
- alysis_code/tools/availability.py +188 -0
- alysis_code/tools/fs.py +1456 -0
- alysis_code/tools/git.py +461 -0
- alysis_code/tools/history.py +229 -0
- alysis_code/tools/http_timeout.py +78 -0
- alysis_code/tools/image_generation.py +552 -0
- alysis_code/tools/registry.py +2936 -0
- alysis_code/tools/repo_map.py +476 -0
- alysis_code/tools/search.py +563 -0
- alysis_code/tools/shell.py +135 -0
- alysis_code/tools/symbols.py +1350 -0
- alysis_code/tools/test_discovery.py +643 -0
- alysis_code/tools/web.py +482 -0
- alysis_code/tools/web_search.py +2012 -0
- alysis_code/tools/web_search_dashscope.py +557 -0
- alysis_code/tools/web_search_ddgs.py +221 -0
- alysis_code/tools/web_search_provider_adapters.py +1429 -0
- alysis_code/tools/web_search_tavily.py +194 -0
- alysis_code/updates.py +933 -0
- alysis_code/usage_tracker.py +1990 -0
- alysis_code/verification_command_analysis.py +1004 -0
- alysis_code/verification_contract.py +574 -0
- alysis_code/verification_failure_summary.py +273 -0
- alysis_code/verification_repair.py +385 -0
- alysis_code/verify_gate.py +3129 -0
- alysis_code/web_research.py +1872 -0
- alysis_code/web_search_adapters.py +66 -0
- alysis_code/web_search_policy.py +27 -0
- alysis_code/workspace_binding.py +389 -0
- alysis_code/workspace_binding_ui.py +408 -0
- alysis_code/workspace_context.py +273 -0
- alysis_code/workspace_isolation.py +138 -0
- alysis_code/workspace_provisioning.py +455 -0
- alysis_code-0.13.0.dist-info/METADATA +507 -0
- alysis_code-0.13.0.dist-info/RECORD +458 -0
- alysis_code-0.13.0.dist-info/WHEEL +4 -0
- alysis_code-0.13.0.dist-info/entry_points.txt +3 -0
- alysis_code-0.13.0.dist-info/licenses/LICENSE +176 -0
- alysis_code-0.13.0.dist-info/licenses/NOTICE +4 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable, Iterable, Sequence
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from prompt_toolkit.completion import Completer, Completion
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(frozen=True)
|
|
11
|
+
class ChatSlashCommandSpec:
|
|
12
|
+
name: str
|
|
13
|
+
usage: str
|
|
14
|
+
description: str
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class _ChatSlashCompletionSpec:
|
|
19
|
+
completion: str
|
|
20
|
+
usage: str
|
|
21
|
+
description: str
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
_DISPLAY_WIDTH = 72
|
|
25
|
+
_USAGE_COLUMN = 34
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _ellipsize(text: str, limit: int) -> str:
|
|
29
|
+
clean = " ".join(str(text or "").split())
|
|
30
|
+
limit = max(1, int(limit))
|
|
31
|
+
if len(clean) <= limit:
|
|
32
|
+
return clean
|
|
33
|
+
if limit <= 3:
|
|
34
|
+
return "." * limit
|
|
35
|
+
return clean[: limit - 3].rstrip() + "..."
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _completion_display(
|
|
39
|
+
usage: str,
|
|
40
|
+
description: str,
|
|
41
|
+
*,
|
|
42
|
+
width: int = _DISPLAY_WIDTH,
|
|
43
|
+
) -> str:
|
|
44
|
+
"""Return one bounded completion row for prompt_toolkit's menu."""
|
|
45
|
+
width = max(8, int(width))
|
|
46
|
+
usage_text = " ".join(str(usage or "").split())
|
|
47
|
+
desc_text = " ".join(str(description or "").split())
|
|
48
|
+
if width <= _USAGE_COLUMN + 1:
|
|
49
|
+
return _ellipsize(usage_text, width)
|
|
50
|
+
usage_cell = _ellipsize(usage_text, _USAGE_COLUMN)
|
|
51
|
+
prefix = f"{usage_cell:<{_USAGE_COLUMN}} "
|
|
52
|
+
remaining = max(1, width - len(prefix))
|
|
53
|
+
return (prefix + _ellipsize(desc_text, remaining))[:width]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
SPECS: tuple[ChatSlashCommandSpec, ...] = (
|
|
57
|
+
ChatSlashCommandSpec("help", "/help", "Show available commands"),
|
|
58
|
+
ChatSlashCommandSpec("mode", "/mode", "Change execution mode"),
|
|
59
|
+
ChatSlashCommandSpec("persona", "/persona", "Switch persona: code, architect, ask, debug"),
|
|
60
|
+
ChatSlashCommandSpec("ask", "/ask <question>", "One read-only turn; mode restored after"),
|
|
61
|
+
ChatSlashCommandSpec("status", "/status", "Show session status"),
|
|
62
|
+
ChatSlashCommandSpec("subagents", "/subagents", "Open an active subagent run"),
|
|
63
|
+
ChatSlashCommandSpec("terminals", "/terminals [list|show|kill]", "Manage background processes"),
|
|
64
|
+
ChatSlashCommandSpec("pwd", "/pwd", "Show active workdir"),
|
|
65
|
+
ChatSlashCommandSpec("usage", "/usage", "Token count & cost; /usage hud on|off toggles HUD"),
|
|
66
|
+
ChatSlashCommandSpec("context", "/context", "Show context usage"),
|
|
67
|
+
ChatSlashCommandSpec("compact", "/compact [focus]", "Force conversation compaction"),
|
|
68
|
+
ChatSlashCommandSpec("clear", "/clear", "Wipe conversation; keep session id and log"),
|
|
69
|
+
ChatSlashCommandSpec("resume", "/resume [id]", "Resume a previous session"),
|
|
70
|
+
ChatSlashCommandSpec("stream", "/stream", "Toggle live answer and reasoning output"),
|
|
71
|
+
ChatSlashCommandSpec("trace", "/trace", "Set reasoning trace detail"),
|
|
72
|
+
ChatSlashCommandSpec("config", "/config", "Open or show configuration"),
|
|
73
|
+
ChatSlashCommandSpec("login", "/login", "Connect your Alysis Code account or a subscription"),
|
|
74
|
+
ChatSlashCommandSpec("logout", "/logout", "Disconnect your Alysis Code account"),
|
|
75
|
+
ChatSlashCommandSpec("toolbar", "/toolbar", "Configure status toolbar"),
|
|
76
|
+
ChatSlashCommandSpec("assets", "/assets", "Open Forge assets"),
|
|
77
|
+
ChatSlashCommandSpec("image", "/image [path]", "Queue an image for the next message"),
|
|
78
|
+
ChatSlashCommandSpec("forge", "/forge [resume]", "Enter or resume Forge"),
|
|
79
|
+
ChatSlashCommandSpec("report", "/report [text]", "Create feedback bundle and issue draft"),
|
|
80
|
+
ChatSlashCommandSpec("feedback", "/feedback [text]", "Alias for /report"),
|
|
81
|
+
ChatSlashCommandSpec("plan", "/plan <task>", "Draft, review, approve, then execute"),
|
|
82
|
+
ChatSlashCommandSpec(
|
|
83
|
+
"skill",
|
|
84
|
+
"/skill",
|
|
85
|
+
"No args lists; <name> shows info; <name> <task> attaches",
|
|
86
|
+
),
|
|
87
|
+
ChatSlashCommandSpec("exit", "/exit", "Exit chat"),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
FORGE_SPECS: tuple[ChatSlashCommandSpec, ...] = (
|
|
91
|
+
ChatSlashCommandSpec("assistant", "/assistant on|off|status", "Toggle planner assistant"),
|
|
92
|
+
ChatSlashCommandSpec("execute", "/execute plan", "Run scoped planned tasks"),
|
|
93
|
+
ChatSlashCommandSpec("goal", "/goal <text>", "Set project goal"),
|
|
94
|
+
ChatSlashCommandSpec("task", "/task <title>", "Add a task to the plan"),
|
|
95
|
+
ChatSlashCommandSpec("show", "/show", "Show the current plan summary"),
|
|
96
|
+
ChatSlashCommandSpec("done", "/done", "Save and validate the plan"),
|
|
97
|
+
ChatSlashCommandSpec("back", "/back", "Return to chat without finalizing"),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
_SHARED_NESTED_SPECS: tuple[_ChatSlashCompletionSpec, ...] = (
|
|
101
|
+
_ChatSlashCompletionSpec("/usage hud", "/usage hud", "Open usage HUD controls"),
|
|
102
|
+
_ChatSlashCompletionSpec("/usage hud on", "/usage hud on", "Enable the persistent usage HUD"),
|
|
103
|
+
_ChatSlashCompletionSpec(
|
|
104
|
+
"/usage hud off", "/usage hud off", "Disable the persistent usage HUD"
|
|
105
|
+
),
|
|
106
|
+
_ChatSlashCompletionSpec(
|
|
107
|
+
"/usage hud status", "/usage hud status", "Show the current usage HUD state"
|
|
108
|
+
),
|
|
109
|
+
_ChatSlashCompletionSpec("/terminals list", "/terminals list", "List background processes"),
|
|
110
|
+
_ChatSlashCompletionSpec(
|
|
111
|
+
"/terminals show", "/terminals show <process_id>", "Show background process output"
|
|
112
|
+
),
|
|
113
|
+
_ChatSlashCompletionSpec(
|
|
114
|
+
"/terminals kill", "/terminals kill <process_id>", "Kill a background process"
|
|
115
|
+
),
|
|
116
|
+
_ChatSlashCompletionSpec("/terminals help", "/terminals help", "Show terminal command usage"),
|
|
117
|
+
_ChatSlashCompletionSpec("/stream on", "/stream on", "Render model output live"),
|
|
118
|
+
_ChatSlashCompletionSpec("/stream off", "/stream off", "Buffer model output until complete"),
|
|
119
|
+
_ChatSlashCompletionSpec(
|
|
120
|
+
"/stream status", "/stream status", "Show the current streaming setting"
|
|
121
|
+
),
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
_CHAT_NESTED_SPECS: tuple[_ChatSlashCompletionSpec, ...] = (
|
|
125
|
+
_ChatSlashCompletionSpec("/forge resume", "/forge resume", "Resume the current run pointer"),
|
|
126
|
+
_ChatSlashCompletionSpec("/plan mode", "/plan mode", "Enter persistent readonly planning"),
|
|
127
|
+
_ChatSlashCompletionSpec("/plan approve", "/plan approve", "Execute the stored plan draft"),
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
_FORGE_NESTED_SPECS: tuple[_ChatSlashCompletionSpec, ...] = (
|
|
131
|
+
_ChatSlashCompletionSpec("/execute plan", "/execute plan", "Run scoped planned tasks"),
|
|
132
|
+
_ChatSlashCompletionSpec(
|
|
133
|
+
"/plan markdown", "/plan markdown", "Preview PLAN.md for the current run"
|
|
134
|
+
),
|
|
135
|
+
_ChatSlashCompletionSpec("/plan md", "/plan md", "Preview PLAN.md for the current run"),
|
|
136
|
+
_ChatSlashCompletionSpec("/plan edit", "/plan edit", "Edit plan.json and reload Forge state"),
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def get_chat_specs() -> tuple[ChatSlashCommandSpec, ...]:
|
|
141
|
+
return SPECS
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def get_forge_specs() -> tuple[ChatSlashCommandSpec, ...]:
|
|
145
|
+
return FORGE_SPECS
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def max_completions_for_mode(mode: str) -> int:
|
|
149
|
+
"""Return the largest static slash completion list for one menu in this mode."""
|
|
150
|
+
|
|
151
|
+
normalized = str(mode or "chat").strip().lower()
|
|
152
|
+
if normalized == "forge":
|
|
153
|
+
top_level_count = len([spec for spec in SPECS if spec.name not in {"clear", "forge"}])
|
|
154
|
+
top_level_count += len(FORGE_SPECS)
|
|
155
|
+
nested_count = len(_SHARED_NESTED_SPECS) + len(_FORGE_NESTED_SPECS)
|
|
156
|
+
return max(top_level_count, nested_count)
|
|
157
|
+
|
|
158
|
+
top_level_count = len(SPECS)
|
|
159
|
+
nested_count = len(_SHARED_NESTED_SPECS) + len(_CHAT_NESTED_SPECS)
|
|
160
|
+
return max(top_level_count, nested_count)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class ChatSlashCompleter(Completer):
|
|
164
|
+
def __init__(
|
|
165
|
+
self,
|
|
166
|
+
*,
|
|
167
|
+
mode_provider: Callable[[], str],
|
|
168
|
+
skill_names_provider: Callable[[], Sequence[str]] | None = None,
|
|
169
|
+
) -> None:
|
|
170
|
+
self._mode_provider = mode_provider
|
|
171
|
+
self._skill_names_provider = skill_names_provider
|
|
172
|
+
|
|
173
|
+
def get_completions(self, document: Any, complete_event: Any) -> Iterable[Completion]:
|
|
174
|
+
del complete_event
|
|
175
|
+
text = str(getattr(document, "text_before_cursor", "") or "")
|
|
176
|
+
if not text.startswith("/"):
|
|
177
|
+
return
|
|
178
|
+
completions = self._matching_completions(text)
|
|
179
|
+
for spec in completions:
|
|
180
|
+
yield Completion(
|
|
181
|
+
text=spec.completion,
|
|
182
|
+
start_position=-len(text),
|
|
183
|
+
display=_completion_display(spec.usage, spec.description),
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
def _matching_completions(self, text: str) -> list[_ChatSlashCompletionSpec]:
|
|
187
|
+
entries = self._completion_entries_for_text(text)
|
|
188
|
+
text_lower = text.lower()
|
|
189
|
+
matches = [entry for entry in entries if entry.completion.lower().startswith(text_lower)]
|
|
190
|
+
exact = [entry for entry in matches if entry.completion.lower() == text_lower]
|
|
191
|
+
inexact = [entry for entry in matches if entry.completion.lower() != text_lower]
|
|
192
|
+
return [*exact, *inexact]
|
|
193
|
+
|
|
194
|
+
def _completion_entries_for_text(self, text: str) -> list[_ChatSlashCompletionSpec]:
|
|
195
|
+
if " " not in text[1:]:
|
|
196
|
+
return self._top_level_entries()
|
|
197
|
+
return self._nested_entries(text)
|
|
198
|
+
|
|
199
|
+
def _top_level_entries(self) -> list[_ChatSlashCompletionSpec]:
|
|
200
|
+
specs = list(get_chat_specs())
|
|
201
|
+
if self._mode() == "forge":
|
|
202
|
+
specs = [spec for spec in specs if spec.name not in {"clear", "forge"}]
|
|
203
|
+
specs.extend(get_forge_specs())
|
|
204
|
+
return [
|
|
205
|
+
_ChatSlashCompletionSpec(
|
|
206
|
+
completion=f"/{spec.name}",
|
|
207
|
+
usage=spec.usage,
|
|
208
|
+
description=spec.description,
|
|
209
|
+
)
|
|
210
|
+
for spec in specs
|
|
211
|
+
]
|
|
212
|
+
|
|
213
|
+
def _nested_entries(self, text: str) -> list[_ChatSlashCompletionSpec]:
|
|
214
|
+
entries = list(_SHARED_NESTED_SPECS)
|
|
215
|
+
if self._mode() == "forge":
|
|
216
|
+
entries.extend(_FORGE_NESTED_SPECS)
|
|
217
|
+
else:
|
|
218
|
+
entries.extend(_CHAT_NESTED_SPECS)
|
|
219
|
+
lower = text.lower()
|
|
220
|
+
if lower.startswith("/skill "):
|
|
221
|
+
entries.extend(self._skill_name_entries())
|
|
222
|
+
return entries
|
|
223
|
+
|
|
224
|
+
def _skill_name_entries(self) -> list[_ChatSlashCompletionSpec]:
|
|
225
|
+
names = self._safe_names(self._skill_names_provider)
|
|
226
|
+
return [
|
|
227
|
+
_ChatSlashCompletionSpec(
|
|
228
|
+
completion=f"/skill {name}",
|
|
229
|
+
usage=f"/skill {name} [task]",
|
|
230
|
+
description="Show skill info or attach it for one turn",
|
|
231
|
+
)
|
|
232
|
+
for name in names
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
@staticmethod
|
|
236
|
+
def _safe_names(provider: Callable[[], Sequence[str]] | None) -> list[str]:
|
|
237
|
+
if provider is None:
|
|
238
|
+
return []
|
|
239
|
+
try:
|
|
240
|
+
values = provider()
|
|
241
|
+
except Exception:
|
|
242
|
+
return []
|
|
243
|
+
seen: set[str] = set()
|
|
244
|
+
ordered: list[str] = []
|
|
245
|
+
for value in values:
|
|
246
|
+
name = str(value or "").strip()
|
|
247
|
+
if not name or name in seen:
|
|
248
|
+
continue
|
|
249
|
+
seen.add(name)
|
|
250
|
+
ordered.append(name)
|
|
251
|
+
return ordered
|
|
252
|
+
|
|
253
|
+
def _mode(self) -> str:
|
|
254
|
+
try:
|
|
255
|
+
mode = str(self._mode_provider() or "chat").strip().lower()
|
|
256
|
+
except Exception:
|
|
257
|
+
return "chat"
|
|
258
|
+
return "forge" if mode == "forge" else "chat"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from typing import TypeVar
|
|
5
|
+
|
|
6
|
+
_T = TypeVar("_T")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _patchable(name: str, default: _T) -> _T:
|
|
10
|
+
module = sys.modules.get("alysis_code.cli")
|
|
11
|
+
return getattr(module, name, default) if module is not None else default
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import io
|
|
4
|
+
import shutil
|
|
5
|
+
import sys
|
|
6
|
+
from enum import StrEnum
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import TYPE_CHECKING, Any
|
|
9
|
+
|
|
10
|
+
from click import get_current_context
|
|
11
|
+
|
|
12
|
+
from ...forge_events import machine_output_active
|
|
13
|
+
from ...surface.console import make_console
|
|
14
|
+
from ...workspace_context import resolve_workspace_context
|
|
15
|
+
from . import _patchable
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from rich.console import Console
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Mode(StrEnum):
|
|
22
|
+
review = "review"
|
|
23
|
+
auto = "auto"
|
|
24
|
+
readonly = "readonly"
|
|
25
|
+
fullaccess = "fullaccess"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _Table(*args: Any, **kwargs: Any) -> Any:
|
|
29
|
+
from rich.table import Table
|
|
30
|
+
|
|
31
|
+
return Table(*args, **kwargs)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class _DiscardStream(io.TextIOBase):
|
|
35
|
+
"""Sink for Rich output while stdout belongs to the machine event stream."""
|
|
36
|
+
|
|
37
|
+
encoding = "utf-8"
|
|
38
|
+
|
|
39
|
+
def write(self, text: str) -> int: # type: ignore[override]
|
|
40
|
+
return len(text)
|
|
41
|
+
|
|
42
|
+
def isatty(self) -> bool:
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _quiet_console() -> Console:
|
|
47
|
+
return make_console(
|
|
48
|
+
file=_DiscardStream(),
|
|
49
|
+
force_terminal=False,
|
|
50
|
+
no_color=True,
|
|
51
|
+
width=_terminal_width(),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _console() -> Console:
|
|
56
|
+
# In machine mode stdout carries NDJSON only, so Rich renders into a sink instead.
|
|
57
|
+
# Deep execution code keeps printing through the console it was handed; nothing
|
|
58
|
+
# below this point needs to know which mode it is in.
|
|
59
|
+
if machine_output_active():
|
|
60
|
+
return _quiet_console()
|
|
61
|
+
return make_console(width=_terminal_width())
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _terminal_width(default: int = 120) -> int:
|
|
65
|
+
try:
|
|
66
|
+
ctx = get_current_context(silent=True)
|
|
67
|
+
except RuntimeError:
|
|
68
|
+
ctx = None
|
|
69
|
+
if ctx is not None:
|
|
70
|
+
ctx_width = getattr(ctx, "terminal_width", None)
|
|
71
|
+
if isinstance(ctx_width, int) and ctx_width > 0:
|
|
72
|
+
return ctx_width
|
|
73
|
+
max_content_width = getattr(ctx, "max_content_width", None)
|
|
74
|
+
if isinstance(max_content_width, int) and max_content_width > 0:
|
|
75
|
+
return max_content_width
|
|
76
|
+
stdout = getattr(sys, "stdout", None)
|
|
77
|
+
if stdout is None or not getattr(stdout, "isatty", lambda: False)():
|
|
78
|
+
return default
|
|
79
|
+
try:
|
|
80
|
+
return shutil.get_terminal_size((default, 40)).columns
|
|
81
|
+
except OSError:
|
|
82
|
+
return default
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _resolve_tool_workspace_root(*, path: Path) -> Path:
|
|
86
|
+
workspace_context = _patchable("resolve_workspace_context", resolve_workspace_context)(
|
|
87
|
+
path.expanduser().resolve()
|
|
88
|
+
)
|
|
89
|
+
return workspace_context.workspace_root
|