tapps-agents 3.5.40__py3-none-any.whl → 3.6.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.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,454 +1,454 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Error envelope system for consistent error handling across agents and workflows.
|
|
3
|
-
|
|
4
|
-
Epic 7 / Story 7.2: Robust Error Handling
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import re
|
|
8
|
-
from dataclasses import dataclass
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
from .exceptions import (
|
|
12
|
-
AgentError,
|
|
13
|
-
AgentFileNotFoundError,
|
|
14
|
-
ConfigurationError,
|
|
15
|
-
Context7UnavailableError,
|
|
16
|
-
FileOperationError,
|
|
17
|
-
WorkflowExecutionError,
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@dataclass
|
|
22
|
-
class ErrorEnvelope:
|
|
23
|
-
"""
|
|
24
|
-
Standard error envelope for agent results and workflow step failures.
|
|
25
|
-
|
|
26
|
-
Provides machine-readable fields and human-readable messages with
|
|
27
|
-
correlation identifiers for traceability.
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
code: str
|
|
31
|
-
message: str
|
|
32
|
-
category: str
|
|
33
|
-
details: dict[str, Any] | None = None
|
|
34
|
-
workflow_id: str | None = None
|
|
35
|
-
step_id: str | None = None
|
|
36
|
-
agent: str | None = None
|
|
37
|
-
correlation_id: str | None = None
|
|
38
|
-
recoverable: bool = False
|
|
39
|
-
retry_after: int | None = None # seconds
|
|
40
|
-
|
|
41
|
-
def to_dict(self) -> dict[str, Any]:
|
|
42
|
-
"""Convert error envelope to dictionary."""
|
|
43
|
-
result: dict[str, Any] = {
|
|
44
|
-
"error": {
|
|
45
|
-
"code": self.code,
|
|
46
|
-
"message": self.message,
|
|
47
|
-
"category": self.category,
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if self.details:
|
|
52
|
-
result["error"]["details"] = self.details
|
|
53
|
-
|
|
54
|
-
if self.workflow_id:
|
|
55
|
-
result["workflow_id"] = self.workflow_id
|
|
56
|
-
if self.step_id:
|
|
57
|
-
result["step_id"] = self.step_id
|
|
58
|
-
if self.agent:
|
|
59
|
-
result["agent"] = self.agent
|
|
60
|
-
if self.correlation_id:
|
|
61
|
-
result["correlation_id"] = self.correlation_id
|
|
62
|
-
|
|
63
|
-
if self.recoverable:
|
|
64
|
-
result["error"]["recoverable"] = True
|
|
65
|
-
if self.retry_after:
|
|
66
|
-
result["error"]["retry_after"] = self.retry_after
|
|
67
|
-
|
|
68
|
-
return result
|
|
69
|
-
|
|
70
|
-
def to_user_message(self) -> str:
|
|
71
|
-
"""
|
|
72
|
-
Generate user-friendly error message with actionable guidance.
|
|
73
|
-
|
|
74
|
-
Returns:
|
|
75
|
-
Human-readable error message with next steps
|
|
76
|
-
"""
|
|
77
|
-
# Use ASCII-safe symbols for Windows compatibility
|
|
78
|
-
parts = [f"\n[ERROR] {self.message}"]
|
|
79
|
-
|
|
80
|
-
if self.recoverable:
|
|
81
|
-
parts.append("\n[RECOVERABLE] This error may be recoverable.")
|
|
82
|
-
if self.retry_after:
|
|
83
|
-
parts.append(f" You can retry after {self.retry_after} seconds.")
|
|
84
|
-
|
|
85
|
-
# Add actionable next steps
|
|
86
|
-
next_steps = self._get_actionable_next_steps()
|
|
87
|
-
if next_steps:
|
|
88
|
-
parts.append("\n[NEXT STEPS]")
|
|
89
|
-
for i, step in enumerate(next_steps, 1):
|
|
90
|
-
parts.append(f" {i}. {step}")
|
|
91
|
-
|
|
92
|
-
# Add category-specific guidance
|
|
93
|
-
guidance = self._get_category_guidance()
|
|
94
|
-
if guidance:
|
|
95
|
-
parts.append(f"\n[HINT] {guidance}")
|
|
96
|
-
|
|
97
|
-
# Add correlation info for debugging
|
|
98
|
-
if self.workflow_id or self.step_id:
|
|
99
|
-
parts.append("\n[REFERENCE]")
|
|
100
|
-
if self.workflow_id:
|
|
101
|
-
parts.append(f" workflow_id: {self.workflow_id}")
|
|
102
|
-
if self.step_id:
|
|
103
|
-
parts.append(f" step_id: {self.step_id}")
|
|
104
|
-
# Add state location hint
|
|
105
|
-
parts.append(" state_dir: .tapps-agents/workflow-state/")
|
|
106
|
-
|
|
107
|
-
return "\n".join(parts)
|
|
108
|
-
|
|
109
|
-
def _get_actionable_next_steps(self) -> list[str]:
|
|
110
|
-
"""Get actionable next steps based on error code and category."""
|
|
111
|
-
steps: list[str] = []
|
|
112
|
-
|
|
113
|
-
# File not found errors
|
|
114
|
-
if self.code == "file_not_found":
|
|
115
|
-
steps.append("Check if the file exists: ls -la <path>")
|
|
116
|
-
steps.append("Run with different target: tapps-agents workflow <preset> --file <correct_path>")
|
|
117
|
-
if self.step_id:
|
|
118
|
-
steps.append(f"Resume from this step: tapps-agents workflow resume --continue-from {self.step_id}")
|
|
119
|
-
|
|
120
|
-
# Configuration errors
|
|
121
|
-
elif self.category == "configuration":
|
|
122
|
-
steps.append("Verify config: tapps-agents doctor --full")
|
|
123
|
-
steps.append("Reinitialize config: tapps-agents init --reset")
|
|
124
|
-
steps.append("Check config file: cat .tapps-agents/config.yaml")
|
|
125
|
-
|
|
126
|
-
# External dependency errors (Context7, etc.)
|
|
127
|
-
elif self.category == "external_dependency":
|
|
128
|
-
steps.append("Check service status: tapps-agents health check")
|
|
129
|
-
steps.append("Verify API keys in environment variables")
|
|
130
|
-
steps.append("Run without external dependencies: tapps-agents workflow <preset> --cli-mode")
|
|
131
|
-
|
|
132
|
-
# Workflow execution errors
|
|
133
|
-
elif self.code == "workflow_execution_error":
|
|
134
|
-
steps.append("View workflow state: tapps-agents workflow state list")
|
|
135
|
-
if self.workflow_id:
|
|
136
|
-
steps.append(f"Show details: tapps-agents workflow state show {self.workflow_id}")
|
|
137
|
-
steps.append(f"Resume workflow: tapps-agents workflow resume --workflow-id {self.workflow_id}")
|
|
138
|
-
steps.append("Try individual agent: tapps-agents <agent> <command> <args>")
|
|
139
|
-
|
|
140
|
-
# Timeout errors
|
|
141
|
-
elif self.category == "timeout":
|
|
142
|
-
steps.append("Increase timeout: Set TAPPS_AGENTS_TIMEOUT=7200 (2 hours)")
|
|
143
|
-
steps.append("Check for stuck processes: tapps-agents status --detailed")
|
|
144
|
-
if self.step_id:
|
|
145
|
-
steps.append(f"Resume from failed step: tapps-agents workflow resume --continue-from {self.step_id}")
|
|
146
|
-
|
|
147
|
-
# Permission errors
|
|
148
|
-
elif self.category == "permission":
|
|
149
|
-
steps.append("Check file permissions: ls -la <path>")
|
|
150
|
-
steps.append("Ensure write access to project directory")
|
|
151
|
-
steps.append("Try running with elevated permissions if needed")
|
|
152
|
-
|
|
153
|
-
# Validation errors
|
|
154
|
-
elif self.category == "validation":
|
|
155
|
-
steps.append("Review input parameters")
|
|
156
|
-
steps.append("Check command syntax: tapps-agents <command> --help")
|
|
157
|
-
steps.append("Validate with dry-run: tapps-agents workflow <preset> --dry-run")
|
|
158
|
-
|
|
159
|
-
# Generic fallback
|
|
160
|
-
if not steps:
|
|
161
|
-
steps.append("Check logs: .tapps-agents/logs/")
|
|
162
|
-
steps.append("Run diagnostics: tapps-agents doctor --full")
|
|
163
|
-
steps.append("View workflow state: tapps-agents workflow state list")
|
|
164
|
-
|
|
165
|
-
return steps
|
|
166
|
-
|
|
167
|
-
def _get_category_guidance(self) -> str | None:
|
|
168
|
-
"""Get category-specific guidance message."""
|
|
169
|
-
guidance_map = {
|
|
170
|
-
"configuration": "Check your configuration file (.tapps-agents/config.yaml) and environment variables.",
|
|
171
|
-
"external_dependency": "Verify that external services are available and credentials are correct.",
|
|
172
|
-
"validation": "Review the input parameters and ensure they meet the required format.",
|
|
173
|
-
"execution": "Check logs for detailed error information. This may indicate a bug or unexpected condition.",
|
|
174
|
-
"permission": "Verify file permissions and that you have access to the required resources.",
|
|
175
|
-
"timeout": "The operation took too long. Consider increasing timeout settings or optimizing the operation.",
|
|
176
|
-
}
|
|
177
|
-
return guidance_map.get(self.category)
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
class ErrorEnvelopeBuilder:
|
|
181
|
-
"""Helper class for building error envelopes from exceptions and errors."""
|
|
182
|
-
|
|
183
|
-
@staticmethod
|
|
184
|
-
def from_exception(
|
|
185
|
-
exc: Exception,
|
|
186
|
-
workflow_id: str | None = None,
|
|
187
|
-
step_id: str | None = None,
|
|
188
|
-
agent: str | None = None,
|
|
189
|
-
correlation_id: str | None = None,
|
|
190
|
-
) -> ErrorEnvelope:
|
|
191
|
-
"""
|
|
192
|
-
Create error envelope from an exception.
|
|
193
|
-
|
|
194
|
-
Args:
|
|
195
|
-
exc: Exception to convert
|
|
196
|
-
workflow_id: Optional workflow ID for correlation
|
|
197
|
-
step_id: Optional step ID for correlation
|
|
198
|
-
agent: Optional agent name for correlation
|
|
199
|
-
correlation_id: Optional correlation ID
|
|
200
|
-
|
|
201
|
-
Returns:
|
|
202
|
-
ErrorEnvelope instance
|
|
203
|
-
"""
|
|
204
|
-
# Determine error category and code
|
|
205
|
-
category, code = ErrorEnvelopeBuilder._categorize_exception(exc)
|
|
206
|
-
|
|
207
|
-
# Sanitize error message (remove secrets)
|
|
208
|
-
message = ErrorEnvelopeBuilder._sanitize_message(str(exc))
|
|
209
|
-
|
|
210
|
-
# Determine if error is recoverable
|
|
211
|
-
recoverable = ErrorEnvelopeBuilder._is_recoverable(exc)
|
|
212
|
-
|
|
213
|
-
return ErrorEnvelope(
|
|
214
|
-
code=code,
|
|
215
|
-
message=message,
|
|
216
|
-
category=category,
|
|
217
|
-
workflow_id=workflow_id,
|
|
218
|
-
step_id=step_id,
|
|
219
|
-
agent=agent,
|
|
220
|
-
correlation_id=correlation_id,
|
|
221
|
-
recoverable=recoverable,
|
|
222
|
-
)
|
|
223
|
-
|
|
224
|
-
@staticmethod
|
|
225
|
-
def from_dict(
|
|
226
|
-
error_dict: dict[str, Any],
|
|
227
|
-
workflow_id: str | None = None,
|
|
228
|
-
step_id: str | None = None,
|
|
229
|
-
agent: str | None = None,
|
|
230
|
-
) -> ErrorEnvelope:
|
|
231
|
-
"""
|
|
232
|
-
Create error envelope from a dictionary (e.g., from agent result).
|
|
233
|
-
|
|
234
|
-
Args:
|
|
235
|
-
error_dict: Dictionary containing error information
|
|
236
|
-
workflow_id: Optional workflow ID for correlation
|
|
237
|
-
step_id: Optional step ID for correlation
|
|
238
|
-
agent: Optional agent name for correlation
|
|
239
|
-
|
|
240
|
-
Returns:
|
|
241
|
-
ErrorEnvelope instance
|
|
242
|
-
"""
|
|
243
|
-
error_info = error_dict.get("error", error_dict)
|
|
244
|
-
|
|
245
|
-
code = error_info.get("code", "unknown_error")
|
|
246
|
-
message = ErrorEnvelopeBuilder._sanitize_message(
|
|
247
|
-
error_info.get("message", "An unknown error occurred")
|
|
248
|
-
)
|
|
249
|
-
category = error_info.get("category", "execution")
|
|
250
|
-
|
|
251
|
-
return ErrorEnvelope(
|
|
252
|
-
code=code,
|
|
253
|
-
message=message,
|
|
254
|
-
category=category,
|
|
255
|
-
details=error_info.get("details"),
|
|
256
|
-
workflow_id=workflow_id or error_info.get("workflow_id"),
|
|
257
|
-
step_id=step_id or error_info.get("step_id"),
|
|
258
|
-
agent=agent or error_info.get("agent"),
|
|
259
|
-
correlation_id=error_info.get("correlation_id"),
|
|
260
|
-
recoverable=error_info.get("recoverable", False),
|
|
261
|
-
retry_after=error_info.get("retry_after"),
|
|
262
|
-
)
|
|
263
|
-
|
|
264
|
-
@staticmethod
|
|
265
|
-
def _categorize_exception(exc: Exception) -> tuple[str, str]:
|
|
266
|
-
"""
|
|
267
|
-
Categorize exception and generate error code.
|
|
268
|
-
|
|
269
|
-
Returns:
|
|
270
|
-
Tuple of (category, code)
|
|
271
|
-
"""
|
|
272
|
-
if isinstance(exc, ConfigurationError):
|
|
273
|
-
return ("configuration", "config_error")
|
|
274
|
-
elif isinstance(exc, Context7UnavailableError):
|
|
275
|
-
return ("external_dependency", "context7_unavailable")
|
|
276
|
-
elif isinstance(exc, WorkflowExecutionError):
|
|
277
|
-
return ("execution", "workflow_execution_error")
|
|
278
|
-
elif isinstance(exc, AgentError):
|
|
279
|
-
return ("execution", "agent_error")
|
|
280
|
-
elif isinstance(exc, AgentFileNotFoundError):
|
|
281
|
-
# Check custom exception before FileOperationError (its parent)
|
|
282
|
-
return ("validation", "file_not_found")
|
|
283
|
-
elif isinstance(exc, FileOperationError):
|
|
284
|
-
return ("permission", "file_operation_error")
|
|
285
|
-
elif isinstance(exc, TimeoutError):
|
|
286
|
-
return ("timeout", "timeout_error")
|
|
287
|
-
elif isinstance(exc, PermissionError):
|
|
288
|
-
return ("permission", "permission_error")
|
|
289
|
-
elif isinstance(exc, ValueError):
|
|
290
|
-
return ("validation", "validation_error")
|
|
291
|
-
elif isinstance(exc, FileNotFoundError):
|
|
292
|
-
# Handle built-in FileNotFoundError (from stdlib)
|
|
293
|
-
return ("validation", "file_not_found")
|
|
294
|
-
else:
|
|
295
|
-
return ("execution", "unknown_error")
|
|
296
|
-
|
|
297
|
-
@staticmethod
|
|
298
|
-
def _sanitize_message(message: str) -> str:
|
|
299
|
-
"""
|
|
300
|
-
Sanitize error message to remove secrets and sensitive information.
|
|
301
|
-
|
|
302
|
-
Args:
|
|
303
|
-
message: Original error message
|
|
304
|
-
|
|
305
|
-
Returns:
|
|
306
|
-
Sanitized message
|
|
307
|
-
"""
|
|
308
|
-
# Redact API keys (common patterns: sk-..., pk-..., api_key=..., API key: ...)
|
|
309
|
-
message = re.sub(
|
|
310
|
-
r"\b(sk|pk|api_key|apikey)=[^\s&]+",
|
|
311
|
-
r"\1=***REDACTED***",
|
|
312
|
-
message,
|
|
313
|
-
flags=re.IGNORECASE,
|
|
314
|
-
)
|
|
315
|
-
message = re.sub(
|
|
316
|
-
r"\b(api\s+key|api_key|apikey):\s*[A-Za-z0-9_-]{10,}",
|
|
317
|
-
r"\1: ***REDACTED***",
|
|
318
|
-
message,
|
|
319
|
-
flags=re.IGNORECASE,
|
|
320
|
-
)
|
|
321
|
-
message = re.sub(
|
|
322
|
-
r"\b(sk|pk)-[A-Za-z0-9]{20,}",
|
|
323
|
-
r"\1-***REDACTED***",
|
|
324
|
-
message,
|
|
325
|
-
flags=re.IGNORECASE,
|
|
326
|
-
)
|
|
327
|
-
|
|
328
|
-
# Redact passwords
|
|
329
|
-
message = re.sub(
|
|
330
|
-
r"\b(password|pwd|passwd)=[^\s&]+",
|
|
331
|
-
r"\1=***REDACTED***",
|
|
332
|
-
message,
|
|
333
|
-
flags=re.IGNORECASE,
|
|
334
|
-
)
|
|
335
|
-
message = re.sub(
|
|
336
|
-
r"\b(password|pwd|passwd):\s*[^\s]+",
|
|
337
|
-
r"\1: ***REDACTED***",
|
|
338
|
-
message,
|
|
339
|
-
flags=re.IGNORECASE,
|
|
340
|
-
)
|
|
341
|
-
|
|
342
|
-
# Redact tokens
|
|
343
|
-
message = re.sub(
|
|
344
|
-
r"\b(token|auth|bearer)\s+[A-Za-z0-9_-]{20,}",
|
|
345
|
-
r"\1 ***REDACTED***",
|
|
346
|
-
message,
|
|
347
|
-
flags=re.IGNORECASE,
|
|
348
|
-
)
|
|
349
|
-
message = re.sub(
|
|
350
|
-
r"\b(token|auth|bearer):\s*[A-Za-z0-9_-]{20,}",
|
|
351
|
-
r"\1: ***REDACTED***",
|
|
352
|
-
message,
|
|
353
|
-
flags=re.IGNORECASE,
|
|
354
|
-
)
|
|
355
|
-
|
|
356
|
-
# Redact file paths that might contain usernames (basic heuristic)
|
|
357
|
-
# This is conservative - only redacts paths with common username patterns
|
|
358
|
-
message = re.sub(
|
|
359
|
-
r"/home/[^/\s]+|C:\\Users\\[^\\\s]+",
|
|
360
|
-
r"***REDACTED_PATH***",
|
|
361
|
-
message,
|
|
362
|
-
flags=re.IGNORECASE,
|
|
363
|
-
)
|
|
364
|
-
|
|
365
|
-
return message
|
|
366
|
-
|
|
367
|
-
@staticmethod
|
|
368
|
-
def _is_recoverable(exc: Exception) -> bool:
|
|
369
|
-
"""
|
|
370
|
-
Determine if an exception represents a recoverable error.
|
|
371
|
-
|
|
372
|
-
Args:
|
|
373
|
-
exc: Exception to check
|
|
374
|
-
|
|
375
|
-
Returns:
|
|
376
|
-
True if error is recoverable, False otherwise
|
|
377
|
-
"""
|
|
378
|
-
# Configuration errors are often recoverable (fix config and retry)
|
|
379
|
-
if isinstance(exc, ConfigurationError):
|
|
380
|
-
return True
|
|
381
|
-
|
|
382
|
-
# External dependency errors may be recoverable (service may come back)
|
|
383
|
-
if isinstance(exc, Context7UnavailableError):
|
|
384
|
-
return True
|
|
385
|
-
|
|
386
|
-
# Timeout errors are often recoverable
|
|
387
|
-
if isinstance(exc, TimeoutError):
|
|
388
|
-
return True
|
|
389
|
-
|
|
390
|
-
# Permission errors may be recoverable (fix permissions)
|
|
391
|
-
if isinstance(exc, PermissionError):
|
|
392
|
-
return True
|
|
393
|
-
|
|
394
|
-
# File not found may be recoverable (create file)
|
|
395
|
-
# Handle both custom and built-in FileNotFoundError
|
|
396
|
-
if isinstance(exc, (AgentFileNotFoundError, FileNotFoundError)):
|
|
397
|
-
return True
|
|
398
|
-
|
|
399
|
-
# Most other errors are not recoverable without code changes
|
|
400
|
-
return False
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
def create_error_result(
|
|
404
|
-
error: Exception | str | dict[str, Any],
|
|
405
|
-
workflow_id: str | None = None,
|
|
406
|
-
step_id: str | None = None,
|
|
407
|
-
agent: str | None = None,
|
|
408
|
-
correlation_id: str | None = None,
|
|
409
|
-
) -> dict[str, Any]:
|
|
410
|
-
"""
|
|
411
|
-
Create a standardized error result dictionary.
|
|
412
|
-
|
|
413
|
-
This is a convenience function for agents to return structured errors.
|
|
414
|
-
|
|
415
|
-
Args:
|
|
416
|
-
error: Exception, error message string, or error dictionary
|
|
417
|
-
workflow_id: Optional workflow ID for correlation
|
|
418
|
-
step_id: Optional step ID for correlation
|
|
419
|
-
agent: Optional agent name for correlation
|
|
420
|
-
correlation_id: Optional correlation ID
|
|
421
|
-
|
|
422
|
-
Returns:
|
|
423
|
-
Dictionary with error envelope and success=False
|
|
424
|
-
"""
|
|
425
|
-
if isinstance(error, Exception):
|
|
426
|
-
envelope = ErrorEnvelopeBuilder.from_exception(
|
|
427
|
-
error,
|
|
428
|
-
workflow_id=workflow_id,
|
|
429
|
-
step_id=step_id,
|
|
430
|
-
agent=agent,
|
|
431
|
-
correlation_id=correlation_id,
|
|
432
|
-
)
|
|
433
|
-
elif isinstance(error, dict):
|
|
434
|
-
envelope = ErrorEnvelopeBuilder.from_dict(
|
|
435
|
-
error,
|
|
436
|
-
workflow_id=workflow_id,
|
|
437
|
-
step_id=step_id,
|
|
438
|
-
agent=agent,
|
|
439
|
-
)
|
|
440
|
-
else:
|
|
441
|
-
# String error message
|
|
442
|
-
envelope = ErrorEnvelope(
|
|
443
|
-
code="error",
|
|
444
|
-
message=ErrorEnvelopeBuilder._sanitize_message(str(error)),
|
|
445
|
-
category="execution",
|
|
446
|
-
workflow_id=workflow_id,
|
|
447
|
-
step_id=step_id,
|
|
448
|
-
agent=agent,
|
|
449
|
-
correlation_id=correlation_id,
|
|
450
|
-
)
|
|
451
|
-
|
|
452
|
-
result = envelope.to_dict()
|
|
453
|
-
result["success"] = False
|
|
454
|
-
return result
|
|
1
|
+
"""
|
|
2
|
+
Error envelope system for consistent error handling across agents and workflows.
|
|
3
|
+
|
|
4
|
+
Epic 7 / Story 7.2: Robust Error Handling
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from .exceptions import (
|
|
12
|
+
AgentError,
|
|
13
|
+
AgentFileNotFoundError,
|
|
14
|
+
ConfigurationError,
|
|
15
|
+
Context7UnavailableError,
|
|
16
|
+
FileOperationError,
|
|
17
|
+
WorkflowExecutionError,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class ErrorEnvelope:
|
|
23
|
+
"""
|
|
24
|
+
Standard error envelope for agent results and workflow step failures.
|
|
25
|
+
|
|
26
|
+
Provides machine-readable fields and human-readable messages with
|
|
27
|
+
correlation identifiers for traceability.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
code: str
|
|
31
|
+
message: str
|
|
32
|
+
category: str
|
|
33
|
+
details: dict[str, Any] | None = None
|
|
34
|
+
workflow_id: str | None = None
|
|
35
|
+
step_id: str | None = None
|
|
36
|
+
agent: str | None = None
|
|
37
|
+
correlation_id: str | None = None
|
|
38
|
+
recoverable: bool = False
|
|
39
|
+
retry_after: int | None = None # seconds
|
|
40
|
+
|
|
41
|
+
def to_dict(self) -> dict[str, Any]:
|
|
42
|
+
"""Convert error envelope to dictionary."""
|
|
43
|
+
result: dict[str, Any] = {
|
|
44
|
+
"error": {
|
|
45
|
+
"code": self.code,
|
|
46
|
+
"message": self.message,
|
|
47
|
+
"category": self.category,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if self.details:
|
|
52
|
+
result["error"]["details"] = self.details
|
|
53
|
+
|
|
54
|
+
if self.workflow_id:
|
|
55
|
+
result["workflow_id"] = self.workflow_id
|
|
56
|
+
if self.step_id:
|
|
57
|
+
result["step_id"] = self.step_id
|
|
58
|
+
if self.agent:
|
|
59
|
+
result["agent"] = self.agent
|
|
60
|
+
if self.correlation_id:
|
|
61
|
+
result["correlation_id"] = self.correlation_id
|
|
62
|
+
|
|
63
|
+
if self.recoverable:
|
|
64
|
+
result["error"]["recoverable"] = True
|
|
65
|
+
if self.retry_after:
|
|
66
|
+
result["error"]["retry_after"] = self.retry_after
|
|
67
|
+
|
|
68
|
+
return result
|
|
69
|
+
|
|
70
|
+
def to_user_message(self) -> str:
|
|
71
|
+
"""
|
|
72
|
+
Generate user-friendly error message with actionable guidance.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Human-readable error message with next steps
|
|
76
|
+
"""
|
|
77
|
+
# Use ASCII-safe symbols for Windows compatibility
|
|
78
|
+
parts = [f"\n[ERROR] {self.message}"]
|
|
79
|
+
|
|
80
|
+
if self.recoverable:
|
|
81
|
+
parts.append("\n[RECOVERABLE] This error may be recoverable.")
|
|
82
|
+
if self.retry_after:
|
|
83
|
+
parts.append(f" You can retry after {self.retry_after} seconds.")
|
|
84
|
+
|
|
85
|
+
# Add actionable next steps
|
|
86
|
+
next_steps = self._get_actionable_next_steps()
|
|
87
|
+
if next_steps:
|
|
88
|
+
parts.append("\n[NEXT STEPS]")
|
|
89
|
+
for i, step in enumerate(next_steps, 1):
|
|
90
|
+
parts.append(f" {i}. {step}")
|
|
91
|
+
|
|
92
|
+
# Add category-specific guidance
|
|
93
|
+
guidance = self._get_category_guidance()
|
|
94
|
+
if guidance:
|
|
95
|
+
parts.append(f"\n[HINT] {guidance}")
|
|
96
|
+
|
|
97
|
+
# Add correlation info for debugging
|
|
98
|
+
if self.workflow_id or self.step_id:
|
|
99
|
+
parts.append("\n[REFERENCE]")
|
|
100
|
+
if self.workflow_id:
|
|
101
|
+
parts.append(f" workflow_id: {self.workflow_id}")
|
|
102
|
+
if self.step_id:
|
|
103
|
+
parts.append(f" step_id: {self.step_id}")
|
|
104
|
+
# Add state location hint
|
|
105
|
+
parts.append(" state_dir: .tapps-agents/workflow-state/")
|
|
106
|
+
|
|
107
|
+
return "\n".join(parts)
|
|
108
|
+
|
|
109
|
+
def _get_actionable_next_steps(self) -> list[str]:
|
|
110
|
+
"""Get actionable next steps based on error code and category."""
|
|
111
|
+
steps: list[str] = []
|
|
112
|
+
|
|
113
|
+
# File not found errors
|
|
114
|
+
if self.code == "file_not_found":
|
|
115
|
+
steps.append("Check if the file exists: ls -la <path>")
|
|
116
|
+
steps.append("Run with different target: tapps-agents workflow <preset> --file <correct_path>")
|
|
117
|
+
if self.step_id:
|
|
118
|
+
steps.append(f"Resume from this step: tapps-agents workflow resume --continue-from {self.step_id}")
|
|
119
|
+
|
|
120
|
+
# Configuration errors
|
|
121
|
+
elif self.category == "configuration":
|
|
122
|
+
steps.append("Verify config: tapps-agents doctor --full")
|
|
123
|
+
steps.append("Reinitialize config: tapps-agents init --reset")
|
|
124
|
+
steps.append("Check config file: cat .tapps-agents/config.yaml")
|
|
125
|
+
|
|
126
|
+
# External dependency errors (Context7, etc.)
|
|
127
|
+
elif self.category == "external_dependency":
|
|
128
|
+
steps.append("Check service status: tapps-agents health check")
|
|
129
|
+
steps.append("Verify API keys in environment variables")
|
|
130
|
+
steps.append("Run without external dependencies: tapps-agents workflow <preset> --cli-mode")
|
|
131
|
+
|
|
132
|
+
# Workflow execution errors
|
|
133
|
+
elif self.code == "workflow_execution_error":
|
|
134
|
+
steps.append("View workflow state: tapps-agents workflow state list")
|
|
135
|
+
if self.workflow_id:
|
|
136
|
+
steps.append(f"Show details: tapps-agents workflow state show {self.workflow_id}")
|
|
137
|
+
steps.append(f"Resume workflow: tapps-agents workflow resume --workflow-id {self.workflow_id}")
|
|
138
|
+
steps.append("Try individual agent: tapps-agents <agent> <command> <args>")
|
|
139
|
+
|
|
140
|
+
# Timeout errors
|
|
141
|
+
elif self.category == "timeout":
|
|
142
|
+
steps.append("Increase timeout: Set TAPPS_AGENTS_TIMEOUT=7200 (2 hours)")
|
|
143
|
+
steps.append("Check for stuck processes: tapps-agents status --detailed")
|
|
144
|
+
if self.step_id:
|
|
145
|
+
steps.append(f"Resume from failed step: tapps-agents workflow resume --continue-from {self.step_id}")
|
|
146
|
+
|
|
147
|
+
# Permission errors
|
|
148
|
+
elif self.category == "permission":
|
|
149
|
+
steps.append("Check file permissions: ls -la <path>")
|
|
150
|
+
steps.append("Ensure write access to project directory")
|
|
151
|
+
steps.append("Try running with elevated permissions if needed")
|
|
152
|
+
|
|
153
|
+
# Validation errors
|
|
154
|
+
elif self.category == "validation":
|
|
155
|
+
steps.append("Review input parameters")
|
|
156
|
+
steps.append("Check command syntax: tapps-agents <command> --help")
|
|
157
|
+
steps.append("Validate with dry-run: tapps-agents workflow <preset> --dry-run")
|
|
158
|
+
|
|
159
|
+
# Generic fallback
|
|
160
|
+
if not steps:
|
|
161
|
+
steps.append("Check logs: .tapps-agents/logs/")
|
|
162
|
+
steps.append("Run diagnostics: tapps-agents doctor --full")
|
|
163
|
+
steps.append("View workflow state: tapps-agents workflow state list")
|
|
164
|
+
|
|
165
|
+
return steps
|
|
166
|
+
|
|
167
|
+
def _get_category_guidance(self) -> str | None:
|
|
168
|
+
"""Get category-specific guidance message."""
|
|
169
|
+
guidance_map = {
|
|
170
|
+
"configuration": "Check your configuration file (.tapps-agents/config.yaml) and environment variables.",
|
|
171
|
+
"external_dependency": "Verify that external services are available and credentials are correct.",
|
|
172
|
+
"validation": "Review the input parameters and ensure they meet the required format.",
|
|
173
|
+
"execution": "Check logs for detailed error information. This may indicate a bug or unexpected condition.",
|
|
174
|
+
"permission": "Verify file permissions and that you have access to the required resources.",
|
|
175
|
+
"timeout": "The operation took too long. Consider increasing timeout settings or optimizing the operation.",
|
|
176
|
+
}
|
|
177
|
+
return guidance_map.get(self.category)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class ErrorEnvelopeBuilder:
|
|
181
|
+
"""Helper class for building error envelopes from exceptions and errors."""
|
|
182
|
+
|
|
183
|
+
@staticmethod
|
|
184
|
+
def from_exception(
|
|
185
|
+
exc: Exception,
|
|
186
|
+
workflow_id: str | None = None,
|
|
187
|
+
step_id: str | None = None,
|
|
188
|
+
agent: str | None = None,
|
|
189
|
+
correlation_id: str | None = None,
|
|
190
|
+
) -> ErrorEnvelope:
|
|
191
|
+
"""
|
|
192
|
+
Create error envelope from an exception.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
exc: Exception to convert
|
|
196
|
+
workflow_id: Optional workflow ID for correlation
|
|
197
|
+
step_id: Optional step ID for correlation
|
|
198
|
+
agent: Optional agent name for correlation
|
|
199
|
+
correlation_id: Optional correlation ID
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
ErrorEnvelope instance
|
|
203
|
+
"""
|
|
204
|
+
# Determine error category and code
|
|
205
|
+
category, code = ErrorEnvelopeBuilder._categorize_exception(exc)
|
|
206
|
+
|
|
207
|
+
# Sanitize error message (remove secrets)
|
|
208
|
+
message = ErrorEnvelopeBuilder._sanitize_message(str(exc))
|
|
209
|
+
|
|
210
|
+
# Determine if error is recoverable
|
|
211
|
+
recoverable = ErrorEnvelopeBuilder._is_recoverable(exc)
|
|
212
|
+
|
|
213
|
+
return ErrorEnvelope(
|
|
214
|
+
code=code,
|
|
215
|
+
message=message,
|
|
216
|
+
category=category,
|
|
217
|
+
workflow_id=workflow_id,
|
|
218
|
+
step_id=step_id,
|
|
219
|
+
agent=agent,
|
|
220
|
+
correlation_id=correlation_id,
|
|
221
|
+
recoverable=recoverable,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
@staticmethod
|
|
225
|
+
def from_dict(
|
|
226
|
+
error_dict: dict[str, Any],
|
|
227
|
+
workflow_id: str | None = None,
|
|
228
|
+
step_id: str | None = None,
|
|
229
|
+
agent: str | None = None,
|
|
230
|
+
) -> ErrorEnvelope:
|
|
231
|
+
"""
|
|
232
|
+
Create error envelope from a dictionary (e.g., from agent result).
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
error_dict: Dictionary containing error information
|
|
236
|
+
workflow_id: Optional workflow ID for correlation
|
|
237
|
+
step_id: Optional step ID for correlation
|
|
238
|
+
agent: Optional agent name for correlation
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
ErrorEnvelope instance
|
|
242
|
+
"""
|
|
243
|
+
error_info = error_dict.get("error", error_dict)
|
|
244
|
+
|
|
245
|
+
code = error_info.get("code", "unknown_error")
|
|
246
|
+
message = ErrorEnvelopeBuilder._sanitize_message(
|
|
247
|
+
error_info.get("message", "An unknown error occurred")
|
|
248
|
+
)
|
|
249
|
+
category = error_info.get("category", "execution")
|
|
250
|
+
|
|
251
|
+
return ErrorEnvelope(
|
|
252
|
+
code=code,
|
|
253
|
+
message=message,
|
|
254
|
+
category=category,
|
|
255
|
+
details=error_info.get("details"),
|
|
256
|
+
workflow_id=workflow_id or error_info.get("workflow_id"),
|
|
257
|
+
step_id=step_id or error_info.get("step_id"),
|
|
258
|
+
agent=agent or error_info.get("agent"),
|
|
259
|
+
correlation_id=error_info.get("correlation_id"),
|
|
260
|
+
recoverable=error_info.get("recoverable", False),
|
|
261
|
+
retry_after=error_info.get("retry_after"),
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
@staticmethod
|
|
265
|
+
def _categorize_exception(exc: Exception) -> tuple[str, str]:
|
|
266
|
+
"""
|
|
267
|
+
Categorize exception and generate error code.
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
Tuple of (category, code)
|
|
271
|
+
"""
|
|
272
|
+
if isinstance(exc, ConfigurationError):
|
|
273
|
+
return ("configuration", "config_error")
|
|
274
|
+
elif isinstance(exc, Context7UnavailableError):
|
|
275
|
+
return ("external_dependency", "context7_unavailable")
|
|
276
|
+
elif isinstance(exc, WorkflowExecutionError):
|
|
277
|
+
return ("execution", "workflow_execution_error")
|
|
278
|
+
elif isinstance(exc, AgentError):
|
|
279
|
+
return ("execution", "agent_error")
|
|
280
|
+
elif isinstance(exc, AgentFileNotFoundError):
|
|
281
|
+
# Check custom exception before FileOperationError (its parent)
|
|
282
|
+
return ("validation", "file_not_found")
|
|
283
|
+
elif isinstance(exc, FileOperationError):
|
|
284
|
+
return ("permission", "file_operation_error")
|
|
285
|
+
elif isinstance(exc, TimeoutError):
|
|
286
|
+
return ("timeout", "timeout_error")
|
|
287
|
+
elif isinstance(exc, PermissionError):
|
|
288
|
+
return ("permission", "permission_error")
|
|
289
|
+
elif isinstance(exc, ValueError):
|
|
290
|
+
return ("validation", "validation_error")
|
|
291
|
+
elif isinstance(exc, FileNotFoundError):
|
|
292
|
+
# Handle built-in FileNotFoundError (from stdlib)
|
|
293
|
+
return ("validation", "file_not_found")
|
|
294
|
+
else:
|
|
295
|
+
return ("execution", "unknown_error")
|
|
296
|
+
|
|
297
|
+
@staticmethod
|
|
298
|
+
def _sanitize_message(message: str) -> str:
|
|
299
|
+
"""
|
|
300
|
+
Sanitize error message to remove secrets and sensitive information.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
message: Original error message
|
|
304
|
+
|
|
305
|
+
Returns:
|
|
306
|
+
Sanitized message
|
|
307
|
+
"""
|
|
308
|
+
# Redact API keys (common patterns: sk-..., pk-..., api_key=..., API key: ...)
|
|
309
|
+
message = re.sub(
|
|
310
|
+
r"\b(sk|pk|api_key|apikey)=[^\s&]+",
|
|
311
|
+
r"\1=***REDACTED***",
|
|
312
|
+
message,
|
|
313
|
+
flags=re.IGNORECASE,
|
|
314
|
+
)
|
|
315
|
+
message = re.sub(
|
|
316
|
+
r"\b(api\s+key|api_key|apikey):\s*[A-Za-z0-9_-]{10,}",
|
|
317
|
+
r"\1: ***REDACTED***",
|
|
318
|
+
message,
|
|
319
|
+
flags=re.IGNORECASE,
|
|
320
|
+
)
|
|
321
|
+
message = re.sub(
|
|
322
|
+
r"\b(sk|pk)-[A-Za-z0-9]{20,}",
|
|
323
|
+
r"\1-***REDACTED***",
|
|
324
|
+
message,
|
|
325
|
+
flags=re.IGNORECASE,
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
# Redact passwords
|
|
329
|
+
message = re.sub(
|
|
330
|
+
r"\b(password|pwd|passwd)=[^\s&]+",
|
|
331
|
+
r"\1=***REDACTED***",
|
|
332
|
+
message,
|
|
333
|
+
flags=re.IGNORECASE,
|
|
334
|
+
)
|
|
335
|
+
message = re.sub(
|
|
336
|
+
r"\b(password|pwd|passwd):\s*[^\s]+",
|
|
337
|
+
r"\1: ***REDACTED***",
|
|
338
|
+
message,
|
|
339
|
+
flags=re.IGNORECASE,
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
# Redact tokens
|
|
343
|
+
message = re.sub(
|
|
344
|
+
r"\b(token|auth|bearer)\s+[A-Za-z0-9_-]{20,}",
|
|
345
|
+
r"\1 ***REDACTED***",
|
|
346
|
+
message,
|
|
347
|
+
flags=re.IGNORECASE,
|
|
348
|
+
)
|
|
349
|
+
message = re.sub(
|
|
350
|
+
r"\b(token|auth|bearer):\s*[A-Za-z0-9_-]{20,}",
|
|
351
|
+
r"\1: ***REDACTED***",
|
|
352
|
+
message,
|
|
353
|
+
flags=re.IGNORECASE,
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# Redact file paths that might contain usernames (basic heuristic)
|
|
357
|
+
# This is conservative - only redacts paths with common username patterns
|
|
358
|
+
message = re.sub(
|
|
359
|
+
r"/home/[^/\s]+|C:\\Users\\[^\\\s]+",
|
|
360
|
+
r"***REDACTED_PATH***",
|
|
361
|
+
message,
|
|
362
|
+
flags=re.IGNORECASE,
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
return message
|
|
366
|
+
|
|
367
|
+
@staticmethod
|
|
368
|
+
def _is_recoverable(exc: Exception) -> bool:
|
|
369
|
+
"""
|
|
370
|
+
Determine if an exception represents a recoverable error.
|
|
371
|
+
|
|
372
|
+
Args:
|
|
373
|
+
exc: Exception to check
|
|
374
|
+
|
|
375
|
+
Returns:
|
|
376
|
+
True if error is recoverable, False otherwise
|
|
377
|
+
"""
|
|
378
|
+
# Configuration errors are often recoverable (fix config and retry)
|
|
379
|
+
if isinstance(exc, ConfigurationError):
|
|
380
|
+
return True
|
|
381
|
+
|
|
382
|
+
# External dependency errors may be recoverable (service may come back)
|
|
383
|
+
if isinstance(exc, Context7UnavailableError):
|
|
384
|
+
return True
|
|
385
|
+
|
|
386
|
+
# Timeout errors are often recoverable
|
|
387
|
+
if isinstance(exc, TimeoutError):
|
|
388
|
+
return True
|
|
389
|
+
|
|
390
|
+
# Permission errors may be recoverable (fix permissions)
|
|
391
|
+
if isinstance(exc, PermissionError):
|
|
392
|
+
return True
|
|
393
|
+
|
|
394
|
+
# File not found may be recoverable (create file)
|
|
395
|
+
# Handle both custom and built-in FileNotFoundError
|
|
396
|
+
if isinstance(exc, (AgentFileNotFoundError, FileNotFoundError)):
|
|
397
|
+
return True
|
|
398
|
+
|
|
399
|
+
# Most other errors are not recoverable without code changes
|
|
400
|
+
return False
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def create_error_result(
|
|
404
|
+
error: Exception | str | dict[str, Any],
|
|
405
|
+
workflow_id: str | None = None,
|
|
406
|
+
step_id: str | None = None,
|
|
407
|
+
agent: str | None = None,
|
|
408
|
+
correlation_id: str | None = None,
|
|
409
|
+
) -> dict[str, Any]:
|
|
410
|
+
"""
|
|
411
|
+
Create a standardized error result dictionary.
|
|
412
|
+
|
|
413
|
+
This is a convenience function for agents to return structured errors.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
error: Exception, error message string, or error dictionary
|
|
417
|
+
workflow_id: Optional workflow ID for correlation
|
|
418
|
+
step_id: Optional step ID for correlation
|
|
419
|
+
agent: Optional agent name for correlation
|
|
420
|
+
correlation_id: Optional correlation ID
|
|
421
|
+
|
|
422
|
+
Returns:
|
|
423
|
+
Dictionary with error envelope and success=False
|
|
424
|
+
"""
|
|
425
|
+
if isinstance(error, Exception):
|
|
426
|
+
envelope = ErrorEnvelopeBuilder.from_exception(
|
|
427
|
+
error,
|
|
428
|
+
workflow_id=workflow_id,
|
|
429
|
+
step_id=step_id,
|
|
430
|
+
agent=agent,
|
|
431
|
+
correlation_id=correlation_id,
|
|
432
|
+
)
|
|
433
|
+
elif isinstance(error, dict):
|
|
434
|
+
envelope = ErrorEnvelopeBuilder.from_dict(
|
|
435
|
+
error,
|
|
436
|
+
workflow_id=workflow_id,
|
|
437
|
+
step_id=step_id,
|
|
438
|
+
agent=agent,
|
|
439
|
+
)
|
|
440
|
+
else:
|
|
441
|
+
# String error message
|
|
442
|
+
envelope = ErrorEnvelope(
|
|
443
|
+
code="error",
|
|
444
|
+
message=ErrorEnvelopeBuilder._sanitize_message(str(error)),
|
|
445
|
+
category="execution",
|
|
446
|
+
workflow_id=workflow_id,
|
|
447
|
+
step_id=step_id,
|
|
448
|
+
agent=agent,
|
|
449
|
+
correlation_id=correlation_id,
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
result = envelope.to_dict()
|
|
453
|
+
result["success"] = False
|
|
454
|
+
return result
|