tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__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/service_discovery.py +534 -534
- 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/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 -227
- tapps_agents/cli/commands/tester.py +191 -191
- 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/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/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.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- 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/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/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- 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/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- 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/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_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/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 -148
- 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.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
tapps_agents/core/task_memory.py
CHANGED
|
@@ -1,582 +1,582 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Task Memory System for Knowledge Retention
|
|
3
|
-
|
|
4
|
-
Stores and retrieves task outcomes and learnings for future use.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import gzip
|
|
10
|
-
import json
|
|
11
|
-
import logging
|
|
12
|
-
from dataclasses import asdict, dataclass, field
|
|
13
|
-
from datetime import UTC, datetime
|
|
14
|
-
from enum import Enum
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import Any
|
|
17
|
-
|
|
18
|
-
from .hardware_profiler import HardwareProfile, HardwareProfiler
|
|
19
|
-
|
|
20
|
-
logger = logging.getLogger(__name__)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class TaskOutcome(Enum):
|
|
24
|
-
"""Task outcome types."""
|
|
25
|
-
|
|
26
|
-
SUCCESS = "success"
|
|
27
|
-
FAILURE = "failure"
|
|
28
|
-
PARTIAL = "partial"
|
|
29
|
-
CANCELLED = "cancelled"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@dataclass
|
|
33
|
-
class TaskMemory:
|
|
34
|
-
"""Memory of a completed task."""
|
|
35
|
-
|
|
36
|
-
task_id: str
|
|
37
|
-
agent_id: str
|
|
38
|
-
command: str
|
|
39
|
-
timestamp: datetime
|
|
40
|
-
outcome: TaskOutcome
|
|
41
|
-
quality_score: float # 0.0 to 1.0
|
|
42
|
-
key_learnings: list[str] = field(default_factory=list)
|
|
43
|
-
patterns_used: list[str] = field(default_factory=list)
|
|
44
|
-
similar_tasks: list[str] = field(default_factory=list) # Related task IDs
|
|
45
|
-
context: dict[str, Any] = field(default_factory=dict) # Task context
|
|
46
|
-
metadata: dict[str, Any] = field(default_factory=dict) # Additional metadata
|
|
47
|
-
|
|
48
|
-
def to_dict(self) -> dict[str, Any]:
|
|
49
|
-
"""Convert to dictionary for serialization."""
|
|
50
|
-
data = asdict(self)
|
|
51
|
-
data["timestamp"] = self.timestamp.isoformat()
|
|
52
|
-
data["outcome"] = self.outcome.value
|
|
53
|
-
return data
|
|
54
|
-
|
|
55
|
-
@classmethod
|
|
56
|
-
def from_dict(cls, data: dict[str, Any]) -> TaskMemory:
|
|
57
|
-
"""Create from dictionary."""
|
|
58
|
-
data = data.copy()
|
|
59
|
-
data["timestamp"] = datetime.fromisoformat(data["timestamp"])
|
|
60
|
-
data["outcome"] = TaskOutcome(data["outcome"])
|
|
61
|
-
return cls(**data)
|
|
62
|
-
|
|
63
|
-
def get_relevance_score(self, query: str, command: str | None = None) -> float:
|
|
64
|
-
"""
|
|
65
|
-
Calculate relevance score for a query.
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
query: Query string
|
|
69
|
-
command: Optional command to match
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
Relevance score (0.0 to 1.0)
|
|
73
|
-
"""
|
|
74
|
-
score = 0.0
|
|
75
|
-
query_lower = query.lower()
|
|
76
|
-
|
|
77
|
-
# Command match (high weight)
|
|
78
|
-
if command and command.lower() in self.command.lower():
|
|
79
|
-
score += 0.4
|
|
80
|
-
|
|
81
|
-
# Key learnings match
|
|
82
|
-
for learning in self.key_learnings:
|
|
83
|
-
if query_lower in learning.lower():
|
|
84
|
-
score += 0.2
|
|
85
|
-
break
|
|
86
|
-
|
|
87
|
-
# Patterns match
|
|
88
|
-
for pattern in self.patterns_used:
|
|
89
|
-
if query_lower in pattern.lower():
|
|
90
|
-
score += 0.2
|
|
91
|
-
break
|
|
92
|
-
|
|
93
|
-
# Context match
|
|
94
|
-
context_str = json.dumps(self.context, default=str).lower()
|
|
95
|
-
if query_lower in context_str:
|
|
96
|
-
score += 0.1
|
|
97
|
-
|
|
98
|
-
# Quality score boost
|
|
99
|
-
score += self.quality_score * 0.1
|
|
100
|
-
|
|
101
|
-
return min(score, 1.0)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
class MemoryIndex:
|
|
105
|
-
"""Indexes memories for fast retrieval."""
|
|
106
|
-
|
|
107
|
-
def __init__(self):
|
|
108
|
-
"""Initialize memory index."""
|
|
109
|
-
self.by_agent: dict[str, list[TaskMemory]] = {}
|
|
110
|
-
self.by_command: dict[str, list[TaskMemory]] = {}
|
|
111
|
-
self.by_outcome: dict[TaskOutcome, list[TaskMemory]] = {}
|
|
112
|
-
self.by_pattern: dict[str, list[TaskMemory]] = {}
|
|
113
|
-
self.all_memories: list[TaskMemory] = []
|
|
114
|
-
|
|
115
|
-
def add_memory(self, memory: TaskMemory):
|
|
116
|
-
"""Add memory to index."""
|
|
117
|
-
self.all_memories.append(memory)
|
|
118
|
-
|
|
119
|
-
# Index by agent
|
|
120
|
-
if memory.agent_id not in self.by_agent:
|
|
121
|
-
self.by_agent[memory.agent_id] = []
|
|
122
|
-
self.by_agent[memory.agent_id].append(memory)
|
|
123
|
-
|
|
124
|
-
# Index by command
|
|
125
|
-
if memory.command not in self.by_command:
|
|
126
|
-
self.by_command[memory.command] = []
|
|
127
|
-
self.by_command[memory.command].append(memory)
|
|
128
|
-
|
|
129
|
-
# Index by outcome
|
|
130
|
-
if memory.outcome not in self.by_outcome:
|
|
131
|
-
self.by_outcome[memory.outcome] = []
|
|
132
|
-
self.by_outcome[memory.outcome].append(memory)
|
|
133
|
-
|
|
134
|
-
# Index by patterns
|
|
135
|
-
for pattern in memory.patterns_used:
|
|
136
|
-
if pattern not in self.by_pattern:
|
|
137
|
-
self.by_pattern[pattern] = []
|
|
138
|
-
self.by_pattern[pattern].append(memory)
|
|
139
|
-
|
|
140
|
-
def search(
|
|
141
|
-
self,
|
|
142
|
-
query: str | None = None,
|
|
143
|
-
agent_id: str | None = None,
|
|
144
|
-
command: str | None = None,
|
|
145
|
-
outcome: TaskOutcome | None = None,
|
|
146
|
-
min_quality: float = 0.0,
|
|
147
|
-
limit: int = 10,
|
|
148
|
-
) -> list[TaskMemory]:
|
|
149
|
-
"""
|
|
150
|
-
Search memories with filters.
|
|
151
|
-
|
|
152
|
-
Args:
|
|
153
|
-
query: Optional query string
|
|
154
|
-
agent_id: Optional agent filter
|
|
155
|
-
command: Optional command filter
|
|
156
|
-
outcome: Optional outcome filter
|
|
157
|
-
min_quality: Minimum quality score
|
|
158
|
-
limit: Maximum results
|
|
159
|
-
|
|
160
|
-
Returns:
|
|
161
|
-
List of matching memories, sorted by relevance
|
|
162
|
-
"""
|
|
163
|
-
candidates = self.all_memories.copy()
|
|
164
|
-
|
|
165
|
-
# Filter by agent
|
|
166
|
-
if agent_id:
|
|
167
|
-
candidates = [m for m in candidates if m.agent_id == agent_id]
|
|
168
|
-
|
|
169
|
-
# Filter by command
|
|
170
|
-
if command:
|
|
171
|
-
candidates = [m for m in candidates if command.lower() in m.command.lower()]
|
|
172
|
-
|
|
173
|
-
# Filter by outcome
|
|
174
|
-
if outcome:
|
|
175
|
-
candidates = [m for m in candidates if m.outcome == outcome]
|
|
176
|
-
|
|
177
|
-
# Filter by quality
|
|
178
|
-
candidates = [m for m in candidates if m.quality_score >= min_quality]
|
|
179
|
-
|
|
180
|
-
# Score and sort
|
|
181
|
-
if query:
|
|
182
|
-
scored = [(m, m.get_relevance_score(query, command)) for m in candidates]
|
|
183
|
-
scored.sort(key=lambda x: x[1], reverse=True)
|
|
184
|
-
candidates = [m for m, score in scored if score > 0]
|
|
185
|
-
|
|
186
|
-
# Sort by quality and timestamp
|
|
187
|
-
candidates.sort(key=lambda m: (m.quality_score, m.timestamp), reverse=True)
|
|
188
|
-
|
|
189
|
-
return candidates[:limit]
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
class MemoryCompressor:
|
|
193
|
-
"""Compresses memories for NUC devices."""
|
|
194
|
-
|
|
195
|
-
@staticmethod
|
|
196
|
-
def compress_memory(memory: TaskMemory) -> TaskMemory:
|
|
197
|
-
"""
|
|
198
|
-
Compress memory by removing non-essential data.
|
|
199
|
-
|
|
200
|
-
Args:
|
|
201
|
-
memory: Memory to compress
|
|
202
|
-
|
|
203
|
-
Returns:
|
|
204
|
-
Compressed memory
|
|
205
|
-
"""
|
|
206
|
-
# Keep only essential learnings (first 3)
|
|
207
|
-
compressed_learnings = memory.key_learnings[:3]
|
|
208
|
-
|
|
209
|
-
# Keep only essential patterns (first 2)
|
|
210
|
-
compressed_patterns = memory.patterns_used[:2]
|
|
211
|
-
|
|
212
|
-
# Remove detailed context, keep only summary
|
|
213
|
-
compressed_context = {
|
|
214
|
-
"summary": memory.context.get("summary", ""),
|
|
215
|
-
"domain": memory.context.get("domain", ""),
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return TaskMemory(
|
|
219
|
-
task_id=memory.task_id,
|
|
220
|
-
agent_id=memory.agent_id,
|
|
221
|
-
command=memory.command,
|
|
222
|
-
timestamp=memory.timestamp,
|
|
223
|
-
outcome=memory.outcome,
|
|
224
|
-
quality_score=memory.quality_score,
|
|
225
|
-
key_learnings=compressed_learnings,
|
|
226
|
-
patterns_used=compressed_patterns,
|
|
227
|
-
similar_tasks=memory.similar_tasks[:5], # Limit to 5
|
|
228
|
-
context=compressed_context,
|
|
229
|
-
metadata={}, # Remove metadata
|
|
230
|
-
)
|
|
231
|
-
|
|
232
|
-
@staticmethod
|
|
233
|
-
def should_compress(hardware_profile: HardwareProfile) -> bool:
|
|
234
|
-
"""Compression disabled (hardware taxonomy removed)."""
|
|
235
|
-
return False
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
class MemoryStorage:
|
|
239
|
-
"""Handles memory persistence."""
|
|
240
|
-
|
|
241
|
-
def __init__(
|
|
242
|
-
self, storage_dir: Path, hardware_profile: HardwareProfile | None = None
|
|
243
|
-
):
|
|
244
|
-
"""
|
|
245
|
-
Initialize memory storage.
|
|
246
|
-
|
|
247
|
-
Args:
|
|
248
|
-
storage_dir: Directory to store memories
|
|
249
|
-
hardware_profile: Hardware profile for optimization
|
|
250
|
-
"""
|
|
251
|
-
self.storage_dir = Path(storage_dir)
|
|
252
|
-
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
|
253
|
-
|
|
254
|
-
# Detect hardware profile if not provided
|
|
255
|
-
if hardware_profile is None:
|
|
256
|
-
profiler = HardwareProfiler()
|
|
257
|
-
hardware_profile = profiler.detect_profile()
|
|
258
|
-
|
|
259
|
-
self.hardware_profile = hardware_profile
|
|
260
|
-
self.compression_enabled = MemoryCompressor.should_compress(hardware_profile)
|
|
261
|
-
self.memories_file = self.storage_dir / "memories.json"
|
|
262
|
-
if self.compression_enabled:
|
|
263
|
-
self.memories_file = self.storage_dir / "memories.json.gz"
|
|
264
|
-
|
|
265
|
-
def save_memory(self, memory: TaskMemory) -> bool:
|
|
266
|
-
"""
|
|
267
|
-
Save memory to disk.
|
|
268
|
-
|
|
269
|
-
Args:
|
|
270
|
-
memory: Memory to save
|
|
271
|
-
|
|
272
|
-
Returns:
|
|
273
|
-
True if successful
|
|
274
|
-
"""
|
|
275
|
-
try:
|
|
276
|
-
# Load existing memories
|
|
277
|
-
memories = self.load_all_memories()
|
|
278
|
-
|
|
279
|
-
# Add or update memory
|
|
280
|
-
existing_index = None
|
|
281
|
-
for i, m in enumerate(memories):
|
|
282
|
-
if m.task_id == memory.task_id:
|
|
283
|
-
existing_index = i
|
|
284
|
-
break
|
|
285
|
-
|
|
286
|
-
if existing_index is not None:
|
|
287
|
-
memories[existing_index] = memory
|
|
288
|
-
else:
|
|
289
|
-
memories.append(memory)
|
|
290
|
-
|
|
291
|
-
# Compress if needed
|
|
292
|
-
if self.compression_enabled:
|
|
293
|
-
memories = [MemoryCompressor.compress_memory(m) for m in memories]
|
|
294
|
-
|
|
295
|
-
# Save to file
|
|
296
|
-
data = [m.to_dict() for m in memories]
|
|
297
|
-
json_str = json.dumps(data, indent=2, default=str)
|
|
298
|
-
|
|
299
|
-
if self.compression_enabled:
|
|
300
|
-
with gzip.open(self.memories_file, "wt", encoding="utf-8") as f:
|
|
301
|
-
f.write(json_str)
|
|
302
|
-
else:
|
|
303
|
-
with open(self.memories_file, "w", encoding="utf-8") as f:
|
|
304
|
-
f.write(json_str)
|
|
305
|
-
|
|
306
|
-
logger.info(f"Saved memory for task {memory.task_id}")
|
|
307
|
-
return True
|
|
308
|
-
except Exception as e:
|
|
309
|
-
logger.error(f"Failed to save memory for task {memory.task_id}: {e}")
|
|
310
|
-
return False
|
|
311
|
-
|
|
312
|
-
def load_all_memories(self) -> list[TaskMemory]:
|
|
313
|
-
"""
|
|
314
|
-
Load all memories from disk.
|
|
315
|
-
|
|
316
|
-
Returns:
|
|
317
|
-
List of all memories
|
|
318
|
-
"""
|
|
319
|
-
if not self.memories_file.exists():
|
|
320
|
-
return []
|
|
321
|
-
|
|
322
|
-
try:
|
|
323
|
-
if self.compression_enabled:
|
|
324
|
-
with gzip.open(self.memories_file, "rt", encoding="utf-8") as f:
|
|
325
|
-
data = json.load(f)
|
|
326
|
-
else:
|
|
327
|
-
with open(self.memories_file, encoding="utf-8") as f:
|
|
328
|
-
data = json.load(f)
|
|
329
|
-
|
|
330
|
-
return [TaskMemory.from_dict(m) for m in data]
|
|
331
|
-
except Exception as e:
|
|
332
|
-
logger.error(f"Failed to load memories: {e}")
|
|
333
|
-
return []
|
|
334
|
-
|
|
335
|
-
def get_memory(self, task_id: str) -> TaskMemory | None:
|
|
336
|
-
"""
|
|
337
|
-
Get memory for a specific task.
|
|
338
|
-
|
|
339
|
-
Args:
|
|
340
|
-
task_id: Task identifier
|
|
341
|
-
|
|
342
|
-
Returns:
|
|
343
|
-
TaskMemory if found, None otherwise
|
|
344
|
-
"""
|
|
345
|
-
memories = self.load_all_memories()
|
|
346
|
-
for memory in memories:
|
|
347
|
-
if memory.task_id == task_id:
|
|
348
|
-
return memory
|
|
349
|
-
return None
|
|
350
|
-
|
|
351
|
-
def delete_memory(self, task_id: str) -> bool:
|
|
352
|
-
"""
|
|
353
|
-
Delete memory for a task.
|
|
354
|
-
|
|
355
|
-
Args:
|
|
356
|
-
task_id: Task identifier
|
|
357
|
-
|
|
358
|
-
Returns:
|
|
359
|
-
True if deleted, False if not found
|
|
360
|
-
"""
|
|
361
|
-
memories = self.load_all_memories()
|
|
362
|
-
original_count = len(memories)
|
|
363
|
-
memories = [m for m in memories if m.task_id != task_id]
|
|
364
|
-
|
|
365
|
-
if len(memories) == original_count:
|
|
366
|
-
return False
|
|
367
|
-
|
|
368
|
-
# Save updated list
|
|
369
|
-
data = [m.to_dict() for m in memories]
|
|
370
|
-
json_str = json.dumps(data, indent=2, default=str)
|
|
371
|
-
|
|
372
|
-
try:
|
|
373
|
-
if self.compression_enabled:
|
|
374
|
-
with gzip.open(self.memories_file, "wt", encoding="utf-8") as f:
|
|
375
|
-
f.write(json_str)
|
|
376
|
-
else:
|
|
377
|
-
with open(self.memories_file, "w", encoding="utf-8") as f:
|
|
378
|
-
f.write(json_str)
|
|
379
|
-
|
|
380
|
-
logger.info(f"Deleted memory for task {task_id}")
|
|
381
|
-
return True
|
|
382
|
-
except Exception as e:
|
|
383
|
-
logger.error(f"Failed to delete memory for task {task_id}: {e}")
|
|
384
|
-
return False
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
class MemoryRetriever:
|
|
388
|
-
"""Retrieves relevant memories for tasks."""
|
|
389
|
-
|
|
390
|
-
def __init__(self, storage: MemoryStorage):
|
|
391
|
-
"""
|
|
392
|
-
Initialize memory retriever.
|
|
393
|
-
|
|
394
|
-
Args:
|
|
395
|
-
storage: Memory storage instance
|
|
396
|
-
"""
|
|
397
|
-
self.storage = storage
|
|
398
|
-
self.index = MemoryIndex()
|
|
399
|
-
self._rebuild_index()
|
|
400
|
-
|
|
401
|
-
def _rebuild_index(self):
|
|
402
|
-
"""Rebuild memory index from storage."""
|
|
403
|
-
memories = self.storage.load_all_memories()
|
|
404
|
-
self.index = MemoryIndex()
|
|
405
|
-
for memory in memories:
|
|
406
|
-
self.index.add_memory(memory)
|
|
407
|
-
|
|
408
|
-
def retrieve_relevant(
|
|
409
|
-
self,
|
|
410
|
-
query: str,
|
|
411
|
-
agent_id: str | None = None,
|
|
412
|
-
command: str | None = None,
|
|
413
|
-
limit: int = 5,
|
|
414
|
-
) -> list[TaskMemory]:
|
|
415
|
-
"""
|
|
416
|
-
Retrieve relevant memories for a query.
|
|
417
|
-
|
|
418
|
-
Args:
|
|
419
|
-
query: Query string
|
|
420
|
-
agent_id: Optional agent filter
|
|
421
|
-
command: Optional command filter
|
|
422
|
-
limit: Maximum results
|
|
423
|
-
|
|
424
|
-
Returns:
|
|
425
|
-
List of relevant memories
|
|
426
|
-
"""
|
|
427
|
-
# Rebuild index to ensure it's up to date
|
|
428
|
-
self._rebuild_index()
|
|
429
|
-
|
|
430
|
-
return self.index.search(
|
|
431
|
-
query=query,
|
|
432
|
-
agent_id=agent_id,
|
|
433
|
-
command=command,
|
|
434
|
-
min_quality=0.3, # Minimum quality threshold
|
|
435
|
-
limit=limit,
|
|
436
|
-
)
|
|
437
|
-
|
|
438
|
-
def get_similar_tasks(self, task_id: str, limit: int = 5) -> list[TaskMemory]:
|
|
439
|
-
"""
|
|
440
|
-
Get tasks similar to a given task.
|
|
441
|
-
|
|
442
|
-
Args:
|
|
443
|
-
task_id: Task identifier
|
|
444
|
-
limit: Maximum results
|
|
445
|
-
|
|
446
|
-
Returns:
|
|
447
|
-
List of similar task memories
|
|
448
|
-
"""
|
|
449
|
-
memory = self.storage.get_memory(task_id)
|
|
450
|
-
if not memory:
|
|
451
|
-
return []
|
|
452
|
-
|
|
453
|
-
# Use similar_tasks list if available
|
|
454
|
-
if memory.similar_tasks:
|
|
455
|
-
similar = []
|
|
456
|
-
for similar_id in memory.similar_tasks[:limit]:
|
|
457
|
-
similar_memory = self.storage.get_memory(similar_id)
|
|
458
|
-
if similar_memory:
|
|
459
|
-
similar.append(similar_memory)
|
|
460
|
-
return similar
|
|
461
|
-
|
|
462
|
-
# Otherwise, search by patterns and command
|
|
463
|
-
self._rebuild_index()
|
|
464
|
-
return self.index.search(
|
|
465
|
-
command=memory.command, agent_id=memory.agent_id, limit=limit
|
|
466
|
-
)
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
class TaskMemorySystem:
|
|
470
|
-
"""Main task memory system."""
|
|
471
|
-
|
|
472
|
-
def __init__(
|
|
473
|
-
self,
|
|
474
|
-
storage_dir: Path | None = None,
|
|
475
|
-
hardware_profile: HardwareProfile | None = None,
|
|
476
|
-
):
|
|
477
|
-
"""
|
|
478
|
-
Initialize task memory system.
|
|
479
|
-
|
|
480
|
-
Args:
|
|
481
|
-
storage_dir: Directory for memory storage (default: .tapps-agents/memory)
|
|
482
|
-
hardware_profile: Hardware profile (auto-detected if None)
|
|
483
|
-
"""
|
|
484
|
-
if storage_dir is None:
|
|
485
|
-
storage_dir = Path(".tapps-agents/memory")
|
|
486
|
-
|
|
487
|
-
self.storage = MemoryStorage(storage_dir, hardware_profile)
|
|
488
|
-
self.retriever = MemoryRetriever(self.storage)
|
|
489
|
-
self.hardware_profile = hardware_profile or HardwareProfiler().detect_profile()
|
|
490
|
-
|
|
491
|
-
def store_memory(
|
|
492
|
-
self,
|
|
493
|
-
task_id: str,
|
|
494
|
-
agent_id: str,
|
|
495
|
-
command: str,
|
|
496
|
-
outcome: TaskOutcome,
|
|
497
|
-
quality_score: float,
|
|
498
|
-
key_learnings: list[str] | None = None,
|
|
499
|
-
patterns_used: list[str] | None = None,
|
|
500
|
-
similar_tasks: list[str] | None = None,
|
|
501
|
-
context: dict[str, Any] | None = None,
|
|
502
|
-
metadata: dict[str, Any] | None = None,
|
|
503
|
-
) -> bool:
|
|
504
|
-
"""
|
|
505
|
-
Store a task memory.
|
|
506
|
-
|
|
507
|
-
Args:
|
|
508
|
-
task_id: Task identifier
|
|
509
|
-
agent_id: Agent identifier
|
|
510
|
-
command: Command executed
|
|
511
|
-
outcome: Task outcome
|
|
512
|
-
quality_score: Quality score (0.0 to 1.0)
|
|
513
|
-
key_learnings: Optional key learnings
|
|
514
|
-
patterns_used: Optional patterns used
|
|
515
|
-
similar_tasks: Optional similar task IDs
|
|
516
|
-
context: Optional task context
|
|
517
|
-
metadata: Optional metadata
|
|
518
|
-
|
|
519
|
-
Returns:
|
|
520
|
-
True if successful
|
|
521
|
-
"""
|
|
522
|
-
memory = TaskMemory(
|
|
523
|
-
task_id=task_id,
|
|
524
|
-
agent_id=agent_id,
|
|
525
|
-
command=command,
|
|
526
|
-
timestamp=datetime.now(UTC),
|
|
527
|
-
outcome=outcome,
|
|
528
|
-
quality_score=quality_score,
|
|
529
|
-
key_learnings=key_learnings or [],
|
|
530
|
-
patterns_used=patterns_used or [],
|
|
531
|
-
similar_tasks=similar_tasks or [],
|
|
532
|
-
context=context or {},
|
|
533
|
-
metadata=metadata or {},
|
|
534
|
-
)
|
|
535
|
-
|
|
536
|
-
return self.storage.save_memory(memory)
|
|
537
|
-
|
|
538
|
-
def retrieve_memories(
|
|
539
|
-
self,
|
|
540
|
-
query: str,
|
|
541
|
-
agent_id: str | None = None,
|
|
542
|
-
command: str | None = None,
|
|
543
|
-
limit: int = 5,
|
|
544
|
-
) -> list[TaskMemory]:
|
|
545
|
-
"""
|
|
546
|
-
Retrieve relevant memories.
|
|
547
|
-
|
|
548
|
-
Args:
|
|
549
|
-
query: Query string
|
|
550
|
-
agent_id: Optional agent filter
|
|
551
|
-
command: Optional command filter
|
|
552
|
-
limit: Maximum results
|
|
553
|
-
|
|
554
|
-
Returns:
|
|
555
|
-
List of relevant memories
|
|
556
|
-
"""
|
|
557
|
-
return self.retriever.retrieve_relevant(query, agent_id, command, limit)
|
|
558
|
-
|
|
559
|
-
def get_memory(self, task_id: str) -> TaskMemory | None:
|
|
560
|
-
"""
|
|
561
|
-
Get memory for a specific task.
|
|
562
|
-
|
|
563
|
-
Args:
|
|
564
|
-
task_id: Task identifier
|
|
565
|
-
|
|
566
|
-
Returns:
|
|
567
|
-
TaskMemory if found, None otherwise
|
|
568
|
-
"""
|
|
569
|
-
return self.storage.get_memory(task_id)
|
|
570
|
-
|
|
571
|
-
def get_similar_tasks(self, task_id: str, limit: int = 5) -> list[TaskMemory]:
|
|
572
|
-
"""
|
|
573
|
-
Get similar tasks.
|
|
574
|
-
|
|
575
|
-
Args:
|
|
576
|
-
task_id: Task identifier
|
|
577
|
-
limit: Maximum results
|
|
578
|
-
|
|
579
|
-
Returns:
|
|
580
|
-
List of similar task memories
|
|
581
|
-
"""
|
|
582
|
-
return self.retriever.get_similar_tasks(task_id, limit)
|
|
1
|
+
"""
|
|
2
|
+
Task Memory System for Knowledge Retention
|
|
3
|
+
|
|
4
|
+
Stores and retrieves task outcomes and learnings for future use.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import gzip
|
|
10
|
+
import json
|
|
11
|
+
import logging
|
|
12
|
+
from dataclasses import asdict, dataclass, field
|
|
13
|
+
from datetime import UTC, datetime
|
|
14
|
+
from enum import Enum
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from .hardware_profiler import HardwareProfile, HardwareProfiler
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TaskOutcome(Enum):
|
|
24
|
+
"""Task outcome types."""
|
|
25
|
+
|
|
26
|
+
SUCCESS = "success"
|
|
27
|
+
FAILURE = "failure"
|
|
28
|
+
PARTIAL = "partial"
|
|
29
|
+
CANCELLED = "cancelled"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class TaskMemory:
|
|
34
|
+
"""Memory of a completed task."""
|
|
35
|
+
|
|
36
|
+
task_id: str
|
|
37
|
+
agent_id: str
|
|
38
|
+
command: str
|
|
39
|
+
timestamp: datetime
|
|
40
|
+
outcome: TaskOutcome
|
|
41
|
+
quality_score: float # 0.0 to 1.0
|
|
42
|
+
key_learnings: list[str] = field(default_factory=list)
|
|
43
|
+
patterns_used: list[str] = field(default_factory=list)
|
|
44
|
+
similar_tasks: list[str] = field(default_factory=list) # Related task IDs
|
|
45
|
+
context: dict[str, Any] = field(default_factory=dict) # Task context
|
|
46
|
+
metadata: dict[str, Any] = field(default_factory=dict) # Additional metadata
|
|
47
|
+
|
|
48
|
+
def to_dict(self) -> dict[str, Any]:
|
|
49
|
+
"""Convert to dictionary for serialization."""
|
|
50
|
+
data = asdict(self)
|
|
51
|
+
data["timestamp"] = self.timestamp.isoformat()
|
|
52
|
+
data["outcome"] = self.outcome.value
|
|
53
|
+
return data
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def from_dict(cls, data: dict[str, Any]) -> TaskMemory:
|
|
57
|
+
"""Create from dictionary."""
|
|
58
|
+
data = data.copy()
|
|
59
|
+
data["timestamp"] = datetime.fromisoformat(data["timestamp"])
|
|
60
|
+
data["outcome"] = TaskOutcome(data["outcome"])
|
|
61
|
+
return cls(**data)
|
|
62
|
+
|
|
63
|
+
def get_relevance_score(self, query: str, command: str | None = None) -> float:
|
|
64
|
+
"""
|
|
65
|
+
Calculate relevance score for a query.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
query: Query string
|
|
69
|
+
command: Optional command to match
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Relevance score (0.0 to 1.0)
|
|
73
|
+
"""
|
|
74
|
+
score = 0.0
|
|
75
|
+
query_lower = query.lower()
|
|
76
|
+
|
|
77
|
+
# Command match (high weight)
|
|
78
|
+
if command and command.lower() in self.command.lower():
|
|
79
|
+
score += 0.4
|
|
80
|
+
|
|
81
|
+
# Key learnings match
|
|
82
|
+
for learning in self.key_learnings:
|
|
83
|
+
if query_lower in learning.lower():
|
|
84
|
+
score += 0.2
|
|
85
|
+
break
|
|
86
|
+
|
|
87
|
+
# Patterns match
|
|
88
|
+
for pattern in self.patterns_used:
|
|
89
|
+
if query_lower in pattern.lower():
|
|
90
|
+
score += 0.2
|
|
91
|
+
break
|
|
92
|
+
|
|
93
|
+
# Context match
|
|
94
|
+
context_str = json.dumps(self.context, default=str).lower()
|
|
95
|
+
if query_lower in context_str:
|
|
96
|
+
score += 0.1
|
|
97
|
+
|
|
98
|
+
# Quality score boost
|
|
99
|
+
score += self.quality_score * 0.1
|
|
100
|
+
|
|
101
|
+
return min(score, 1.0)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class MemoryIndex:
|
|
105
|
+
"""Indexes memories for fast retrieval."""
|
|
106
|
+
|
|
107
|
+
def __init__(self):
|
|
108
|
+
"""Initialize memory index."""
|
|
109
|
+
self.by_agent: dict[str, list[TaskMemory]] = {}
|
|
110
|
+
self.by_command: dict[str, list[TaskMemory]] = {}
|
|
111
|
+
self.by_outcome: dict[TaskOutcome, list[TaskMemory]] = {}
|
|
112
|
+
self.by_pattern: dict[str, list[TaskMemory]] = {}
|
|
113
|
+
self.all_memories: list[TaskMemory] = []
|
|
114
|
+
|
|
115
|
+
def add_memory(self, memory: TaskMemory):
|
|
116
|
+
"""Add memory to index."""
|
|
117
|
+
self.all_memories.append(memory)
|
|
118
|
+
|
|
119
|
+
# Index by agent
|
|
120
|
+
if memory.agent_id not in self.by_agent:
|
|
121
|
+
self.by_agent[memory.agent_id] = []
|
|
122
|
+
self.by_agent[memory.agent_id].append(memory)
|
|
123
|
+
|
|
124
|
+
# Index by command
|
|
125
|
+
if memory.command not in self.by_command:
|
|
126
|
+
self.by_command[memory.command] = []
|
|
127
|
+
self.by_command[memory.command].append(memory)
|
|
128
|
+
|
|
129
|
+
# Index by outcome
|
|
130
|
+
if memory.outcome not in self.by_outcome:
|
|
131
|
+
self.by_outcome[memory.outcome] = []
|
|
132
|
+
self.by_outcome[memory.outcome].append(memory)
|
|
133
|
+
|
|
134
|
+
# Index by patterns
|
|
135
|
+
for pattern in memory.patterns_used:
|
|
136
|
+
if pattern not in self.by_pattern:
|
|
137
|
+
self.by_pattern[pattern] = []
|
|
138
|
+
self.by_pattern[pattern].append(memory)
|
|
139
|
+
|
|
140
|
+
def search(
|
|
141
|
+
self,
|
|
142
|
+
query: str | None = None,
|
|
143
|
+
agent_id: str | None = None,
|
|
144
|
+
command: str | None = None,
|
|
145
|
+
outcome: TaskOutcome | None = None,
|
|
146
|
+
min_quality: float = 0.0,
|
|
147
|
+
limit: int = 10,
|
|
148
|
+
) -> list[TaskMemory]:
|
|
149
|
+
"""
|
|
150
|
+
Search memories with filters.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
query: Optional query string
|
|
154
|
+
agent_id: Optional agent filter
|
|
155
|
+
command: Optional command filter
|
|
156
|
+
outcome: Optional outcome filter
|
|
157
|
+
min_quality: Minimum quality score
|
|
158
|
+
limit: Maximum results
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
List of matching memories, sorted by relevance
|
|
162
|
+
"""
|
|
163
|
+
candidates = self.all_memories.copy()
|
|
164
|
+
|
|
165
|
+
# Filter by agent
|
|
166
|
+
if agent_id:
|
|
167
|
+
candidates = [m for m in candidates if m.agent_id == agent_id]
|
|
168
|
+
|
|
169
|
+
# Filter by command
|
|
170
|
+
if command:
|
|
171
|
+
candidates = [m for m in candidates if command.lower() in m.command.lower()]
|
|
172
|
+
|
|
173
|
+
# Filter by outcome
|
|
174
|
+
if outcome:
|
|
175
|
+
candidates = [m for m in candidates if m.outcome == outcome]
|
|
176
|
+
|
|
177
|
+
# Filter by quality
|
|
178
|
+
candidates = [m for m in candidates if m.quality_score >= min_quality]
|
|
179
|
+
|
|
180
|
+
# Score and sort
|
|
181
|
+
if query:
|
|
182
|
+
scored = [(m, m.get_relevance_score(query, command)) for m in candidates]
|
|
183
|
+
scored.sort(key=lambda x: x[1], reverse=True)
|
|
184
|
+
candidates = [m for m, score in scored if score > 0]
|
|
185
|
+
|
|
186
|
+
# Sort by quality and timestamp
|
|
187
|
+
candidates.sort(key=lambda m: (m.quality_score, m.timestamp), reverse=True)
|
|
188
|
+
|
|
189
|
+
return candidates[:limit]
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class MemoryCompressor:
|
|
193
|
+
"""Compresses memories for NUC devices."""
|
|
194
|
+
|
|
195
|
+
@staticmethod
|
|
196
|
+
def compress_memory(memory: TaskMemory) -> TaskMemory:
|
|
197
|
+
"""
|
|
198
|
+
Compress memory by removing non-essential data.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
memory: Memory to compress
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
Compressed memory
|
|
205
|
+
"""
|
|
206
|
+
# Keep only essential learnings (first 3)
|
|
207
|
+
compressed_learnings = memory.key_learnings[:3]
|
|
208
|
+
|
|
209
|
+
# Keep only essential patterns (first 2)
|
|
210
|
+
compressed_patterns = memory.patterns_used[:2]
|
|
211
|
+
|
|
212
|
+
# Remove detailed context, keep only summary
|
|
213
|
+
compressed_context = {
|
|
214
|
+
"summary": memory.context.get("summary", ""),
|
|
215
|
+
"domain": memory.context.get("domain", ""),
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return TaskMemory(
|
|
219
|
+
task_id=memory.task_id,
|
|
220
|
+
agent_id=memory.agent_id,
|
|
221
|
+
command=memory.command,
|
|
222
|
+
timestamp=memory.timestamp,
|
|
223
|
+
outcome=memory.outcome,
|
|
224
|
+
quality_score=memory.quality_score,
|
|
225
|
+
key_learnings=compressed_learnings,
|
|
226
|
+
patterns_used=compressed_patterns,
|
|
227
|
+
similar_tasks=memory.similar_tasks[:5], # Limit to 5
|
|
228
|
+
context=compressed_context,
|
|
229
|
+
metadata={}, # Remove metadata
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
@staticmethod
|
|
233
|
+
def should_compress(hardware_profile: HardwareProfile) -> bool:
|
|
234
|
+
"""Compression disabled (hardware taxonomy removed)."""
|
|
235
|
+
return False
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class MemoryStorage:
|
|
239
|
+
"""Handles memory persistence."""
|
|
240
|
+
|
|
241
|
+
def __init__(
|
|
242
|
+
self, storage_dir: Path, hardware_profile: HardwareProfile | None = None
|
|
243
|
+
):
|
|
244
|
+
"""
|
|
245
|
+
Initialize memory storage.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
storage_dir: Directory to store memories
|
|
249
|
+
hardware_profile: Hardware profile for optimization
|
|
250
|
+
"""
|
|
251
|
+
self.storage_dir = Path(storage_dir)
|
|
252
|
+
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
|
253
|
+
|
|
254
|
+
# Detect hardware profile if not provided
|
|
255
|
+
if hardware_profile is None:
|
|
256
|
+
profiler = HardwareProfiler()
|
|
257
|
+
hardware_profile = profiler.detect_profile()
|
|
258
|
+
|
|
259
|
+
self.hardware_profile = hardware_profile
|
|
260
|
+
self.compression_enabled = MemoryCompressor.should_compress(hardware_profile)
|
|
261
|
+
self.memories_file = self.storage_dir / "memories.json"
|
|
262
|
+
if self.compression_enabled:
|
|
263
|
+
self.memories_file = self.storage_dir / "memories.json.gz"
|
|
264
|
+
|
|
265
|
+
def save_memory(self, memory: TaskMemory) -> bool:
|
|
266
|
+
"""
|
|
267
|
+
Save memory to disk.
|
|
268
|
+
|
|
269
|
+
Args:
|
|
270
|
+
memory: Memory to save
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
True if successful
|
|
274
|
+
"""
|
|
275
|
+
try:
|
|
276
|
+
# Load existing memories
|
|
277
|
+
memories = self.load_all_memories()
|
|
278
|
+
|
|
279
|
+
# Add or update memory
|
|
280
|
+
existing_index = None
|
|
281
|
+
for i, m in enumerate(memories):
|
|
282
|
+
if m.task_id == memory.task_id:
|
|
283
|
+
existing_index = i
|
|
284
|
+
break
|
|
285
|
+
|
|
286
|
+
if existing_index is not None:
|
|
287
|
+
memories[existing_index] = memory
|
|
288
|
+
else:
|
|
289
|
+
memories.append(memory)
|
|
290
|
+
|
|
291
|
+
# Compress if needed
|
|
292
|
+
if self.compression_enabled:
|
|
293
|
+
memories = [MemoryCompressor.compress_memory(m) for m in memories]
|
|
294
|
+
|
|
295
|
+
# Save to file
|
|
296
|
+
data = [m.to_dict() for m in memories]
|
|
297
|
+
json_str = json.dumps(data, indent=2, default=str)
|
|
298
|
+
|
|
299
|
+
if self.compression_enabled:
|
|
300
|
+
with gzip.open(self.memories_file, "wt", encoding="utf-8") as f:
|
|
301
|
+
f.write(json_str)
|
|
302
|
+
else:
|
|
303
|
+
with open(self.memories_file, "w", encoding="utf-8") as f:
|
|
304
|
+
f.write(json_str)
|
|
305
|
+
|
|
306
|
+
logger.info(f"Saved memory for task {memory.task_id}")
|
|
307
|
+
return True
|
|
308
|
+
except Exception as e:
|
|
309
|
+
logger.error(f"Failed to save memory for task {memory.task_id}: {e}")
|
|
310
|
+
return False
|
|
311
|
+
|
|
312
|
+
def load_all_memories(self) -> list[TaskMemory]:
|
|
313
|
+
"""
|
|
314
|
+
Load all memories from disk.
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
List of all memories
|
|
318
|
+
"""
|
|
319
|
+
if not self.memories_file.exists():
|
|
320
|
+
return []
|
|
321
|
+
|
|
322
|
+
try:
|
|
323
|
+
if self.compression_enabled:
|
|
324
|
+
with gzip.open(self.memories_file, "rt", encoding="utf-8") as f:
|
|
325
|
+
data = json.load(f)
|
|
326
|
+
else:
|
|
327
|
+
with open(self.memories_file, encoding="utf-8") as f:
|
|
328
|
+
data = json.load(f)
|
|
329
|
+
|
|
330
|
+
return [TaskMemory.from_dict(m) for m in data]
|
|
331
|
+
except Exception as e:
|
|
332
|
+
logger.error(f"Failed to load memories: {e}")
|
|
333
|
+
return []
|
|
334
|
+
|
|
335
|
+
def get_memory(self, task_id: str) -> TaskMemory | None:
|
|
336
|
+
"""
|
|
337
|
+
Get memory for a specific task.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
task_id: Task identifier
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
TaskMemory if found, None otherwise
|
|
344
|
+
"""
|
|
345
|
+
memories = self.load_all_memories()
|
|
346
|
+
for memory in memories:
|
|
347
|
+
if memory.task_id == task_id:
|
|
348
|
+
return memory
|
|
349
|
+
return None
|
|
350
|
+
|
|
351
|
+
def delete_memory(self, task_id: str) -> bool:
|
|
352
|
+
"""
|
|
353
|
+
Delete memory for a task.
|
|
354
|
+
|
|
355
|
+
Args:
|
|
356
|
+
task_id: Task identifier
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
True if deleted, False if not found
|
|
360
|
+
"""
|
|
361
|
+
memories = self.load_all_memories()
|
|
362
|
+
original_count = len(memories)
|
|
363
|
+
memories = [m for m in memories if m.task_id != task_id]
|
|
364
|
+
|
|
365
|
+
if len(memories) == original_count:
|
|
366
|
+
return False
|
|
367
|
+
|
|
368
|
+
# Save updated list
|
|
369
|
+
data = [m.to_dict() for m in memories]
|
|
370
|
+
json_str = json.dumps(data, indent=2, default=str)
|
|
371
|
+
|
|
372
|
+
try:
|
|
373
|
+
if self.compression_enabled:
|
|
374
|
+
with gzip.open(self.memories_file, "wt", encoding="utf-8") as f:
|
|
375
|
+
f.write(json_str)
|
|
376
|
+
else:
|
|
377
|
+
with open(self.memories_file, "w", encoding="utf-8") as f:
|
|
378
|
+
f.write(json_str)
|
|
379
|
+
|
|
380
|
+
logger.info(f"Deleted memory for task {task_id}")
|
|
381
|
+
return True
|
|
382
|
+
except Exception as e:
|
|
383
|
+
logger.error(f"Failed to delete memory for task {task_id}: {e}")
|
|
384
|
+
return False
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
class MemoryRetriever:
|
|
388
|
+
"""Retrieves relevant memories for tasks."""
|
|
389
|
+
|
|
390
|
+
def __init__(self, storage: MemoryStorage):
|
|
391
|
+
"""
|
|
392
|
+
Initialize memory retriever.
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
storage: Memory storage instance
|
|
396
|
+
"""
|
|
397
|
+
self.storage = storage
|
|
398
|
+
self.index = MemoryIndex()
|
|
399
|
+
self._rebuild_index()
|
|
400
|
+
|
|
401
|
+
def _rebuild_index(self):
|
|
402
|
+
"""Rebuild memory index from storage."""
|
|
403
|
+
memories = self.storage.load_all_memories()
|
|
404
|
+
self.index = MemoryIndex()
|
|
405
|
+
for memory in memories:
|
|
406
|
+
self.index.add_memory(memory)
|
|
407
|
+
|
|
408
|
+
def retrieve_relevant(
|
|
409
|
+
self,
|
|
410
|
+
query: str,
|
|
411
|
+
agent_id: str | None = None,
|
|
412
|
+
command: str | None = None,
|
|
413
|
+
limit: int = 5,
|
|
414
|
+
) -> list[TaskMemory]:
|
|
415
|
+
"""
|
|
416
|
+
Retrieve relevant memories for a query.
|
|
417
|
+
|
|
418
|
+
Args:
|
|
419
|
+
query: Query string
|
|
420
|
+
agent_id: Optional agent filter
|
|
421
|
+
command: Optional command filter
|
|
422
|
+
limit: Maximum results
|
|
423
|
+
|
|
424
|
+
Returns:
|
|
425
|
+
List of relevant memories
|
|
426
|
+
"""
|
|
427
|
+
# Rebuild index to ensure it's up to date
|
|
428
|
+
self._rebuild_index()
|
|
429
|
+
|
|
430
|
+
return self.index.search(
|
|
431
|
+
query=query,
|
|
432
|
+
agent_id=agent_id,
|
|
433
|
+
command=command,
|
|
434
|
+
min_quality=0.3, # Minimum quality threshold
|
|
435
|
+
limit=limit,
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
def get_similar_tasks(self, task_id: str, limit: int = 5) -> list[TaskMemory]:
|
|
439
|
+
"""
|
|
440
|
+
Get tasks similar to a given task.
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
task_id: Task identifier
|
|
444
|
+
limit: Maximum results
|
|
445
|
+
|
|
446
|
+
Returns:
|
|
447
|
+
List of similar task memories
|
|
448
|
+
"""
|
|
449
|
+
memory = self.storage.get_memory(task_id)
|
|
450
|
+
if not memory:
|
|
451
|
+
return []
|
|
452
|
+
|
|
453
|
+
# Use similar_tasks list if available
|
|
454
|
+
if memory.similar_tasks:
|
|
455
|
+
similar = []
|
|
456
|
+
for similar_id in memory.similar_tasks[:limit]:
|
|
457
|
+
similar_memory = self.storage.get_memory(similar_id)
|
|
458
|
+
if similar_memory:
|
|
459
|
+
similar.append(similar_memory)
|
|
460
|
+
return similar
|
|
461
|
+
|
|
462
|
+
# Otherwise, search by patterns and command
|
|
463
|
+
self._rebuild_index()
|
|
464
|
+
return self.index.search(
|
|
465
|
+
command=memory.command, agent_id=memory.agent_id, limit=limit
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
class TaskMemorySystem:
|
|
470
|
+
"""Main task memory system."""
|
|
471
|
+
|
|
472
|
+
def __init__(
|
|
473
|
+
self,
|
|
474
|
+
storage_dir: Path | None = None,
|
|
475
|
+
hardware_profile: HardwareProfile | None = None,
|
|
476
|
+
):
|
|
477
|
+
"""
|
|
478
|
+
Initialize task memory system.
|
|
479
|
+
|
|
480
|
+
Args:
|
|
481
|
+
storage_dir: Directory for memory storage (default: .tapps-agents/memory)
|
|
482
|
+
hardware_profile: Hardware profile (auto-detected if None)
|
|
483
|
+
"""
|
|
484
|
+
if storage_dir is None:
|
|
485
|
+
storage_dir = Path(".tapps-agents/memory")
|
|
486
|
+
|
|
487
|
+
self.storage = MemoryStorage(storage_dir, hardware_profile)
|
|
488
|
+
self.retriever = MemoryRetriever(self.storage)
|
|
489
|
+
self.hardware_profile = hardware_profile or HardwareProfiler().detect_profile()
|
|
490
|
+
|
|
491
|
+
def store_memory(
|
|
492
|
+
self,
|
|
493
|
+
task_id: str,
|
|
494
|
+
agent_id: str,
|
|
495
|
+
command: str,
|
|
496
|
+
outcome: TaskOutcome,
|
|
497
|
+
quality_score: float,
|
|
498
|
+
key_learnings: list[str] | None = None,
|
|
499
|
+
patterns_used: list[str] | None = None,
|
|
500
|
+
similar_tasks: list[str] | None = None,
|
|
501
|
+
context: dict[str, Any] | None = None,
|
|
502
|
+
metadata: dict[str, Any] | None = None,
|
|
503
|
+
) -> bool:
|
|
504
|
+
"""
|
|
505
|
+
Store a task memory.
|
|
506
|
+
|
|
507
|
+
Args:
|
|
508
|
+
task_id: Task identifier
|
|
509
|
+
agent_id: Agent identifier
|
|
510
|
+
command: Command executed
|
|
511
|
+
outcome: Task outcome
|
|
512
|
+
quality_score: Quality score (0.0 to 1.0)
|
|
513
|
+
key_learnings: Optional key learnings
|
|
514
|
+
patterns_used: Optional patterns used
|
|
515
|
+
similar_tasks: Optional similar task IDs
|
|
516
|
+
context: Optional task context
|
|
517
|
+
metadata: Optional metadata
|
|
518
|
+
|
|
519
|
+
Returns:
|
|
520
|
+
True if successful
|
|
521
|
+
"""
|
|
522
|
+
memory = TaskMemory(
|
|
523
|
+
task_id=task_id,
|
|
524
|
+
agent_id=agent_id,
|
|
525
|
+
command=command,
|
|
526
|
+
timestamp=datetime.now(UTC),
|
|
527
|
+
outcome=outcome,
|
|
528
|
+
quality_score=quality_score,
|
|
529
|
+
key_learnings=key_learnings or [],
|
|
530
|
+
patterns_used=patterns_used or [],
|
|
531
|
+
similar_tasks=similar_tasks or [],
|
|
532
|
+
context=context or {},
|
|
533
|
+
metadata=metadata or {},
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
return self.storage.save_memory(memory)
|
|
537
|
+
|
|
538
|
+
def retrieve_memories(
|
|
539
|
+
self,
|
|
540
|
+
query: str,
|
|
541
|
+
agent_id: str | None = None,
|
|
542
|
+
command: str | None = None,
|
|
543
|
+
limit: int = 5,
|
|
544
|
+
) -> list[TaskMemory]:
|
|
545
|
+
"""
|
|
546
|
+
Retrieve relevant memories.
|
|
547
|
+
|
|
548
|
+
Args:
|
|
549
|
+
query: Query string
|
|
550
|
+
agent_id: Optional agent filter
|
|
551
|
+
command: Optional command filter
|
|
552
|
+
limit: Maximum results
|
|
553
|
+
|
|
554
|
+
Returns:
|
|
555
|
+
List of relevant memories
|
|
556
|
+
"""
|
|
557
|
+
return self.retriever.retrieve_relevant(query, agent_id, command, limit)
|
|
558
|
+
|
|
559
|
+
def get_memory(self, task_id: str) -> TaskMemory | None:
|
|
560
|
+
"""
|
|
561
|
+
Get memory for a specific task.
|
|
562
|
+
|
|
563
|
+
Args:
|
|
564
|
+
task_id: Task identifier
|
|
565
|
+
|
|
566
|
+
Returns:
|
|
567
|
+
TaskMemory if found, None otherwise
|
|
568
|
+
"""
|
|
569
|
+
return self.storage.get_memory(task_id)
|
|
570
|
+
|
|
571
|
+
def get_similar_tasks(self, task_id: str, limit: int = 5) -> list[TaskMemory]:
|
|
572
|
+
"""
|
|
573
|
+
Get similar tasks.
|
|
574
|
+
|
|
575
|
+
Args:
|
|
576
|
+
task_id: Task identifier
|
|
577
|
+
limit: Maximum results
|
|
578
|
+
|
|
579
|
+
Returns:
|
|
580
|
+
List of similar task memories
|
|
581
|
+
"""
|
|
582
|
+
return self.retriever.get_similar_tasks(task_id, limit)
|