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,137 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Collection, Iterator
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class CapabilityDefinition:
|
|
10
|
+
"""A user-meaningful capability whose readiness is controlled by runtime state."""
|
|
11
|
+
|
|
12
|
+
name: str
|
|
13
|
+
description: str
|
|
14
|
+
config_path: tuple[str, ...]
|
|
15
|
+
required_tool_names: tuple[str, ...] = ()
|
|
16
|
+
success_event_types: tuple[str, ...] = ()
|
|
17
|
+
success_tool_names: tuple[str, ...] = ()
|
|
18
|
+
minimum_success_tool_events: int = 0
|
|
19
|
+
materializes_artifacts: bool = False
|
|
20
|
+
disabled_reason: str = "This capability is disabled for this session."
|
|
21
|
+
disabled_resolution: str = "Enable the capability and start a new chat session."
|
|
22
|
+
unavailable_in_mode_reason: str = "This capability is unavailable in the current mode."
|
|
23
|
+
unavailable_in_mode_resolution: str = "Switch to a write-capable mode and retry."
|
|
24
|
+
unavailable_in_mode_requires_new_session: bool = False
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(frozen=True)
|
|
28
|
+
class CapabilityStatus:
|
|
29
|
+
name: str
|
|
30
|
+
available: bool
|
|
31
|
+
reason_code: str | None = None
|
|
32
|
+
reason: str | None = None
|
|
33
|
+
resolution: str | None = None
|
|
34
|
+
requires_new_session: bool = False
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
_CAPABILITY_DEFINITIONS: tuple[CapabilityDefinition, ...] = (
|
|
38
|
+
CapabilityDefinition(
|
|
39
|
+
name="external_research",
|
|
40
|
+
description=("Research dependency and framework behavior with the configured web tools."),
|
|
41
|
+
config_path=("web_tools_enabled",),
|
|
42
|
+
required_tool_names=("web_fetch", "web_search"),
|
|
43
|
+
success_tool_names=("web_fetch", "web_search"),
|
|
44
|
+
minimum_success_tool_events=1,
|
|
45
|
+
disabled_reason="External research is disabled for this session.",
|
|
46
|
+
disabled_resolution=("Enable web tools and web search, then start a new chat session."),
|
|
47
|
+
unavailable_in_mode_reason=(
|
|
48
|
+
"External research is unavailable because this session does not expose "
|
|
49
|
+
"both web_fetch and web_search."
|
|
50
|
+
),
|
|
51
|
+
unavailable_in_mode_resolution=(
|
|
52
|
+
"Configure web search and enable web tools, then start a new chat session."
|
|
53
|
+
),
|
|
54
|
+
unavailable_in_mode_requires_new_session=True,
|
|
55
|
+
),
|
|
56
|
+
CapabilityDefinition(
|
|
57
|
+
name="image_generation",
|
|
58
|
+
description=(
|
|
59
|
+
"Create production raster images and save validated image files in the workspace."
|
|
60
|
+
),
|
|
61
|
+
config_path=("image_generation", "enabled"),
|
|
62
|
+
required_tool_names=("image_generate",),
|
|
63
|
+
success_event_types=("image_generated",),
|
|
64
|
+
materializes_artifacts=True,
|
|
65
|
+
disabled_reason="Image generation is disabled for this session.",
|
|
66
|
+
disabled_resolution=(
|
|
67
|
+
"Set an image-provider credential, run "
|
|
68
|
+
"`alysis config set image_generation.enabled true`, then start a new chat session."
|
|
69
|
+
),
|
|
70
|
+
unavailable_in_mode_reason=(
|
|
71
|
+
"Image generation is not available in the current session mode."
|
|
72
|
+
),
|
|
73
|
+
unavailable_in_mode_resolution=(
|
|
74
|
+
"Switch to `review`, `auto`, or `fullaccess` mode and retry."
|
|
75
|
+
),
|
|
76
|
+
),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
_CAPABILITY_BY_NAME = {definition.name: definition for definition in _CAPABILITY_DEFINITIONS}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def iter_capability_definitions() -> Iterator[CapabilityDefinition]:
|
|
83
|
+
return iter(_CAPABILITY_DEFINITIONS)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def get_capability_definition(name: str) -> CapabilityDefinition | None:
|
|
87
|
+
return _CAPABILITY_BY_NAME.get(str(name or "").strip().casefold())
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _config_flag(cfg: Any, path: tuple[str, ...]) -> bool:
|
|
91
|
+
current = cfg
|
|
92
|
+
for segment in path:
|
|
93
|
+
if current is None:
|
|
94
|
+
return False
|
|
95
|
+
current = getattr(current, segment, None)
|
|
96
|
+
return bool(current)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def resolve_capability_status(
|
|
100
|
+
name: str,
|
|
101
|
+
*,
|
|
102
|
+
cfg: Any,
|
|
103
|
+
available_tool_names: Collection[str] | None = None,
|
|
104
|
+
) -> CapabilityStatus:
|
|
105
|
+
definition = get_capability_definition(name)
|
|
106
|
+
clean_name = str(name or "").strip().casefold()
|
|
107
|
+
if definition is None:
|
|
108
|
+
return CapabilityStatus(
|
|
109
|
+
name=clean_name,
|
|
110
|
+
available=False,
|
|
111
|
+
reason_code="unknown_capability",
|
|
112
|
+
reason=f"Unknown capability: {clean_name or '(empty)'}.",
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if not _config_flag(cfg, definition.config_path):
|
|
116
|
+
return CapabilityStatus(
|
|
117
|
+
name=definition.name,
|
|
118
|
+
available=False,
|
|
119
|
+
reason_code="capability_disabled",
|
|
120
|
+
reason=definition.disabled_reason,
|
|
121
|
+
resolution=definition.disabled_resolution,
|
|
122
|
+
requires_new_session=True,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if available_tool_names is not None and definition.required_tool_names:
|
|
126
|
+
available = {str(item or "").strip() for item in available_tool_names}
|
|
127
|
+
if any(tool_name not in available for tool_name in definition.required_tool_names):
|
|
128
|
+
return CapabilityStatus(
|
|
129
|
+
name=definition.name,
|
|
130
|
+
available=False,
|
|
131
|
+
reason_code="capability_unavailable_in_mode",
|
|
132
|
+
reason=definition.unavailable_in_mode_reason,
|
|
133
|
+
resolution=definition.unavailable_in_mode_resolution,
|
|
134
|
+
requires_new_session=definition.unavailable_in_mode_requires_new_session,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
return CapabilityStatus(name=definition.name, available=True)
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from functools import lru_cache
|
|
6
|
+
from importlib import resources
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from .model_metadata_utils import parse_positive_int
|
|
10
|
+
|
|
11
|
+
CHATGPT_CODEX_SUBSCRIPTION_CATALOG_SOURCE = "bundled_chatgpt_codex_subscription_snapshot"
|
|
12
|
+
_CATALOG_PACKAGE = "alysis_code.model_catalog"
|
|
13
|
+
_CATALOG_FILENAME = "chatgpt_codex_subscription_snapshot.json"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True, slots=True)
|
|
17
|
+
class ChatGPTCodexStaticModel:
|
|
18
|
+
id: str
|
|
19
|
+
label: str
|
|
20
|
+
description: str
|
|
21
|
+
priority: int
|
|
22
|
+
context_window_tokens: int | None
|
|
23
|
+
max_output_tokens: int | None
|
|
24
|
+
input_modalities: tuple[str, ...]
|
|
25
|
+
reasoning_efforts: tuple[tuple[str, str], ...]
|
|
26
|
+
default_reasoning_effort: str | None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _clean_string(value: Any) -> str:
|
|
30
|
+
return str(value or "").strip()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _parse_model(raw: Any) -> ChatGPTCodexStaticModel | None:
|
|
34
|
+
if not isinstance(raw, dict):
|
|
35
|
+
return None
|
|
36
|
+
model_id = _clean_string(raw.get("id"))
|
|
37
|
+
if not model_id:
|
|
38
|
+
return None
|
|
39
|
+
try:
|
|
40
|
+
priority = int(raw.get("priority") or 9999)
|
|
41
|
+
except (TypeError, ValueError):
|
|
42
|
+
priority = 9999
|
|
43
|
+
|
|
44
|
+
modalities_raw = raw.get("input_modalities")
|
|
45
|
+
modalities = (
|
|
46
|
+
tuple(
|
|
47
|
+
dict.fromkeys(
|
|
48
|
+
_clean_string(item).casefold() for item in modalities_raw if _clean_string(item)
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
if isinstance(modalities_raw, list)
|
|
52
|
+
else ()
|
|
53
|
+
)
|
|
54
|
+
if not modalities:
|
|
55
|
+
modalities = ("text",)
|
|
56
|
+
|
|
57
|
+
efforts: list[tuple[str, str]] = []
|
|
58
|
+
efforts_raw = raw.get("reasoning_efforts")
|
|
59
|
+
if isinstance(efforts_raw, list):
|
|
60
|
+
for item in efforts_raw:
|
|
61
|
+
if not isinstance(item, dict):
|
|
62
|
+
continue
|
|
63
|
+
effort_id = _clean_string(item.get("id"))
|
|
64
|
+
if effort_id:
|
|
65
|
+
efforts.append((effort_id, _clean_string(item.get("description"))))
|
|
66
|
+
|
|
67
|
+
default_effort = _clean_string(raw.get("default_reasoning_effort")) or None
|
|
68
|
+
return ChatGPTCodexStaticModel(
|
|
69
|
+
id=model_id,
|
|
70
|
+
label=_clean_string(raw.get("label")) or model_id,
|
|
71
|
+
description=_clean_string(raw.get("description")),
|
|
72
|
+
priority=priority,
|
|
73
|
+
context_window_tokens=parse_positive_int(raw.get("context_window_tokens")),
|
|
74
|
+
max_output_tokens=parse_positive_int(raw.get("max_output_tokens")),
|
|
75
|
+
input_modalities=modalities,
|
|
76
|
+
reasoning_efforts=tuple(efforts),
|
|
77
|
+
default_reasoning_effort=default_effort,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@lru_cache(maxsize=1)
|
|
82
|
+
def load_chatgpt_codex_static_models() -> tuple[ChatGPTCodexStaticModel, ...]:
|
|
83
|
+
try:
|
|
84
|
+
text = (
|
|
85
|
+
resources.files(_CATALOG_PACKAGE)
|
|
86
|
+
.joinpath(_CATALOG_FILENAME)
|
|
87
|
+
.read_text(encoding="utf-8")
|
|
88
|
+
)
|
|
89
|
+
payload = json.loads(text)
|
|
90
|
+
except (
|
|
91
|
+
FileNotFoundError,
|
|
92
|
+
ModuleNotFoundError,
|
|
93
|
+
OSError,
|
|
94
|
+
UnicodeDecodeError,
|
|
95
|
+
json.JSONDecodeError,
|
|
96
|
+
):
|
|
97
|
+
return ()
|
|
98
|
+
if not isinstance(payload, dict):
|
|
99
|
+
return ()
|
|
100
|
+
if payload.get("source") != CHATGPT_CODEX_SUBSCRIPTION_CATALOG_SOURCE:
|
|
101
|
+
return ()
|
|
102
|
+
raw_models = payload.get("models")
|
|
103
|
+
if not isinstance(raw_models, list):
|
|
104
|
+
return ()
|
|
105
|
+
models = tuple(model for raw in raw_models if (model := _parse_model(raw)) is not None)
|
|
106
|
+
return tuple(
|
|
107
|
+
sorted(models, key=lambda model: (model.priority, model.label.casefold(), model.id))
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def resolve_chatgpt_codex_static_model(model_name: str) -> ChatGPTCodexStaticModel | None:
|
|
112
|
+
requested = _clean_string(model_name).casefold()
|
|
113
|
+
if not requested:
|
|
114
|
+
return None
|
|
115
|
+
candidates = {requested}
|
|
116
|
+
if "/" in requested:
|
|
117
|
+
candidates.add(requested.rsplit("/", 1)[-1])
|
|
118
|
+
return next(
|
|
119
|
+
(
|
|
120
|
+
model
|
|
121
|
+
for model in load_chatgpt_codex_static_models()
|
|
122
|
+
if model.id.casefold() in candidates
|
|
123
|
+
),
|
|
124
|
+
None,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
__all__ = [
|
|
129
|
+
"CHATGPT_CODEX_SUBSCRIPTION_CATALOG_SOURCE",
|
|
130
|
+
"ChatGPTCodexStaticModel",
|
|
131
|
+
"load_chatgpt_codex_static_models",
|
|
132
|
+
"resolve_chatgpt_codex_static_model",
|
|
133
|
+
]
|
alysis_code/cli.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# ruff: noqa: F401,F403,F405,E402
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def _harden_stdio() -> None:
|
|
6
|
+
"""Make stdout/stderr tolerant of glyphs the console encoding can't map
|
|
7
|
+
(e.g. the rich UI's box-drawing ``│`` on a non-UTF-8 Windows console such as
|
|
8
|
+
Greek cp1253), so the first surfaced warning/error no longer crashes with
|
|
9
|
+
UnicodeEncodeError. ``backslashreplace`` degrades an unmappable glyph to a
|
|
10
|
+
readable escape instead of aborting. We change only the error handler, not
|
|
11
|
+
the encoding, so redirected/piped output keeps its locale codec for
|
|
12
|
+
downstream readers. Runs once at process start, before any output."""
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
for stream in (sys.stdout, sys.stderr):
|
|
16
|
+
reconfigure = getattr(stream, "reconfigure", None)
|
|
17
|
+
if reconfigure is None:
|
|
18
|
+
continue
|
|
19
|
+
try:
|
|
20
|
+
reconfigure(errors="backslashreplace")
|
|
21
|
+
except (ValueError, OSError): # detached buffer / unsupported stream
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
_harden_stdio()
|
|
26
|
+
|
|
27
|
+
# Source-alignment markers for checks that read this legacy entrypoint after the
|
|
28
|
+
# command implementation moved into cli_impl/commands.
|
|
29
|
+
# Chat command marker: "/forge"
|
|
30
|
+
# Prompt hotkey marker: @kb.add("c-b")
|
|
31
|
+
from .cli_impl.commands.cli_surface import *
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def legacy_app() -> None:
|
|
35
|
+
"""Entry point for the deprecated ``sylliptor`` command.
|
|
36
|
+
|
|
37
|
+
Behaves identically to ``alysis``; the only difference is a notice on
|
|
38
|
+
stderr, so piping stdout to another program is unaffected.
|
|
39
|
+
"""
|
|
40
|
+
import sys as _sys
|
|
41
|
+
|
|
42
|
+
print(
|
|
43
|
+
"note: 'sylliptor' has been renamed to 'alysis'. This alias still works "
|
|
44
|
+
"but will be removed in a future release.",
|
|
45
|
+
file=_sys.stderr,
|
|
46
|
+
)
|
|
47
|
+
app()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
if __name__ == "__main__":
|
|
51
|
+
app()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Internal CLI implementation modules."""
|