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,423 +1,423 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Progress Update System for Real-Time Workflow Updates
|
|
3
|
-
|
|
4
|
-
Provides formatted progress updates for Cursor chat display during workflow execution.
|
|
5
|
-
Epic 8 / Story 8.1: Progress Update System Foundation
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from dataclasses import dataclass, field
|
|
9
|
-
from datetime import datetime
|
|
10
|
-
from enum import Enum
|
|
11
|
-
from typing import Any
|
|
12
|
-
|
|
13
|
-
from .models import WorkflowState
|
|
14
|
-
from .visual_feedback import VisualFeedbackGenerator
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class UpdateType(Enum):
|
|
18
|
-
"""Type of progress update."""
|
|
19
|
-
|
|
20
|
-
STEP_STARTED = "step_started"
|
|
21
|
-
STEP_PROGRESS = "step_progress"
|
|
22
|
-
STEP_COMPLETED = "step_completed"
|
|
23
|
-
STEP_FAILED = "step_failed"
|
|
24
|
-
WORKFLOW_COMPLETED = "workflow_completed"
|
|
25
|
-
WORKFLOW_FAILED = "workflow_failed"
|
|
26
|
-
WORKFLOW_STARTED = "workflow_started"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class UpdatePriority(Enum):
|
|
30
|
-
"""Update priority for queue management."""
|
|
31
|
-
|
|
32
|
-
CRITICAL = "critical" # Errors, completion
|
|
33
|
-
HIGH = "high" # Step transitions
|
|
34
|
-
NORMAL = "normal" # Routine progress
|
|
35
|
-
LOW = "low" # Periodic updates
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@dataclass
|
|
39
|
-
class ProgressUpdate:
|
|
40
|
-
"""Progress update message structure."""
|
|
41
|
-
|
|
42
|
-
update_type: UpdateType
|
|
43
|
-
timestamp: datetime
|
|
44
|
-
step_number: int | None = None
|
|
45
|
-
total_steps: int | None = None
|
|
46
|
-
percentage: float | None = None
|
|
47
|
-
status: str | None = None
|
|
48
|
-
message: str | None = None
|
|
49
|
-
step_id: str | None = None
|
|
50
|
-
agent: str | None = None
|
|
51
|
-
action: str | None = None
|
|
52
|
-
error: str | None = None
|
|
53
|
-
priority: UpdatePriority = UpdatePriority.NORMAL
|
|
54
|
-
metadata: dict[str, Any] = field(default_factory=dict)
|
|
55
|
-
|
|
56
|
-
def to_dict(self) -> dict[str, Any]:
|
|
57
|
-
"""Convert to dictionary for JSON serialization."""
|
|
58
|
-
return {
|
|
59
|
-
"update_type": self.update_type.value,
|
|
60
|
-
"timestamp": self.timestamp.isoformat(),
|
|
61
|
-
"step_number": self.step_number,
|
|
62
|
-
"total_steps": self.total_steps,
|
|
63
|
-
"percentage": self.percentage,
|
|
64
|
-
"status": self.status,
|
|
65
|
-
"message": self.message,
|
|
66
|
-
"step_id": self.step_id,
|
|
67
|
-
"agent": self.agent,
|
|
68
|
-
"action": self.action,
|
|
69
|
-
"error": self.error,
|
|
70
|
-
"priority": self.priority.value,
|
|
71
|
-
"metadata": self.metadata,
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class ProgressCalculator:
|
|
76
|
-
"""Calculates progress metrics from workflow state."""
|
|
77
|
-
|
|
78
|
-
def __init__(self, total_steps: int):
|
|
79
|
-
"""
|
|
80
|
-
Initialize progress calculator.
|
|
81
|
-
|
|
82
|
-
Args:
|
|
83
|
-
total_steps: Total number of steps in the workflow
|
|
84
|
-
"""
|
|
85
|
-
self.total_steps = total_steps
|
|
86
|
-
|
|
87
|
-
def calculate_progress(
|
|
88
|
-
self, state: WorkflowState
|
|
89
|
-
) -> dict[str, Any]:
|
|
90
|
-
"""
|
|
91
|
-
Calculate progress from workflow state.
|
|
92
|
-
|
|
93
|
-
Args:
|
|
94
|
-
state: Current workflow state
|
|
95
|
-
|
|
96
|
-
Returns:
|
|
97
|
-
Dictionary with progress metrics
|
|
98
|
-
"""
|
|
99
|
-
completed = len(state.completed_steps)
|
|
100
|
-
skipped = len(state.skipped_steps)
|
|
101
|
-
failed = sum(
|
|
102
|
-
1 for exec in state.step_executions if exec.status == "failed"
|
|
103
|
-
)
|
|
104
|
-
running = sum(
|
|
105
|
-
1 for exec in state.step_executions if exec.status == "running"
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
# Calculate percentage
|
|
109
|
-
if self.total_steps > 0:
|
|
110
|
-
percentage = ((completed + skipped) / self.total_steps) * 100.0
|
|
111
|
-
else:
|
|
112
|
-
percentage = 0.0
|
|
113
|
-
|
|
114
|
-
# Determine current step number
|
|
115
|
-
current_step_number = None
|
|
116
|
-
if state.current_step:
|
|
117
|
-
# Find step index in workflow
|
|
118
|
-
# Note: This assumes steps are ordered, which may not always be true
|
|
119
|
-
# For now, we'll use completed steps count + 1 as approximation
|
|
120
|
-
current_step_number = completed + running + 1
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
"current_step": current_step_number,
|
|
124
|
-
"total_steps": self.total_steps,
|
|
125
|
-
"completed": completed,
|
|
126
|
-
"skipped": skipped,
|
|
127
|
-
"failed": failed,
|
|
128
|
-
"running": running,
|
|
129
|
-
"percentage": round(percentage, 2),
|
|
130
|
-
"current_step_id": state.current_step,
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
class ProgressUpdateGenerator:
|
|
135
|
-
"""Generates formatted progress updates for Cursor chat."""
|
|
136
|
-
|
|
137
|
-
# Emoji mapping for status types
|
|
138
|
-
STATUS_EMOJIS = {
|
|
139
|
-
"pending": "⏳",
|
|
140
|
-
"running": "🔄",
|
|
141
|
-
"completed": "✅",
|
|
142
|
-
"failed": "❌",
|
|
143
|
-
"skipped": "⏭️",
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
def __init__(self, calculator: ProgressCalculator, enable_visual: bool = True):
|
|
147
|
-
"""
|
|
148
|
-
Initialize update generator.
|
|
149
|
-
|
|
150
|
-
Args:
|
|
151
|
-
calculator: Progress calculator instance
|
|
152
|
-
enable_visual: Whether to enable visual enhancements (Epic 11)
|
|
153
|
-
"""
|
|
154
|
-
self.calculator = calculator
|
|
155
|
-
self.visual = VisualFeedbackGenerator(enable_visual=enable_visual)
|
|
156
|
-
|
|
157
|
-
def generate_update(
|
|
158
|
-
self,
|
|
159
|
-
update_type: UpdateType,
|
|
160
|
-
state: WorkflowState,
|
|
161
|
-
step_id: str | None = None,
|
|
162
|
-
agent: str | None = None,
|
|
163
|
-
action: str | None = None,
|
|
164
|
-
error: str | None = None,
|
|
165
|
-
message: str | None = None,
|
|
166
|
-
) -> ProgressUpdate:
|
|
167
|
-
"""
|
|
168
|
-
Generate a progress update.
|
|
169
|
-
|
|
170
|
-
Args:
|
|
171
|
-
update_type: Type of update
|
|
172
|
-
state: Current workflow state
|
|
173
|
-
step_id: Optional step ID
|
|
174
|
-
agent: Optional agent name
|
|
175
|
-
action: Optional action name
|
|
176
|
-
error: Optional error message
|
|
177
|
-
message: Optional custom message
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
ProgressUpdate instance
|
|
181
|
-
"""
|
|
182
|
-
progress = self.calculator.calculate_progress(state)
|
|
183
|
-
|
|
184
|
-
# Determine priority
|
|
185
|
-
priority = UpdatePriority.NORMAL
|
|
186
|
-
if update_type in (
|
|
187
|
-
UpdateType.WORKFLOW_COMPLETED,
|
|
188
|
-
UpdateType.WORKFLOW_FAILED,
|
|
189
|
-
UpdateType.STEP_FAILED,
|
|
190
|
-
):
|
|
191
|
-
priority = UpdatePriority.CRITICAL
|
|
192
|
-
elif update_type in (
|
|
193
|
-
UpdateType.STEP_STARTED,
|
|
194
|
-
UpdateType.STEP_COMPLETED,
|
|
195
|
-
):
|
|
196
|
-
priority = UpdatePriority.HIGH
|
|
197
|
-
|
|
198
|
-
# Determine status
|
|
199
|
-
status = state.status
|
|
200
|
-
if update_type == UpdateType.STEP_FAILED:
|
|
201
|
-
status = "failed"
|
|
202
|
-
elif update_type == UpdateType.STEP_COMPLETED:
|
|
203
|
-
status = "completed"
|
|
204
|
-
|
|
205
|
-
return ProgressUpdate(
|
|
206
|
-
update_type=update_type,
|
|
207
|
-
timestamp=datetime.now(),
|
|
208
|
-
step_number=progress.get("current_step"),
|
|
209
|
-
total_steps=progress.get("total_steps"),
|
|
210
|
-
percentage=progress.get("percentage"),
|
|
211
|
-
status=status,
|
|
212
|
-
message=message,
|
|
213
|
-
step_id=step_id or progress.get("current_step_id"),
|
|
214
|
-
agent=agent,
|
|
215
|
-
action=action,
|
|
216
|
-
error=error,
|
|
217
|
-
priority=priority,
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
def format_for_chat(self, update: ProgressUpdate) -> str:
|
|
221
|
-
"""
|
|
222
|
-
Format update for Cursor chat display.
|
|
223
|
-
|
|
224
|
-
Args:
|
|
225
|
-
update: Progress update to format
|
|
226
|
-
|
|
227
|
-
Returns:
|
|
228
|
-
Formatted markdown string for chat
|
|
229
|
-
"""
|
|
230
|
-
lines = []
|
|
231
|
-
|
|
232
|
-
# Header based on update type
|
|
233
|
-
if update.update_type == UpdateType.WORKFLOW_STARTED:
|
|
234
|
-
lines.append("## 🚀 Workflow Started")
|
|
235
|
-
elif update.update_type == UpdateType.WORKFLOW_COMPLETED:
|
|
236
|
-
lines.append("## ✅ Workflow Completed")
|
|
237
|
-
elif update.update_type == UpdateType.WORKFLOW_FAILED:
|
|
238
|
-
lines.append("## ❌ Workflow Failed")
|
|
239
|
-
elif update.update_type == UpdateType.STEP_STARTED:
|
|
240
|
-
emoji = self.STATUS_EMOJIS.get("running", "🔄")
|
|
241
|
-
lines.append(f"### {emoji} Step Started")
|
|
242
|
-
elif update.update_type == UpdateType.STEP_COMPLETED:
|
|
243
|
-
emoji = self.STATUS_EMOJIS.get("completed", "✅")
|
|
244
|
-
lines.append(f"### {emoji} Step Completed")
|
|
245
|
-
elif update.update_type == UpdateType.STEP_FAILED:
|
|
246
|
-
emoji = self.STATUS_EMOJIS.get("failed", "❌")
|
|
247
|
-
lines.append(f"### {emoji} Step Failed")
|
|
248
|
-
else:
|
|
249
|
-
lines.append("### 🔄 Progress Update")
|
|
250
|
-
|
|
251
|
-
# Progress bar (Epic 11: Enhanced visual feedback)
|
|
252
|
-
if update.percentage is not None:
|
|
253
|
-
progress_bar = self.visual.format_progress_bar(update.percentage)
|
|
254
|
-
lines.append(f"\n{progress_bar}\n")
|
|
255
|
-
|
|
256
|
-
# Step information (Epic 11: Enhanced step indicators)
|
|
257
|
-
if update.step_number and update.total_steps:
|
|
258
|
-
step_indicator = self.visual.format_step_indicator(
|
|
259
|
-
update.step_number, update.total_steps, update.step_id
|
|
260
|
-
)
|
|
261
|
-
if update.percentage is not None:
|
|
262
|
-
lines.append(f"{step_indicator} ({update.percentage:.1f}% complete)")
|
|
263
|
-
else:
|
|
264
|
-
lines.append(step_indicator)
|
|
265
|
-
|
|
266
|
-
# Step details (Epic 11: Status badges)
|
|
267
|
-
if update.agent and update.action:
|
|
268
|
-
status_badge = self.visual.format_status_badge(update.status or "running")
|
|
269
|
-
lines.append(f"- **Status:** {status_badge}")
|
|
270
|
-
lines.append(f"- **Agent:** {update.agent}")
|
|
271
|
-
lines.append(f"- **Action:** {update.action}")
|
|
272
|
-
|
|
273
|
-
if update.step_id:
|
|
274
|
-
lines.append(f"- **Step ID:** `{update.step_id}`")
|
|
275
|
-
|
|
276
|
-
# Error information
|
|
277
|
-
if update.error:
|
|
278
|
-
lines.append(f"\n**Error:** {update.error}")
|
|
279
|
-
|
|
280
|
-
# Custom message
|
|
281
|
-
if update.message:
|
|
282
|
-
lines.append(f"\n{update.message}")
|
|
283
|
-
|
|
284
|
-
return "\n".join(lines)
|
|
285
|
-
|
|
286
|
-
def _generate_progress_bar(self, percentage: float, width: int = 30) -> str:
|
|
287
|
-
"""
|
|
288
|
-
Generate text-based progress bar.
|
|
289
|
-
|
|
290
|
-
Args:
|
|
291
|
-
percentage: Completion percentage (0-100)
|
|
292
|
-
width: Width of progress bar in characters
|
|
293
|
-
|
|
294
|
-
Returns:
|
|
295
|
-
Formatted progress bar string (ASCII-safe)
|
|
296
|
-
"""
|
|
297
|
-
from ..core.unicode_safe import safe_format_progress_bar
|
|
298
|
-
return safe_format_progress_bar(percentage, width)
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
class UpdateQueue:
|
|
302
|
-
"""Manages update frequency to prevent chat spam."""
|
|
303
|
-
|
|
304
|
-
def __init__(
|
|
305
|
-
self,
|
|
306
|
-
min_interval_seconds: float = 2.0,
|
|
307
|
-
max_updates_per_minute: int = 30,
|
|
308
|
-
):
|
|
309
|
-
"""
|
|
310
|
-
Initialize update queue.
|
|
311
|
-
|
|
312
|
-
Args:
|
|
313
|
-
min_interval_seconds: Minimum time between updates
|
|
314
|
-
max_updates_per_minute: Maximum updates per minute
|
|
315
|
-
"""
|
|
316
|
-
self.min_interval = min_interval_seconds
|
|
317
|
-
self.max_per_minute = max_updates_per_minute
|
|
318
|
-
self.queue: list[ProgressUpdate] = []
|
|
319
|
-
self.last_update_time: datetime | None = None
|
|
320
|
-
self.update_times: list[datetime] = []
|
|
321
|
-
|
|
322
|
-
def add_update(self, update: ProgressUpdate) -> bool:
|
|
323
|
-
"""
|
|
324
|
-
Add update to queue and determine if it should be sent.
|
|
325
|
-
|
|
326
|
-
Args:
|
|
327
|
-
update: Progress update to queue
|
|
328
|
-
|
|
329
|
-
Returns:
|
|
330
|
-
True if update should be sent immediately, False if queued
|
|
331
|
-
"""
|
|
332
|
-
now = datetime.now()
|
|
333
|
-
|
|
334
|
-
# Critical updates always sent immediately
|
|
335
|
-
if update.priority == UpdatePriority.CRITICAL:
|
|
336
|
-
self._record_update(now)
|
|
337
|
-
return True
|
|
338
|
-
|
|
339
|
-
# Check minimum interval
|
|
340
|
-
if (
|
|
341
|
-
self.last_update_time
|
|
342
|
-
and (now - self.last_update_time).total_seconds() < self.min_interval
|
|
343
|
-
):
|
|
344
|
-
# Queue for later unless high priority
|
|
345
|
-
if update.priority == UpdatePriority.HIGH:
|
|
346
|
-
# High priority can bypass interval but still check rate limit
|
|
347
|
-
if self._check_rate_limit(now):
|
|
348
|
-
self._record_update(now)
|
|
349
|
-
return True
|
|
350
|
-
# Always queue if interval not met (for normal/low priority)
|
|
351
|
-
self.queue.append(update)
|
|
352
|
-
return False
|
|
353
|
-
|
|
354
|
-
# Check rate limit
|
|
355
|
-
if not self._check_rate_limit(now):
|
|
356
|
-
self.queue.append(update)
|
|
357
|
-
return False
|
|
358
|
-
|
|
359
|
-
# Update can be sent
|
|
360
|
-
self._record_update(now)
|
|
361
|
-
return True
|
|
362
|
-
|
|
363
|
-
def get_queued_updates(self) -> list[ProgressUpdate]:
|
|
364
|
-
"""
|
|
365
|
-
Get updates that should be sent now.
|
|
366
|
-
|
|
367
|
-
Returns:
|
|
368
|
-
List of updates to send
|
|
369
|
-
"""
|
|
370
|
-
if not self.queue:
|
|
371
|
-
return []
|
|
372
|
-
|
|
373
|
-
now = datetime.now()
|
|
374
|
-
updates_to_send: list[ProgressUpdate] = []
|
|
375
|
-
|
|
376
|
-
# Check if we can send queued updates
|
|
377
|
-
if (
|
|
378
|
-
not self.last_update_time
|
|
379
|
-
or (now - self.last_update_time).total_seconds() >= self.min_interval
|
|
380
|
-
):
|
|
381
|
-
if self._check_rate_limit(now):
|
|
382
|
-
# Send highest priority update from queue
|
|
383
|
-
self.queue.sort(
|
|
384
|
-
key=lambda u: (
|
|
385
|
-
UpdatePriority.CRITICAL.value,
|
|
386
|
-
UpdatePriority.HIGH.value,
|
|
387
|
-
UpdatePriority.NORMAL.value,
|
|
388
|
-
UpdatePriority.LOW.value,
|
|
389
|
-
).index(u.priority.value)
|
|
390
|
-
)
|
|
391
|
-
if self.queue:
|
|
392
|
-
update = self.queue.pop(0)
|
|
393
|
-
updates_to_send.append(update)
|
|
394
|
-
self._record_update(now)
|
|
395
|
-
|
|
396
|
-
return updates_to_send
|
|
397
|
-
|
|
398
|
-
def flush_queue(self) -> list[ProgressUpdate]:
|
|
399
|
-
"""
|
|
400
|
-
Flush all queued updates (for completion/error states).
|
|
401
|
-
|
|
402
|
-
Returns:
|
|
403
|
-
List of all queued updates
|
|
404
|
-
"""
|
|
405
|
-
updates = self.queue.copy()
|
|
406
|
-
self.queue.clear()
|
|
407
|
-
return updates
|
|
408
|
-
|
|
409
|
-
def _check_rate_limit(self, now: datetime) -> bool:
|
|
410
|
-
"""Check if we're within rate limits."""
|
|
411
|
-
# Remove updates older than 1 minute
|
|
412
|
-
cutoff = now.timestamp() - 60
|
|
413
|
-
self.update_times = [
|
|
414
|
-
t for t in self.update_times if t.timestamp() > cutoff
|
|
415
|
-
]
|
|
416
|
-
|
|
417
|
-
return len(self.update_times) < self.max_per_minute
|
|
418
|
-
|
|
419
|
-
def _record_update(self, timestamp: datetime) -> None:
|
|
420
|
-
"""Record that an update was sent."""
|
|
421
|
-
self.last_update_time = timestamp
|
|
422
|
-
self.update_times.append(timestamp)
|
|
423
|
-
|
|
1
|
+
"""
|
|
2
|
+
Progress Update System for Real-Time Workflow Updates
|
|
3
|
+
|
|
4
|
+
Provides formatted progress updates for Cursor chat display during workflow execution.
|
|
5
|
+
Epic 8 / Story 8.1: Progress Update System Foundation
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from enum import Enum
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from .models import WorkflowState
|
|
14
|
+
from .visual_feedback import VisualFeedbackGenerator
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class UpdateType(Enum):
|
|
18
|
+
"""Type of progress update."""
|
|
19
|
+
|
|
20
|
+
STEP_STARTED = "step_started"
|
|
21
|
+
STEP_PROGRESS = "step_progress"
|
|
22
|
+
STEP_COMPLETED = "step_completed"
|
|
23
|
+
STEP_FAILED = "step_failed"
|
|
24
|
+
WORKFLOW_COMPLETED = "workflow_completed"
|
|
25
|
+
WORKFLOW_FAILED = "workflow_failed"
|
|
26
|
+
WORKFLOW_STARTED = "workflow_started"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class UpdatePriority(Enum):
|
|
30
|
+
"""Update priority for queue management."""
|
|
31
|
+
|
|
32
|
+
CRITICAL = "critical" # Errors, completion
|
|
33
|
+
HIGH = "high" # Step transitions
|
|
34
|
+
NORMAL = "normal" # Routine progress
|
|
35
|
+
LOW = "low" # Periodic updates
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class ProgressUpdate:
|
|
40
|
+
"""Progress update message structure."""
|
|
41
|
+
|
|
42
|
+
update_type: UpdateType
|
|
43
|
+
timestamp: datetime
|
|
44
|
+
step_number: int | None = None
|
|
45
|
+
total_steps: int | None = None
|
|
46
|
+
percentage: float | None = None
|
|
47
|
+
status: str | None = None
|
|
48
|
+
message: str | None = None
|
|
49
|
+
step_id: str | None = None
|
|
50
|
+
agent: str | None = None
|
|
51
|
+
action: str | None = None
|
|
52
|
+
error: str | None = None
|
|
53
|
+
priority: UpdatePriority = UpdatePriority.NORMAL
|
|
54
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
55
|
+
|
|
56
|
+
def to_dict(self) -> dict[str, Any]:
|
|
57
|
+
"""Convert to dictionary for JSON serialization."""
|
|
58
|
+
return {
|
|
59
|
+
"update_type": self.update_type.value,
|
|
60
|
+
"timestamp": self.timestamp.isoformat(),
|
|
61
|
+
"step_number": self.step_number,
|
|
62
|
+
"total_steps": self.total_steps,
|
|
63
|
+
"percentage": self.percentage,
|
|
64
|
+
"status": self.status,
|
|
65
|
+
"message": self.message,
|
|
66
|
+
"step_id": self.step_id,
|
|
67
|
+
"agent": self.agent,
|
|
68
|
+
"action": self.action,
|
|
69
|
+
"error": self.error,
|
|
70
|
+
"priority": self.priority.value,
|
|
71
|
+
"metadata": self.metadata,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class ProgressCalculator:
|
|
76
|
+
"""Calculates progress metrics from workflow state."""
|
|
77
|
+
|
|
78
|
+
def __init__(self, total_steps: int):
|
|
79
|
+
"""
|
|
80
|
+
Initialize progress calculator.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
total_steps: Total number of steps in the workflow
|
|
84
|
+
"""
|
|
85
|
+
self.total_steps = total_steps
|
|
86
|
+
|
|
87
|
+
def calculate_progress(
|
|
88
|
+
self, state: WorkflowState
|
|
89
|
+
) -> dict[str, Any]:
|
|
90
|
+
"""
|
|
91
|
+
Calculate progress from workflow state.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
state: Current workflow state
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
Dictionary with progress metrics
|
|
98
|
+
"""
|
|
99
|
+
completed = len(state.completed_steps)
|
|
100
|
+
skipped = len(state.skipped_steps)
|
|
101
|
+
failed = sum(
|
|
102
|
+
1 for exec in state.step_executions if exec.status == "failed"
|
|
103
|
+
)
|
|
104
|
+
running = sum(
|
|
105
|
+
1 for exec in state.step_executions if exec.status == "running"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Calculate percentage
|
|
109
|
+
if self.total_steps > 0:
|
|
110
|
+
percentage = ((completed + skipped) / self.total_steps) * 100.0
|
|
111
|
+
else:
|
|
112
|
+
percentage = 0.0
|
|
113
|
+
|
|
114
|
+
# Determine current step number
|
|
115
|
+
current_step_number = None
|
|
116
|
+
if state.current_step:
|
|
117
|
+
# Find step index in workflow
|
|
118
|
+
# Note: This assumes steps are ordered, which may not always be true
|
|
119
|
+
# For now, we'll use completed steps count + 1 as approximation
|
|
120
|
+
current_step_number = completed + running + 1
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
"current_step": current_step_number,
|
|
124
|
+
"total_steps": self.total_steps,
|
|
125
|
+
"completed": completed,
|
|
126
|
+
"skipped": skipped,
|
|
127
|
+
"failed": failed,
|
|
128
|
+
"running": running,
|
|
129
|
+
"percentage": round(percentage, 2),
|
|
130
|
+
"current_step_id": state.current_step,
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class ProgressUpdateGenerator:
|
|
135
|
+
"""Generates formatted progress updates for Cursor chat."""
|
|
136
|
+
|
|
137
|
+
# Emoji mapping for status types
|
|
138
|
+
STATUS_EMOJIS = {
|
|
139
|
+
"pending": "⏳",
|
|
140
|
+
"running": "🔄",
|
|
141
|
+
"completed": "✅",
|
|
142
|
+
"failed": "❌",
|
|
143
|
+
"skipped": "⏭️",
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
def __init__(self, calculator: ProgressCalculator, enable_visual: bool = True):
|
|
147
|
+
"""
|
|
148
|
+
Initialize update generator.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
calculator: Progress calculator instance
|
|
152
|
+
enable_visual: Whether to enable visual enhancements (Epic 11)
|
|
153
|
+
"""
|
|
154
|
+
self.calculator = calculator
|
|
155
|
+
self.visual = VisualFeedbackGenerator(enable_visual=enable_visual)
|
|
156
|
+
|
|
157
|
+
def generate_update(
|
|
158
|
+
self,
|
|
159
|
+
update_type: UpdateType,
|
|
160
|
+
state: WorkflowState,
|
|
161
|
+
step_id: str | None = None,
|
|
162
|
+
agent: str | None = None,
|
|
163
|
+
action: str | None = None,
|
|
164
|
+
error: str | None = None,
|
|
165
|
+
message: str | None = None,
|
|
166
|
+
) -> ProgressUpdate:
|
|
167
|
+
"""
|
|
168
|
+
Generate a progress update.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
update_type: Type of update
|
|
172
|
+
state: Current workflow state
|
|
173
|
+
step_id: Optional step ID
|
|
174
|
+
agent: Optional agent name
|
|
175
|
+
action: Optional action name
|
|
176
|
+
error: Optional error message
|
|
177
|
+
message: Optional custom message
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
ProgressUpdate instance
|
|
181
|
+
"""
|
|
182
|
+
progress = self.calculator.calculate_progress(state)
|
|
183
|
+
|
|
184
|
+
# Determine priority
|
|
185
|
+
priority = UpdatePriority.NORMAL
|
|
186
|
+
if update_type in (
|
|
187
|
+
UpdateType.WORKFLOW_COMPLETED,
|
|
188
|
+
UpdateType.WORKFLOW_FAILED,
|
|
189
|
+
UpdateType.STEP_FAILED,
|
|
190
|
+
):
|
|
191
|
+
priority = UpdatePriority.CRITICAL
|
|
192
|
+
elif update_type in (
|
|
193
|
+
UpdateType.STEP_STARTED,
|
|
194
|
+
UpdateType.STEP_COMPLETED,
|
|
195
|
+
):
|
|
196
|
+
priority = UpdatePriority.HIGH
|
|
197
|
+
|
|
198
|
+
# Determine status
|
|
199
|
+
status = state.status
|
|
200
|
+
if update_type == UpdateType.STEP_FAILED:
|
|
201
|
+
status = "failed"
|
|
202
|
+
elif update_type == UpdateType.STEP_COMPLETED:
|
|
203
|
+
status = "completed"
|
|
204
|
+
|
|
205
|
+
return ProgressUpdate(
|
|
206
|
+
update_type=update_type,
|
|
207
|
+
timestamp=datetime.now(),
|
|
208
|
+
step_number=progress.get("current_step"),
|
|
209
|
+
total_steps=progress.get("total_steps"),
|
|
210
|
+
percentage=progress.get("percentage"),
|
|
211
|
+
status=status,
|
|
212
|
+
message=message,
|
|
213
|
+
step_id=step_id or progress.get("current_step_id"),
|
|
214
|
+
agent=agent,
|
|
215
|
+
action=action,
|
|
216
|
+
error=error,
|
|
217
|
+
priority=priority,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
def format_for_chat(self, update: ProgressUpdate) -> str:
|
|
221
|
+
"""
|
|
222
|
+
Format update for Cursor chat display.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
update: Progress update to format
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
Formatted markdown string for chat
|
|
229
|
+
"""
|
|
230
|
+
lines = []
|
|
231
|
+
|
|
232
|
+
# Header based on update type
|
|
233
|
+
if update.update_type == UpdateType.WORKFLOW_STARTED:
|
|
234
|
+
lines.append("## 🚀 Workflow Started")
|
|
235
|
+
elif update.update_type == UpdateType.WORKFLOW_COMPLETED:
|
|
236
|
+
lines.append("## ✅ Workflow Completed")
|
|
237
|
+
elif update.update_type == UpdateType.WORKFLOW_FAILED:
|
|
238
|
+
lines.append("## ❌ Workflow Failed")
|
|
239
|
+
elif update.update_type == UpdateType.STEP_STARTED:
|
|
240
|
+
emoji = self.STATUS_EMOJIS.get("running", "🔄")
|
|
241
|
+
lines.append(f"### {emoji} Step Started")
|
|
242
|
+
elif update.update_type == UpdateType.STEP_COMPLETED:
|
|
243
|
+
emoji = self.STATUS_EMOJIS.get("completed", "✅")
|
|
244
|
+
lines.append(f"### {emoji} Step Completed")
|
|
245
|
+
elif update.update_type == UpdateType.STEP_FAILED:
|
|
246
|
+
emoji = self.STATUS_EMOJIS.get("failed", "❌")
|
|
247
|
+
lines.append(f"### {emoji} Step Failed")
|
|
248
|
+
else:
|
|
249
|
+
lines.append("### 🔄 Progress Update")
|
|
250
|
+
|
|
251
|
+
# Progress bar (Epic 11: Enhanced visual feedback)
|
|
252
|
+
if update.percentage is not None:
|
|
253
|
+
progress_bar = self.visual.format_progress_bar(update.percentage)
|
|
254
|
+
lines.append(f"\n{progress_bar}\n")
|
|
255
|
+
|
|
256
|
+
# Step information (Epic 11: Enhanced step indicators)
|
|
257
|
+
if update.step_number and update.total_steps:
|
|
258
|
+
step_indicator = self.visual.format_step_indicator(
|
|
259
|
+
update.step_number, update.total_steps, update.step_id
|
|
260
|
+
)
|
|
261
|
+
if update.percentage is not None:
|
|
262
|
+
lines.append(f"{step_indicator} ({update.percentage:.1f}% complete)")
|
|
263
|
+
else:
|
|
264
|
+
lines.append(step_indicator)
|
|
265
|
+
|
|
266
|
+
# Step details (Epic 11: Status badges)
|
|
267
|
+
if update.agent and update.action:
|
|
268
|
+
status_badge = self.visual.format_status_badge(update.status or "running")
|
|
269
|
+
lines.append(f"- **Status:** {status_badge}")
|
|
270
|
+
lines.append(f"- **Agent:** {update.agent}")
|
|
271
|
+
lines.append(f"- **Action:** {update.action}")
|
|
272
|
+
|
|
273
|
+
if update.step_id:
|
|
274
|
+
lines.append(f"- **Step ID:** `{update.step_id}`")
|
|
275
|
+
|
|
276
|
+
# Error information
|
|
277
|
+
if update.error:
|
|
278
|
+
lines.append(f"\n**Error:** {update.error}")
|
|
279
|
+
|
|
280
|
+
# Custom message
|
|
281
|
+
if update.message:
|
|
282
|
+
lines.append(f"\n{update.message}")
|
|
283
|
+
|
|
284
|
+
return "\n".join(lines)
|
|
285
|
+
|
|
286
|
+
def _generate_progress_bar(self, percentage: float, width: int = 30) -> str:
|
|
287
|
+
"""
|
|
288
|
+
Generate text-based progress bar.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
percentage: Completion percentage (0-100)
|
|
292
|
+
width: Width of progress bar in characters
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
Formatted progress bar string (ASCII-safe)
|
|
296
|
+
"""
|
|
297
|
+
from ..core.unicode_safe import safe_format_progress_bar
|
|
298
|
+
return safe_format_progress_bar(percentage, width)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class UpdateQueue:
|
|
302
|
+
"""Manages update frequency to prevent chat spam."""
|
|
303
|
+
|
|
304
|
+
def __init__(
|
|
305
|
+
self,
|
|
306
|
+
min_interval_seconds: float = 2.0,
|
|
307
|
+
max_updates_per_minute: int = 30,
|
|
308
|
+
):
|
|
309
|
+
"""
|
|
310
|
+
Initialize update queue.
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
min_interval_seconds: Minimum time between updates
|
|
314
|
+
max_updates_per_minute: Maximum updates per minute
|
|
315
|
+
"""
|
|
316
|
+
self.min_interval = min_interval_seconds
|
|
317
|
+
self.max_per_minute = max_updates_per_minute
|
|
318
|
+
self.queue: list[ProgressUpdate] = []
|
|
319
|
+
self.last_update_time: datetime | None = None
|
|
320
|
+
self.update_times: list[datetime] = []
|
|
321
|
+
|
|
322
|
+
def add_update(self, update: ProgressUpdate) -> bool:
|
|
323
|
+
"""
|
|
324
|
+
Add update to queue and determine if it should be sent.
|
|
325
|
+
|
|
326
|
+
Args:
|
|
327
|
+
update: Progress update to queue
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
True if update should be sent immediately, False if queued
|
|
331
|
+
"""
|
|
332
|
+
now = datetime.now()
|
|
333
|
+
|
|
334
|
+
# Critical updates always sent immediately
|
|
335
|
+
if update.priority == UpdatePriority.CRITICAL:
|
|
336
|
+
self._record_update(now)
|
|
337
|
+
return True
|
|
338
|
+
|
|
339
|
+
# Check minimum interval
|
|
340
|
+
if (
|
|
341
|
+
self.last_update_time
|
|
342
|
+
and (now - self.last_update_time).total_seconds() < self.min_interval
|
|
343
|
+
):
|
|
344
|
+
# Queue for later unless high priority
|
|
345
|
+
if update.priority == UpdatePriority.HIGH:
|
|
346
|
+
# High priority can bypass interval but still check rate limit
|
|
347
|
+
if self._check_rate_limit(now):
|
|
348
|
+
self._record_update(now)
|
|
349
|
+
return True
|
|
350
|
+
# Always queue if interval not met (for normal/low priority)
|
|
351
|
+
self.queue.append(update)
|
|
352
|
+
return False
|
|
353
|
+
|
|
354
|
+
# Check rate limit
|
|
355
|
+
if not self._check_rate_limit(now):
|
|
356
|
+
self.queue.append(update)
|
|
357
|
+
return False
|
|
358
|
+
|
|
359
|
+
# Update can be sent
|
|
360
|
+
self._record_update(now)
|
|
361
|
+
return True
|
|
362
|
+
|
|
363
|
+
def get_queued_updates(self) -> list[ProgressUpdate]:
|
|
364
|
+
"""
|
|
365
|
+
Get updates that should be sent now.
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
List of updates to send
|
|
369
|
+
"""
|
|
370
|
+
if not self.queue:
|
|
371
|
+
return []
|
|
372
|
+
|
|
373
|
+
now = datetime.now()
|
|
374
|
+
updates_to_send: list[ProgressUpdate] = []
|
|
375
|
+
|
|
376
|
+
# Check if we can send queued updates
|
|
377
|
+
if (
|
|
378
|
+
not self.last_update_time
|
|
379
|
+
or (now - self.last_update_time).total_seconds() >= self.min_interval
|
|
380
|
+
):
|
|
381
|
+
if self._check_rate_limit(now):
|
|
382
|
+
# Send highest priority update from queue
|
|
383
|
+
self.queue.sort(
|
|
384
|
+
key=lambda u: (
|
|
385
|
+
UpdatePriority.CRITICAL.value,
|
|
386
|
+
UpdatePriority.HIGH.value,
|
|
387
|
+
UpdatePriority.NORMAL.value,
|
|
388
|
+
UpdatePriority.LOW.value,
|
|
389
|
+
).index(u.priority.value)
|
|
390
|
+
)
|
|
391
|
+
if self.queue:
|
|
392
|
+
update = self.queue.pop(0)
|
|
393
|
+
updates_to_send.append(update)
|
|
394
|
+
self._record_update(now)
|
|
395
|
+
|
|
396
|
+
return updates_to_send
|
|
397
|
+
|
|
398
|
+
def flush_queue(self) -> list[ProgressUpdate]:
|
|
399
|
+
"""
|
|
400
|
+
Flush all queued updates (for completion/error states).
|
|
401
|
+
|
|
402
|
+
Returns:
|
|
403
|
+
List of all queued updates
|
|
404
|
+
"""
|
|
405
|
+
updates = self.queue.copy()
|
|
406
|
+
self.queue.clear()
|
|
407
|
+
return updates
|
|
408
|
+
|
|
409
|
+
def _check_rate_limit(self, now: datetime) -> bool:
|
|
410
|
+
"""Check if we're within rate limits."""
|
|
411
|
+
# Remove updates older than 1 minute
|
|
412
|
+
cutoff = now.timestamp() - 60
|
|
413
|
+
self.update_times = [
|
|
414
|
+
t for t in self.update_times if t.timestamp() > cutoff
|
|
415
|
+
]
|
|
416
|
+
|
|
417
|
+
return len(self.update_times) < self.max_per_minute
|
|
418
|
+
|
|
419
|
+
def _record_update(self, timestamp: datetime) -> None:
|
|
420
|
+
"""Record that an update was sent."""
|
|
421
|
+
self.last_update_time = timestamp
|
|
422
|
+
self.update_times.append(timestamp)
|
|
423
|
+
|