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,372 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Engine event inventory (migration targets; current call sites are intentionally unchanged):
|
|
3
|
+
- message_delta: assistant streaming tokens from agent_loop.py and plan_assistant.py via
|
|
4
|
+
on_text_delta callbacks, including Plan Mode/Forge planner streaming in cli_impl/chat.py.
|
|
5
|
+
- message_end: final assistant messages from agent_loop.py and plan draft/planner completion
|
|
6
|
+
flows in cli_impl/chat.py.
|
|
7
|
+
- tool_call_started: tool lifecycle starts from agent_loop.py for built-ins, custom tools,
|
|
8
|
+
non-repo tool-assisted turns, and nested subagent tool forwarding through hidden_surface.py.
|
|
9
|
+
- tool_call_progress: tool output chunks/previews from agent_loop.py and summarization helpers
|
|
10
|
+
in tools/registry.py.
|
|
11
|
+
- tool_call_completed: tool lifecycle completion/failure from agent_loop.py, including hook
|
|
12
|
+
blocks, repeated-call guards, verify_run, shell, git, web, MCP/custom tool failures.
|
|
13
|
+
- status_update: startup/session status in agent_loop.py plus command/status HUD text in
|
|
14
|
+
cli_impl/chat.py.
|
|
15
|
+
- mode_changed: /mode, /plan on/off readonly overlay, and Forge UI transitions in
|
|
16
|
+
cli_impl/chat.py.
|
|
17
|
+
- persona_changed: persona-mode transitions (user-initiated /mode persona switches and
|
|
18
|
+
approved model switch_mode proposals) applied through the chat loop's persona primitive.
|
|
19
|
+
- plan_node_updated: task creation/status/validation/reconciliation updates in forge.py,
|
|
20
|
+
cli_impl/forge.py, cli_impl/chat.py, plan_assistant.py, and plan_reconciliation.py.
|
|
21
|
+
- swarm_worker_state_changed: scheduler batches, worker task starts/ends, merge/retry state,
|
|
22
|
+
and dry-run output in swarm_orchestrator.py.
|
|
23
|
+
- verify_gate_result: verify_run tool payloads in agent_loop.py and command execution/results
|
|
24
|
+
in verify_gate.py and cli_impl/forge.py.
|
|
25
|
+
- review_gate_decision: review approvals, blocking issues, and changes_requested status in
|
|
26
|
+
review_gate.py and cli_impl/forge.py.
|
|
27
|
+
- error_raised: agent/runtime/LLM/tool/config/Forge errors surfaced through on_error,
|
|
28
|
+
console.print red paths, and raised domain errors in agent_loop.py, cli_impl/chat.py,
|
|
29
|
+
cli_impl/forge.py, tools/*.py, verify_gate.py, and review_gate.py.
|
|
30
|
+
- warning_emitted: model metadata warnings, plan validation/reconciliation warnings, hook
|
|
31
|
+
notices, unknown command/usage warnings, repeated tool guards, and verify/review warnings.
|
|
32
|
+
- info_emitted: progress/thinking lines, planner assistant meta text, saved artifact paths,
|
|
33
|
+
subagent summaries, usage/context/HUD lines, dry-run summaries, and feedback bundle paths.
|
|
34
|
+
- prompt_for_input: approval prompts in RichSurface.request_approval, Plan Mode approve/revise
|
|
35
|
+
prompts in cli_impl/chat.py, workspace/model/menu selectors, and interactive chat input.
|
|
36
|
+
- config_form_request: future structured menus/forms replacing /config, setup, model metadata,
|
|
37
|
+
toolbar, usage HUD, subagents, skills, and workspace binding command surfaces.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
import math
|
|
43
|
+
from dataclasses import MISSING, dataclass, field, fields
|
|
44
|
+
from typing import Any, ClassVar, Literal, TypeAlias, get_args
|
|
45
|
+
|
|
46
|
+
JsonPrimitive: TypeAlias = str | int | float | bool | None
|
|
47
|
+
JsonValue: TypeAlias = JsonPrimitive | list["JsonValue"] | dict[str, "JsonValue"]
|
|
48
|
+
MAX_ARGUMENTS_PREVIEW_CHARS = 500
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _truncate_preview(text: str, *, max_chars: int = MAX_ARGUMENTS_PREVIEW_CHARS) -> str:
|
|
52
|
+
if len(text) <= max_chars:
|
|
53
|
+
return text
|
|
54
|
+
if max_chars <= 3:
|
|
55
|
+
return text[:max_chars]
|
|
56
|
+
return text[: max_chars - 3] + "..."
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _json_safe(value: Any) -> JsonValue:
|
|
60
|
+
if value is None or isinstance(value, str | bool | int):
|
|
61
|
+
return value
|
|
62
|
+
if isinstance(value, float):
|
|
63
|
+
if not math.isfinite(value):
|
|
64
|
+
raise ValueError("event values must be finite JSON numbers")
|
|
65
|
+
return value
|
|
66
|
+
if isinstance(value, list | tuple):
|
|
67
|
+
return [_json_safe(item) for item in value]
|
|
68
|
+
if isinstance(value, dict):
|
|
69
|
+
out: dict[str, JsonValue] = {}
|
|
70
|
+
for key, item in value.items():
|
|
71
|
+
if not isinstance(key, str):
|
|
72
|
+
raise ValueError("event dict keys must be strings")
|
|
73
|
+
out[key] = _json_safe(item)
|
|
74
|
+
return out
|
|
75
|
+
raise ValueError(f"event value is not JSON-safe: {type(value).__name__}")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _to_dict(event: Any) -> dict[str, Any]:
|
|
79
|
+
data: dict[str, Any] = {"type": event.type}
|
|
80
|
+
for event_field in fields(event):
|
|
81
|
+
data[event_field.name] = _json_safe(getattr(event, event_field.name))
|
|
82
|
+
return data
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@dataclass(frozen=True, slots=True)
|
|
86
|
+
class MessageDelta:
|
|
87
|
+
type: ClassVar[Literal["message_delta"]] = "message_delta"
|
|
88
|
+
text: str
|
|
89
|
+
worker_id: str | None = None
|
|
90
|
+
role: str | None = None
|
|
91
|
+
|
|
92
|
+
def to_dict(self) -> dict[str, Any]:
|
|
93
|
+
return _to_dict(self)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@dataclass(frozen=True, slots=True)
|
|
97
|
+
class MessageEnd:
|
|
98
|
+
type: ClassVar[Literal["message_end"]] = "message_end"
|
|
99
|
+
text: str = ""
|
|
100
|
+
worker_id: str | None = None
|
|
101
|
+
role: str | None = None
|
|
102
|
+
|
|
103
|
+
def to_dict(self) -> dict[str, Any]:
|
|
104
|
+
return _to_dict(self)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@dataclass(frozen=True, slots=True)
|
|
108
|
+
class ToolCallStarted:
|
|
109
|
+
type: ClassVar[Literal["tool_call_started"]] = "tool_call_started"
|
|
110
|
+
call_id: str
|
|
111
|
+
name: str
|
|
112
|
+
arguments_preview: str
|
|
113
|
+
worker_id: str | None = None
|
|
114
|
+
role: str | None = None
|
|
115
|
+
|
|
116
|
+
def to_dict(self) -> dict[str, Any]:
|
|
117
|
+
data = _to_dict(self)
|
|
118
|
+
data["arguments_preview"] = _truncate_preview(str(data["arguments_preview"]))
|
|
119
|
+
return data
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@dataclass(frozen=True, slots=True)
|
|
123
|
+
class ToolCallProgress:
|
|
124
|
+
type: ClassVar[Literal["tool_call_progress"]] = "tool_call_progress"
|
|
125
|
+
call_id: str
|
|
126
|
+
text: str
|
|
127
|
+
worker_id: str | None = None
|
|
128
|
+
role: str | None = None
|
|
129
|
+
|
|
130
|
+
def to_dict(self) -> dict[str, Any]:
|
|
131
|
+
return _to_dict(self)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@dataclass(frozen=True, slots=True)
|
|
135
|
+
class ToolCallCompleted:
|
|
136
|
+
type: ClassVar[Literal["tool_call_completed"]] = "tool_call_completed"
|
|
137
|
+
call_id: str
|
|
138
|
+
success: bool
|
|
139
|
+
result_preview: str
|
|
140
|
+
worker_id: str | None = None
|
|
141
|
+
role: str | None = None
|
|
142
|
+
|
|
143
|
+
def to_dict(self) -> dict[str, Any]:
|
|
144
|
+
return _to_dict(self)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@dataclass(frozen=True, slots=True)
|
|
148
|
+
class StatusUpdate:
|
|
149
|
+
type: ClassVar[Literal["status_update"]] = "status_update"
|
|
150
|
+
tokens_in: int | None = None
|
|
151
|
+
tokens_out: int | None = None
|
|
152
|
+
cached_tokens: int | None = None
|
|
153
|
+
cost_usd: float | None = None
|
|
154
|
+
mode: str | None = None
|
|
155
|
+
model: str | None = None
|
|
156
|
+
step: int | None = None
|
|
157
|
+
step_budget: int | None = None
|
|
158
|
+
|
|
159
|
+
def to_dict(self) -> dict[str, Any]:
|
|
160
|
+
return _to_dict(self)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@dataclass(frozen=True, slots=True)
|
|
164
|
+
class ModeChanged:
|
|
165
|
+
type: ClassVar[Literal["mode_changed"]] = "mode_changed"
|
|
166
|
+
mode: str
|
|
167
|
+
|
|
168
|
+
def to_dict(self) -> dict[str, Any]:
|
|
169
|
+
return _to_dict(self)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@dataclass(frozen=True, slots=True)
|
|
173
|
+
class PersonaChanged:
|
|
174
|
+
type: ClassVar[Literal["persona_changed"]] = "persona_changed"
|
|
175
|
+
persona: str
|
|
176
|
+
effective_mode: str
|
|
177
|
+
source: str = "user"
|
|
178
|
+
|
|
179
|
+
def to_dict(self) -> dict[str, Any]:
|
|
180
|
+
return _to_dict(self)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@dataclass(frozen=True, slots=True)
|
|
184
|
+
class PlanNodeUpdated:
|
|
185
|
+
type: ClassVar[Literal["plan_node_updated"]] = "plan_node_updated"
|
|
186
|
+
node_id: str
|
|
187
|
+
state: str
|
|
188
|
+
summary: str | None = None
|
|
189
|
+
worker_id: str | None = None
|
|
190
|
+
role: str | None = None
|
|
191
|
+
|
|
192
|
+
def to_dict(self) -> dict[str, Any]:
|
|
193
|
+
return _to_dict(self)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
@dataclass(frozen=True, slots=True)
|
|
197
|
+
class SwarmWorkerStateChanged:
|
|
198
|
+
type: ClassVar[Literal["swarm_worker_state_changed"]] = "swarm_worker_state_changed"
|
|
199
|
+
worker_id: str
|
|
200
|
+
state: str
|
|
201
|
+
role: str | None = None
|
|
202
|
+
|
|
203
|
+
def to_dict(self) -> dict[str, Any]:
|
|
204
|
+
return _to_dict(self)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass(frozen=True, slots=True)
|
|
208
|
+
class SubagentStateChanged:
|
|
209
|
+
"""Read-only lifecycle projection for one model-managed child turn.
|
|
210
|
+
|
|
211
|
+
``subagent_run_id`` is correlation only, never an authority token. The
|
|
212
|
+
owning IDE job remains the sole cancellation/approval boundary.
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
type: ClassVar[Literal["subagent_state_changed"]] = "subagent_state_changed"
|
|
216
|
+
subagent_run_id: str
|
|
217
|
+
name: str
|
|
218
|
+
mode: str
|
|
219
|
+
state: str
|
|
220
|
+
label: str = ""
|
|
221
|
+
subagent_session_id: str | None = None
|
|
222
|
+
description: str = ""
|
|
223
|
+
elapsed_ms: int | None = None
|
|
224
|
+
steps_completed: int | None = None
|
|
225
|
+
error: str | None = None
|
|
226
|
+
|
|
227
|
+
def to_dict(self) -> dict[str, Any]:
|
|
228
|
+
return _to_dict(self)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
@dataclass(frozen=True, slots=True)
|
|
232
|
+
class VerifyGateResult:
|
|
233
|
+
type: ClassVar[Literal["verify_gate_result"]] = "verify_gate_result"
|
|
234
|
+
command: str
|
|
235
|
+
success: bool
|
|
236
|
+
summary: str
|
|
237
|
+
worker_id: str | None = None
|
|
238
|
+
role: str | None = None
|
|
239
|
+
|
|
240
|
+
def to_dict(self) -> dict[str, Any]:
|
|
241
|
+
return _to_dict(self)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
@dataclass(frozen=True, slots=True)
|
|
245
|
+
class ReviewGateDecision:
|
|
246
|
+
type: ClassVar[Literal["review_gate_decision"]] = "review_gate_decision"
|
|
247
|
+
decision: str
|
|
248
|
+
summary: str
|
|
249
|
+
worker_id: str | None = None
|
|
250
|
+
role: str | None = None
|
|
251
|
+
|
|
252
|
+
def to_dict(self) -> dict[str, Any]:
|
|
253
|
+
return _to_dict(self)
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
@dataclass(frozen=True, slots=True)
|
|
257
|
+
class ErrorRaised:
|
|
258
|
+
type: ClassVar[Literal["error_raised"]] = "error_raised"
|
|
259
|
+
code: str
|
|
260
|
+
message: str
|
|
261
|
+
recoverable: bool
|
|
262
|
+
worker_id: str | None = None
|
|
263
|
+
role: str | None = None
|
|
264
|
+
|
|
265
|
+
def to_dict(self) -> dict[str, Any]:
|
|
266
|
+
return _to_dict(self)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
@dataclass(frozen=True, slots=True)
|
|
270
|
+
class WarningEmitted:
|
|
271
|
+
type: ClassVar[Literal["warning_emitted"]] = "warning_emitted"
|
|
272
|
+
message: str
|
|
273
|
+
worker_id: str | None = None
|
|
274
|
+
role: str | None = None
|
|
275
|
+
|
|
276
|
+
def to_dict(self) -> dict[str, Any]:
|
|
277
|
+
return _to_dict(self)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
@dataclass(frozen=True, slots=True)
|
|
281
|
+
class InfoEmitted:
|
|
282
|
+
type: ClassVar[Literal["info_emitted"]] = "info_emitted"
|
|
283
|
+
message: str
|
|
284
|
+
worker_id: str | None = None
|
|
285
|
+
role: str | None = None
|
|
286
|
+
|
|
287
|
+
def to_dict(self) -> dict[str, Any]:
|
|
288
|
+
return _to_dict(self)
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
@dataclass(frozen=True, slots=True)
|
|
292
|
+
class PromptForInput:
|
|
293
|
+
type: ClassVar[Literal["prompt_for_input"]] = "prompt_for_input"
|
|
294
|
+
prompt_id: str
|
|
295
|
+
prompt_text: str
|
|
296
|
+
kind: str
|
|
297
|
+
approval_kind: str | None = None
|
|
298
|
+
approval_id: str | None = None
|
|
299
|
+
reason: str | None = None
|
|
300
|
+
preview: str | None = None
|
|
301
|
+
files: list[str] = field(default_factory=list)
|
|
302
|
+
command: str | None = None
|
|
303
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
304
|
+
expires_at: str | None = None
|
|
305
|
+
allow_for_session_supported: bool | None = None
|
|
306
|
+
allow_for_session_scope: dict[str, Any] | None = None
|
|
307
|
+
allow_for_session_warning: str | None = None
|
|
308
|
+
|
|
309
|
+
def to_dict(self) -> dict[str, Any]:
|
|
310
|
+
return _to_dict(self)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
@dataclass(frozen=True, slots=True)
|
|
314
|
+
class ConfigFormRequest:
|
|
315
|
+
type: ClassVar[Literal["config_form_request"]] = "config_form_request"
|
|
316
|
+
form_id: str
|
|
317
|
+
schema: dict[str, Any]
|
|
318
|
+
|
|
319
|
+
def to_dict(self) -> dict[str, Any]:
|
|
320
|
+
return _to_dict(self)
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
Event: TypeAlias = (
|
|
324
|
+
MessageDelta
|
|
325
|
+
| MessageEnd
|
|
326
|
+
| ToolCallStarted
|
|
327
|
+
| ToolCallProgress
|
|
328
|
+
| ToolCallCompleted
|
|
329
|
+
| StatusUpdate
|
|
330
|
+
| ModeChanged
|
|
331
|
+
| PersonaChanged
|
|
332
|
+
| PlanNodeUpdated
|
|
333
|
+
| SwarmWorkerStateChanged
|
|
334
|
+
| SubagentStateChanged
|
|
335
|
+
| VerifyGateResult
|
|
336
|
+
| ReviewGateDecision
|
|
337
|
+
| ErrorRaised
|
|
338
|
+
| WarningEmitted
|
|
339
|
+
| InfoEmitted
|
|
340
|
+
| PromptForInput
|
|
341
|
+
| ConfigFormRequest
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
EVENT_REGISTRY: dict[str, type] = {event_cls.type: event_cls for event_cls in get_args(Event)}
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
def event_from_dict(data: dict[str, Any]) -> Event:
|
|
348
|
+
event_type = str(data.get("type") or "")
|
|
349
|
+
event_cls = EVENT_REGISTRY.get(event_type)
|
|
350
|
+
if event_cls is None:
|
|
351
|
+
raise ValueError(f"Unknown surface event type: {event_type or '(missing)'}")
|
|
352
|
+
|
|
353
|
+
event_fields = fields(event_cls)
|
|
354
|
+
allowed_keys = {field.name for field in event_fields}
|
|
355
|
+
extra_keys = sorted(set(data) - allowed_keys - {"type"})
|
|
356
|
+
if extra_keys:
|
|
357
|
+
raise ValueError(
|
|
358
|
+
f"Unexpected field(s) for surface event {event_type}: {', '.join(extra_keys)}"
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
missing_keys = [
|
|
362
|
+
field.name
|
|
363
|
+
for field in event_fields
|
|
364
|
+
if field.default is MISSING and field.default_factory is MISSING and field.name not in data
|
|
365
|
+
]
|
|
366
|
+
if missing_keys:
|
|
367
|
+
raise ValueError(
|
|
368
|
+
f"Missing field(s) for surface event {event_type}: {', '.join(missing_keys)}"
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
kwargs = {field.name: data[field.name] for field in event_fields if field.name in data}
|
|
372
|
+
return event_cls(**kwargs)
|