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,276 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import json
|
|
5
|
+
import re
|
|
6
|
+
from collections.abc import Iterable
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
SCOPE_EXACT_COMMAND_HASH = "exact_command_hash"
|
|
11
|
+
SCOPE_EXACT_FILE_SET = "exact_file_set"
|
|
12
|
+
SCOPE_EXACT_VERIFY_COMMAND_SET = "exact_verify_command_set"
|
|
13
|
+
SCOPE_EXPLICIT_BACKEND_SAFE_KIND = "explicit_backend_safe_kind"
|
|
14
|
+
|
|
15
|
+
SUPPORTED_APPROVAL_SCOPES = frozenset(
|
|
16
|
+
{
|
|
17
|
+
SCOPE_EXACT_COMMAND_HASH,
|
|
18
|
+
SCOPE_EXACT_FILE_SET,
|
|
19
|
+
SCOPE_EXACT_VERIFY_COMMAND_SET,
|
|
20
|
+
SCOPE_EXPLICIT_BACKEND_SAFE_KIND,
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
_SHA256_PATTERN = re.compile(r"^[a-f0-9]{64}$")
|
|
25
|
+
_FILE_SCOPE_KINDS = frozenset(
|
|
26
|
+
{
|
|
27
|
+
"fs_write",
|
|
28
|
+
"fs_edit",
|
|
29
|
+
"fs_move",
|
|
30
|
+
"fs_copy",
|
|
31
|
+
"fs_delete",
|
|
32
|
+
"fs_mkdir",
|
|
33
|
+
"git_apply_patch",
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
_COMMAND_SCOPE_KINDS = frozenset({"shell_run", "shell_background"})
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True, slots=True)
|
|
40
|
+
class ApprovalSessionScope:
|
|
41
|
+
supported: bool
|
|
42
|
+
scope: dict[str, Any] | None
|
|
43
|
+
key: str | None
|
|
44
|
+
warning: str | None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def exact_command_scope(command: str, *, kind: str | None = None) -> dict[str, Any]:
|
|
48
|
+
scope: dict[str, Any] = {
|
|
49
|
+
"type": SCOPE_EXACT_COMMAND_HASH,
|
|
50
|
+
"algorithm": "sha256",
|
|
51
|
+
"command_hash": _sha256_text(command),
|
|
52
|
+
}
|
|
53
|
+
if kind:
|
|
54
|
+
scope["kind"] = str(kind)
|
|
55
|
+
return scope
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def exact_file_set_scope(files: Iterable[str], *, operation: str | None = None) -> dict[str, Any]:
|
|
59
|
+
normalized = _normalize_files(files)
|
|
60
|
+
scope: dict[str, Any] = {
|
|
61
|
+
"type": SCOPE_EXACT_FILE_SET,
|
|
62
|
+
"algorithm": "sha256",
|
|
63
|
+
"files_hash": _sha256_json(list(normalized)),
|
|
64
|
+
"file_count": len(normalized),
|
|
65
|
+
"files": list(normalized),
|
|
66
|
+
}
|
|
67
|
+
if operation:
|
|
68
|
+
scope["operation"] = str(operation)
|
|
69
|
+
return scope
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def exact_verify_command_set_scope(commands: Iterable[str]) -> dict[str, Any]:
|
|
73
|
+
normalized = tuple(str(command) for command in commands)
|
|
74
|
+
return {
|
|
75
|
+
"type": SCOPE_EXACT_VERIFY_COMMAND_SET,
|
|
76
|
+
"algorithm": "sha256",
|
|
77
|
+
"commands_hash": _sha256_json(list(normalized)),
|
|
78
|
+
"command_count": len(normalized),
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def explicit_backend_safe_kind_scope(kind: str) -> dict[str, Any]:
|
|
83
|
+
return {
|
|
84
|
+
"type": SCOPE_EXPLICIT_BACKEND_SAFE_KIND,
|
|
85
|
+
"safe_kind": str(kind),
|
|
86
|
+
"backend_owned": True,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def approval_session_scope_for_request(request: Any) -> ApprovalSessionScope:
|
|
91
|
+
kind = str(getattr(request, "kind", "") or "approval")
|
|
92
|
+
raw_scope = getattr(request, "allow_for_session_scope", None)
|
|
93
|
+
metadata = getattr(request, "metadata", None)
|
|
94
|
+
if raw_scope is None and isinstance(metadata, dict):
|
|
95
|
+
candidate = metadata.get("allow_for_session_scope")
|
|
96
|
+
if isinstance(candidate, dict):
|
|
97
|
+
raw_scope = candidate
|
|
98
|
+
if not isinstance(raw_scope, dict):
|
|
99
|
+
return _unsupported(
|
|
100
|
+
"Allow for session is unavailable because this approval did not include an exact safe scope."
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
scope_type = str(raw_scope.get("type") or raw_scope.get("scope_type") or "").strip()
|
|
104
|
+
if scope_type not in SUPPORTED_APPROVAL_SCOPES:
|
|
105
|
+
return _unsupported(
|
|
106
|
+
"Allow for session is unavailable because the approval scope is unsupported."
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
if _is_command_like_kind(kind):
|
|
110
|
+
if scope_type != SCOPE_EXACT_COMMAND_HASH:
|
|
111
|
+
return _unsupported(
|
|
112
|
+
"Allow for session is unavailable because command approvals require an exact command hash scope."
|
|
113
|
+
)
|
|
114
|
+
elif kind == "verify_run":
|
|
115
|
+
if scope_type != SCOPE_EXACT_VERIFY_COMMAND_SET:
|
|
116
|
+
return _unsupported(
|
|
117
|
+
"Allow for session is unavailable because verification approvals require an exact verification command set scope."
|
|
118
|
+
)
|
|
119
|
+
elif kind in _FILE_SCOPE_KINDS:
|
|
120
|
+
if scope_type != SCOPE_EXACT_FILE_SET:
|
|
121
|
+
return _unsupported(
|
|
122
|
+
"Allow for session is unavailable because file approvals require an exact file set scope."
|
|
123
|
+
)
|
|
124
|
+
elif scope_type != SCOPE_EXPLICIT_BACKEND_SAFE_KIND:
|
|
125
|
+
return _unsupported(
|
|
126
|
+
"Allow for session is unavailable because this approval kind is not backend-marked as session safe."
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if scope_type == SCOPE_EXACT_COMMAND_HASH:
|
|
130
|
+
return _command_hash_scope(kind, raw_scope, getattr(request, "command", None))
|
|
131
|
+
if scope_type == SCOPE_EXACT_FILE_SET:
|
|
132
|
+
return _file_set_scope(kind, raw_scope, getattr(request, "files", ()))
|
|
133
|
+
if scope_type == SCOPE_EXACT_VERIFY_COMMAND_SET:
|
|
134
|
+
return _verify_command_set_scope(kind, raw_scope)
|
|
135
|
+
return _explicit_backend_safe_kind_scope(kind, raw_scope)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _command_hash_scope(
|
|
139
|
+
kind: str,
|
|
140
|
+
raw_scope: dict[str, Any],
|
|
141
|
+
command: Any,
|
|
142
|
+
) -> ApprovalSessionScope:
|
|
143
|
+
command_hash = str(raw_scope.get("command_hash") or "").strip().lower()
|
|
144
|
+
if _SHA256_PATTERN.fullmatch(command_hash) is None:
|
|
145
|
+
return _unsupported(
|
|
146
|
+
"Allow for session is unavailable because the command scope is malformed."
|
|
147
|
+
)
|
|
148
|
+
if command is not None and _sha256_text(str(command)) != command_hash:
|
|
149
|
+
return _unsupported(
|
|
150
|
+
"Allow for session is unavailable because the command scope does not match the approval request."
|
|
151
|
+
)
|
|
152
|
+
scope = {
|
|
153
|
+
"type": SCOPE_EXACT_COMMAND_HASH,
|
|
154
|
+
"algorithm": "sha256",
|
|
155
|
+
"kind": kind,
|
|
156
|
+
"command_hash": command_hash,
|
|
157
|
+
}
|
|
158
|
+
return _supported(scope)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _file_set_scope(
|
|
162
|
+
kind: str,
|
|
163
|
+
raw_scope: dict[str, Any],
|
|
164
|
+
files: Any,
|
|
165
|
+
) -> ApprovalSessionScope:
|
|
166
|
+
files_hash = str(raw_scope.get("files_hash") or "").strip().lower()
|
|
167
|
+
normalized_files = _normalize_files(files if isinstance(files, list | tuple) else ())
|
|
168
|
+
if _SHA256_PATTERN.fullmatch(files_hash) is None:
|
|
169
|
+
return _unsupported("Allow for session is unavailable because the file scope is malformed.")
|
|
170
|
+
if not normalized_files:
|
|
171
|
+
return _unsupported(
|
|
172
|
+
"Allow for session is unavailable because file approvals require at least one scoped file."
|
|
173
|
+
)
|
|
174
|
+
if _sha256_json(list(normalized_files)) != files_hash:
|
|
175
|
+
return _unsupported(
|
|
176
|
+
"Allow for session is unavailable because the file scope does not match the approval request."
|
|
177
|
+
)
|
|
178
|
+
scope = {
|
|
179
|
+
"type": SCOPE_EXACT_FILE_SET,
|
|
180
|
+
"algorithm": "sha256",
|
|
181
|
+
"kind": kind,
|
|
182
|
+
"operation": str(raw_scope.get("operation") or kind),
|
|
183
|
+
"files_hash": files_hash,
|
|
184
|
+
"file_count": len(normalized_files),
|
|
185
|
+
"files": list(normalized_files),
|
|
186
|
+
}
|
|
187
|
+
return _supported(scope)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _verify_command_set_scope(kind: str, raw_scope: dict[str, Any]) -> ApprovalSessionScope:
|
|
191
|
+
commands_hash = str(raw_scope.get("commands_hash") or "").strip().lower()
|
|
192
|
+
if _SHA256_PATTERN.fullmatch(commands_hash) is None:
|
|
193
|
+
return _unsupported(
|
|
194
|
+
"Allow for session is unavailable because the verification scope is malformed."
|
|
195
|
+
)
|
|
196
|
+
command_count = _positive_int(raw_scope.get("command_count"))
|
|
197
|
+
if command_count is None:
|
|
198
|
+
return _unsupported(
|
|
199
|
+
"Allow for session is unavailable because the verification scope is missing its command count."
|
|
200
|
+
)
|
|
201
|
+
scope = {
|
|
202
|
+
"type": SCOPE_EXACT_VERIFY_COMMAND_SET,
|
|
203
|
+
"algorithm": "sha256",
|
|
204
|
+
"kind": kind,
|
|
205
|
+
"commands_hash": commands_hash,
|
|
206
|
+
"command_count": command_count,
|
|
207
|
+
}
|
|
208
|
+
return _supported(scope)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _explicit_backend_safe_kind_scope(
|
|
212
|
+
kind: str,
|
|
213
|
+
raw_scope: dict[str, Any],
|
|
214
|
+
) -> ApprovalSessionScope:
|
|
215
|
+
safe_kind = str(raw_scope.get("safe_kind") or "").strip()
|
|
216
|
+
if safe_kind != kind or raw_scope.get("backend_owned") is not True:
|
|
217
|
+
return _unsupported(
|
|
218
|
+
"Allow for session is unavailable because the backend safe-kind scope is malformed."
|
|
219
|
+
)
|
|
220
|
+
scope = {
|
|
221
|
+
"type": SCOPE_EXPLICIT_BACKEND_SAFE_KIND,
|
|
222
|
+
"kind": kind,
|
|
223
|
+
"safe_kind": safe_kind,
|
|
224
|
+
}
|
|
225
|
+
return _supported(scope)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _supported(scope: dict[str, Any]) -> ApprovalSessionScope:
|
|
229
|
+
key = json.dumps(scope, ensure_ascii=True, sort_keys=True, separators=(",", ":"))
|
|
230
|
+
return ApprovalSessionScope(supported=True, scope=scope, key=key, warning=None)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _unsupported(warning: str) -> ApprovalSessionScope:
|
|
234
|
+
return ApprovalSessionScope(supported=False, scope=None, key=None, warning=warning)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def _normalize_files(files: Iterable[Any]) -> tuple[str, ...]:
|
|
238
|
+
normalized: list[str] = []
|
|
239
|
+
seen: set[str] = set()
|
|
240
|
+
for file in files:
|
|
241
|
+
text = str(file).strip().replace("\\", "/")
|
|
242
|
+
if not text or text in seen:
|
|
243
|
+
continue
|
|
244
|
+
seen.add(text)
|
|
245
|
+
normalized.append(text)
|
|
246
|
+
return tuple(sorted(normalized))
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def _sha256_text(text: str) -> str:
|
|
250
|
+
return hashlib.sha256(text.encode("utf-8", errors="surrogatepass")).hexdigest()
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def _sha256_json(value: Any) -> str:
|
|
254
|
+
encoded = json.dumps(value, ensure_ascii=True, sort_keys=True, separators=(",", ":")).encode(
|
|
255
|
+
"utf-8"
|
|
256
|
+
)
|
|
257
|
+
return hashlib.sha256(encoded).hexdigest()
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def _positive_int(value: Any) -> int | None:
|
|
261
|
+
if isinstance(value, bool):
|
|
262
|
+
return None
|
|
263
|
+
try:
|
|
264
|
+
parsed = int(value)
|
|
265
|
+
except (TypeError, ValueError):
|
|
266
|
+
return None
|
|
267
|
+
return parsed if parsed > 0 else None
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _is_command_like_kind(kind: str) -> bool:
|
|
271
|
+
return (
|
|
272
|
+
kind in _COMMAND_SCOPE_KINDS
|
|
273
|
+
or kind.startswith("custom_tool_run:")
|
|
274
|
+
or kind.startswith("mcp_")
|
|
275
|
+
or kind.startswith("mcp_tool_run:")
|
|
276
|
+
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Assets
|
|
2
|
+
|
|
3
|
+
This package implements assets used by planning and execution workflows. Assets
|
|
4
|
+
can represent local files, text, images, OCR output, and derived comprehension
|
|
5
|
+
records associated with a run.
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- `models.py`, `paths.py`, `index.py`, and `ingestion.py` define and persist
|
|
10
|
+
asset records.
|
|
11
|
+
- `ocr.py`, `comprehender.py`, and `prompts.py` derive text and summaries.
|
|
12
|
+
- `planner_context.py`, `replanner_context.py`, `worker_section.py`, and
|
|
13
|
+
`worker_tools.py` prepare assets for planning and execution.
|
|
14
|
+
- `legacy_migration.py` handles older attached-asset layouts.
|
|
15
|
+
- `untrusted_content.py` wraps extracted asset text.
|
|
16
|
+
|
|
17
|
+
## Scope
|
|
18
|
+
|
|
19
|
+
Asset content can come from repository files, user uploads, OCR, or generated
|
|
20
|
+
summaries. Keep it bounded and provenance-aware before exposing it to prompts.
|
|
21
|
+
|
|
22
|
+
Asset records are run artifacts. Mutations should preserve index consistency
|
|
23
|
+
and avoid silently deleting original stored files.
|
|
24
|
+
|
|
25
|
+
## Development
|
|
26
|
+
|
|
27
|
+
Schema, migration, and prompt-context changes should include regression coverage
|
|
28
|
+
for existing asset records.
|
|
29
|
+
|
|
30
|
+
## See Also
|
|
31
|
+
|
|
32
|
+
- [Forge](../../../docs/forge.md)
|
|
33
|
+
- [Security model](../../../docs/security_model.md)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from .asset_read_core import AssetReadResult, perform_asset_read
|
|
4
|
+
from .budget_allocator import (
|
|
5
|
+
AssetInclusionDecision,
|
|
6
|
+
TaskAssetAllocation,
|
|
7
|
+
allocate_task_assets,
|
|
8
|
+
)
|
|
9
|
+
from .comprehender import AssetComprehender
|
|
10
|
+
from .index import AssetIndex
|
|
11
|
+
from .ingestion import ingest_asset
|
|
12
|
+
from .legacy_migration import (
|
|
13
|
+
LegacyAssetMigrationResult,
|
|
14
|
+
MigratedLegacyAsset,
|
|
15
|
+
migrate_legacy_assets,
|
|
16
|
+
)
|
|
17
|
+
from .models import (
|
|
18
|
+
AssetAlreadyExistsError,
|
|
19
|
+
AssetError,
|
|
20
|
+
AssetNotFoundError,
|
|
21
|
+
AssetRecord,
|
|
22
|
+
ComprehensionData,
|
|
23
|
+
ComprehensionRecord,
|
|
24
|
+
OcrError,
|
|
25
|
+
)
|
|
26
|
+
from .ocr import (
|
|
27
|
+
OcrProvider,
|
|
28
|
+
OcrResult,
|
|
29
|
+
ScriptDetection,
|
|
30
|
+
ScriptToLanguagesMapper,
|
|
31
|
+
TesseractOcrProvider,
|
|
32
|
+
)
|
|
33
|
+
from .plan_binding import (
|
|
34
|
+
AssetBriefingEntry,
|
|
35
|
+
TaskAssetBriefing,
|
|
36
|
+
bind_asset_to_matching_tasks,
|
|
37
|
+
collect_referenced_asset_ids,
|
|
38
|
+
infer_implicit_task_asset_briefing,
|
|
39
|
+
parse_task_asset_briefing,
|
|
40
|
+
serialize_task_asset_briefing,
|
|
41
|
+
task_asset_briefing,
|
|
42
|
+
task_asset_briefing_for_execution,
|
|
43
|
+
)
|
|
44
|
+
from .planner_context import (
|
|
45
|
+
AssetReadinessPolicy,
|
|
46
|
+
AssetReadinessReport,
|
|
47
|
+
AssetReferenceReport,
|
|
48
|
+
PlannerAssetsBundle,
|
|
49
|
+
PlannerAssetsContext,
|
|
50
|
+
asset_reference_check,
|
|
51
|
+
build_planner_assets_block,
|
|
52
|
+
build_planner_assets_bundle,
|
|
53
|
+
ensure_planner_asset_readiness,
|
|
54
|
+
)
|
|
55
|
+
from .replanner_context import (
|
|
56
|
+
PriorAssetUsageSummary,
|
|
57
|
+
ReplannerAssetsBundle,
|
|
58
|
+
build_replanner_assets_bundle,
|
|
59
|
+
)
|
|
60
|
+
from .surface import (
|
|
61
|
+
AssetSurface,
|
|
62
|
+
AssetSurfaceAddResult,
|
|
63
|
+
AssetSurfaceDetail,
|
|
64
|
+
AssetSurfaceEntry,
|
|
65
|
+
AssetSurfaceJoinReport,
|
|
66
|
+
ComprehensionRefreshHandle,
|
|
67
|
+
)
|
|
68
|
+
from .worker_mirror import MirroredAssetEntry, TaskAssetMirror, mirror_task_assets
|
|
69
|
+
from .worker_section import render_relevant_assets_section
|
|
70
|
+
|
|
71
|
+
__all__ = [
|
|
72
|
+
"AssetAlreadyExistsError",
|
|
73
|
+
"AssetComprehender",
|
|
74
|
+
"AssetError",
|
|
75
|
+
"AssetInclusionDecision",
|
|
76
|
+
"AssetIndex",
|
|
77
|
+
"AssetNotFoundError",
|
|
78
|
+
"AssetRecord",
|
|
79
|
+
"AssetReadResult",
|
|
80
|
+
"AssetReadinessPolicy",
|
|
81
|
+
"AssetReadinessReport",
|
|
82
|
+
"AssetReferenceReport",
|
|
83
|
+
"AssetSurface",
|
|
84
|
+
"AssetSurfaceAddResult",
|
|
85
|
+
"AssetSurfaceDetail",
|
|
86
|
+
"AssetSurfaceEntry",
|
|
87
|
+
"AssetSurfaceJoinReport",
|
|
88
|
+
"AssetBriefingEntry",
|
|
89
|
+
"ComprehensionData",
|
|
90
|
+
"ComprehensionRecord",
|
|
91
|
+
"ComprehensionRefreshHandle",
|
|
92
|
+
"LegacyAssetMigrationResult",
|
|
93
|
+
"MigratedLegacyAsset",
|
|
94
|
+
"OcrError",
|
|
95
|
+
"OcrProvider",
|
|
96
|
+
"OcrResult",
|
|
97
|
+
"PlannerAssetsContext",
|
|
98
|
+
"PlannerAssetsBundle",
|
|
99
|
+
"PriorAssetUsageSummary",
|
|
100
|
+
"ReplannerAssetsBundle",
|
|
101
|
+
"ScriptDetection",
|
|
102
|
+
"ScriptToLanguagesMapper",
|
|
103
|
+
"TesseractOcrProvider",
|
|
104
|
+
"TaskAssetBriefing",
|
|
105
|
+
"TaskAssetAllocation",
|
|
106
|
+
"TaskAssetMirror",
|
|
107
|
+
"MirroredAssetEntry",
|
|
108
|
+
"asset_reference_check",
|
|
109
|
+
"allocate_task_assets",
|
|
110
|
+
"bind_asset_to_matching_tasks",
|
|
111
|
+
"build_planner_assets_block",
|
|
112
|
+
"build_planner_assets_bundle",
|
|
113
|
+
"build_replanner_assets_bundle",
|
|
114
|
+
"collect_referenced_asset_ids",
|
|
115
|
+
"ensure_planner_asset_readiness",
|
|
116
|
+
"infer_implicit_task_asset_briefing",
|
|
117
|
+
"ingest_asset",
|
|
118
|
+
"migrate_legacy_assets",
|
|
119
|
+
"mirror_task_assets",
|
|
120
|
+
"parse_task_asset_briefing",
|
|
121
|
+
"perform_asset_read",
|
|
122
|
+
"render_relevant_assets_section",
|
|
123
|
+
"serialize_task_asset_briefing",
|
|
124
|
+
"task_asset_briefing",
|
|
125
|
+
"task_asset_briefing_for_execution",
|
|
126
|
+
]
|