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,263 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
import re
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Literal, cast
|
|
7
|
+
|
|
8
|
+
from ..config import AppConfig
|
|
9
|
+
from ..surface.console import redact_console_text
|
|
10
|
+
from .base import RuntimeTurnRequest, RuntimeTurnResult
|
|
11
|
+
from .service import (
|
|
12
|
+
RuntimeConnectionError,
|
|
13
|
+
run_runtime_turn,
|
|
14
|
+
runtime_connection_snapshot,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def validate_delegated_cli_options(
|
|
19
|
+
*,
|
|
20
|
+
base_url: str | None,
|
|
21
|
+
temperature: float | None,
|
|
22
|
+
max_steps: int | None,
|
|
23
|
+
subagents: bool | None,
|
|
24
|
+
verify_cmd: list[str] | None,
|
|
25
|
+
api_key_env: str | None,
|
|
26
|
+
api_key_stdin: bool,
|
|
27
|
+
api_key: str | None,
|
|
28
|
+
stream: bool | None = None,
|
|
29
|
+
yes: bool = False,
|
|
30
|
+
benchmark: bool = False,
|
|
31
|
+
diagnostic_log: Path | None = None,
|
|
32
|
+
) -> None:
|
|
33
|
+
"""Fail visibly for native-only flags instead of silently ignoring them."""
|
|
34
|
+
|
|
35
|
+
unsupported: list[str] = []
|
|
36
|
+
if base_url is not None:
|
|
37
|
+
unsupported.append("--base-url")
|
|
38
|
+
if temperature is not None:
|
|
39
|
+
unsupported.append("--temperature")
|
|
40
|
+
if max_steps is not None:
|
|
41
|
+
unsupported.append("--max-steps")
|
|
42
|
+
if subagents is not None:
|
|
43
|
+
unsupported.append("--subagents/--no-subagents")
|
|
44
|
+
if verify_cmd:
|
|
45
|
+
unsupported.append("--verify-cmd")
|
|
46
|
+
if api_key_env is not None:
|
|
47
|
+
unsupported.append("--api-key-env")
|
|
48
|
+
if api_key_stdin:
|
|
49
|
+
unsupported.append("--api-key-stdin")
|
|
50
|
+
if api_key is not None:
|
|
51
|
+
unsupported.append("--api-key")
|
|
52
|
+
if stream is not None:
|
|
53
|
+
unsupported.append("--stream/--no-stream")
|
|
54
|
+
if yes:
|
|
55
|
+
unsupported.append("--yes")
|
|
56
|
+
if benchmark:
|
|
57
|
+
unsupported.append("--benchmark")
|
|
58
|
+
if diagnostic_log is not None:
|
|
59
|
+
unsupported.append("--diagnostic-log")
|
|
60
|
+
if unsupported:
|
|
61
|
+
joined = ", ".join(unsupported)
|
|
62
|
+
raise RuntimeConnectionError(
|
|
63
|
+
f"Delegated execution does not support these native Alysis Code options: {joined}."
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def prepare_delegated_runtime(
|
|
68
|
+
cfg: AppConfig,
|
|
69
|
+
*,
|
|
70
|
+
model: str | None = None,
|
|
71
|
+
deadline_seconds: float | None = None,
|
|
72
|
+
) -> str:
|
|
73
|
+
"""Verify installation/auth and apply invocation-local settings."""
|
|
74
|
+
|
|
75
|
+
snapshot = runtime_connection_snapshot(cfg)
|
|
76
|
+
if not snapshot.probe.available:
|
|
77
|
+
raise RuntimeConnectionError(
|
|
78
|
+
snapshot.probe.detail or f"Runtime {snapshot.option.id!r} is not installed."
|
|
79
|
+
)
|
|
80
|
+
if not snapshot.account.verified or not snapshot.account.authenticated:
|
|
81
|
+
raise RuntimeConnectionError(
|
|
82
|
+
(snapshot.account.detail or "Runtime account is not connected.")
|
|
83
|
+
+ f" Run `alysis auth login {snapshot.option.id}`."
|
|
84
|
+
)
|
|
85
|
+
settings = cfg.agent_runtimes[snapshot.option.id]
|
|
86
|
+
if model is not None:
|
|
87
|
+
settings.model = str(model).strip() or None
|
|
88
|
+
if deadline_seconds is not None:
|
|
89
|
+
if deadline_seconds <= 0 or not math.isfinite(deadline_seconds):
|
|
90
|
+
raise RuntimeConnectionError(
|
|
91
|
+
"--deadline-seconds must be a finite number greater than zero."
|
|
92
|
+
)
|
|
93
|
+
settings.timeout_seconds = min(settings.timeout_seconds, float(deadline_seconds))
|
|
94
|
+
return snapshot.option.id
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def run_delegated_once(
|
|
98
|
+
*,
|
|
99
|
+
cfg: AppConfig,
|
|
100
|
+
cwd: Path,
|
|
101
|
+
instruction: str,
|
|
102
|
+
mode: str,
|
|
103
|
+
image_paths: tuple[Path, ...],
|
|
104
|
+
no_log: bool,
|
|
105
|
+
console: Any,
|
|
106
|
+
) -> int:
|
|
107
|
+
normalized_mode = _normalized_mode(mode)
|
|
108
|
+
if normalized_mode == "review":
|
|
109
|
+
console.print(
|
|
110
|
+
"[yellow]Review mode is enforced as read-only by this delegated adapter.[/yellow]"
|
|
111
|
+
)
|
|
112
|
+
request = RuntimeTurnRequest(
|
|
113
|
+
prompt=instruction,
|
|
114
|
+
cwd=cwd,
|
|
115
|
+
mode=normalized_mode,
|
|
116
|
+
images=image_paths,
|
|
117
|
+
no_log=no_log,
|
|
118
|
+
)
|
|
119
|
+
result = run_runtime_turn(cfg, request)
|
|
120
|
+
_render_turn_result(console, result)
|
|
121
|
+
return 0 if result.ok else (result.exit_code or 1)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def run_delegated_chat(
|
|
125
|
+
*,
|
|
126
|
+
cfg: AppConfig,
|
|
127
|
+
cwd: Path,
|
|
128
|
+
mode: str,
|
|
129
|
+
initial_images: tuple[Path, ...],
|
|
130
|
+
no_log: bool,
|
|
131
|
+
console: Any,
|
|
132
|
+
) -> None:
|
|
133
|
+
if no_log:
|
|
134
|
+
raise RuntimeConnectionError(
|
|
135
|
+
"Delegated interactive chat cannot guarantee --no-log while resuming a provider "
|
|
136
|
+
"session. Use `alysis run --no-log ...` for an ephemeral turn."
|
|
137
|
+
)
|
|
138
|
+
normalized_mode = _normalized_mode(mode)
|
|
139
|
+
runtime_id = str(cfg.execution.runtime or "delegated runtime")
|
|
140
|
+
console.print(
|
|
141
|
+
f"[bold]Delegated chat:[/bold] {runtime_id} · mode {normalized_mode} · "
|
|
142
|
+
"provider owns the agent loop and tools"
|
|
143
|
+
)
|
|
144
|
+
if normalized_mode == "review":
|
|
145
|
+
console.print(
|
|
146
|
+
"[yellow]Review mode is enforced as read-only by this delegated adapter.[/yellow]"
|
|
147
|
+
)
|
|
148
|
+
console.print(
|
|
149
|
+
"[dim]Commands: /status · /new · /help · /exit. Native Alysis Code slash commands "
|
|
150
|
+
"are unavailable in delegated chat.[/dim]"
|
|
151
|
+
)
|
|
152
|
+
session_id: str | None = None
|
|
153
|
+
images = initial_images
|
|
154
|
+
while True:
|
|
155
|
+
try:
|
|
156
|
+
prompt = str(console.input("[bold cyan]>[/bold cyan] ")).strip()
|
|
157
|
+
except (EOFError, KeyboardInterrupt):
|
|
158
|
+
console.print("")
|
|
159
|
+
return
|
|
160
|
+
if not prompt:
|
|
161
|
+
continue
|
|
162
|
+
command = prompt.casefold()
|
|
163
|
+
if command in {"/exit", "/quit", "exit", "quit"}:
|
|
164
|
+
return
|
|
165
|
+
if command == "/new":
|
|
166
|
+
session_id = None
|
|
167
|
+
console.print("[dim]Started a new delegated provider session.[/dim]")
|
|
168
|
+
continue
|
|
169
|
+
if command == "/status":
|
|
170
|
+
status = runtime_connection_snapshot(cfg)
|
|
171
|
+
console.print(
|
|
172
|
+
f"Runtime: {status.option.label} · "
|
|
173
|
+
f"authenticated {'yes' if status.account.authenticated else 'no'} · "
|
|
174
|
+
f"session {session_id or 'new'}"
|
|
175
|
+
)
|
|
176
|
+
continue
|
|
177
|
+
if command == "/help":
|
|
178
|
+
console.print(
|
|
179
|
+
"[dim]/status shows connection state; /new starts a new provider thread; "
|
|
180
|
+
"/exit returns to the shell.[/dim]"
|
|
181
|
+
)
|
|
182
|
+
continue
|
|
183
|
+
if prompt.startswith("/"):
|
|
184
|
+
console.print(
|
|
185
|
+
"[yellow]That native Alysis Code command is unavailable in delegated chat. "
|
|
186
|
+
"Use /help.[/yellow]"
|
|
187
|
+
)
|
|
188
|
+
continue
|
|
189
|
+
console.print("[dim]Delegated agent is working…[/dim]")
|
|
190
|
+
result = run_runtime_turn(
|
|
191
|
+
cfg,
|
|
192
|
+
RuntimeTurnRequest(
|
|
193
|
+
prompt=prompt,
|
|
194
|
+
cwd=cwd,
|
|
195
|
+
mode=normalized_mode,
|
|
196
|
+
session_id=session_id,
|
|
197
|
+
images=images,
|
|
198
|
+
),
|
|
199
|
+
)
|
|
200
|
+
images = ()
|
|
201
|
+
_render_turn_result(console, result)
|
|
202
|
+
if result.ok:
|
|
203
|
+
session_id = result.session_id
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _normalized_mode(
|
|
207
|
+
mode: str,
|
|
208
|
+
) -> Literal["readonly", "review", "auto"]:
|
|
209
|
+
normalized = str(mode or "review").strip().lower()
|
|
210
|
+
if normalized == "fullaccess":
|
|
211
|
+
raise RuntimeConnectionError(
|
|
212
|
+
"Delegated execution does not support fullaccess; use readonly, review, or auto."
|
|
213
|
+
)
|
|
214
|
+
if normalized not in {"readonly", "review", "auto"}:
|
|
215
|
+
raise RuntimeConnectionError(f"Unsupported delegated execution mode: {mode!r}.")
|
|
216
|
+
return cast(Literal["readonly", "review", "auto"], normalized)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
_OSC_SEQUENCE_RE = re.compile(r"\x1b\].*?(?:\x07|\x1b\\)", re.DOTALL)
|
|
220
|
+
_ANSI_SEQUENCE_RE = re.compile(r"\x1b(?:\[[0-?]*[ -/]*[@-~]|[@-_])")
|
|
221
|
+
_TERMINAL_CONTROL_RE = re.compile(r"[\x00-\x08\x0b-\x1f\x7f-\x9f]")
|
|
222
|
+
_BIDI_CONTROL_RE = re.compile(r"[\u202a-\u202e\u2066-\u2069]")
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _safe_runtime_text(value: object) -> str:
|
|
226
|
+
"""Make provider-controlled output inert before it reaches a terminal."""
|
|
227
|
+
|
|
228
|
+
clean = _OSC_SEQUENCE_RE.sub("", str(value or ""))
|
|
229
|
+
clean = _ANSI_SEQUENCE_RE.sub("", clean)
|
|
230
|
+
clean = _TERMINAL_CONTROL_RE.sub("", clean)
|
|
231
|
+
clean = _BIDI_CONTROL_RE.sub("", clean)
|
|
232
|
+
return redact_console_text(clean)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def _render_turn_result(console: Any, result: RuntimeTurnResult) -> None:
|
|
236
|
+
if result.final_message:
|
|
237
|
+
console.print(
|
|
238
|
+
_safe_runtime_text(result.final_message),
|
|
239
|
+
markup=False,
|
|
240
|
+
highlight=False,
|
|
241
|
+
)
|
|
242
|
+
for warning in result.warnings:
|
|
243
|
+
console.print(
|
|
244
|
+
f"Runtime warning: {_safe_runtime_text(warning)}",
|
|
245
|
+
style="yellow",
|
|
246
|
+
markup=False,
|
|
247
|
+
highlight=False,
|
|
248
|
+
)
|
|
249
|
+
if not result.ok:
|
|
250
|
+
console.print(
|
|
251
|
+
f"Delegated runtime error: {_safe_runtime_text(result.error or 'turn failed')}",
|
|
252
|
+
style="red",
|
|
253
|
+
markup=False,
|
|
254
|
+
highlight=False,
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
__all__ = [
|
|
259
|
+
"prepare_delegated_runtime",
|
|
260
|
+
"run_delegated_chat",
|
|
261
|
+
"run_delegated_once",
|
|
262
|
+
"validate_delegated_cli_options",
|
|
263
|
+
]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Iterable
|
|
4
|
+
|
|
5
|
+
from .base import AgentRuntimeAdapter
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RuntimeRegistryError(ValueError):
|
|
9
|
+
"""Base error for invalid delegated-runtime registry operations."""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DuplicateRuntimeError(RuntimeRegistryError):
|
|
13
|
+
"""Raised when two adapters claim the same runtime identifier."""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class UnknownRuntimeError(RuntimeRegistryError):
|
|
17
|
+
"""Raised when a configured runtime identifier is not registered."""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AgentRuntimeRegistry:
|
|
21
|
+
"""Explicit registry for provider-managed runtime adapters."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, adapters: Iterable[AgentRuntimeAdapter] = ()) -> None:
|
|
24
|
+
self._adapters: dict[str, AgentRuntimeAdapter] = {}
|
|
25
|
+
for adapter in adapters:
|
|
26
|
+
self.register(adapter)
|
|
27
|
+
|
|
28
|
+
def register(self, adapter: AgentRuntimeAdapter) -> None:
|
|
29
|
+
runtime_id = _runtime_id(adapter.runtime_id)
|
|
30
|
+
if runtime_id in self._adapters:
|
|
31
|
+
raise DuplicateRuntimeError(f"Agent runtime {runtime_id!r} is already registered.")
|
|
32
|
+
self._adapters[runtime_id] = adapter
|
|
33
|
+
|
|
34
|
+
def get(self, runtime_id: str) -> AgentRuntimeAdapter:
|
|
35
|
+
normalized = _runtime_id(runtime_id)
|
|
36
|
+
try:
|
|
37
|
+
return self._adapters[normalized]
|
|
38
|
+
except KeyError as exc:
|
|
39
|
+
available = ", ".join(self.runtime_ids()) or "none"
|
|
40
|
+
raise UnknownRuntimeError(
|
|
41
|
+
f"Unknown agent runtime {normalized!r}. Available runtimes: {available}."
|
|
42
|
+
) from exc
|
|
43
|
+
|
|
44
|
+
def runtime_ids(self) -> tuple[str, ...]:
|
|
45
|
+
return tuple(sorted(self._adapters))
|
|
46
|
+
|
|
47
|
+
def adapters(self) -> tuple[AgentRuntimeAdapter, ...]:
|
|
48
|
+
return tuple(self._adapters[runtime_id] for runtime_id in self.runtime_ids())
|
|
49
|
+
|
|
50
|
+
def __contains__(self, runtime_id: object) -> bool:
|
|
51
|
+
if not isinstance(runtime_id, str):
|
|
52
|
+
return False
|
|
53
|
+
normalized = runtime_id.strip()
|
|
54
|
+
return bool(normalized) and normalized in self._adapters
|
|
55
|
+
|
|
56
|
+
def __len__(self) -> int:
|
|
57
|
+
return len(self._adapters)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _runtime_id(value: object) -> str:
|
|
61
|
+
runtime_id = str(value or "").strip()
|
|
62
|
+
if not runtime_id:
|
|
63
|
+
raise RuntimeRegistryError("Agent runtime id must be a non-empty string.")
|
|
64
|
+
return runtime_id
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from ..config import AgentRuntimeSettings, AppConfig, ConfigError
|
|
6
|
+
from .base import (
|
|
7
|
+
RuntimeAccountStatus,
|
|
8
|
+
RuntimeProbeStatus,
|
|
9
|
+
RuntimeTurnRequest,
|
|
10
|
+
RuntimeTurnResult,
|
|
11
|
+
)
|
|
12
|
+
from .builtins import (
|
|
13
|
+
RuntimeSetupOption,
|
|
14
|
+
create_runtime_registry,
|
|
15
|
+
runtime_setup_option,
|
|
16
|
+
)
|
|
17
|
+
from .registry import UnknownRuntimeError
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class RuntimeConnectionError(ConfigError):
|
|
21
|
+
"""Raised when a configured delegated runtime cannot be resolved."""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True, slots=True)
|
|
25
|
+
class RuntimeConnectionSnapshot:
|
|
26
|
+
option: RuntimeSetupOption
|
|
27
|
+
settings: AgentRuntimeSettings
|
|
28
|
+
probe: RuntimeProbeStatus
|
|
29
|
+
account: RuntimeAccountStatus
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def resolve_runtime_id(cfg: AppConfig, runtime_id: str | None = None) -> str:
|
|
33
|
+
resolved = str(runtime_id or cfg.execution.runtime or "").strip()
|
|
34
|
+
if not resolved:
|
|
35
|
+
raise RuntimeConnectionError("No delegated agent runtime is selected.")
|
|
36
|
+
return resolved
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def ensure_runtime_settings(cfg: AppConfig, runtime_id: str) -> AgentRuntimeSettings:
|
|
40
|
+
normalized = str(runtime_id or "").strip()
|
|
41
|
+
option = runtime_setup_option(normalized)
|
|
42
|
+
if option is None:
|
|
43
|
+
raise RuntimeConnectionError(f"Unknown delegated agent runtime: {normalized or '(empty)'}.")
|
|
44
|
+
settings = cfg.agent_runtimes.get(normalized)
|
|
45
|
+
if settings is None:
|
|
46
|
+
settings = AgentRuntimeSettings(
|
|
47
|
+
adapter=option.adapter,
|
|
48
|
+
executable=option.default_executable,
|
|
49
|
+
)
|
|
50
|
+
cfg.agent_runtimes[normalized] = settings
|
|
51
|
+
return settings
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def activate_runtime(cfg: AppConfig, runtime_id: str) -> AgentRuntimeSettings:
|
|
55
|
+
settings = ensure_runtime_settings(cfg, runtime_id)
|
|
56
|
+
cfg.execution.backend = "delegated"
|
|
57
|
+
cfg.execution.runtime = str(runtime_id).strip()
|
|
58
|
+
return settings
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def activate_native_runtime(cfg: AppConfig) -> None:
|
|
62
|
+
cfg.execution.backend = "native"
|
|
63
|
+
cfg.execution.runtime = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def runtime_connection_snapshot(
|
|
67
|
+
cfg: AppConfig,
|
|
68
|
+
runtime_id: str | None = None,
|
|
69
|
+
) -> RuntimeConnectionSnapshot:
|
|
70
|
+
resolved = resolve_runtime_id(cfg, runtime_id)
|
|
71
|
+
option = runtime_setup_option(resolved)
|
|
72
|
+
if option is None:
|
|
73
|
+
raise RuntimeConnectionError(f"Unknown delegated agent runtime: {resolved}.")
|
|
74
|
+
settings = ensure_runtime_settings(cfg, resolved)
|
|
75
|
+
try:
|
|
76
|
+
adapter = create_runtime_registry().get(resolved)
|
|
77
|
+
except UnknownRuntimeError as exc:
|
|
78
|
+
raise RuntimeConnectionError(str(exc)) from exc
|
|
79
|
+
probe = adapter.probe(settings)
|
|
80
|
+
account = (
|
|
81
|
+
adapter.account_status(settings)
|
|
82
|
+
if probe.available
|
|
83
|
+
else RuntimeAccountStatus(
|
|
84
|
+
authenticated=False,
|
|
85
|
+
verified=False,
|
|
86
|
+
detail=probe.detail,
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
return RuntimeConnectionSnapshot(
|
|
90
|
+
option=option,
|
|
91
|
+
settings=settings,
|
|
92
|
+
probe=probe,
|
|
93
|
+
account=account,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def login_runtime(
|
|
98
|
+
cfg: AppConfig,
|
|
99
|
+
runtime_id: str | None = None,
|
|
100
|
+
*,
|
|
101
|
+
method_id: str,
|
|
102
|
+
) -> RuntimeAccountStatus:
|
|
103
|
+
resolved = resolve_runtime_id(cfg, runtime_id)
|
|
104
|
+
settings = ensure_runtime_settings(cfg, resolved)
|
|
105
|
+
try:
|
|
106
|
+
adapter = create_runtime_registry().get(resolved)
|
|
107
|
+
except UnknownRuntimeError as exc:
|
|
108
|
+
raise RuntimeConnectionError(str(exc)) from exc
|
|
109
|
+
return adapter.login(settings, method_id)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def logout_runtime(
|
|
113
|
+
cfg: AppConfig,
|
|
114
|
+
runtime_id: str | None = None,
|
|
115
|
+
) -> RuntimeAccountStatus:
|
|
116
|
+
resolved = resolve_runtime_id(cfg, runtime_id)
|
|
117
|
+
settings = ensure_runtime_settings(cfg, resolved)
|
|
118
|
+
try:
|
|
119
|
+
adapter = create_runtime_registry().get(resolved)
|
|
120
|
+
except UnknownRuntimeError as exc:
|
|
121
|
+
raise RuntimeConnectionError(str(exc)) from exc
|
|
122
|
+
return adapter.logout(settings)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def run_runtime_turn(
|
|
126
|
+
cfg: AppConfig,
|
|
127
|
+
request: RuntimeTurnRequest,
|
|
128
|
+
runtime_id: str | None = None,
|
|
129
|
+
) -> RuntimeTurnResult:
|
|
130
|
+
resolved = resolve_runtime_id(cfg, runtime_id)
|
|
131
|
+
settings = ensure_runtime_settings(cfg, resolved)
|
|
132
|
+
try:
|
|
133
|
+
adapter = create_runtime_registry().get(resolved)
|
|
134
|
+
except UnknownRuntimeError as exc:
|
|
135
|
+
raise RuntimeConnectionError(str(exc)) from exc
|
|
136
|
+
return adapter.run_turn(settings, request)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
__all__ = [
|
|
140
|
+
"RuntimeConnectionError",
|
|
141
|
+
"RuntimeConnectionSnapshot",
|
|
142
|
+
"activate_native_runtime",
|
|
143
|
+
"activate_runtime",
|
|
144
|
+
"ensure_runtime_settings",
|
|
145
|
+
"login_runtime",
|
|
146
|
+
"logout_runtime",
|
|
147
|
+
"resolve_runtime_id",
|
|
148
|
+
"run_runtime_turn",
|
|
149
|
+
"runtime_connection_snapshot",
|
|
150
|
+
]
|