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,314 +1,314 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Step Checkpoint Manager - Manages step-level checkpoints for workflow state persistence.
|
|
3
|
-
|
|
4
|
-
Enables resume capability by saving workflow progress after each step.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import hashlib
|
|
8
|
-
import json
|
|
9
|
-
from dataclasses import asdict, dataclass, field
|
|
10
|
-
from datetime import datetime
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
import logging
|
|
15
|
-
|
|
16
|
-
from .file_utils import atomic_write_json
|
|
17
|
-
from .models import Artifact
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class CheckpointError(Exception):
|
|
23
|
-
"""Base exception for checkpoint operations."""
|
|
24
|
-
|
|
25
|
-
pass
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class CheckpointNotFoundError(CheckpointError):
|
|
29
|
-
"""Checkpoint not found."""
|
|
30
|
-
|
|
31
|
-
pass
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class CheckpointValidationError(CheckpointError):
|
|
35
|
-
"""Checkpoint validation failed."""
|
|
36
|
-
|
|
37
|
-
pass
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@dataclass
|
|
41
|
-
class StepCheckpoint:
|
|
42
|
-
"""Step checkpoint data model."""
|
|
43
|
-
|
|
44
|
-
workflow_id: str
|
|
45
|
-
step_id: str
|
|
46
|
-
step_number: int
|
|
47
|
-
step_name: str
|
|
48
|
-
completed_at: datetime
|
|
49
|
-
step_output: dict[str, Any]
|
|
50
|
-
artifacts: dict[str, Artifact]
|
|
51
|
-
metadata: dict[str, Any] = field(default_factory=dict)
|
|
52
|
-
checksum: str = ""
|
|
53
|
-
version: str = "1.0"
|
|
54
|
-
|
|
55
|
-
def to_dict(self) -> dict[str, Any]:
|
|
56
|
-
"""Convert checkpoint to dictionary."""
|
|
57
|
-
data = asdict(self)
|
|
58
|
-
# Convert datetime to ISO format
|
|
59
|
-
data["completed_at"] = self.completed_at.isoformat()
|
|
60
|
-
# Convert artifacts to dict
|
|
61
|
-
data["artifacts"] = {
|
|
62
|
-
k: asdict(v) if hasattr(v, "__dict__") else v
|
|
63
|
-
for k, v in self.artifacts.items()
|
|
64
|
-
}
|
|
65
|
-
return data
|
|
66
|
-
|
|
67
|
-
@classmethod
|
|
68
|
-
def from_dict(cls, data: dict[str, Any]) -> "StepCheckpoint":
|
|
69
|
-
"""Create checkpoint from dictionary."""
|
|
70
|
-
# Convert ISO datetime string back to datetime
|
|
71
|
-
if isinstance(data.get("completed_at"), str):
|
|
72
|
-
data["completed_at"] = datetime.fromisoformat(data["completed_at"])
|
|
73
|
-
# Reconstruct artifacts
|
|
74
|
-
artifacts = {}
|
|
75
|
-
for k, v in data.get("artifacts", {}).items():
|
|
76
|
-
if isinstance(v, dict):
|
|
77
|
-
artifacts[k] = Artifact(**v)
|
|
78
|
-
else:
|
|
79
|
-
artifacts[k] = v
|
|
80
|
-
data["artifacts"] = artifacts
|
|
81
|
-
return cls(**data)
|
|
82
|
-
|
|
83
|
-
def _calculate_checksum(self) -> str:
|
|
84
|
-
"""Calculate checksum for checkpoint data."""
|
|
85
|
-
data = self.to_dict()
|
|
86
|
-
# Remove checksum from calculation
|
|
87
|
-
data.pop("checksum", None)
|
|
88
|
-
data_str = json.dumps(data, sort_keys=True, default=str)
|
|
89
|
-
return hashlib.sha256(data_str.encode("utf-8")).hexdigest()
|
|
90
|
-
|
|
91
|
-
def validate(self) -> bool:
|
|
92
|
-
"""Validate checkpoint integrity."""
|
|
93
|
-
expected_checksum = self._calculate_checksum()
|
|
94
|
-
return self.checksum == expected_checksum
|
|
95
|
-
|
|
96
|
-
def update_checksum(self) -> None:
|
|
97
|
-
"""Update checksum for checkpoint."""
|
|
98
|
-
self.checksum = self._calculate_checksum()
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
class StepCheckpointManager:
|
|
102
|
-
"""Manages step-level checkpoints for workflow state persistence."""
|
|
103
|
-
|
|
104
|
-
def __init__(
|
|
105
|
-
self,
|
|
106
|
-
state_dir: Path,
|
|
107
|
-
workflow_id: str,
|
|
108
|
-
compression: bool = False,
|
|
109
|
-
):
|
|
110
|
-
"""
|
|
111
|
-
Initialize checkpoint manager.
|
|
112
|
-
|
|
113
|
-
Args:
|
|
114
|
-
state_dir: Base directory for state storage
|
|
115
|
-
workflow_id: Workflow identifier
|
|
116
|
-
compression: Enable compression for checkpoint files (not implemented yet)
|
|
117
|
-
"""
|
|
118
|
-
self.state_dir = Path(state_dir)
|
|
119
|
-
self.workflow_id = workflow_id
|
|
120
|
-
self.compression = compression
|
|
121
|
-
self.checkpoint_dir = self.state_dir / workflow_id / "checkpoints"
|
|
122
|
-
self.checkpoint_dir.mkdir(parents=True, exist_ok=True)
|
|
123
|
-
|
|
124
|
-
def save_checkpoint(
|
|
125
|
-
self,
|
|
126
|
-
step_id: str,
|
|
127
|
-
step_number: int,
|
|
128
|
-
step_output: dict[str, Any],
|
|
129
|
-
artifacts: dict[str, Artifact],
|
|
130
|
-
step_name: str | None = None,
|
|
131
|
-
metadata: dict[str, Any] | None = None,
|
|
132
|
-
) -> Path:
|
|
133
|
-
"""
|
|
134
|
-
Save checkpoint after step completion.
|
|
135
|
-
|
|
136
|
-
Args:
|
|
137
|
-
step_id: Step identifier (e.g., "step1", "enhance")
|
|
138
|
-
step_number: Step number (1-based)
|
|
139
|
-
step_output: Step execution output
|
|
140
|
-
artifacts: Step artifacts
|
|
141
|
-
step_name: Optional step name
|
|
142
|
-
metadata: Optional metadata
|
|
143
|
-
|
|
144
|
-
Returns:
|
|
145
|
-
Path to saved checkpoint file
|
|
146
|
-
|
|
147
|
-
Raises:
|
|
148
|
-
CheckpointError: If checkpoint save fails
|
|
149
|
-
"""
|
|
150
|
-
checkpoint = StepCheckpoint(
|
|
151
|
-
workflow_id=self.workflow_id,
|
|
152
|
-
step_id=step_id,
|
|
153
|
-
step_number=step_number,
|
|
154
|
-
step_name=step_name or step_id,
|
|
155
|
-
completed_at=datetime.now(),
|
|
156
|
-
step_output=step_output,
|
|
157
|
-
artifacts=artifacts,
|
|
158
|
-
metadata=metadata or {},
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
# Calculate and set checksum
|
|
162
|
-
checkpoint.update_checksum()
|
|
163
|
-
|
|
164
|
-
# Generate filename
|
|
165
|
-
filename = f"step{step_number}-{step_id}.json"
|
|
166
|
-
checkpoint_path = self.checkpoint_dir / filename
|
|
167
|
-
|
|
168
|
-
try:
|
|
169
|
-
# Atomic write
|
|
170
|
-
atomic_write_json(checkpoint_path, checkpoint.to_dict(), indent=2)
|
|
171
|
-
logger.debug(f"Saved checkpoint: {checkpoint_path}")
|
|
172
|
-
return checkpoint_path
|
|
173
|
-
except OSError as e:
|
|
174
|
-
raise CheckpointError(
|
|
175
|
-
f"Failed to save checkpoint to {checkpoint_path}: {e}"
|
|
176
|
-
) from e
|
|
177
|
-
|
|
178
|
-
def load_checkpoint(
|
|
179
|
-
self,
|
|
180
|
-
step_id: str | None = None,
|
|
181
|
-
step_number: int | None = None,
|
|
182
|
-
) -> StepCheckpoint:
|
|
183
|
-
"""
|
|
184
|
-
Load checkpoint for step.
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
step_id: Step identifier (if None, load latest)
|
|
188
|
-
step_number: Step number (if None, load latest)
|
|
189
|
-
|
|
190
|
-
Returns:
|
|
191
|
-
StepCheckpoint object
|
|
192
|
-
|
|
193
|
-
Raises:
|
|
194
|
-
CheckpointNotFoundError: If checkpoint not found
|
|
195
|
-
CheckpointValidationError: If checkpoint is invalid
|
|
196
|
-
"""
|
|
197
|
-
if step_id and step_number:
|
|
198
|
-
filename = f"step{step_number}-{step_id}.json"
|
|
199
|
-
checkpoint_path = self.checkpoint_dir / filename
|
|
200
|
-
else:
|
|
201
|
-
# Load latest checkpoint
|
|
202
|
-
checkpoint = self.get_latest_checkpoint()
|
|
203
|
-
if checkpoint is None:
|
|
204
|
-
raise CheckpointNotFoundError(
|
|
205
|
-
f"No checkpoint found for workflow {self.workflow_id}"
|
|
206
|
-
)
|
|
207
|
-
return checkpoint
|
|
208
|
-
|
|
209
|
-
if not checkpoint_path.exists():
|
|
210
|
-
raise CheckpointNotFoundError(
|
|
211
|
-
f"Checkpoint not found: {checkpoint_path}"
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
try:
|
|
215
|
-
with open(checkpoint_path, encoding="utf-8") as f:
|
|
216
|
-
data = json.load(f)
|
|
217
|
-
|
|
218
|
-
checkpoint = StepCheckpoint.from_dict(data)
|
|
219
|
-
|
|
220
|
-
# Validate checkpoint
|
|
221
|
-
if not checkpoint.validate():
|
|
222
|
-
raise CheckpointValidationError(
|
|
223
|
-
f"Checkpoint validation failed: {checkpoint_path}"
|
|
224
|
-
)
|
|
225
|
-
|
|
226
|
-
return checkpoint
|
|
227
|
-
except json.JSONDecodeError as e:
|
|
228
|
-
raise CheckpointValidationError(
|
|
229
|
-
f"Invalid checkpoint JSON: {checkpoint_path}: {e}"
|
|
230
|
-
) from e
|
|
231
|
-
except Exception as e:
|
|
232
|
-
raise CheckpointError(
|
|
233
|
-
f"Failed to load checkpoint: {checkpoint_path}: {e}"
|
|
234
|
-
) from e
|
|
235
|
-
|
|
236
|
-
def get_latest_checkpoint(self) -> StepCheckpoint | None:
|
|
237
|
-
"""
|
|
238
|
-
Get latest checkpoint for workflow.
|
|
239
|
-
|
|
240
|
-
Returns:
|
|
241
|
-
Latest StepCheckpoint or None if no checkpoints exist
|
|
242
|
-
"""
|
|
243
|
-
checkpoints = self.list_checkpoints()
|
|
244
|
-
if not checkpoints:
|
|
245
|
-
return None
|
|
246
|
-
# Return checkpoint with highest step_number
|
|
247
|
-
return max(checkpoints, key=lambda c: c.step_number)
|
|
248
|
-
|
|
249
|
-
def list_checkpoints(self) -> list[StepCheckpoint]:
|
|
250
|
-
"""
|
|
251
|
-
List all checkpoints for workflow.
|
|
252
|
-
|
|
253
|
-
Returns:
|
|
254
|
-
List of StepCheckpoint objects, sorted by step_number
|
|
255
|
-
"""
|
|
256
|
-
checkpoints = []
|
|
257
|
-
if not self.checkpoint_dir.exists():
|
|
258
|
-
return checkpoints
|
|
259
|
-
|
|
260
|
-
for checkpoint_file in sorted(self.checkpoint_dir.glob("step*.json")):
|
|
261
|
-
try:
|
|
262
|
-
with open(checkpoint_file, encoding="utf-8") as f:
|
|
263
|
-
data = json.load(f)
|
|
264
|
-
checkpoint = StepCheckpoint.from_dict(data)
|
|
265
|
-
if checkpoint.validate():
|
|
266
|
-
checkpoints.append(checkpoint)
|
|
267
|
-
except Exception as e:
|
|
268
|
-
logger.warning(
|
|
269
|
-
f"Failed to load checkpoint {checkpoint_file}: {e}",
|
|
270
|
-
exc_info=True,
|
|
271
|
-
)
|
|
272
|
-
|
|
273
|
-
return sorted(checkpoints, key=lambda c: c.step_number)
|
|
274
|
-
|
|
275
|
-
def cleanup_old_checkpoints(
|
|
276
|
-
self,
|
|
277
|
-
retention_days: int = 30,
|
|
278
|
-
) -> int:
|
|
279
|
-
"""
|
|
280
|
-
Clean up checkpoints older than retention period.
|
|
281
|
-
|
|
282
|
-
Args:
|
|
283
|
-
retention_days: Days to retain checkpoints
|
|
284
|
-
|
|
285
|
-
Returns:
|
|
286
|
-
Number of checkpoints deleted
|
|
287
|
-
"""
|
|
288
|
-
if not self.checkpoint_dir.exists():
|
|
289
|
-
return 0
|
|
290
|
-
|
|
291
|
-
cutoff_date = datetime.now().replace(
|
|
292
|
-
hour=0, minute=0, second=0, microsecond=0
|
|
293
|
-
)
|
|
294
|
-
cutoff_date = cutoff_date.replace(
|
|
295
|
-
day=cutoff_date.day - retention_days
|
|
296
|
-
)
|
|
297
|
-
|
|
298
|
-
deleted_count = 0
|
|
299
|
-
for checkpoint_file in self.checkpoint_dir.glob("step*.json"):
|
|
300
|
-
try:
|
|
301
|
-
with open(checkpoint_file, encoding="utf-8") as f:
|
|
302
|
-
data = json.load(f)
|
|
303
|
-
completed_at = datetime.fromisoformat(data["completed_at"])
|
|
304
|
-
|
|
305
|
-
if completed_at < cutoff_date:
|
|
306
|
-
checkpoint_file.unlink()
|
|
307
|
-
deleted_count += 1
|
|
308
|
-
except Exception as e:
|
|
309
|
-
logger.warning(
|
|
310
|
-
f"Failed to process checkpoint {checkpoint_file}: {e}",
|
|
311
|
-
exc_info=True,
|
|
312
|
-
)
|
|
313
|
-
|
|
314
|
-
return deleted_count
|
|
1
|
+
"""
|
|
2
|
+
Step Checkpoint Manager - Manages step-level checkpoints for workflow state persistence.
|
|
3
|
+
|
|
4
|
+
Enables resume capability by saving workflow progress after each step.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import json
|
|
9
|
+
from dataclasses import asdict, dataclass, field
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
|
|
16
|
+
from .file_utils import atomic_write_json
|
|
17
|
+
from .models import Artifact
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class CheckpointError(Exception):
|
|
23
|
+
"""Base exception for checkpoint operations."""
|
|
24
|
+
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class CheckpointNotFoundError(CheckpointError):
|
|
29
|
+
"""Checkpoint not found."""
|
|
30
|
+
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class CheckpointValidationError(CheckpointError):
|
|
35
|
+
"""Checkpoint validation failed."""
|
|
36
|
+
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class StepCheckpoint:
|
|
42
|
+
"""Step checkpoint data model."""
|
|
43
|
+
|
|
44
|
+
workflow_id: str
|
|
45
|
+
step_id: str
|
|
46
|
+
step_number: int
|
|
47
|
+
step_name: str
|
|
48
|
+
completed_at: datetime
|
|
49
|
+
step_output: dict[str, Any]
|
|
50
|
+
artifacts: dict[str, Artifact]
|
|
51
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
52
|
+
checksum: str = ""
|
|
53
|
+
version: str = "1.0"
|
|
54
|
+
|
|
55
|
+
def to_dict(self) -> dict[str, Any]:
|
|
56
|
+
"""Convert checkpoint to dictionary."""
|
|
57
|
+
data = asdict(self)
|
|
58
|
+
# Convert datetime to ISO format
|
|
59
|
+
data["completed_at"] = self.completed_at.isoformat()
|
|
60
|
+
# Convert artifacts to dict
|
|
61
|
+
data["artifacts"] = {
|
|
62
|
+
k: asdict(v) if hasattr(v, "__dict__") else v
|
|
63
|
+
for k, v in self.artifacts.items()
|
|
64
|
+
}
|
|
65
|
+
return data
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_dict(cls, data: dict[str, Any]) -> "StepCheckpoint":
|
|
69
|
+
"""Create checkpoint from dictionary."""
|
|
70
|
+
# Convert ISO datetime string back to datetime
|
|
71
|
+
if isinstance(data.get("completed_at"), str):
|
|
72
|
+
data["completed_at"] = datetime.fromisoformat(data["completed_at"])
|
|
73
|
+
# Reconstruct artifacts
|
|
74
|
+
artifacts = {}
|
|
75
|
+
for k, v in data.get("artifacts", {}).items():
|
|
76
|
+
if isinstance(v, dict):
|
|
77
|
+
artifacts[k] = Artifact(**v)
|
|
78
|
+
else:
|
|
79
|
+
artifacts[k] = v
|
|
80
|
+
data["artifacts"] = artifacts
|
|
81
|
+
return cls(**data)
|
|
82
|
+
|
|
83
|
+
def _calculate_checksum(self) -> str:
|
|
84
|
+
"""Calculate checksum for checkpoint data."""
|
|
85
|
+
data = self.to_dict()
|
|
86
|
+
# Remove checksum from calculation
|
|
87
|
+
data.pop("checksum", None)
|
|
88
|
+
data_str = json.dumps(data, sort_keys=True, default=str)
|
|
89
|
+
return hashlib.sha256(data_str.encode("utf-8")).hexdigest()
|
|
90
|
+
|
|
91
|
+
def validate(self) -> bool:
|
|
92
|
+
"""Validate checkpoint integrity."""
|
|
93
|
+
expected_checksum = self._calculate_checksum()
|
|
94
|
+
return self.checksum == expected_checksum
|
|
95
|
+
|
|
96
|
+
def update_checksum(self) -> None:
|
|
97
|
+
"""Update checksum for checkpoint."""
|
|
98
|
+
self.checksum = self._calculate_checksum()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class StepCheckpointManager:
|
|
102
|
+
"""Manages step-level checkpoints for workflow state persistence."""
|
|
103
|
+
|
|
104
|
+
def __init__(
|
|
105
|
+
self,
|
|
106
|
+
state_dir: Path,
|
|
107
|
+
workflow_id: str,
|
|
108
|
+
compression: bool = False,
|
|
109
|
+
):
|
|
110
|
+
"""
|
|
111
|
+
Initialize checkpoint manager.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
state_dir: Base directory for state storage
|
|
115
|
+
workflow_id: Workflow identifier
|
|
116
|
+
compression: Enable compression for checkpoint files (not implemented yet)
|
|
117
|
+
"""
|
|
118
|
+
self.state_dir = Path(state_dir)
|
|
119
|
+
self.workflow_id = workflow_id
|
|
120
|
+
self.compression = compression
|
|
121
|
+
self.checkpoint_dir = self.state_dir / workflow_id / "checkpoints"
|
|
122
|
+
self.checkpoint_dir.mkdir(parents=True, exist_ok=True)
|
|
123
|
+
|
|
124
|
+
def save_checkpoint(
|
|
125
|
+
self,
|
|
126
|
+
step_id: str,
|
|
127
|
+
step_number: int,
|
|
128
|
+
step_output: dict[str, Any],
|
|
129
|
+
artifacts: dict[str, Artifact],
|
|
130
|
+
step_name: str | None = None,
|
|
131
|
+
metadata: dict[str, Any] | None = None,
|
|
132
|
+
) -> Path:
|
|
133
|
+
"""
|
|
134
|
+
Save checkpoint after step completion.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
step_id: Step identifier (e.g., "step1", "enhance")
|
|
138
|
+
step_number: Step number (1-based)
|
|
139
|
+
step_output: Step execution output
|
|
140
|
+
artifacts: Step artifacts
|
|
141
|
+
step_name: Optional step name
|
|
142
|
+
metadata: Optional metadata
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Path to saved checkpoint file
|
|
146
|
+
|
|
147
|
+
Raises:
|
|
148
|
+
CheckpointError: If checkpoint save fails
|
|
149
|
+
"""
|
|
150
|
+
checkpoint = StepCheckpoint(
|
|
151
|
+
workflow_id=self.workflow_id,
|
|
152
|
+
step_id=step_id,
|
|
153
|
+
step_number=step_number,
|
|
154
|
+
step_name=step_name or step_id,
|
|
155
|
+
completed_at=datetime.now(),
|
|
156
|
+
step_output=step_output,
|
|
157
|
+
artifacts=artifacts,
|
|
158
|
+
metadata=metadata or {},
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Calculate and set checksum
|
|
162
|
+
checkpoint.update_checksum()
|
|
163
|
+
|
|
164
|
+
# Generate filename
|
|
165
|
+
filename = f"step{step_number}-{step_id}.json"
|
|
166
|
+
checkpoint_path = self.checkpoint_dir / filename
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
# Atomic write
|
|
170
|
+
atomic_write_json(checkpoint_path, checkpoint.to_dict(), indent=2)
|
|
171
|
+
logger.debug(f"Saved checkpoint: {checkpoint_path}")
|
|
172
|
+
return checkpoint_path
|
|
173
|
+
except OSError as e:
|
|
174
|
+
raise CheckpointError(
|
|
175
|
+
f"Failed to save checkpoint to {checkpoint_path}: {e}"
|
|
176
|
+
) from e
|
|
177
|
+
|
|
178
|
+
def load_checkpoint(
|
|
179
|
+
self,
|
|
180
|
+
step_id: str | None = None,
|
|
181
|
+
step_number: int | None = None,
|
|
182
|
+
) -> StepCheckpoint:
|
|
183
|
+
"""
|
|
184
|
+
Load checkpoint for step.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
step_id: Step identifier (if None, load latest)
|
|
188
|
+
step_number: Step number (if None, load latest)
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
StepCheckpoint object
|
|
192
|
+
|
|
193
|
+
Raises:
|
|
194
|
+
CheckpointNotFoundError: If checkpoint not found
|
|
195
|
+
CheckpointValidationError: If checkpoint is invalid
|
|
196
|
+
"""
|
|
197
|
+
if step_id and step_number:
|
|
198
|
+
filename = f"step{step_number}-{step_id}.json"
|
|
199
|
+
checkpoint_path = self.checkpoint_dir / filename
|
|
200
|
+
else:
|
|
201
|
+
# Load latest checkpoint
|
|
202
|
+
checkpoint = self.get_latest_checkpoint()
|
|
203
|
+
if checkpoint is None:
|
|
204
|
+
raise CheckpointNotFoundError(
|
|
205
|
+
f"No checkpoint found for workflow {self.workflow_id}"
|
|
206
|
+
)
|
|
207
|
+
return checkpoint
|
|
208
|
+
|
|
209
|
+
if not checkpoint_path.exists():
|
|
210
|
+
raise CheckpointNotFoundError(
|
|
211
|
+
f"Checkpoint not found: {checkpoint_path}"
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
with open(checkpoint_path, encoding="utf-8") as f:
|
|
216
|
+
data = json.load(f)
|
|
217
|
+
|
|
218
|
+
checkpoint = StepCheckpoint.from_dict(data)
|
|
219
|
+
|
|
220
|
+
# Validate checkpoint
|
|
221
|
+
if not checkpoint.validate():
|
|
222
|
+
raise CheckpointValidationError(
|
|
223
|
+
f"Checkpoint validation failed: {checkpoint_path}"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
return checkpoint
|
|
227
|
+
except json.JSONDecodeError as e:
|
|
228
|
+
raise CheckpointValidationError(
|
|
229
|
+
f"Invalid checkpoint JSON: {checkpoint_path}: {e}"
|
|
230
|
+
) from e
|
|
231
|
+
except Exception as e:
|
|
232
|
+
raise CheckpointError(
|
|
233
|
+
f"Failed to load checkpoint: {checkpoint_path}: {e}"
|
|
234
|
+
) from e
|
|
235
|
+
|
|
236
|
+
def get_latest_checkpoint(self) -> StepCheckpoint | None:
|
|
237
|
+
"""
|
|
238
|
+
Get latest checkpoint for workflow.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
Latest StepCheckpoint or None if no checkpoints exist
|
|
242
|
+
"""
|
|
243
|
+
checkpoints = self.list_checkpoints()
|
|
244
|
+
if not checkpoints:
|
|
245
|
+
return None
|
|
246
|
+
# Return checkpoint with highest step_number
|
|
247
|
+
return max(checkpoints, key=lambda c: c.step_number)
|
|
248
|
+
|
|
249
|
+
def list_checkpoints(self) -> list[StepCheckpoint]:
|
|
250
|
+
"""
|
|
251
|
+
List all checkpoints for workflow.
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
List of StepCheckpoint objects, sorted by step_number
|
|
255
|
+
"""
|
|
256
|
+
checkpoints = []
|
|
257
|
+
if not self.checkpoint_dir.exists():
|
|
258
|
+
return checkpoints
|
|
259
|
+
|
|
260
|
+
for checkpoint_file in sorted(self.checkpoint_dir.glob("step*.json")):
|
|
261
|
+
try:
|
|
262
|
+
with open(checkpoint_file, encoding="utf-8") as f:
|
|
263
|
+
data = json.load(f)
|
|
264
|
+
checkpoint = StepCheckpoint.from_dict(data)
|
|
265
|
+
if checkpoint.validate():
|
|
266
|
+
checkpoints.append(checkpoint)
|
|
267
|
+
except Exception as e:
|
|
268
|
+
logger.warning(
|
|
269
|
+
f"Failed to load checkpoint {checkpoint_file}: {e}",
|
|
270
|
+
exc_info=True,
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
return sorted(checkpoints, key=lambda c: c.step_number)
|
|
274
|
+
|
|
275
|
+
def cleanup_old_checkpoints(
|
|
276
|
+
self,
|
|
277
|
+
retention_days: int = 30,
|
|
278
|
+
) -> int:
|
|
279
|
+
"""
|
|
280
|
+
Clean up checkpoints older than retention period.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
retention_days: Days to retain checkpoints
|
|
284
|
+
|
|
285
|
+
Returns:
|
|
286
|
+
Number of checkpoints deleted
|
|
287
|
+
"""
|
|
288
|
+
if not self.checkpoint_dir.exists():
|
|
289
|
+
return 0
|
|
290
|
+
|
|
291
|
+
cutoff_date = datetime.now().replace(
|
|
292
|
+
hour=0, minute=0, second=0, microsecond=0
|
|
293
|
+
)
|
|
294
|
+
cutoff_date = cutoff_date.replace(
|
|
295
|
+
day=cutoff_date.day - retention_days
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
deleted_count = 0
|
|
299
|
+
for checkpoint_file in self.checkpoint_dir.glob("step*.json"):
|
|
300
|
+
try:
|
|
301
|
+
with open(checkpoint_file, encoding="utf-8") as f:
|
|
302
|
+
data = json.load(f)
|
|
303
|
+
completed_at = datetime.fromisoformat(data["completed_at"])
|
|
304
|
+
|
|
305
|
+
if completed_at < cutoff_date:
|
|
306
|
+
checkpoint_file.unlink()
|
|
307
|
+
deleted_count += 1
|
|
308
|
+
except Exception as e:
|
|
309
|
+
logger.warning(
|
|
310
|
+
f"Failed to process checkpoint {checkpoint_file}: {e}",
|
|
311
|
+
exc_info=True,
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
return deleted_count
|