aria-code 0.167.0__py3-none-win_amd64.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.
- aria_bots/__init__.py +7 -0
- aria_bots/channels/README.md +97 -0
- aria_bots/channels/__init__.py +1 -0
- aria_bots/channels/approvals.py +263 -0
- aria_bots/channels/conversation.py +280 -0
- aria_bots/channels/digest.py +186 -0
- aria_bots/channels/registry.py +95 -0
- aria_bots/engine.py +144 -0
- aria_bots/feishu_bot.py +1385 -0
- aria_bots/logistics/__init__.py +1 -0
- aria_bots/logistics/carriers.py +253 -0
- aria_bots/logistics/freight.py +154 -0
- aria_bots/logistics/inventory.py +242 -0
- aria_bots/logistics/mcp_server.py +156 -0
- aria_bots/logistics/records.py +119 -0
- aria_bots/logistics/tenancy.py +152 -0
- aria_bots/market.py +91 -0
- aria_bots/relay_client.py +326 -0
- aria_bots/telegram_bot.py +299 -0
- aria_code/__init__.py +111 -0
- aria_code/_bin/aria-native.exe +0 -0
- aria_code/_bin/aria-runtime.exe +0 -0
- aria_code/_version.py +20 -0
- aria_code/account_memory.py +296 -0
- aria_code/account_session.py +166 -0
- aria_code/adk_apps/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/agent.py +32 -0
- aria_code/adk_apps/aria_research/__init__.py +1 -0
- aria_code/adk_apps/aria_research/agent.py +31 -0
- aria_code/agents/__init__.py +49 -0
- aria_code/agents/base.py +329 -0
- aria_code/agents/code_review.py +200 -0
- aria_code/agents/deep/__init__.py +37 -0
- aria_code/agents/deep/calibration_loop.py +144 -0
- aria_code/agents/deep/critic.py +125 -0
- aria_code/agents/deep/deepen.py +193 -0
- aria_code/agents/deep/models.py +149 -0
- aria_code/agents/deep/pipeline.py +164 -0
- aria_code/agents/deep/quant_fusion.py +192 -0
- aria_code/agents/deep/themes.py +95 -0
- aria_code/agents/deep/tiers.py +106 -0
- aria_code/agents/engineering/__init__.py +14 -0
- aria_code/agents/engineering/coder.py +222 -0
- aria_code/agents/engineering/tester.py +145 -0
- aria_code/agents/financial/__init__.py +21 -0
- aria_code/agents/financial/cashflow_burn.py +119 -0
- aria_code/agents/financial/catalyst.py +279 -0
- aria_code/agents/financial/corporate_finance.py +175 -0
- aria_code/agents/financial/debate.py +224 -0
- aria_code/agents/financial/earnings.py +315 -0
- aria_code/agents/financial/fundamental.py +178 -0
- aria_code/agents/financial/macro.py +111 -0
- aria_code/agents/financial/news.py +231 -0
- aria_code/agents/financial/risk.py +146 -0
- aria_code/agents/financial/sector.py +279 -0
- aria_code/agents/financial/strategist.py +121 -0
- aria_code/agents/financial/stripe_revenue.py +127 -0
- aria_code/agents/financial/synthesis.py +274 -0
- aria_code/agents/financial/technical.py +277 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +392 -0
- aria_code/agents/realty/__init__.py +62 -0
- aria_code/agents/realty/asset_diagnosis.py +152 -0
- aria_code/agents/realty/business_match.py +166 -0
- aria_code/agents/realty/cashflow_verify.py +209 -0
- aria_code/agents/realty/contract_rules.py +210 -0
- aria_code/agents/realty/energy_anomaly.py +189 -0
- aria_code/agents/realty/exit_settlement.py +208 -0
- aria_code/agents/realty/fulfillment_risk.py +206 -0
- aria_code/agents/realty/ops_optimize.py +160 -0
- aria_code/agents/realty/revenue_share.py +215 -0
- aria_code/agents/registry.py +168 -0
- aria_code/agents/signal_scheme.py +111 -0
- aria_code/agents/sports/__init__.py +0 -0
- aria_code/agents/sports/football_agent.py +197 -0
- aria_code/agents/supervisor.py +113 -0
- aria_code/agents/team.py +500 -0
- aria_code/agents/video/__init__.py +16 -0
- aria_code/agents/video/director.py +376 -0
- aria_code/agents/video/qa_agent.py +143 -0
- aria_code/agents/video/script_doctor.py +112 -0
- aria_code/agents/warehouse/__init__.py +25 -0
- aria_code/agents/warehouse/contracts.py +26 -0
- aria_code/agents/warehouse/dashboard.py +155 -0
- aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
- aria_code/agents/warehouse/inbound_exceptions.py +25 -0
- aria_code/agents/warehouse/inventory_health.py +24 -0
- aria_code/agents/warehouse/local_run.py +71 -0
- aria_code/agents/warehouse/local_snapshot.py +132 -0
- aria_code/agents/warehouse/logistics_cost.py +84 -0
- aria_code/agents/warehouse/logistics_sync.py +21 -0
- aria_code/agents/warehouse/navigation.schema.json +110 -0
- aria_code/agents/warehouse/task_agent.py +172 -0
- aria_code/agents/warehouse/workflow.py +31 -0
- aria_code/aliyun_data_client.py +4 -0
- aria_code/apps/README.md +12 -0
- aria_code/apps/__init__.py +2 -0
- aria_code/apps/channels/README.md +9 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/approvals.py +11 -0
- aria_code/apps/channels/conversation.py +11 -0
- aria_code/apps/channels/digest.py +11 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +11 -0
- aria_code/apps/channels/tradingview.py +94 -0
- aria_code/apps/cli/README.md +13 -0
- aria_code/apps/cli/__init__.py +2 -0
- aria_code/apps/cli/_optional.py +120 -0
- aria_code/apps/cli/app_server.py +656 -0
- aria_code/apps/cli/auto_update.py +125 -0
- aria_code/apps/cli/bootstrap.py +206 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/chat_turn.py +1327 -0
- aria_code/apps/cli/cloud_models.py +231 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +34 -0
- aria_code/apps/cli/commands/_business_render.py +78 -0
- aria_code/apps/cli/commands/_ui.py +71 -0
- aria_code/apps/cli/commands/analysis_cmds.py +378 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +215 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
- aria_code/apps/cli/commands/broker_cmds.py +1236 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +189 -0
- aria_code/apps/cli/commands/core_cmds.py +2748 -0
- aria_code/apps/cli/commands/data_cmds.py +521 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/engineering_cmds.py +399 -0
- aria_code/apps/cli/commands/file_cmds.py +312 -0
- aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
- aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
- aria_code/apps/cli/commands/market.py +544 -0
- aria_code/apps/cli/commands/market_cmds.py +1419 -0
- aria_code/apps/cli/commands/market_context.py +432 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2374 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
- aria_code/apps/cli/commands/report.py +476 -0
- aria_code/apps/cli/commands/scaffold_templates.py +617 -0
- aria_code/apps/cli/commands/session_cmds.py +236 -0
- aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
- aria_code/apps/cli/commands/team.py +723 -0
- aria_code/apps/cli/commands/team_render.py +8 -0
- aria_code/apps/cli/commands/ui_cmds.py +401 -0
- aria_code/apps/cli/commands/warehouse_cmds.py +297 -0
- aria_code/apps/cli/commands/workflow_cmds.py +629 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +158 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/conversation_policy.py +53 -0
- aria_code/apps/cli/deterministic.py +200 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/earnings_view.py +172 -0
- aria_code/apps/cli/endpoint_migration.py +64 -0
- aria_code/apps/cli/exec_events.py +255 -0
- aria_code/apps/cli/file_references.py +155 -0
- aria_code/apps/cli/finance_service_catalog.py +111 -0
- aria_code/apps/cli/football_reports.py +231 -0
- aria_code/apps/cli/github_app_auth.py +135 -0
- aria_code/apps/cli/google_login.py +239 -0
- aria_code/apps/cli/handlers/__init__.py +11 -0
- aria_code/apps/cli/handlers/broker_handlers.py +122 -0
- aria_code/apps/cli/handlers/chart_handlers.py +1314 -0
- aria_code/apps/cli/handlers/market_handlers.py +2570 -0
- aria_code/apps/cli/handlers/realty_handlers.py +114 -0
- aria_code/apps/cli/handlers/sports_handlers.py +22 -0
- aria_code/apps/cli/handlers/strategy_advice.py +82 -0
- aria_code/apps/cli/headless.py +352 -0
- aria_code/apps/cli/helpers.py +326 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +310 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +305 -0
- aria_code/apps/cli/intent_shadow.py +72 -0
- aria_code/apps/cli/intent_signals.py +347 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +550 -0
- aria_code/apps/cli/main.py +39 -0
- aria_code/apps/cli/market_hours.py +100 -0
- aria_code/apps/cli/market_metadata.py +135 -0
- aria_code/apps/cli/market_universe.py +487 -0
- aria_code/apps/cli/message_processing.py +310 -0
- aria_code/apps/cli/mixin_binding.py +32 -0
- aria_code/apps/cli/model_catalog.py +652 -0
- aria_code/apps/cli/model_probe.py +169 -0
- aria_code/apps/cli/model_retirement.py +65 -0
- aria_code/apps/cli/native_branding.py +12 -0
- aria_code/apps/cli/native_bridge.py +118 -0
- aria_code/apps/cli/native_entry.py +58 -0
- aria_code/apps/cli/pdf_report.py +977 -0
- aria_code/apps/cli/plan_mode.py +139 -0
- aria_code/apps/cli/plotly_html.py +15 -0
- aria_code/apps/cli/prediction_feedback.py +202 -0
- aria_code/apps/cli/preflight.py +502 -0
- aria_code/apps/cli/project_aria.py +60 -0
- aria_code/apps/cli/prompt_assembly.py +78 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +71 -0
- aria_code/apps/cli/prompts/select.py +193 -0
- aria_code/apps/cli/prompts/system_prompts.py +562 -0
- aria_code/apps/cli/prompts/ui.py +436 -0
- aria_code/apps/cli/provider_endpoints.py +237 -0
- aria_code/apps/cli/provider_keys.py +73 -0
- aria_code/apps/cli/providers/__init__.py +1 -0
- aria_code/apps/cli/providers/base.py +775 -0
- aria_code/apps/cli/providers/chat_routing.py +139 -0
- aria_code/apps/cli/providers/collaboration.py +98 -0
- aria_code/apps/cli/providers/llm/__init__.py +1 -0
- aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
- aria_code/apps/cli/providers/llm/ollama_stream.py +1574 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
- aria_code/apps/cli/providers/runtime_bridge.py +586 -0
- aria_code/apps/cli/providers/vertexai_stream.py +592 -0
- aria_code/apps/cli/release_download.py +159 -0
- aria_code/apps/cli/review_runner.py +111 -0
- aria_code/apps/cli/runtime_consumer.py +769 -0
- aria_code/apps/cli/sandbox.py +32 -0
- aria_code/apps/cli/session_export.py +120 -0
- aria_code/apps/cli/session_jsonl.py +208 -0
- aria_code/apps/cli/session_refresh.py +123 -0
- aria_code/apps/cli/session_store.py +125 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/task_isolation.py +211 -0
- aria_code/apps/cli/terminal_chrome.py +412 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +932 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +113 -0
- aria_code/apps/cli/tools/__init__.py +40 -0
- aria_code/apps/cli/tools/context.py +46 -0
- aria_code/apps/cli/tools/file_tools.py +181 -0
- aria_code/apps/cli/tools/market_tools.py +626 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +656 -0
- aria_code/apps/cli/tools/write_tools.py +961 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/transactions.py +269 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +257 -0
- aria_code/apps/cli/updater.py +373 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1663 -0
- aria_code/apps/cli/web_login.py +136 -0
- aria_code/apps/cli/workflow_runner.py +127 -0
- aria_code/apps/cli/workspace_route.py +121 -0
- aria_code/apps/daemon/README.md +14 -0
- aria_code/apps/vscode/README.md +115 -0
- aria_code/apps/vscode/package.json +70 -0
- aria_code/aria_cli.py +5244 -0
- aria_code/aria_daemon.py +1372 -0
- aria_code/aria_feishu_bot.py +16 -0
- aria_code/aria_mcp_server.py +61 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_telegram_bot.py +11 -0
- aria_code/ariarc.py +385 -0
- aria_code/artifacts.py +581 -0
- aria_code/backtest_engine.py +4 -0
- aria_code/backtest_report.py +4 -0
- aria_code/brokers/__init__.py +78 -0
- aria_code/brokers/automation.py +193 -0
- aria_code/brokers/base.py +231 -0
- aria_code/brokers/capabilities.py +264 -0
- aria_code/brokers/cn/__init__.py +10 -0
- aria_code/brokers/cn/easytrader_broker.py +193 -0
- aria_code/brokers/cn/futu_broker.py +194 -0
- aria_code/brokers/cn/longbridge_broker.py +190 -0
- aria_code/brokers/cn/tiger_broker.py +196 -0
- aria_code/brokers/cn/xtquant_broker.py +225 -0
- aria_code/brokers/config.py +414 -0
- aria_code/brokers/intl/__init__.py +5 -0
- aria_code/brokers/intl/alpaca_broker.py +183 -0
- aria_code/brokers/intl/ibkr_broker.py +215 -0
- aria_code/brokers/intl/trading212_broker.py +183 -0
- aria_code/brokers/intl/webull_broker.py +156 -0
- aria_code/brokers/paper_broker.py +266 -0
- aria_code/brokers/planning.py +296 -0
- aria_code/brokers/registry.py +213 -0
- aria_code/brokers/trading.py +267 -0
- aria_code/canva_client.py +4 -0
- aria_code/change_store.py +127 -0
- aria_code/clients/__init__.py +0 -0
- aria_code/clients/aliyun_data_client.py +660 -0
- aria_code/clients/aria_relay_client.py +16 -0
- aria_code/clients/canva_client.py +284 -0
- aria_code/clients/figma_client.py +100 -0
- aria_code/clients/football_data_client.py +1671 -0
- aria_code/clients/kling_video_client.py +182 -0
- aria_code/clients/market_data_client.py +1985 -0
- aria_code/clients/openai_image_client.py +242 -0
- aria_code/clients/runway_video_client.py +157 -0
- aria_code/clients/warehouse_erp_client.py +105 -0
- aria_code/cloud_memory.py +190 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_server.py +276 -0
- aria_code/computer_use_tools.py +4 -0
- aria_code/dashboard_generator.py +579 -0
- aria_code/data_analysis_tools.py +4 -0
- aria_code/data_cleaner.py +483 -0
- aria_code/data_service.py +513 -0
- aria_code/datasources/__init__.py +23 -0
- aria_code/datasources/base.py +166 -0
- aria_code/datasources/router.py +253 -0
- aria_code/datasources/sec_statements.py +217 -0
- aria_code/datasources/sources/__init__.py +15 -0
- aria_code/datasources/sources/akshare_source.py +269 -0
- aria_code/datasources/sources/alpha_vantage_source.py +203 -0
- aria_code/datasources/sources/edgar_source.py +219 -0
- aria_code/datasources/sources/finnhub_source.py +198 -0
- aria_code/datasources/sources/fred_source.py +223 -0
- aria_code/datasources/sources/tushare_source.py +143 -0
- aria_code/datasources/sources/web_scraper_source.py +278 -0
- aria_code/datasources/sources/world_bank_source.py +206 -0
- aria_code/datasources/sources/yfinance_source.py +152 -0
- aria_code/doctor.py +860 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/_finance_core/__init__.py +5 -0
- aria_code/domain/_finance_core/backtest_engine.py +325 -0
- aria_code/domain/_finance_core/performance_stats.py +101 -0
- aria_code/domain/backtest_engine.py +75 -0
- aria_code/domain/backtest_report.py +488 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/performance_stats.py +6 -0
- aria_code/domain/portfolio_ledger.py +307 -0
- aria_code/domain/strategy_vault.py +421 -0
- aria_code/evals/__init__.py +37 -0
- aria_code/evals/behavior.py +113 -0
- aria_code/evals/gap.py +93 -0
- aria_code/evals/harness.py +949 -0
- aria_code/evals/review_probe.py +132 -0
- aria_code/evals/runner.py +425 -0
- aria_code/evals/scorecard.py +322 -0
- aria_code/evals/summary.py +125 -0
- aria_code/external_agent_runner.py +115 -0
- aria_code/figma_client.py +4 -0
- aria_code/file_analysis_tools.py +4 -0
- aria_code/finance_formulas.py +4 -0
- aria_code/football_data_client.py +4 -0
- aria_code/image_gen_tools.py +4 -0
- aria_code/intent_classifier.py +459 -0
- aria_code/kling_video_client.py +4 -0
- aria_code/licensing.py +151 -0
- aria_code/local_finance_tools.py +4 -0
- aria_code/local_image_provider.py +4 -0
- aria_code/local_llm_provider.py +4 -0
- aria_code/macro_tools.py +4 -0
- aria_code/markdown_pdf.py +289 -0
- aria_code/market_data_client.py +4 -0
- aria_code/mcp_client.py +744 -0
- aria_code/memory_manager.py +273 -0
- aria_code/model_capability.py +512 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +26 -0
- aria_code/packages/adk_bridge/__init__.py +11 -0
- aria_code/packages/adk_bridge/code_review_tools.py +49 -0
- aria_code/packages/adk_bridge/market_tools.py +125 -0
- aria_code/packages/aria_agents/__init__.py +5 -0
- aria_code/packages/aria_agents/manifest.py +78 -0
- aria_code/packages/aria_core/__init__.py +34 -0
- aria_code/packages/aria_core/architecture.py +269 -0
- aria_code/packages/aria_core/export.py +147 -0
- aria_code/packages/aria_core/manifest.py +65 -0
- aria_code/packages/aria_core/paths.py +57 -0
- aria_code/packages/aria_core/secure_file.py +68 -0
- aria_code/packages/aria_infra/__init__.py +15 -0
- aria_code/packages/aria_infra/arthera.py +58 -0
- aria_code/packages/aria_infra/doctor.py +246 -0
- aria_code/packages/aria_infra/product.py +40 -0
- aria_code/packages/aria_mcp/__init__.py +25 -0
- aria_code/packages/aria_mcp/bridge.py +232 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +162 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1705 -0
- aria_code/packages/aria_mcp/tools.py +81 -0
- aria_code/packages/aria_sdk/__init__.py +19 -0
- aria_code/packages/aria_sdk/client.py +393 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +75 -0
- aria_code/packages/aria_sdk/types.py +86 -0
- aria_code/packages/aria_services/__init__.py +92 -0
- aria_code/packages/aria_services/cache.py +60 -0
- aria_code/packages/aria_services/context.py +356 -0
- aria_code/packages/aria_services/context_checkpoints.py +157 -0
- aria_code/packages/aria_services/data.py +11 -0
- aria_code/packages/aria_services/provider_health.py +304 -0
- aria_code/packages/aria_services/references.py +247 -0
- aria_code/packages/aria_services/registry.py +249 -0
- aria_code/packages/aria_services/research_protocol.py +137 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +160 -0
- aria_code/packages/aria_services/usage.py +151 -0
- aria_code/packages/aria_skills/__init__.py +46 -0
- aria_code/packages/aria_skills/catalog.py +149 -0
- aria_code/packages/aria_skills/loader.py +455 -0
- aria_code/packages/aria_skills/registry.py +84 -0
- aria_code/packages/aria_tools/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/_paths.py +92 -0
- aria_code/packages/aria_tools/registry.py +129 -0
- aria_code/packages/quant_engine/__init__.py +33 -0
- aria_code/packages/quant_engine/_namespace.py +24 -0
- aria_code/packages/quant_engine/backtest/__init__.py +10 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +102 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +76 -0
- aria_code/packages/quant_engine/sports/calibrator.py +354 -0
- aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
- aria_code/packages/quant_engine/sports/elo.py +300 -0
- aria_code/packages/quant_engine/sports/form.py +188 -0
- aria_code/packages/quant_engine/sports/h2h.py +195 -0
- aria_code/packages/quant_engine/sports/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +31 -0
- aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
- aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
- aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- aria_code/packs/__init__.py +85 -0
- aria_code/packs/base.py +168 -0
- aria_code/packs/finance/__init__.py +250 -0
- aria_code/packs/healthcare/__init__.py +40 -0
- aria_code/packs/logistics/__init__.py +171 -0
- aria_code/packs/payments/__init__.py +139 -0
- aria_code/packs/realty/__init__.py +190 -0
- aria_code/packs/registry.py +202 -0
- aria_code/packs/rules.py +90 -0
- aria_code/plan_utils.py +194 -0
- aria_code/plugin_loader.py +328 -0
- aria_code/portfolio_ledger.py +4 -0
- aria_code/preview_server.py +449 -0
- aria_code/privacy/__init__.py +5 -0
- aria_code/privacy/feedback.py +123 -0
- aria_code/project_review.py +278 -0
- aria_code/project_review_api.py +235 -0
- aria_code/project_review_server.py +18 -0
- aria_code/project_tools.py +4 -0
- aria_code/providers/__init__.py +30 -0
- aria_code/providers/google_video_provider.py +256 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/arthera_gateway.py +90 -0
- aria_code/providers/llm/autoconfig.py +213 -0
- aria_code/providers/llm/base.py +139 -0
- aria_code/providers/llm/custom.py +158 -0
- aria_code/providers/llm/ollama.py +137 -0
- aria_code/providers/llm/openai_compat.py +350 -0
- aria_code/providers/llm/registry.py +457 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +549 -0
- aria_code/providers/ollama_models.py +79 -0
- aria_code/providers/openai_params.py +32 -0
- aria_code/providers/tool_messages.py +100 -0
- aria_code/realty_data_tools.py +4 -0
- aria_code/report_exporters.py +150 -0
- aria_code/report_generator.py +1764 -0
- aria_code/review_service.py +497 -0
- aria_code/runtime/__init__.py +176 -0
- aria_code/runtime/acceptance.py +632 -0
- aria_code/runtime/agent_loop.py +1851 -0
- aria_code/runtime/agent_profiles.py +75 -0
- aria_code/runtime/approval.py +71 -0
- aria_code/runtime/baseline.py +219 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +481 -0
- aria_code/runtime/consult.py +65 -0
- aria_code/runtime/contract.py +282 -0
- aria_code/runtime/delivery.py +432 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +167 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/native_index.py +153 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/processes.py +343 -0
- aria_code/runtime/project_graph.py +614 -0
- aria_code/runtime/repo_map.py +712 -0
- aria_code/runtime/research_bundle.py +105 -0
- aria_code/runtime/review.py +269 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +522 -0
- aria_code/runtime/scoped_runs.py +113 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/semantic_diff.py +171 -0
- aria_code/runtime/subagent.py +721 -0
- aria_code/runtime/symbol_edit.py +117 -0
- aria_code/runtime/task_brief.py +46 -0
- aria_code/runtime/task_context.py +145 -0
- aria_code/runtime/task_ledger.py +108 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/task_outcome.py +33 -0
- aria_code/runtime/task_verification.py +266 -0
- aria_code/runtime/task_worktree.py +448 -0
- aria_code/runtime/tool_executor.py +329 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/transactions.py +216 -0
- aria_code/runtime/windows_job.py +115 -0
- aria_code/runtime/workflows.py +222 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +27 -0
- aria_code/safety/client_isolation.py +178 -0
- aria_code/safety/permissions.py +339 -0
- aria_code/safety/risk.py +699 -0
- aria_code/safety/sandbox.py +148 -0
- aria_code/safety/service.py +102 -0
- aria_code/service_endpoints.py +14 -0
- aria_code/setup_wizard.py +684 -0
- aria_code/spreadsheet_tools.py +4 -0
- aria_code/strategy_vault.py +4 -0
- aria_code/tools/__init__.py +0 -0
- aria_code/tools/artifact_tools.py +252 -0
- aria_code/tools/broker_tools.py +92 -0
- aria_code/tools/build_quant_engine.py +97 -0
- aria_code/tools/code_audit_tools.py +192 -0
- aria_code/tools/computer_use_tools.py +509 -0
- aria_code/tools/data_analysis_tools.py +831 -0
- aria_code/tools/enterprise_finance_tools.py +202 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +880 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3488 -0
- aria_code/tools/logistics_carriers.py +11 -0
- aria_code/tools/logistics_inventory.py +11 -0
- aria_code/tools/logistics_io.py +11 -0
- aria_code/tools/logistics_tenancy.py +11 -0
- aria_code/tools/logistics_tools.py +11 -0
- aria_code/tools/macro_tools.py +412 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +662 -0
- aria_code/tools/spreadsheet_tools.py +399 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/tools/video_tools.py +500 -0
- aria_code/training/__init__.py +1 -0
- aria_code/training/compare.py +117 -0
- aria_code/training/prelude_commands.py +111 -0
- aria_code/training/prelude_eval.py +390 -0
- aria_code/training/prelude_real.py +183 -0
- aria_code/training/prelude_train.py +248 -0
- aria_code/training/sft_dataset.py +230 -0
- aria_code/training/trajectory_dataset.py +263 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +404 -0
- aria_code/ui/completer.py +571 -0
- aria_code/ui/console.py +285 -0
- aria_code/ui/input_box.py +505 -0
- aria_code/ui/mentions.py +206 -0
- aria_code/ui/picker.py +248 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/actions.py +297 -0
- aria_code/ui/render/finance.py +1732 -0
- aria_code/ui/render/market.py +253 -0
- aria_code/ui/render/output.py +954 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +367 -0
- aria_code/ui/robot.py +239 -0
- aria_code/ui/startup_dashboard.py +110 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +518 -0
- aria_code/video_workflow/__init__.py +8 -0
- aria_code/video_workflow/__main__.py +61 -0
- aria_code/video_workflow/engines/__init__.py +18 -0
- aria_code/video_workflow/engines/base.py +69 -0
- aria_code/video_workflow/engines/custom_model.py +204 -0
- aria_code/video_workflow/engines/google_veo.py +94 -0
- aria_code/video_workflow/engines/local_engine.py +71 -0
- aria_code/video_workflow/engines/registry.py +98 -0
- aria_code/video_workflow/google_models.py +278 -0
- aria_code/video_workflow/music/__init__.py +5 -0
- aria_code/video_workflow/music/foley_service.py +132 -0
- aria_code/video_workflow/music/service.py +212 -0
- aria_code/video_workflow/pipeline.py +620 -0
- aria_code/video_workflow/plan.py +202 -0
- aria_code/video_workflow/session.py +297 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +219 -0
- aria_code/workspace/verify.py +167 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.167.0.dist-info/METADATA +330 -0
- aria_code-0.167.0.dist-info/RECORD +601 -0
- aria_code-0.167.0.dist-info/WHEEL +5 -0
- aria_code-0.167.0.dist-info/entry_points.txt +5 -0
- aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.167.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"""Bounded task acceptance from workspace bytes and host-observed tool receipts.
|
|
2
|
+
|
|
3
|
+
Never executes a command or interprets the delegate's prose as evidence.
|
|
4
|
+
Verification covers declared predicates, not the completeness of a user's goal.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import csv
|
|
9
|
+
import hashlib
|
|
10
|
+
import io
|
|
11
|
+
import json
|
|
12
|
+
import math
|
|
13
|
+
import os
|
|
14
|
+
from pathlib import Path, PurePosixPath, PureWindowsPath
|
|
15
|
+
import re
|
|
16
|
+
import stat
|
|
17
|
+
import time
|
|
18
|
+
|
|
19
|
+
MAX_BYTES = 1_048_576
|
|
20
|
+
MAX_CHECKS = 16
|
|
21
|
+
MAX_RECEIPTS = 256
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class PredicateFailure(ValueError):
|
|
26
|
+
"""A safe, static diagnostic that may be returned without file contents."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _json_object(pairs):
|
|
30
|
+
result = {}
|
|
31
|
+
for key, value in pairs:
|
|
32
|
+
if key in result:
|
|
33
|
+
raise PredicateFailure("Duplicate JSON object keys are not accepted")
|
|
34
|
+
result[key] = value
|
|
35
|
+
return result
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _json_float(value):
|
|
39
|
+
parsed = float(value)
|
|
40
|
+
if not math.isfinite(parsed):
|
|
41
|
+
raise PredicateFailure("Non-finite JSON numbers are not accepted")
|
|
42
|
+
return parsed
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _json_constant(value):
|
|
46
|
+
raise PredicateFailure("Non-finite JSON numbers are not accepted")
|
|
47
|
+
|
|
48
|
+
def relative_path(value: str) -> str:
|
|
49
|
+
if not isinstance(value, str) or not value or len(value) > 512:
|
|
50
|
+
raise ValueError("A bounded workspace-relative path is required")
|
|
51
|
+
path = PurePosixPath(value)
|
|
52
|
+
if (path.is_absolute() or PureWindowsPath(value).drive or "\\" in value
|
|
53
|
+
or ".." in path.parts or not path.parts or len(path.parts) > 32):
|
|
54
|
+
raise ValueError("Paths must stay inside the task workspace; use forward slashes")
|
|
55
|
+
return str(path)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def validate_checks(checks) -> list[dict]:
|
|
59
|
+
if not isinstance(checks, list) or len(checks) > MAX_CHECKS:
|
|
60
|
+
raise ValueError(f"checks must be a list of at most {MAX_CHECKS} predicates")
|
|
61
|
+
normalized = []
|
|
62
|
+
for item in checks:
|
|
63
|
+
if not isinstance(item, dict):
|
|
64
|
+
raise ValueError("Each check must be an object")
|
|
65
|
+
check = dict(item)
|
|
66
|
+
kind = check.get("kind")
|
|
67
|
+
allowed = {
|
|
68
|
+
"artifact": {"kind", "path", "format", "min_bytes", "required_keys", "min_rows", "contains", "sha256", "changed"},
|
|
69
|
+
"tool": {"kind", "tool", "path"},
|
|
70
|
+
"command": {"kind", "command", "cwd"},
|
|
71
|
+
}
|
|
72
|
+
if not isinstance(kind, str) or kind not in allowed or check.keys() - allowed[kind]:
|
|
73
|
+
raise ValueError("Unknown check kind or fields")
|
|
74
|
+
if kind == "artifact":
|
|
75
|
+
check["path"] = relative_path(check.get("path"))
|
|
76
|
+
fmt = check.setdefault("format", "binary")
|
|
77
|
+
if not isinstance(fmt, str) or fmt not in {"binary", "text", "json", "csv"}:
|
|
78
|
+
raise ValueError("artifact format must be binary, text, json or csv")
|
|
79
|
+
for key, limit in (("min_bytes", MAX_BYTES), ("min_rows", 10000)):
|
|
80
|
+
if key in check and (type(check[key]) is not int or not 0 <= check[key] <= limit):
|
|
81
|
+
raise ValueError(f"Invalid {key}")
|
|
82
|
+
if "min_rows" in check and fmt != "csv":
|
|
83
|
+
raise ValueError("min_rows requires csv format")
|
|
84
|
+
if "required_keys" in check:
|
|
85
|
+
keys = check["required_keys"]
|
|
86
|
+
if (fmt not in {"json", "csv"} or not isinstance(keys, list) or len(keys) > 32
|
|
87
|
+
or any(not isinstance(k, str) or not k or len(k) > 128 for k in keys)):
|
|
88
|
+
raise ValueError("required_keys must be bounded JSON keys or CSV column names")
|
|
89
|
+
if "contains" in check and (fmt != "text" or not isinstance(check["contains"], str)
|
|
90
|
+
or not 1 <= len(check["contains"]) <= 256):
|
|
91
|
+
raise ValueError("contains requires a bounded literal text condition")
|
|
92
|
+
if "sha256" in check and not re.fullmatch(r"[a-f0-9]{64}", str(check["sha256"])):
|
|
93
|
+
raise ValueError("sha256 must be a lowercase SHA-256 digest")
|
|
94
|
+
if "changed" in check and type(check["changed"]) is not bool:
|
|
95
|
+
raise ValueError("changed must be boolean")
|
|
96
|
+
elif kind == "tool":
|
|
97
|
+
if not re.fullmatch(r"[A-Za-z0-9_.-]{1,128}", str(check.get("tool", ""))):
|
|
98
|
+
raise ValueError("tool name is required")
|
|
99
|
+
if check["tool"] == "run_command":
|
|
100
|
+
raise ValueError("Use a command check to require an observed exit code")
|
|
101
|
+
if "path" in check:
|
|
102
|
+
check["path"] = relative_path(check["path"])
|
|
103
|
+
else:
|
|
104
|
+
if not isinstance(check.get("command"), str) or not 1 <= len(check["command"].strip()) <= 4096:
|
|
105
|
+
raise ValueError("command requires the exact expected command string")
|
|
106
|
+
check["cwd"] = relative_path(check.get("cwd", ".")) if check.get("cwd", ".") != "." else "."
|
|
107
|
+
normalized.append(check)
|
|
108
|
+
return normalized
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _read_file(workspace: str, name: str) -> bytes:
|
|
112
|
+
"""Read a bounded regular file, rejecting symlink components.
|
|
113
|
+
|
|
114
|
+
POSIX uses descriptor-relative O_NOFOLLOW opens. Other platforms additionally
|
|
115
|
+
compare file identity before/after reading; this is not an OS sandbox.
|
|
116
|
+
"""
|
|
117
|
+
parts = PurePosixPath(relative_path(name)).parts
|
|
118
|
+
root = Path(workspace).resolve(strict=True)
|
|
119
|
+
descriptors = []
|
|
120
|
+
try:
|
|
121
|
+
if os.open in os.supports_dir_fd and hasattr(os, "O_NOFOLLOW"):
|
|
122
|
+
parent = os.open(root, os.O_RDONLY | os.O_DIRECTORY)
|
|
123
|
+
descriptors.append(parent)
|
|
124
|
+
for part in parts[:-1]:
|
|
125
|
+
parent = os.open(part, os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW, dir_fd=parent)
|
|
126
|
+
descriptors.append(parent)
|
|
127
|
+
fd = os.open(parts[-1], os.O_RDONLY | os.O_NOFOLLOW | os.O_NONBLOCK, dir_fd=parent)
|
|
128
|
+
else:
|
|
129
|
+
target = root
|
|
130
|
+
for part in parts:
|
|
131
|
+
target /= part
|
|
132
|
+
if target.is_symlink():
|
|
133
|
+
raise PredicateFailure("Symlink artifacts are not accepted")
|
|
134
|
+
before_path = target.stat()
|
|
135
|
+
if not stat.S_ISREG(before_path.st_mode):
|
|
136
|
+
raise PredicateFailure("Artifact must be a regular file")
|
|
137
|
+
fd = os.open(target, os.O_RDONLY | getattr(os, "O_BINARY", 0))
|
|
138
|
+
opened = os.fstat(fd)
|
|
139
|
+
if (before_path.st_dev, before_path.st_ino) != (opened.st_dev, opened.st_ino):
|
|
140
|
+
os.close(fd)
|
|
141
|
+
raise PredicateFailure("Artifact changed while opening")
|
|
142
|
+
descriptors.append(fd)
|
|
143
|
+
before = os.fstat(fd)
|
|
144
|
+
if not stat.S_ISREG(before.st_mode) or before.st_size > MAX_BYTES:
|
|
145
|
+
raise PredicateFailure("Artifact must be a regular file no larger than 1 MiB")
|
|
146
|
+
data = bytearray()
|
|
147
|
+
while len(data) <= MAX_BYTES:
|
|
148
|
+
block = os.read(fd, min(65536, MAX_BYTES + 1 - len(data)))
|
|
149
|
+
if not block:
|
|
150
|
+
break
|
|
151
|
+
data.extend(block)
|
|
152
|
+
after = os.fstat(fd)
|
|
153
|
+
if (len(data) > MAX_BYTES or len(data) != before.st_size
|
|
154
|
+
or (before.st_size, before.st_mtime_ns) != (after.st_size, after.st_mtime_ns)):
|
|
155
|
+
raise PredicateFailure("Artifact changed while reading or exceeds the size limit")
|
|
156
|
+
return bytes(data)
|
|
157
|
+
finally:
|
|
158
|
+
for fd in reversed(descriptors):
|
|
159
|
+
os.close(fd)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def capture_baseline(workspace: str, checks: list[dict]) -> dict:
|
|
163
|
+
result = {}
|
|
164
|
+
for check in checks:
|
|
165
|
+
if check["kind"] == "artifact" and check.get("changed"):
|
|
166
|
+
try:
|
|
167
|
+
result[check["path"]] = hashlib.sha256(_read_file(workspace, check["path"])).hexdigest()
|
|
168
|
+
except FileNotFoundError:
|
|
169
|
+
result[check["path"]] = None
|
|
170
|
+
return result
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def _relative_observation(workspace: str, value: str) -> str | None:
|
|
174
|
+
try:
|
|
175
|
+
root = Path(workspace).resolve()
|
|
176
|
+
path = Path(value)
|
|
177
|
+
return str((path if path.is_absolute() else root / path).resolve().relative_to(root)).replace(os.sep, "/")
|
|
178
|
+
except (ValueError, OSError, TypeError):
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def receipt_from_record(record, workspace: str) -> dict:
|
|
183
|
+
"""Project a trusted executor record without copying contents or command text."""
|
|
184
|
+
result = record.result if isinstance(record.result, dict) else {}
|
|
185
|
+
data = result.get("data") if isinstance(result.get("data"), dict) else result
|
|
186
|
+
receipt = {"tool": record.tool, "success": result.get("success") is True and not bool(result.get("error")),
|
|
187
|
+
"observed_at": record.ended_at, "source": "runtime_tool_executor"}
|
|
188
|
+
if record.params.get("path"):
|
|
189
|
+
receipt["path"] = _relative_observation(workspace, record.params["path"])
|
|
190
|
+
if record.tool == "run_command":
|
|
191
|
+
receipt["command_sha256"] = hashlib.sha256(str(record.params.get("command", "")).encode()).hexdigest()
|
|
192
|
+
receipt["cwd"] = _relative_observation(workspace, record.params.get("cwd") or workspace)
|
|
193
|
+
code = data.get("exit_code", data.get("returncode"))
|
|
194
|
+
receipt["exit_code"] = code if type(code) is int else None
|
|
195
|
+
return receipt
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def verify_checks(workspace: str, checks: list[dict], receipts: list[dict], baseline: dict | None = None, *, receipts_truncated: bool = False) -> dict:
|
|
199
|
+
if not checks:
|
|
200
|
+
return {"status": "not_requested", "verified": None, "checks": [], "checked_at": time.time()}
|
|
201
|
+
checks = validate_checks(checks)
|
|
202
|
+
reports = []
|
|
203
|
+
for index, check in enumerate(checks):
|
|
204
|
+
report = {"index": index, "kind": check["kind"], "passed": False}
|
|
205
|
+
try:
|
|
206
|
+
if check["kind"] == "artifact":
|
|
207
|
+
report["path"] = check["path"]
|
|
208
|
+
data = _read_file(workspace, check["path"])
|
|
209
|
+
digest = hashlib.sha256(data).hexdigest()
|
|
210
|
+
report.update(sha256=digest, bytes=len(data))
|
|
211
|
+
if len(data) < check.get("min_bytes", 0):
|
|
212
|
+
raise PredicateFailure("Artifact is smaller than required")
|
|
213
|
+
if "sha256" in check and digest != check["sha256"]:
|
|
214
|
+
raise PredicateFailure("Artifact digest differs from required digest")
|
|
215
|
+
if check.get("changed") and (baseline is None or check["path"] not in baseline
|
|
216
|
+
or baseline[check["path"]] == digest):
|
|
217
|
+
raise PredicateFailure("No verified change from the pre-execution baseline")
|
|
218
|
+
fmt = check["format"]
|
|
219
|
+
if fmt == "json":
|
|
220
|
+
parsed = json.loads(data.decode("utf-8"), object_pairs_hook=_json_object, parse_float=_json_float, parse_constant=_json_constant)
|
|
221
|
+
if check.get("required_keys") and (not isinstance(parsed, dict) or not set(check["required_keys"]) <= parsed.keys()):
|
|
222
|
+
raise PredicateFailure("Required top-level JSON keys are missing")
|
|
223
|
+
elif fmt == "csv":
|
|
224
|
+
reader = csv.DictReader(io.StringIO(data.decode("utf-8-sig")), strict=True)
|
|
225
|
+
if not reader.fieldnames or len(set(reader.fieldnames)) != len(reader.fieldnames):
|
|
226
|
+
raise PredicateFailure("CSV requires unique column names")
|
|
227
|
+
if not set(check.get("required_keys", [])) <= set(reader.fieldnames):
|
|
228
|
+
raise PredicateFailure("Required CSV columns are missing")
|
|
229
|
+
count = 0
|
|
230
|
+
for row in reader:
|
|
231
|
+
if None in row or any(value is None for value in row.values()):
|
|
232
|
+
raise PredicateFailure("CSV rows do not match the header")
|
|
233
|
+
count += 1
|
|
234
|
+
report["rows"] = count
|
|
235
|
+
if count < check.get("min_rows", 0):
|
|
236
|
+
raise PredicateFailure("CSV has fewer data rows than required")
|
|
237
|
+
elif fmt == "text":
|
|
238
|
+
text = data.decode("utf-8")
|
|
239
|
+
if "contains" in check and check["contains"] not in text:
|
|
240
|
+
raise PredicateFailure("Required literal text is missing")
|
|
241
|
+
report["passed"] = True
|
|
242
|
+
else:
|
|
243
|
+
if receipts_truncated:
|
|
244
|
+
raise PredicateFailure("Incomplete execution receipt history")
|
|
245
|
+
if check["kind"] == "command":
|
|
246
|
+
digest = hashlib.sha256(check["command"].encode()).hexdigest()
|
|
247
|
+
matches = [r for r in receipts if r.get("tool") == "run_command" and r.get("command_sha256") == digest and r.get("cwd") == check["cwd"]]
|
|
248
|
+
else:
|
|
249
|
+
matches = [r for r in receipts if r.get("tool") == check["tool"] and ("path" not in check or r.get("path") == check["path"])]
|
|
250
|
+
# Only a host receipt is evidence. A later failing invocation
|
|
251
|
+
# supersedes an earlier pass of the same declared operation.
|
|
252
|
+
matches = [r for r in matches if r.get("source") == "runtime_tool_executor"]
|
|
253
|
+
if not matches:
|
|
254
|
+
raise PredicateFailure("No matching host-observed execution")
|
|
255
|
+
last = matches[-1]
|
|
256
|
+
report["receipt"] = last
|
|
257
|
+
report["passed"] = last["success"] is True and (check["kind"] != "command" or last.get("exit_code") == 0)
|
|
258
|
+
if not report["passed"]:
|
|
259
|
+
raise PredicateFailure("The last matching execution failed or has no zero exit code")
|
|
260
|
+
except (OSError, ValueError, UnicodeError, csv.Error, RecursionError) as exc:
|
|
261
|
+
# Do not return parser excerpts, file contents or unrelated paths.
|
|
262
|
+
report["error"] = str(exc) if isinstance(exc, PredicateFailure) else "Missing, unsafe or invalid artifact data"
|
|
263
|
+
reports.append(report)
|
|
264
|
+
passed = all(r["passed"] for r in reports)
|
|
265
|
+
return {"status": "verified" if passed else "failed", "verified": passed, "checks": reports,
|
|
266
|
+
"checked_at": time.time(), "coverage": "declared_predicates_only"}
|