prismal-ai 3.0.0__tar.gz
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.
- prismal_ai-3.0.0/.codegraph/.gitignore +16 -0
- prismal_ai-3.0.0/.codegraph/codegraph.db +0 -0
- prismal_ai-3.0.0/.gitignore +76 -0
- prismal_ai-3.0.0/.gitleaks.toml +69 -0
- prismal_ai-3.0.0/.pre-commit-config.yaml +316 -0
- prismal_ai-3.0.0/.python-version +1 -0
- prismal_ai-3.0.0/.trivyignore +61 -0
- prismal_ai-3.0.0/CHANGELOG.md +229 -0
- prismal_ai-3.0.0/CLAUDE.md +189 -0
- prismal_ai-3.0.0/CONTRIBUTING.md +279 -0
- prismal_ai-3.0.0/LICENSE +21 -0
- prismal_ai-3.0.0/PKG-INFO +670 -0
- prismal_ai-3.0.0/PLAN_MIGRACION.md +200 -0
- prismal_ai-3.0.0/README.md +506 -0
- prismal_ai-3.0.0/assets/prismal-logo-icon.svg +37 -0
- prismal_ai-3.0.0/assets/prismal-logo.svg +72 -0
- prismal_ai-3.0.0/config/mcp_servers.yaml +74 -0
- prismal_ai-3.0.0/env.example +407 -0
- prismal_ai-3.0.0/examples/README.md +292 -0
- prismal_ai-3.0.0/examples/extension/custom_node.py +36 -0
- prismal_ai-3.0.0/examples/extension/custom_subgraph.py +45 -0
- prismal_ai-3.0.0/examples/extension/discover_plugins_demo.py +53 -0
- prismal_ai-3.0.0/examples/extension/langchain_migration.py +35 -0
- prismal_ai-3.0.0/examples/multimodal/01_vision_agent.py +206 -0
- prismal_ai-3.0.0/examples/multimodal/02_audio_agent.py +196 -0
- prismal_ai-3.0.0/examples/multimodal/03_video_agent.py +223 -0
- prismal_ai-3.0.0/examples/multimodal/04_modality_router.py +162 -0
- prismal_ai-3.0.0/examples/multimodal/05_multimodal_fusion.py +195 -0
- prismal_ai-3.0.0/examples/multimodal_pipeline.py +70 -0
- prismal_ai-3.0.0/examples/patterns/01_tree_of_thoughts.py +221 -0
- prismal_ai-3.0.0/examples/patterns/02_debate.py +165 -0
- prismal_ai-3.0.0/examples/patterns/03_lats.py +284 -0
- prismal_ai-3.0.0/examples/patterns/04_llm_compiler.py +355 -0
- prismal_ai-3.0.0/examples/patterns/05_mixture_of_agents.py +198 -0
- prismal_ai-3.0.0/examples/patterns/06_reflection_loop.py +273 -0
- prismal_ai-3.0.0/examples/patterns/07_constitutional_ai.py +249 -0
- prismal_ai-3.0.0/examples/patterns/08_swarm.py +304 -0
- prismal_ai-3.0.0/examples/patterns/09_parallel_dispatcher.py +310 -0
- prismal_ai-3.0.0/examples/plugin_template/README.md +47 -0
- prismal_ai-3.0.0/examples/plugin_template/pyproject.toml +21 -0
- prismal_ai-3.0.0/examples/plugin_template/src/prismal_x_example/__init__.py +5 -0
- prismal_ai-3.0.0/examples/plugin_template/src/prismal_x_example/nodes.py +12 -0
- prismal_ai-3.0.0/examples/plugin_template/src/prismal_x_example/plugin.py +34 -0
- prismal_ai-3.0.0/examples/plugin_template/tests/test_plugin.py +19 -0
- prismal_ai-3.0.0/examples/rag/01_crag.py +280 -0
- prismal_ai-3.0.0/examples/rag/02_adaptive_rag.py +303 -0
- prismal_ai-3.0.0/examples/rag/03_self_rag.py +270 -0
- prismal_ai-3.0.0/examples/rag/04_hyde.py +328 -0
- prismal_ai-3.0.0/examples/rag/05_hybrid_search.py +332 -0
- prismal_ai-3.0.0/examples/rag/06_hierarchical_rag.py +305 -0
- prismal_ai-3.0.0/examples/rag/07_rag_fusion.py +318 -0
- prismal_ai-3.0.0/examples/rag/08_multi_vector_rag.py +319 -0
- prismal_ai-3.0.0/examples/rag/09_multimodal_rag.py +312 -0
- prismal_ai-3.0.0/examples/subgraphs/01_ml_pipeline.py +177 -0
- prismal_ai-3.0.0/examples/subgraphs/02_financial_analyst.py +266 -0
- prismal_ai-3.0.0/examples/subgraphs/03_dev_pipeline.py +366 -0
- prismal_ai-3.0.0/examples/subgraphs/04_code_review.py +777 -0
- prismal_ai-3.0.0/examples/subgraphs/05_data_etl.py +580 -0
- prismal_ai-3.0.0/examples/subgraphs/06_customer_service.py +471 -0
- prismal_ai-3.0.0/examples/subgraphs/07_document_generation.py +484 -0
- prismal_ai-3.0.0/examples/subgraphs/08_debate_consensus.py +454 -0
- prismal_ai-3.0.0/examples/subgraphs/09_hitl_approval.py +801 -0
- prismal_ai-3.0.0/examples/subgraphs/10_analysis_orchestrator.py +883 -0
- prismal_ai-3.0.0/examples/subgraphs/11_engineering_orchestrator.py +340 -0
- prismal_ai-3.0.0/examples/subgraphs/12_research_orchestrator.py +290 -0
- prismal_ai-3.0.0/examples/tool_provider_custom.py +71 -0
- prismal_ai-3.0.0/examples/tool_provider_host.py +99 -0
- prismal_ai-3.0.0/examples/visualize_graphs.py +52 -0
- prismal_ai-3.0.0/examples.md +404 -0
- prismal_ai-3.0.0/prismal/agents/__init__.py +31 -0
- prismal_ai-3.0.0/prismal/agents/codeact_agent.py +638 -0
- prismal_ai-3.0.0/prismal/agents/coder.py +185 -0
- prismal_ai-3.0.0/prismal/agents/context.py +77 -0
- prismal_ai-3.0.0/prismal/agents/critic.py +200 -0
- prismal_ai-3.0.0/prismal/agents/cron_manager.py +172 -0
- prismal_ai-3.0.0/prismal/agents/cua_agent.py +558 -0
- prismal_ai-3.0.0/prismal/agents/data_analyst.py +170 -0
- prismal_ai-3.0.0/prismal/agents/domain_supervisor.py +334 -0
- prismal_ai-3.0.0/prismal/agents/extension/__init__.py +81 -0
- prismal_ai-3.0.0/prismal/agents/extension/_middleware.py +304 -0
- prismal_ai-3.0.0/prismal/agents/extension/_registry.py +41 -0
- prismal_ai-3.0.0/prismal/agents/extension/adapters.py +136 -0
- prismal_ai-3.0.0/prismal/agents/extension/builder.py +263 -0
- prismal_ai-3.0.0/prismal/agents/extension/decorators.py +164 -0
- prismal_ai-3.0.0/prismal/agents/extension/plugins.py +335 -0
- prismal_ai-3.0.0/prismal/agents/extension/ports.py +146 -0
- prismal_ai-3.0.0/prismal/agents/extension/providers.py +363 -0
- prismal_ai-3.0.0/prismal/agents/factory.py +480 -0
- prismal_ai-3.0.0/prismal/agents/file_manager.py +155 -0
- prismal_ai-3.0.0/prismal/agents/graph.py +806 -0
- prismal_ai-3.0.0/prismal/agents/intent_router.py +160 -0
- prismal_ai-3.0.0/prismal/agents/meta_learner.py +300 -0
- prismal_ai-3.0.0/prismal/agents/multimodal/__init__.py +45 -0
- prismal_ai-3.0.0/prismal/agents/multimodal/audio_agent.py +200 -0
- prismal_ai-3.0.0/prismal/agents/multimodal/ingestion.py +178 -0
- prismal_ai-3.0.0/prismal/agents/multimodal/modality_router.py +252 -0
- prismal_ai-3.0.0/prismal/agents/multimodal/multimodal_fusion.py +172 -0
- prismal_ai-3.0.0/prismal/agents/multimodal/video_agent.py +268 -0
- prismal_ai-3.0.0/prismal/agents/multimodal/vision_agent.py +188 -0
- prismal_ai-3.0.0/prismal/agents/network_supervisor.py +247 -0
- prismal_ai-3.0.0/prismal/agents/parallel_research.py +221 -0
- prismal_ai-3.0.0/prismal/agents/patterns/__init__.py +38 -0
- prismal_ai-3.0.0/prismal/agents/patterns/constitutional.py +330 -0
- prismal_ai-3.0.0/prismal/agents/patterns/debate.py +353 -0
- prismal_ai-3.0.0/prismal/agents/patterns/lats.py +342 -0
- prismal_ai-3.0.0/prismal/agents/patterns/llm_compiler.py +399 -0
- prismal_ai-3.0.0/prismal/agents/patterns/mixture_of_agents.py +199 -0
- prismal_ai-3.0.0/prismal/agents/patterns/nodes.py +486 -0
- prismal_ai-3.0.0/prismal/agents/patterns/parallel.py +166 -0
- prismal_ai-3.0.0/prismal/agents/patterns/reflection.py +255 -0
- prismal_ai-3.0.0/prismal/agents/patterns/swarm.py +171 -0
- prismal_ai-3.0.0/prismal/agents/patterns/tree_of_thoughts.py +476 -0
- prismal_ai-3.0.0/prismal/agents/planner.py +365 -0
- prismal_ai-3.0.0/prismal/agents/rag_agent.py +339 -0
- prismal_ai-3.0.0/prismal/agents/researcher.py +243 -0
- prismal_ai-3.0.0/prismal/agents/skill_creator.py +512 -0
- prismal_ai-3.0.0/prismal/agents/skill_manager.py +725 -0
- prismal_ai-3.0.0/prismal/agents/spawner.py +115 -0
- prismal_ai-3.0.0/prismal/agents/state.py +163 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/__init__.py +22 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/analysis_orchestrator/__init__.py +13 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/analysis_orchestrator/builder.py +222 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/artifacts.py +94 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/__init__.py +55 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/builder.py +110 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/linter_node.py +68 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/logic_reviewer_node.py +66 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/report_generator_node.py +111 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/security_scanner_node.py +69 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/suggester_node.py +82 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/code_review/types.py +52 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/customer_service/__init__.py +44 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/customer_service/builder.py +149 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/customer_service/classifier_node.py +81 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/customer_service/escalation_node.py +62 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/customer_service/faq_retrieval_node.py +80 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/customer_service/response_generator_node.py +74 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/customer_service/ticket_creator_node.py +66 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/data_etl/__init__.py +35 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/data_etl/auditor_node.py +83 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/data_etl/builder.py +120 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/data_etl/extractor_node.py +90 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/data_etl/loader_node.py +87 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/data_etl/transformer_node.py +123 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/data_etl/validator_node.py +92 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/debate_consensus/__init__.py +44 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/debate_consensus/_helpers.py +97 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/debate_consensus/builder.py +106 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/debate_consensus/consensus_node.py +88 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/debate_consensus/moderator_node.py +33 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/debate_consensus/opponent_node.py +32 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/debate_consensus/proponent_node.py +31 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/architect_agent.py +153 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/builder.py +196 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/developer_agent.py +173 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/parallel_unit_test.py +254 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/po_agent.py +271 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/qa_agent.py +158 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/reviewer_agent.py +162 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/dev_pipeline/unit_test_agent.py +159 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/document_generation/__init__.py +43 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/document_generation/builder.py +121 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/document_generation/editor_node.py +69 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/document_generation/formatter_node.py +71 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/document_generation/planner_node.py +92 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/document_generation/researcher_node.py +98 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/document_generation/writer_node.py +75 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/engineering_orchestrator/__init__.py +13 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/engineering_orchestrator/builder.py +153 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/factory.py +168 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/artifacts.py +213 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/builder.py +442 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/fundamental_analyst.py +190 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/market_data_collector.py +263 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/report_generator.py +229 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/risk_sentiment_analyst.py +190 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/technical_analyst.py +252 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/financial/tools_finance.py +252 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/gates.py +420 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/artifacts.py +163 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/builder.py +135 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/data_ingester.py +193 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/eda_analyst.py +194 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/feature_engineer.py +192 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/model_evaluator.py +217 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/model_exporter.py +210 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/model_trainer.py +217 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/ml_pipeline/tools_ml.py +945 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/multimodal_pipeline/__init__.py +18 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/multimodal_pipeline/builder.py +324 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/registry.py +206 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/research_orchestrator/__init__.py +21 -0
- prismal_ai-3.0.0/prismal/agents/subgraphs/research_orchestrator/builder.py +170 -0
- prismal_ai-3.0.0/prismal/agents/supervisor.py +1114 -0
- prismal_ai-3.0.0/prismal/agents/tool_registry.py +987 -0
- prismal_ai-3.0.0/prismal/agents/tools.py +1247 -0
- prismal_ai-3.0.0/prismal/agents/visualization.py +131 -0
- prismal_ai-3.0.0/prismal/core/__init__.py +48 -0
- prismal_ai-3.0.0/prismal/core/config.py +1385 -0
- prismal_ai-3.0.0/prismal/core/database.py +236 -0
- prismal_ai-3.0.0/prismal/core/env_compat.py +62 -0
- prismal_ai-3.0.0/prismal/core/exceptions.py +664 -0
- prismal_ai-3.0.0/prismal/core/logging.py +176 -0
- prismal_ai-3.0.0/prismal/core/users.py +298 -0
- prismal_ai-3.0.0/prismal/data/__init__.py +36 -0
- prismal_ai-3.0.0/prismal/data/duckdb_engine.py +187 -0
- prismal_ai-3.0.0/prismal/data/polars_utils.py +320 -0
- prismal_ai-3.0.0/prismal/events/__init__.py +20 -0
- prismal_ai-3.0.0/prismal/events/file_watcher.py +251 -0
- prismal_ai-3.0.0/prismal/events/webhook_dispatcher.py +190 -0
- prismal_ai-3.0.0/prismal/langgraph.py +61 -0
- prismal_ai-3.0.0/prismal/mcp/__init__.py +32 -0
- prismal_ai-3.0.0/prismal/mcp/adapter.py +342 -0
- prismal_ai-3.0.0/prismal/mcp/client.py +441 -0
- prismal_ai-3.0.0/prismal/mcp/connection.py +675 -0
- prismal_ai-3.0.0/prismal/mcp/servers/__init__.py +10 -0
- prismal_ai-3.0.0/prismal/mcp/servers/datetime_server.py +595 -0
- prismal_ai-3.0.0/prismal/memory/__init__.py +36 -0
- prismal_ai-3.0.0/prismal/memory/chat_session_store.py +185 -0
- prismal_ai-3.0.0/prismal/memory/conversation_history.py +156 -0
- prismal_ai-3.0.0/prismal/memory/long_term.py +387 -0
- prismal_ai-3.0.0/prismal/memory/long_term_store.py +327 -0
- prismal_ai-3.0.0/prismal/memory/mongodb_store.py +340 -0
- prismal_ai-3.0.0/prismal/memory/preferences.py +351 -0
- prismal_ai-3.0.0/prismal/memory/profile.py +271 -0
- prismal_ai-3.0.0/prismal/memory/session_registry.py +222 -0
- prismal_ai-3.0.0/prismal/memory/short_term.py +125 -0
- prismal_ai-3.0.0/prismal/monitoring/__init__.py +15 -0
- prismal_ai-3.0.0/prismal/monitoring/_settings_proxy.py +22 -0
- prismal_ai-3.0.0/prismal/monitoring/cost_tracker.py +399 -0
- prismal_ai-3.0.0/prismal/monitoring/langfuse_client.py +217 -0
- prismal_ai-3.0.0/prismal/monitoring/otel.py +363 -0
- prismal_ai-3.0.0/prismal/plugins.py +112 -0
- prismal_ai-3.0.0/prismal/providers/__init__.py +44 -0
- prismal_ai-3.0.0/prismal/providers/cross_modal_embeddings.py +149 -0
- prismal_ai-3.0.0/prismal/providers/multimodal.py +44 -0
- prismal_ai-3.0.0/prismal/providers/registry.py +321 -0
- prismal_ai-3.0.0/prismal/providers/stt.py +227 -0
- prismal_ai-3.0.0/prismal/providers/tts.py +275 -0
- prismal_ai-3.0.0/prismal/providers/vision.py +45 -0
- prismal_ai-3.0.0/prismal/rag/__init__.py +99 -0
- prismal_ai-3.0.0/prismal/rag/adaptive.py +326 -0
- prismal_ai-3.0.0/prismal/rag/crag.py +320 -0
- prismal_ai-3.0.0/prismal/rag/embeddings.py +94 -0
- prismal_ai-3.0.0/prismal/rag/engine.py +293 -0
- prismal_ai-3.0.0/prismal/rag/federated.py +226 -0
- prismal_ai-3.0.0/prismal/rag/fusion.py +232 -0
- prismal_ai-3.0.0/prismal/rag/hierarchical.py +281 -0
- prismal_ai-3.0.0/prismal/rag/hybrid.py +239 -0
- prismal_ai-3.0.0/prismal/rag/hyde.py +177 -0
- prismal_ai-3.0.0/prismal/rag/loaders/__init__.py +26 -0
- prismal_ai-3.0.0/prismal/rag/loaders/audio_loader.py +101 -0
- prismal_ai-3.0.0/prismal/rag/loaders/document_loader.py +180 -0
- prismal_ai-3.0.0/prismal/rag/loaders/image_loader.py +53 -0
- prismal_ai-3.0.0/prismal/rag/loaders/video_loader.py +96 -0
- prismal_ai-3.0.0/prismal/rag/multi_vector.py +295 -0
- prismal_ai-3.0.0/prismal/rag/multimodal.py +220 -0
- prismal_ai-3.0.0/prismal/rag/self_rag.py +273 -0
- prismal_ai-3.0.0/prismal/rag/vector_store.py +213 -0
- prismal_ai-3.0.0/prismal/sandbox/__init__.py +10 -0
- prismal_ai-3.0.0/prismal/sandbox/executor.py +507 -0
- prismal_ai-3.0.0/prismal/sandbox/installer.py +307 -0
- prismal_ai-3.0.0/prismal/sandbox/isolation.py +1369 -0
- prismal_ai-3.0.0/prismal/sandbox/manager.py +205 -0
- prismal_ai-3.0.0/prismal/sandbox/tools.py +305 -0
- prismal_ai-3.0.0/prismal/scheduler/__init__.py +60 -0
- prismal_ai-3.0.0/prismal/scheduler/cron_manager.py +699 -0
- prismal_ai-3.0.0/prismal/scheduler/datetime_service.py +333 -0
- prismal_ai-3.0.0/prismal/scheduler/executor.py +504 -0
- prismal_ai-3.0.0/prismal/scheduler/heartbeat_delivery.py +201 -0
- prismal_ai-3.0.0/prismal/scheduler/notifier.py +211 -0
- prismal_ai-3.0.0/prismal/scheduler/prefect_flows.py +184 -0
- prismal_ai-3.0.0/prismal/security/__init__.py +43 -0
- prismal_ai-3.0.0/prismal/security/action_interceptor.py +205 -0
- prismal_ai-3.0.0/prismal/security/audit.py +320 -0
- prismal_ai-3.0.0/prismal/security/filesystem_guard.py +99 -0
- prismal_ai-3.0.0/prismal/security/guardrails.py +227 -0
- prismal_ai-3.0.0/prismal/security/media_validator.py +260 -0
- prismal_ai-3.0.0/prismal/security/nemo_rails.py +265 -0
- prismal_ai-3.0.0/prismal/security/patterns/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/security/patterns/injection_patterns.yaml +83 -0
- prismal_ai-3.0.0/prismal/security/permissions.py +159 -0
- prismal_ai-3.0.0/prismal/security/pii_sanitizer.py +90 -0
- prismal_ai-3.0.0/prismal/security/prompt_builder.py +75 -0
- prismal_ai-3.0.0/prismal/security/sanitizer.py +154 -0
- prismal_ai-3.0.0/prismal/skills/__init__.py +32 -0
- prismal_ai-3.0.0/prismal/skills/available/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/skills/available/calendar/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/skills/available/calendar/skill.py +166 -0
- prismal_ai-3.0.0/prismal/skills/available/code_executor/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/skills/available/code_executor/skill.py +130 -0
- prismal_ai-3.0.0/prismal/skills/available/database_query/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/skills/available/database_query/skill.py +158 -0
- prismal_ai-3.0.0/prismal/skills/available/email_reader/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/skills/available/email_reader/skill.py +212 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/SKILL.md +123 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/references/01-PLANTILLA-PRD.md +159 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/references/02-PLANTILLA-API-SPEC.md +320 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/references/03-PLANTILLA-TECHNICAL-DESIGN.md +227 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/references/04-PLANTILLA-DATA-MODEL.md +190 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/references/05-PLANTILLA-IMPLEMENTATION-PLAN.md +205 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/references/06-GUIA-LLENADO.md +284 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/scripts/validate_specs.py +204 -0
- prismal_ai-3.0.0/prismal/skills/available/spec_driven_design/skill.py +46 -0
- prismal_ai-3.0.0/prismal/skills/available/weather/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/skills/available/weather/skill.py +137 -0
- prismal_ai-3.0.0/prismal/skills/available/web_search/__init__.py +0 -0
- prismal_ai-3.0.0/prismal/skills/available/web_search/skill.py +163 -0
- prismal_ai-3.0.0/prismal/skills/base.py +573 -0
- prismal_ai-3.0.0/prismal/skills/manager.py +638 -0
- prismal_ai-3.0.0/prismal/skills/remote_installer.py +613 -0
- prismal_ai-3.0.0/prismal/utils/__init__.py +0 -0
- prismal_ai-3.0.0/pyproject.toml +475 -0
- prismal_ai-3.0.0/setup.cfg +29 -0
- prismal_ai-3.0.0/specs/a2a-interop/ARCHITECTURE.md +237 -0
- prismal_ai-3.0.0/specs/a2a-interop/PLAN.md +289 -0
- prismal_ai-3.0.0/specs/a2a-interop/SPEC.md +278 -0
- prismal_ai-3.0.0/specs/a2a-interop/TASKS.md +165 -0
- prismal_ai-3.0.0/specs/advanced-architectures/ARCHITECTURE.md +538 -0
- prismal_ai-3.0.0/specs/advanced-architectures/PRD.md +445 -0
- prismal_ai-3.0.0/specs/advanced-architectures/SPEC.md +1517 -0
- prismal_ai-3.0.0/specs/advanced-architectures/TASKS.md +749 -0
- prismal_ai-3.0.0/specs/agent-eval-harness/PLAN.md +113 -0
- prismal_ai-3.0.0/specs/agent-identity-governance/PLAN.md +118 -0
- prismal_ai-3.0.0/specs/composition-root/ARCHITECTURE.md +242 -0
- prismal_ai-3.0.0/specs/composition-root/PLAN.md +267 -0
- prismal_ai-3.0.0/specs/composition-root/SPEC.md +228 -0
- prismal_ai-3.0.0/specs/composition-root/TASKS.md +172 -0
- prismal_ai-3.0.0/specs/cost-budget-governance/PLAN.md +116 -0
- prismal_ai-3.0.0/specs/dependency-security-remediation/ARCHITECTURE.md +209 -0
- prismal_ai-3.0.0/specs/dependency-security-remediation/PLAN.md +229 -0
- prismal_ai-3.0.0/specs/dependency-security-remediation/SPEC.md +211 -0
- prismal_ai-3.0.0/specs/dependency-security-remediation/TASKS.md +209 -0
- prismal_ai-3.0.0/specs/dependency-security-remediation/remediation-tracker.csv +19 -0
- prismal_ai-3.0.0/specs/extension-surface/ARCHITECTURE.md +601 -0
- prismal_ai-3.0.0/specs/extension-surface/PLAN.md +375 -0
- prismal_ai-3.0.0/specs/extension-surface/SPEC.md +855 -0
- prismal_ai-3.0.0/specs/extension-surface/TASKS.md +458 -0
- prismal_ai-3.0.0/specs/multimodal-agents/ARCHITECTURE.md +584 -0
- prismal_ai-3.0.0/specs/multimodal-agents/PLAN.md +319 -0
- prismal_ai-3.0.0/specs/multimodal-agents/SPEC.md +996 -0
- prismal_ai-3.0.0/specs/multimodal-agents/TASKS.md +480 -0
- prismal_ai-3.0.0/specs/tool-provider-injection/ARCHITECTURE.md +320 -0
- prismal_ai-3.0.0/specs/tool-provider-injection/PLAN.md +370 -0
- prismal_ai-3.0.0/specs/tool-provider-injection/SPEC.md +380 -0
- prismal_ai-3.0.0/specs/tool-provider-injection/TASKS.md +272 -0
- prismal_ai-3.0.0/specs/vector-store-port/ARCHITECTURE.md +281 -0
- prismal_ai-3.0.0/specs/vector-store-port/PLAN.md +300 -0
- prismal_ai-3.0.0/specs/vector-store-port/SPEC.md +293 -0
- prismal_ai-3.0.0/specs/vector-store-port/TASKS.md +200 -0
- prismal_ai-3.0.0/ty.toml +126 -0
- prismal_ai-3.0.0/uv.lock +8567 -0
|
Binary file
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
develop-eggs/
|
|
9
|
+
dist/
|
|
10
|
+
downloads/
|
|
11
|
+
eggs/
|
|
12
|
+
.eggs/
|
|
13
|
+
lib/
|
|
14
|
+
lib64/
|
|
15
|
+
parts/
|
|
16
|
+
sdist/
|
|
17
|
+
var/
|
|
18
|
+
wheels/
|
|
19
|
+
*.egg-info/
|
|
20
|
+
.installed.cfg
|
|
21
|
+
*.egg
|
|
22
|
+
MANIFEST
|
|
23
|
+
|
|
24
|
+
# Virtual environments
|
|
25
|
+
.env
|
|
26
|
+
.venv
|
|
27
|
+
env/
|
|
28
|
+
venv/
|
|
29
|
+
ENV/
|
|
30
|
+
env.bak/
|
|
31
|
+
venv.bak/
|
|
32
|
+
|
|
33
|
+
# Testing
|
|
34
|
+
.pytest_cache/
|
|
35
|
+
.coverage
|
|
36
|
+
htmlcov/
|
|
37
|
+
coverage.xml
|
|
38
|
+
*.cover
|
|
39
|
+
.hypothesis/
|
|
40
|
+
|
|
41
|
+
# Mypy
|
|
42
|
+
.mypy_cache/
|
|
43
|
+
.dmypy.json
|
|
44
|
+
dmypy.json
|
|
45
|
+
|
|
46
|
+
# Ruff
|
|
47
|
+
.ruff_cache/
|
|
48
|
+
|
|
49
|
+
# IDE
|
|
50
|
+
.idea/
|
|
51
|
+
.vscode/
|
|
52
|
+
*.swp
|
|
53
|
+
*.swo
|
|
54
|
+
|
|
55
|
+
# Data (runtime)
|
|
56
|
+
data/db/
|
|
57
|
+
data/logs/
|
|
58
|
+
data/workspace/
|
|
59
|
+
data/documents/
|
|
60
|
+
data/backups/
|
|
61
|
+
|
|
62
|
+
# Skills (AI-generated, not committed)
|
|
63
|
+
prismal/skills/custom/
|
|
64
|
+
prismal/skills/active/
|
|
65
|
+
|
|
66
|
+
# Secrets
|
|
67
|
+
.env
|
|
68
|
+
env.example
|
|
69
|
+
!env.example
|
|
70
|
+
*.html
|
|
71
|
+
*.pdf
|
|
72
|
+
dist/
|
|
73
|
+
packaging/
|
|
74
|
+
*.pptx
|
|
75
|
+
*.ipynb
|
|
76
|
+
.pypirc.tmp
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# .gitleaks.toml
|
|
2
|
+
# Prismal — Gitleaks configuration
|
|
3
|
+
# ============================================================
|
|
4
|
+
|
|
5
|
+
title = "Prismal Gitleaks Config"
|
|
6
|
+
|
|
7
|
+
[extend]
|
|
8
|
+
# Hereda todas las reglas por defecto de gitleaks
|
|
9
|
+
useDefault = true
|
|
10
|
+
|
|
11
|
+
# ----------------------------------------------------------
|
|
12
|
+
# Allowlist global — patrones que NO son secretos reales
|
|
13
|
+
# ----------------------------------------------------------
|
|
14
|
+
[allowlist]
|
|
15
|
+
description = "Valores de ejemplo y placeholders"
|
|
16
|
+
|
|
17
|
+
regexes = [
|
|
18
|
+
# Placeholders comunes en documentacion y ejemplos
|
|
19
|
+
'''(?i)(example|placeholder|your[-_]?key|changeme|dummy|fake|test[-_]?key|xxxx+|1234+)''',
|
|
20
|
+
# Variables de entorno sin valor asignado (solo nombre)
|
|
21
|
+
'''^\s*[A-Z_]+=\s*$''',
|
|
22
|
+
# URLs de documentacion
|
|
23
|
+
'''https?://(docs\.|www\.)?''',
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
paths = [
|
|
27
|
+
# Archivos de ejemplo/plantilla
|
|
28
|
+
'''\.env\.example$''',
|
|
29
|
+
'''\.env\.template$''',
|
|
30
|
+
'''\.env\.sample$''',
|
|
31
|
+
# Tests y fixtures
|
|
32
|
+
'''tests?/.*''',
|
|
33
|
+
'''fixtures?/.*''',
|
|
34
|
+
# Ejemplos / demos — contienen credenciales falsas intencionales
|
|
35
|
+
# usadas como entrada de los subgraphs de code-review y security scan.
|
|
36
|
+
'''examples?/.*''',
|
|
37
|
+
# Documentacion
|
|
38
|
+
'''docs?/.*''',
|
|
39
|
+
'''README.*''',
|
|
40
|
+
'''CHANGELOG.*''',
|
|
41
|
+
# Lock files (no contienen secrets reales)
|
|
42
|
+
'''uv\.lock$''',
|
|
43
|
+
'''package-lock\.json$''',
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
# ----------------------------------------------------------
|
|
47
|
+
# Reglas adicionales especificas de CuidaSalud
|
|
48
|
+
# ----------------------------------------------------------
|
|
49
|
+
|
|
50
|
+
# Detecta posibles tokens de Mercantil Seguros
|
|
51
|
+
[[rules]]
|
|
52
|
+
description = "Mercantil Seguros API Token"
|
|
53
|
+
id = "mercantil-token"
|
|
54
|
+
regex = '''(?i)mercantil.{0,20}(token|key|secret).{0,5}[=:].{0,5}["']?[A-Za-z0-9+/]{20,}'''
|
|
55
|
+
tags = ["api-key", "mercantil"]
|
|
56
|
+
|
|
57
|
+
# Detecta posibles credenciales de AWS hardcodeadas
|
|
58
|
+
[[rules]]
|
|
59
|
+
description = "AWS Access Key hardcoded"
|
|
60
|
+
id = "aws-access-key-cuida"
|
|
61
|
+
regex = '''(?i)aws.{0,20}(access.?key|secret).{0,5}[=:].{0,5}["']?[A-Za-z0-9/+]{20,}'''
|
|
62
|
+
tags = ["aws", "credentials"]
|
|
63
|
+
[rules.allowlist]
|
|
64
|
+
regexes = [
|
|
65
|
+
# Permite referencias a variables de entorno
|
|
66
|
+
'''\$\{?[A-Z_]+\}?''',
|
|
67
|
+
'''os\.environ''',
|
|
68
|
+
'''os\.getenv''',
|
|
69
|
+
]
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# .pre-commit-config.yaml
|
|
2
|
+
# CuidaSalud — cuida-integrations (FastAPI + uv)
|
|
3
|
+
# ============================================================
|
|
4
|
+
# Gate local: lint, tipos, complejidad, SAST, secrets, deps
|
|
5
|
+
# Tests y Trivy quedan en CI (demasiado lentos para pre-commit)
|
|
6
|
+
#
|
|
7
|
+
# Instalacion:
|
|
8
|
+
# uv add --dev pre-commit
|
|
9
|
+
# uv run pre-commit install
|
|
10
|
+
# uv run pre-commit install --hook-type commit-msg
|
|
11
|
+
# uv run pre-commit run --all-files # primera ejecucion completa
|
|
12
|
+
# ============================================================
|
|
13
|
+
|
|
14
|
+
default_language_version:
|
|
15
|
+
python: python3.13
|
|
16
|
+
|
|
17
|
+
# e2e runs on `git push` (pre-push), mutmut only on demand (manual). Install
|
|
18
|
+
# the extra hook type once: uv run pre-commit install --install-hooks
|
|
19
|
+
default_install_hook_types: [pre-commit, pre-push, commit-msg]
|
|
20
|
+
|
|
21
|
+
# Excluye globalmente: venv, migraciones, tests de hooks pesados,
|
|
22
|
+
# plantillas Helm (Jinja, no YAML puro), datos y artefactos runtime.
|
|
23
|
+
exclude: |
|
|
24
|
+
(?x)^(
|
|
25
|
+
\.venv/.*|
|
|
26
|
+
migrations/.*|
|
|
27
|
+
\.git/.*|
|
|
28
|
+
helm/.*|
|
|
29
|
+
data/.*|
|
|
30
|
+
dist/.*|
|
|
31
|
+
docs/.*|
|
|
32
|
+
chat_history/.*|
|
|
33
|
+
assets/.*|
|
|
34
|
+
node_modules/.*
|
|
35
|
+
)$
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
repos:
|
|
39
|
+
|
|
40
|
+
# ----------------------------------------------------------
|
|
41
|
+
# 1. SECRETS — Gitleaks
|
|
42
|
+
# Detecta API keys, tokens, passwords, JWTs hardcodeados
|
|
43
|
+
# ----------------------------------------------------------
|
|
44
|
+
- repo: https://github.com/gitleaks/gitleaks
|
|
45
|
+
rev: v8.21.2
|
|
46
|
+
hooks:
|
|
47
|
+
- id: gitleaks
|
|
48
|
+
name: "secrets: Gitleaks"
|
|
49
|
+
|
|
50
|
+
# ----------------------------------------------------------
|
|
51
|
+
# 2. CALIDAD GENERAL
|
|
52
|
+
# Hooks estandar: whitespace, EOF, YAML, TOML, JSON, merge
|
|
53
|
+
# ----------------------------------------------------------
|
|
54
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
55
|
+
rev: v5.0.0
|
|
56
|
+
hooks:
|
|
57
|
+
- id: trailing-whitespace
|
|
58
|
+
name: "fmt: trailing whitespace"
|
|
59
|
+
- id: end-of-file-fixer
|
|
60
|
+
name: "fmt: end of file"
|
|
61
|
+
- id: check-yaml
|
|
62
|
+
name: "lint: YAML valido"
|
|
63
|
+
args: [--unsafe] # permite tags custom en docker-compose
|
|
64
|
+
- id: check-toml
|
|
65
|
+
name: "lint: TOML valido"
|
|
66
|
+
- id: check-json
|
|
67
|
+
name: "lint: JSON valido"
|
|
68
|
+
- id: check-merge-conflict
|
|
69
|
+
name: "git: sin conflict markers"
|
|
70
|
+
- id: check-added-large-files
|
|
71
|
+
name: "git: archivos grandes (max 500KB)"
|
|
72
|
+
args: [--maxkb=500]
|
|
73
|
+
- id: detect-private-key
|
|
74
|
+
name: "secrets: private keys"
|
|
75
|
+
# file_manager.py docstring lists the PEM header literally as a pattern
|
|
76
|
+
# the agent must refuse to write -- excluded as false positive.
|
|
77
|
+
# Exclude both old path (monolith) and new path (extracted package).
|
|
78
|
+
exclude: ^(prismal/agents/file_manager\.py|packages/prismal/prismal/agents/file_manager\.py)$
|
|
79
|
+
- id: debug-statements
|
|
80
|
+
name: "python: sin breakpoint() / pdb / set_trace()"
|
|
81
|
+
- id: check-ast
|
|
82
|
+
name: "python: AST valido (sintaxis)"
|
|
83
|
+
|
|
84
|
+
# ----------------------------------------------------------
|
|
85
|
+
# 3. DOCKERFILE — Hadolint
|
|
86
|
+
# Malas practicas, instrucciones inseguras, :latest tags
|
|
87
|
+
# ----------------------------------------------------------
|
|
88
|
+
- repo: https://github.com/hadolint/hadolint
|
|
89
|
+
rev: v2.13.1-beta
|
|
90
|
+
hooks:
|
|
91
|
+
- id: hadolint-docker
|
|
92
|
+
name: "docker: Hadolint"
|
|
93
|
+
args:
|
|
94
|
+
- --failure-threshold=warning
|
|
95
|
+
- --ignore=DL3008 # apt-get sin pin version (ok en CI images)
|
|
96
|
+
- --ignore=DL3013 # pip install sin pin version (gestionado por uv.lock en este repo)
|
|
97
|
+
- --ignore=SC2015 # "A && B || C" idiom intencional en Dockerfile
|
|
98
|
+
|
|
99
|
+
# ----------------------------------------------------------
|
|
100
|
+
# 4. LINTING + COMPLEJIDAD CICLOMATICA — Ruff
|
|
101
|
+
# C901: max-complexity = 10 (configurado en pyproject.toml)
|
|
102
|
+
# Tambien aplica formato (reemplaza black + isort)
|
|
103
|
+
# ----------------------------------------------------------
|
|
104
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
105
|
+
# Mantener alineado con la version de ruff en uv.lock (la que usa el job
|
|
106
|
+
# `lint` de .github/workflows/ci.yml via `uv run ruff`). Si actualizas el
|
|
107
|
+
# lock, actualiza este rev para evitar drift entre pre-commit y CI.
|
|
108
|
+
rev: v0.15.11
|
|
109
|
+
hooks:
|
|
110
|
+
- id: ruff
|
|
111
|
+
name: "lint: Ruff (lint + C901)"
|
|
112
|
+
args: [--fix, --exit-non-zero-on-fix]
|
|
113
|
+
- id: ruff-format
|
|
114
|
+
name: "fmt: Ruff format"
|
|
115
|
+
|
|
116
|
+
# ----------------------------------------------------------
|
|
117
|
+
# 5. TYPE CHECKING — ty (Astral)
|
|
118
|
+
# Tipos, flujo de datos, None no manejado, retornos incorrectos
|
|
119
|
+
# Solo corre si hay cambios en app/
|
|
120
|
+
# ----------------------------------------------------------
|
|
121
|
+
- repo: local
|
|
122
|
+
hooks:
|
|
123
|
+
- id: ty-check
|
|
124
|
+
name: "types: ty (informational)"
|
|
125
|
+
language: system
|
|
126
|
+
# ty (Astral) aun en alpha v0.0.x — los errores actuales son informativos
|
|
127
|
+
# y no bloquean el commit. El type-check autoritativo es `mypy --strict`
|
|
128
|
+
# (ver CLAUDE.md > "Before Every Commit"). Migrar a `ty` cuando estabilice.
|
|
129
|
+
# Se invoca por path al venv para no depender de `uv` ni del PATH del IDE.
|
|
130
|
+
entry: .venv/bin/ty
|
|
131
|
+
args: [check, --exit-zero, --output-format=concise, prismal/]
|
|
132
|
+
pass_filenames: false
|
|
133
|
+
types: [python]
|
|
134
|
+
files: ^prismal/
|
|
135
|
+
|
|
136
|
+
# ----------------------------------------------------------
|
|
137
|
+
# 6. COMPLEJIDAD COGNITIVA — flake8 + CCR001
|
|
138
|
+
# Complementa Ruff C901 con la metrica cognitiva de SonarSource
|
|
139
|
+
# Umbral: 12 (mas estricto que ciclomatica por su naturaleza)
|
|
140
|
+
# ----------------------------------------------------------
|
|
141
|
+
- repo: https://github.com/PyCQA/flake8
|
|
142
|
+
rev: 7.3.0
|
|
143
|
+
hooks:
|
|
144
|
+
- id: flake8
|
|
145
|
+
name: "complexity: cognitive CCR001 (baseline=100)"
|
|
146
|
+
additional_dependencies:
|
|
147
|
+
- flake8-cognitive-complexity==0.1.0
|
|
148
|
+
args:
|
|
149
|
+
- --select=CCR001
|
|
150
|
+
# Umbral alineado con el peor caso actual (_repl_async: 98).
|
|
151
|
+
# TODO: bajar progresivamente a 12 conforme se refactoren
|
|
152
|
+
# supervisor_node, _repl_async, react_loop, skill_manager_node.
|
|
153
|
+
- --max-cognitive-complexity=100
|
|
154
|
+
files: ^prismal/
|
|
155
|
+
exclude: ^tests/
|
|
156
|
+
|
|
157
|
+
# ----------------------------------------------------------
|
|
158
|
+
# 7. COMPLEJIDAD — Radon (reporte, no bloquea)
|
|
159
|
+
# Muestra funciones con CC >= C (10+) como informacion
|
|
160
|
+
# verbose: true para ver output aunque no falle
|
|
161
|
+
# ----------------------------------------------------------
|
|
162
|
+
- repo: local
|
|
163
|
+
hooks:
|
|
164
|
+
- id: radon-cc
|
|
165
|
+
name: "complexity: Radon CC report (warning)"
|
|
166
|
+
language: system
|
|
167
|
+
# Path al venv en vez de `uv run ...` para no depender de `uv` en el PATH del IDE.
|
|
168
|
+
entry: .venv/bin/radon
|
|
169
|
+
args: [cc, prismal/, -s, -n, C]
|
|
170
|
+
pass_filenames: false
|
|
171
|
+
files: ^prismal/
|
|
172
|
+
verbose: true
|
|
173
|
+
|
|
174
|
+
# ----------------------------------------------------------
|
|
175
|
+
# 8. COMPLEJIDAD — Lizard (bloquea)
|
|
176
|
+
# CCN <= 10 y cognitive <= 12 por funcion
|
|
177
|
+
# Tambien valida parametros (<= 5) y longitud (<= 60 lineas)
|
|
178
|
+
# ----------------------------------------------------------
|
|
179
|
+
- repo: local
|
|
180
|
+
hooks:
|
|
181
|
+
- id: lizard
|
|
182
|
+
name: "complexity: Lizard CCN+args+length (baseline)"
|
|
183
|
+
language: system
|
|
184
|
+
# Umbrales alineados con codebase actual. Meta: CCN=10 / args=5 / length=200.
|
|
185
|
+
# TODO: bajar progresivamente al refactorizar _repl_async, supervisor_node,
|
|
186
|
+
# react_loop, skill_manager_node, cua_node, codeact _validate_imports.
|
|
187
|
+
# Path al venv en vez de `uv run ...` para no depender de `uv` en el PATH del IDE.
|
|
188
|
+
entry: .venv/bin/lizard
|
|
189
|
+
args: [prismal/, --CCN, "40", --arguments, "15", --length, "350", -w]
|
|
190
|
+
pass_filenames: false
|
|
191
|
+
files: ^prismal/
|
|
192
|
+
exclude: ^tests/
|
|
193
|
+
|
|
194
|
+
# ----------------------------------------------------------
|
|
195
|
+
# 9. SAST — Bandit
|
|
196
|
+
# Vulnerabilidades Python: eval, subprocess, shell=True,
|
|
197
|
+
# pickle inseguro, hardcoded passwords, assert en produccion
|
|
198
|
+
# ----------------------------------------------------------
|
|
199
|
+
- repo: https://github.com/PyCQA/bandit
|
|
200
|
+
rev: 1.9.4
|
|
201
|
+
hooks:
|
|
202
|
+
- id: bandit
|
|
203
|
+
name: "sast: Bandit (medium+)"
|
|
204
|
+
additional_dependencies: ["bandit[toml]"]
|
|
205
|
+
args:
|
|
206
|
+
- -r
|
|
207
|
+
- prismal/
|
|
208
|
+
- -c
|
|
209
|
+
- pyproject.toml
|
|
210
|
+
- --severity-level=medium
|
|
211
|
+
- -q
|
|
212
|
+
pass_filenames: false
|
|
213
|
+
files: ^prismal/
|
|
214
|
+
exclude: ^tests/
|
|
215
|
+
|
|
216
|
+
# ----------------------------------------------------------
|
|
217
|
+
# 10. SAST — Semgrep
|
|
218
|
+
# Deshabilitado en pre-commit: opentelemetry-instrumentation (dep. de semgrep)
|
|
219
|
+
# usa pkg_resources que no está disponible en Python 3.13.
|
|
220
|
+
# Semgrep se ejecuta en CI (Bitbucket Pipelines) con todas las reglas:
|
|
221
|
+
# p/python, p/secrets, p/owasp-top-ten, p/fastapi
|
|
222
|
+
# ----------------------------------------------------------
|
|
223
|
+
# - repo: https://github.com/semgrep/semgrep
|
|
224
|
+
# rev: v1.116.0
|
|
225
|
+
# hooks:
|
|
226
|
+
# - id: semgrep
|
|
227
|
+
# name: "sast: Semgrep (python + secrets)"
|
|
228
|
+
# args: [--config=p/python, --config=p/secrets, --error, --quiet, --exclude=tests]
|
|
229
|
+
# pass_filenames: false
|
|
230
|
+
|
|
231
|
+
# ----------------------------------------------------------
|
|
232
|
+
# 11. SEGURIDAD DEPENDENCIAS — pip-audit
|
|
233
|
+
# Solo corre si cambia pyproject.toml o uv.lock
|
|
234
|
+
# CVEs en paquetes del entorno gestionado por uv
|
|
235
|
+
# ----------------------------------------------------------
|
|
236
|
+
- repo: local
|
|
237
|
+
hooks:
|
|
238
|
+
- id: pip-audit
|
|
239
|
+
name: "sca: pip-audit (CVEs en deps)"
|
|
240
|
+
language: system
|
|
241
|
+
# Triage activo de CVEs en `prismal doctor security-check` (Phase 30).
|
|
242
|
+
# Solo CVEs SIN fix upstream aplicable, espejo exacto de `.trivyignore`
|
|
243
|
+
# (ver justificacion + trigger por entrada alli) y de ci.yml
|
|
244
|
+
# (PIP_AUDIT_IGNORES). Remediacion 2026-06:
|
|
245
|
+
# specs/dependency-security-remediation/.
|
|
246
|
+
# Path al venv en vez de `uv run ...` para no depender de `uv` en el PATH del IDE.
|
|
247
|
+
entry: .venv/bin/pip-audit
|
|
248
|
+
args:
|
|
249
|
+
# ecdsa (won't-fix, Minerva) — GHSA + alias CVE
|
|
250
|
+
- --ignore-vuln=GHSA-wj6h-64fc-37mp
|
|
251
|
+
- --ignore-vuln=CVE-2024-23342
|
|
252
|
+
# transformers 4.57.6 (solo rama lock py>=3.14) — mitigado torch>=2.6
|
|
253
|
+
- --ignore-vuln=CVE-2026-1839
|
|
254
|
+
# pip 26.0.1: CVE-2026-3219 sin fix publicado aun
|
|
255
|
+
- --ignore-vuln=CVE-2026-3219
|
|
256
|
+
# chromadb 1.5.8: CVE-2026-45829 sin first_patched_version
|
|
257
|
+
- --ignore-vuln=CVE-2026-45829
|
|
258
|
+
- --skip-editable
|
|
259
|
+
pass_filenames: false
|
|
260
|
+
files: ^(pyproject\.toml|uv\.lock)$
|
|
261
|
+
|
|
262
|
+
# ----------------------------------------------------------
|
|
263
|
+
# 12. CONVENTIONAL COMMITS
|
|
264
|
+
# Formato: feat:, fix:, chore:, docs:, refactor:, test:, ci:
|
|
265
|
+
# Requiere: uv run pre-commit install --hook-type commit-msg
|
|
266
|
+
# ----------------------------------------------------------
|
|
267
|
+
# - repo: https://github.com/compilerla/conventional-pre-commit
|
|
268
|
+
# rev: v3.4.0
|
|
269
|
+
# hooks:
|
|
270
|
+
# - id: conventional-pre-commit
|
|
271
|
+
# name: "git: conventional commit message"
|
|
272
|
+
# stages: [commit-msg]
|
|
273
|
+
# args:
|
|
274
|
+
# - feat
|
|
275
|
+
# - fix
|
|
276
|
+
# - chore
|
|
277
|
+
# - docs
|
|
278
|
+
# - style
|
|
279
|
+
# - refactor
|
|
280
|
+
# - test
|
|
281
|
+
# - ci
|
|
282
|
+
# - perf
|
|
283
|
+
# - revert
|
|
284
|
+
|
|
285
|
+
# ----------------------------------------------------------
|
|
286
|
+
# 13. E2E TESTS — runs on `git push` (pre-push stage)
|
|
287
|
+
# Deterministic end-to-end run of the compiled graph with a mocked LLM.
|
|
288
|
+
# Kept off the per-commit path (tests live in CI) but gates pushes.
|
|
289
|
+
# ----------------------------------------------------------
|
|
290
|
+
- repo: local
|
|
291
|
+
hooks:
|
|
292
|
+
- id: pytest-e2e
|
|
293
|
+
name: "tests: e2e (compiled graph, mocked LLM)"
|
|
294
|
+
language: system
|
|
295
|
+
entry: .venv/bin/pytest
|
|
296
|
+
args: [tests/e2e, -m, e2e, -q]
|
|
297
|
+
pass_filenames: false
|
|
298
|
+
stages: [pre-push]
|
|
299
|
+
types: [python]
|
|
300
|
+
|
|
301
|
+
# ----------------------------------------------------------
|
|
302
|
+
# 14. MUTATION TESTING — mutmut, scoped to prismal/security/
|
|
303
|
+
# Manual stage only (slow). Run on demand:
|
|
304
|
+
# uv run pre-commit run mutmut --hook-stage manual
|
|
305
|
+
# (or directly: uv run mutmut run && uv run mutmut results)
|
|
306
|
+
# ----------------------------------------------------------
|
|
307
|
+
- repo: local
|
|
308
|
+
hooks:
|
|
309
|
+
- id: mutmut
|
|
310
|
+
name: "mutation: mutmut (prismal/security)"
|
|
311
|
+
language: system
|
|
312
|
+
entry: .venv/bin/mutmut
|
|
313
|
+
args: [run]
|
|
314
|
+
pass_filenames: false
|
|
315
|
+
stages: [manual]
|
|
316
|
+
types: [python]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# .trivyignore — Prismal
|
|
2
|
+
# ============================================================
|
|
3
|
+
# CVEs/GHSAs aceptadas/mitigadas en dependencias SIN fix upstream
|
|
4
|
+
# aplicable. Cada entrada exige: razon, surface, referencia al spec
|
|
5
|
+
# y TRIGGER de re-evaluacion.
|
|
6
|
+
#
|
|
7
|
+
# Mismos IDs que `pip-audit --ignore-vuln` en `.github/workflows/ci.yml`
|
|
8
|
+
# y en `.pre-commit-config.yaml` -> hook `pip-audit`. Mantener los tres
|
|
9
|
+
# espejados (regla de oro).
|
|
10
|
+
#
|
|
11
|
+
# Triage activo: `prismal doctor security-check` (Phase 30 maintenance).
|
|
12
|
+
# Remediacion 2026-06: specs/dependency-security-remediation/ (18 alertas
|
|
13
|
+
# Dependabot; las resueltas por el lock se retiraron de esta lista).
|
|
14
|
+
# ============================================================
|
|
15
|
+
|
|
16
|
+
# --- ecdsa 0.19.2 -> CVE-2024-23342 (Minerva timing attack) --
|
|
17
|
+
# Transitiva (python-jose -> ecdsa). El mantenedor de python-ecdsa
|
|
18
|
+
# declaro publicamente que NO habra fix (GHSA-wj6h-64fc-37mp): la
|
|
19
|
+
# mitigacion completa requiere criptografia en C. Recomienda migrar
|
|
20
|
+
# a `cryptography`. Ya usamos python-jose[cryptography] pero python-jose
|
|
21
|
+
# arrastra `ecdsa` como dep regular. Surface: prismal no realiza firmas
|
|
22
|
+
# ECDSA P-256 sensibles en caliente -> riesgo residual aceptado.
|
|
23
|
+
# Spec: specs/dependency-security-remediation/SPEC.md (SEC-A05, alerta #1).
|
|
24
|
+
# TRIGGER de re-evaluacion: migracion python-jose -> PyJWT (deuda
|
|
25
|
+
# registrada en el spec) o fix upstream en python-ecdsa -> quitar ignore.
|
|
26
|
+
CVE-2024-23342
|
|
27
|
+
|
|
28
|
+
# --- transformers 4.57.6 (marker py>=3.14) -> CVE-2026-1839 --
|
|
29
|
+
# RCE en Trainer._load_rng_state() via torch.load() sin weights_only
|
|
30
|
+
# (GHSA-69w3-r845-3855, fix transformers 5.0.0rc3). MITIGADO:
|
|
31
|
+
# (1) pyproject fija torch>=2.6 (lock: 2.11.0) -> safe_globals() de
|
|
32
|
+
# PyTorch >=2.6 neutraliza el vector de deserializacion;
|
|
33
|
+
# (2) prismal no usa la clase Trainer (solo inferencia/embeddings via
|
|
34
|
+
# sentence-transformers);
|
|
35
|
+
# (3) en py<3.14 el lock ya resuelve transformers 5.5.4 (>=5.0.0rc3);
|
|
36
|
+
# solo la rama del lock para py>=3.14 conserva 4.57.6.
|
|
37
|
+
# Spec: specs/dependency-security-remediation/SPEC.md (SEC-A10, alerta #2).
|
|
38
|
+
# TRIGGER de re-evaluacion: release estable de transformers 5.x soportado
|
|
39
|
+
# por sentence-transformers en py>=3.14 -> subir y quitar este ignore.
|
|
40
|
+
CVE-2026-1839
|
|
41
|
+
|
|
42
|
+
# --- pip 26.0.1 -> CVE-2026-3219 (sin fix upstream aun) ------
|
|
43
|
+
# pip 26.0.1 es el ultimo release publicado y CVE-2026-3219 no tiene
|
|
44
|
+
# first_patched_version. Dependencia del toolchain (pip-audit), no del
|
|
45
|
+
# runtime de prismal.
|
|
46
|
+
# TRIGGER de re-evaluacion: pip publica release con fix -> quitar ignore.
|
|
47
|
+
CVE-2026-3219
|
|
48
|
+
|
|
49
|
+
# --- chromadb 1.5.8 -> CVE-2026-45829 (sin fix upstream) -----
|
|
50
|
+
# CRITICAL — pre-authentication code injection (GHSA-f4j7-r4q5-qw2c). El rango
|
|
51
|
+
# vulnerable es >=1.0.0,<=1.5.9 con first_patched=None: NO existe version
|
|
52
|
+
# parcheada (1.5.9 sigue afectada) y el stack langchain-chroma no admite
|
|
53
|
+
# downgrade a <1.0.0. ChromaDB se usa aqui como vector store local/embebido
|
|
54
|
+
# (SQLite + Chroma), no como servidor HTTP expuesto, lo que limita la
|
|
55
|
+
# explotabilidad pre-auth (verificado: solo `Chroma(persist_directory=...)`
|
|
56
|
+
# en rag/vector_store.py, sin HttpClient ni `chroma run`). Mismo ignore en
|
|
57
|
+
# pip-audit (.pre-commit-config.yaml + ci.yml).
|
|
58
|
+
# Spec: specs/dependency-security-remediation/SPEC.md (SEC-A02, alerta #15).
|
|
59
|
+
# TRIGGER de re-evaluacion: chromadb publica first_patched_version ->
|
|
60
|
+
# quitar ignore y subir. Triage: `prismal doctor security-check`.
|
|
61
|
+
CVE-2026-45829
|