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,446 +1,446 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Knowledge Graph for Task Relationships
|
|
3
|
-
|
|
4
|
-
Tracks relationships between tasks to enable knowledge discovery.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from dataclasses import dataclass, field
|
|
11
|
-
from datetime import datetime
|
|
12
|
-
from enum import Enum
|
|
13
|
-
|
|
14
|
-
from .task_memory import TaskMemory, TaskMemorySystem
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class RelationshipType(Enum):
|
|
20
|
-
"""Types of task relationships."""
|
|
21
|
-
|
|
22
|
-
SIMILAR = "similar" # Tasks with similar patterns
|
|
23
|
-
DEPENDS = "depends" # Task dependencies
|
|
24
|
-
IMPROVES = "improves" # Task improvements
|
|
25
|
-
RELATED = "related" # Related tasks in same domain
|
|
26
|
-
FOLLOWS = "follows" # Sequential task relationship
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@dataclass
|
|
30
|
-
class RelationshipEdge:
|
|
31
|
-
"""Edge representing a task relationship."""
|
|
32
|
-
|
|
33
|
-
from_task: str
|
|
34
|
-
to_task: str
|
|
35
|
-
relationship_type: RelationshipType
|
|
36
|
-
strength: float = 1.0 # 0.0 to 1.0
|
|
37
|
-
metadata: dict = field(default_factory=dict)
|
|
38
|
-
created_at: datetime = field(default_factory=datetime.utcnow)
|
|
39
|
-
|
|
40
|
-
def to_dict(self) -> dict:
|
|
41
|
-
"""Convert to dictionary."""
|
|
42
|
-
return {
|
|
43
|
-
"from_task": self.from_task,
|
|
44
|
-
"to_task": self.to_task,
|
|
45
|
-
"relationship_type": self.relationship_type.value,
|
|
46
|
-
"strength": self.strength,
|
|
47
|
-
"metadata": self.metadata,
|
|
48
|
-
"created_at": self.created_at.isoformat(),
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@classmethod
|
|
52
|
-
def from_dict(cls, data: dict) -> RelationshipEdge:
|
|
53
|
-
"""Create from dictionary."""
|
|
54
|
-
data = data.copy()
|
|
55
|
-
data["relationship_type"] = RelationshipType(data["relationship_type"])
|
|
56
|
-
data["created_at"] = datetime.fromisoformat(data["created_at"])
|
|
57
|
-
return cls(**data)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
@dataclass
|
|
61
|
-
class TaskNode:
|
|
62
|
-
"""Node representing a task in the knowledge graph."""
|
|
63
|
-
|
|
64
|
-
task_id: str
|
|
65
|
-
memory: TaskMemory | None = None
|
|
66
|
-
incoming_edges: list[RelationshipEdge] = field(default_factory=list)
|
|
67
|
-
outgoing_edges: list[RelationshipEdge] = field(default_factory=list)
|
|
68
|
-
|
|
69
|
-
def get_related_tasks(
|
|
70
|
-
self, relationship_type: RelationshipType | None = None
|
|
71
|
-
) -> list[str]:
|
|
72
|
-
"""
|
|
73
|
-
Get related task IDs.
|
|
74
|
-
|
|
75
|
-
Args:
|
|
76
|
-
relationship_type: Optional relationship type filter
|
|
77
|
-
|
|
78
|
-
Returns:
|
|
79
|
-
List of related task IDs
|
|
80
|
-
"""
|
|
81
|
-
related = set()
|
|
82
|
-
|
|
83
|
-
for edge in self.incoming_edges:
|
|
84
|
-
if relationship_type is None or edge.relationship_type == relationship_type:
|
|
85
|
-
related.add(edge.from_task)
|
|
86
|
-
|
|
87
|
-
for edge in self.outgoing_edges:
|
|
88
|
-
if relationship_type is None or edge.relationship_type == relationship_type:
|
|
89
|
-
related.add(edge.to_task)
|
|
90
|
-
|
|
91
|
-
return list(related)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
class KnowledgeGraph:
|
|
95
|
-
"""Graph of task relationships."""
|
|
96
|
-
|
|
97
|
-
def __init__(self, memory_system: TaskMemorySystem | None = None):
|
|
98
|
-
"""
|
|
99
|
-
Initialize knowledge graph.
|
|
100
|
-
|
|
101
|
-
Args:
|
|
102
|
-
memory_system: Optional task memory system for loading memories
|
|
103
|
-
"""
|
|
104
|
-
self.nodes: dict[str, TaskNode] = {}
|
|
105
|
-
self.edges: list[RelationshipEdge] = []
|
|
106
|
-
self.memory_system = memory_system
|
|
107
|
-
|
|
108
|
-
def add_node(self, task_id: str, memory: TaskMemory | None = None):
|
|
109
|
-
"""
|
|
110
|
-
Add a task node to the graph.
|
|
111
|
-
|
|
112
|
-
Args:
|
|
113
|
-
task_id: Task identifier
|
|
114
|
-
memory: Optional task memory
|
|
115
|
-
"""
|
|
116
|
-
if task_id not in self.nodes:
|
|
117
|
-
self.nodes[task_id] = TaskNode(task_id=task_id, memory=memory)
|
|
118
|
-
elif memory:
|
|
119
|
-
self.nodes[task_id].memory = memory
|
|
120
|
-
|
|
121
|
-
def add_edge(
|
|
122
|
-
self,
|
|
123
|
-
from_task: str,
|
|
124
|
-
to_task: str,
|
|
125
|
-
relationship_type: RelationshipType,
|
|
126
|
-
strength: float = 1.0,
|
|
127
|
-
metadata: dict | None = None,
|
|
128
|
-
):
|
|
129
|
-
"""
|
|
130
|
-
Add a relationship edge.
|
|
131
|
-
|
|
132
|
-
Args:
|
|
133
|
-
from_task: Source task ID
|
|
134
|
-
to_task: Target task ID
|
|
135
|
-
relationship_type: Type of relationship
|
|
136
|
-
strength: Relationship strength (0.0 to 1.0)
|
|
137
|
-
metadata: Optional metadata
|
|
138
|
-
"""
|
|
139
|
-
# Ensure nodes exist
|
|
140
|
-
self.add_node(from_task)
|
|
141
|
-
self.add_node(to_task)
|
|
142
|
-
|
|
143
|
-
# Create edge
|
|
144
|
-
edge = RelationshipEdge(
|
|
145
|
-
from_task=from_task,
|
|
146
|
-
to_task=to_task,
|
|
147
|
-
relationship_type=relationship_type,
|
|
148
|
-
strength=strength,
|
|
149
|
-
metadata=metadata or {},
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
# Add to edges list
|
|
153
|
-
self.edges.append(edge)
|
|
154
|
-
|
|
155
|
-
# Update node edges
|
|
156
|
-
self.nodes[from_task].outgoing_edges.append(edge)
|
|
157
|
-
self.nodes[to_task].incoming_edges.append(edge)
|
|
158
|
-
|
|
159
|
-
logger.debug(
|
|
160
|
-
f"Added {relationship_type.value} edge: {from_task} -> {to_task} "
|
|
161
|
-
f"(strength: {strength})"
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
def detect_relationships(self, task_id: str, memory: TaskMemory):
|
|
165
|
-
"""
|
|
166
|
-
Automatically detect relationships for a task.
|
|
167
|
-
|
|
168
|
-
Args:
|
|
169
|
-
task_id: Task identifier
|
|
170
|
-
memory: Task memory
|
|
171
|
-
"""
|
|
172
|
-
self.add_node(task_id, memory)
|
|
173
|
-
|
|
174
|
-
# Find similar tasks based on patterns and command
|
|
175
|
-
if self.memory_system:
|
|
176
|
-
similar_memories = self.memory_system.retrieve_memories(
|
|
177
|
-
query=memory.command, agent_id=memory.agent_id, limit=10
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
for similar_memory in similar_memories:
|
|
181
|
-
if similar_memory.task_id != task_id:
|
|
182
|
-
# Calculate similarity strength
|
|
183
|
-
strength = self._calculate_similarity(memory, similar_memory)
|
|
184
|
-
|
|
185
|
-
if strength > 0.5: # Threshold for similarity
|
|
186
|
-
self.add_edge(
|
|
187
|
-
task_id,
|
|
188
|
-
similar_memory.task_id,
|
|
189
|
-
RelationshipType.SIMILAR,
|
|
190
|
-
strength=strength,
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
# Add explicit similar_tasks relationships
|
|
194
|
-
for similar_id in memory.similar_tasks:
|
|
195
|
-
if similar_id != task_id:
|
|
196
|
-
self.add_edge(
|
|
197
|
-
task_id, similar_id, RelationshipType.RELATED, strength=0.8
|
|
198
|
-
)
|
|
199
|
-
|
|
200
|
-
def _calculate_similarity(self, memory1: TaskMemory, memory2: TaskMemory) -> float:
|
|
201
|
-
"""
|
|
202
|
-
Calculate similarity between two memories.
|
|
203
|
-
|
|
204
|
-
Args:
|
|
205
|
-
memory1: First memory
|
|
206
|
-
memory2: Second memory
|
|
207
|
-
|
|
208
|
-
Returns:
|
|
209
|
-
Similarity score (0.0 to 1.0)
|
|
210
|
-
"""
|
|
211
|
-
score = 0.0
|
|
212
|
-
|
|
213
|
-
# Command similarity
|
|
214
|
-
if memory1.command.lower() == memory2.command.lower():
|
|
215
|
-
score += 0.4
|
|
216
|
-
elif (
|
|
217
|
-
memory1.command.lower() in memory2.command.lower()
|
|
218
|
-
or memory2.command.lower() in memory1.command.lower()
|
|
219
|
-
):
|
|
220
|
-
score += 0.2
|
|
221
|
-
|
|
222
|
-
# Pattern overlap
|
|
223
|
-
patterns1 = set(memory1.patterns_used)
|
|
224
|
-
patterns2 = set(memory2.patterns_used)
|
|
225
|
-
if patterns1 and patterns2:
|
|
226
|
-
overlap = len(patterns1 & patterns2) / max(len(patterns1), len(patterns2))
|
|
227
|
-
score += overlap * 0.3
|
|
228
|
-
|
|
229
|
-
# Learning overlap
|
|
230
|
-
learnings1 = set(learning.lower() for learning in memory1.key_learnings)
|
|
231
|
-
learnings2 = set(learning.lower() for learning in memory2.key_learnings)
|
|
232
|
-
if learnings1 and learnings2:
|
|
233
|
-
overlap = len(learnings1 & learnings2) / max(
|
|
234
|
-
len(learnings1), len(learnings2)
|
|
235
|
-
)
|
|
236
|
-
score += overlap * 0.3
|
|
237
|
-
|
|
238
|
-
return min(score, 1.0)
|
|
239
|
-
|
|
240
|
-
def get_related_tasks(
|
|
241
|
-
self,
|
|
242
|
-
task_id: str,
|
|
243
|
-
relationship_type: RelationshipType | None = None,
|
|
244
|
-
limit: int | None = None,
|
|
245
|
-
) -> list[str]:
|
|
246
|
-
"""
|
|
247
|
-
Get tasks related to a given task.
|
|
248
|
-
|
|
249
|
-
Args:
|
|
250
|
-
task_id: Task identifier
|
|
251
|
-
relationship_type: Optional relationship type filter
|
|
252
|
-
limit: Optional result limit
|
|
253
|
-
|
|
254
|
-
Returns:
|
|
255
|
-
List of related task IDs
|
|
256
|
-
"""
|
|
257
|
-
if task_id not in self.nodes:
|
|
258
|
-
return []
|
|
259
|
-
|
|
260
|
-
related = self.nodes[task_id].get_related_tasks(relationship_type)
|
|
261
|
-
|
|
262
|
-
if limit:
|
|
263
|
-
related = related[:limit]
|
|
264
|
-
|
|
265
|
-
return related
|
|
266
|
-
|
|
267
|
-
def find_path(
|
|
268
|
-
self, from_task: str, to_task: str, max_depth: int = 3
|
|
269
|
-
) -> list[str] | None:
|
|
270
|
-
"""
|
|
271
|
-
Find a path between two tasks.
|
|
272
|
-
|
|
273
|
-
Args:
|
|
274
|
-
from_task: Source task ID
|
|
275
|
-
to_task: Target task ID
|
|
276
|
-
max_depth: Maximum path depth
|
|
277
|
-
|
|
278
|
-
Returns:
|
|
279
|
-
List of task IDs forming the path, or None if no path found
|
|
280
|
-
"""
|
|
281
|
-
if from_task == to_task:
|
|
282
|
-
return [from_task]
|
|
283
|
-
|
|
284
|
-
if from_task not in self.nodes or to_task not in self.nodes:
|
|
285
|
-
return None
|
|
286
|
-
|
|
287
|
-
# Simple BFS path finding
|
|
288
|
-
queue = [(from_task, [from_task])]
|
|
289
|
-
visited = {from_task}
|
|
290
|
-
|
|
291
|
-
while queue:
|
|
292
|
-
current, path = queue.pop(0)
|
|
293
|
-
|
|
294
|
-
if len(path) > max_depth:
|
|
295
|
-
continue
|
|
296
|
-
|
|
297
|
-
node = self.nodes[current]
|
|
298
|
-
for edge in node.outgoing_edges:
|
|
299
|
-
next_task = edge.to_task
|
|
300
|
-
|
|
301
|
-
if next_task == to_task:
|
|
302
|
-
return path + [next_task]
|
|
303
|
-
|
|
304
|
-
if next_task not in visited:
|
|
305
|
-
visited.add(next_task)
|
|
306
|
-
queue.append((next_task, path + [next_task]))
|
|
307
|
-
|
|
308
|
-
return None
|
|
309
|
-
|
|
310
|
-
def get_subgraph(self, task_ids: set[str]) -> KnowledgeGraph:
|
|
311
|
-
"""
|
|
312
|
-
Get a subgraph containing only specified tasks.
|
|
313
|
-
|
|
314
|
-
Args:
|
|
315
|
-
task_ids: Set of task IDs to include
|
|
316
|
-
|
|
317
|
-
Returns:
|
|
318
|
-
New KnowledgeGraph containing only specified tasks
|
|
319
|
-
"""
|
|
320
|
-
subgraph = KnowledgeGraph(self.memory_system)
|
|
321
|
-
|
|
322
|
-
# Add nodes
|
|
323
|
-
for task_id in task_ids:
|
|
324
|
-
if task_id in self.nodes:
|
|
325
|
-
subgraph.add_node(task_id, self.nodes[task_id].memory)
|
|
326
|
-
|
|
327
|
-
# Add edges
|
|
328
|
-
for edge in self.edges:
|
|
329
|
-
if edge.from_task in task_ids and edge.to_task in task_ids:
|
|
330
|
-
subgraph.add_edge(
|
|
331
|
-
edge.from_task,
|
|
332
|
-
edge.to_task,
|
|
333
|
-
edge.relationship_type,
|
|
334
|
-
edge.strength,
|
|
335
|
-
edge.metadata,
|
|
336
|
-
)
|
|
337
|
-
|
|
338
|
-
return subgraph
|
|
339
|
-
|
|
340
|
-
def to_dict(self) -> dict:
|
|
341
|
-
"""Convert graph to dictionary."""
|
|
342
|
-
return {
|
|
343
|
-
"nodes": {
|
|
344
|
-
task_id: {
|
|
345
|
-
"task_id": node.task_id,
|
|
346
|
-
"memory": node.memory.to_dict() if node.memory else None,
|
|
347
|
-
}
|
|
348
|
-
for task_id, node in self.nodes.items()
|
|
349
|
-
},
|
|
350
|
-
"edges": [edge.to_dict() for edge in self.edges],
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
@classmethod
|
|
354
|
-
def from_dict(
|
|
355
|
-
cls, data: dict, memory_system: TaskMemorySystem | None = None
|
|
356
|
-
) -> KnowledgeGraph:
|
|
357
|
-
"""
|
|
358
|
-
Create graph from dictionary.
|
|
359
|
-
|
|
360
|
-
Args:
|
|
361
|
-
data: Dictionary representation
|
|
362
|
-
memory_system: Optional memory system
|
|
363
|
-
|
|
364
|
-
Returns:
|
|
365
|
-
KnowledgeGraph instance
|
|
366
|
-
"""
|
|
367
|
-
graph = cls(memory_system)
|
|
368
|
-
|
|
369
|
-
# Add nodes
|
|
370
|
-
for task_id, node_data in data.get("nodes", {}).items():
|
|
371
|
-
memory = None
|
|
372
|
-
if node_data.get("memory"):
|
|
373
|
-
memory = TaskMemory.from_dict(node_data["memory"])
|
|
374
|
-
graph.add_node(task_id, memory)
|
|
375
|
-
|
|
376
|
-
# Add edges
|
|
377
|
-
for edge_data in data.get("edges", []):
|
|
378
|
-
edge = RelationshipEdge.from_dict(edge_data)
|
|
379
|
-
graph.edges.append(edge)
|
|
380
|
-
graph.nodes[edge.from_task].outgoing_edges.append(edge)
|
|
381
|
-
graph.nodes[edge.to_task].incoming_edges.append(edge)
|
|
382
|
-
|
|
383
|
-
return graph
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
class GraphQuery:
|
|
387
|
-
"""Query interface for knowledge graph."""
|
|
388
|
-
|
|
389
|
-
def __init__(self, graph: KnowledgeGraph):
|
|
390
|
-
"""
|
|
391
|
-
Initialize graph query.
|
|
392
|
-
|
|
393
|
-
Args:
|
|
394
|
-
graph: Knowledge graph to query
|
|
395
|
-
"""
|
|
396
|
-
self.graph = graph
|
|
397
|
-
|
|
398
|
-
def find_similar_tasks(self, task_id: str, limit: int = 5) -> list[str]:
|
|
399
|
-
"""
|
|
400
|
-
Find tasks similar to a given task.
|
|
401
|
-
|
|
402
|
-
Args:
|
|
403
|
-
task_id: Task identifier
|
|
404
|
-
limit: Maximum results
|
|
405
|
-
|
|
406
|
-
Returns:
|
|
407
|
-
List of similar task IDs
|
|
408
|
-
"""
|
|
409
|
-
return self.graph.get_related_tasks(task_id, RelationshipType.SIMILAR, limit)
|
|
410
|
-
|
|
411
|
-
def find_dependencies(self, task_id: str) -> list[str]:
|
|
412
|
-
"""
|
|
413
|
-
Find tasks that a task depends on.
|
|
414
|
-
|
|
415
|
-
Args:
|
|
416
|
-
task_id: Task identifier
|
|
417
|
-
|
|
418
|
-
Returns:
|
|
419
|
-
List of dependency task IDs
|
|
420
|
-
"""
|
|
421
|
-
return self.graph.get_related_tasks(task_id, RelationshipType.DEPENDS)
|
|
422
|
-
|
|
423
|
-
def find_improvements(self, task_id: str) -> list[str]:
|
|
424
|
-
"""
|
|
425
|
-
Find tasks that improve a given task.
|
|
426
|
-
|
|
427
|
-
Args:
|
|
428
|
-
task_id: Task identifier
|
|
429
|
-
|
|
430
|
-
Returns:
|
|
431
|
-
List of improvement task IDs
|
|
432
|
-
"""
|
|
433
|
-
return self.graph.get_related_tasks(task_id, RelationshipType.IMPROVES)
|
|
434
|
-
|
|
435
|
-
def find_related_domain_tasks(self, task_id: str, limit: int = 10) -> list[str]:
|
|
436
|
-
"""
|
|
437
|
-
Find tasks in the same domain.
|
|
438
|
-
|
|
439
|
-
Args:
|
|
440
|
-
task_id: Task identifier
|
|
441
|
-
limit: Maximum results
|
|
442
|
-
|
|
443
|
-
Returns:
|
|
444
|
-
List of related task IDs
|
|
445
|
-
"""
|
|
446
|
-
return self.graph.get_related_tasks(task_id, RelationshipType.RELATED, limit)
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Graph for Task Relationships
|
|
3
|
+
|
|
4
|
+
Tracks relationships between tasks to enable knowledge discovery.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from enum import Enum
|
|
13
|
+
|
|
14
|
+
from .task_memory import TaskMemory, TaskMemorySystem
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RelationshipType(Enum):
|
|
20
|
+
"""Types of task relationships."""
|
|
21
|
+
|
|
22
|
+
SIMILAR = "similar" # Tasks with similar patterns
|
|
23
|
+
DEPENDS = "depends" # Task dependencies
|
|
24
|
+
IMPROVES = "improves" # Task improvements
|
|
25
|
+
RELATED = "related" # Related tasks in same domain
|
|
26
|
+
FOLLOWS = "follows" # Sequential task relationship
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class RelationshipEdge:
|
|
31
|
+
"""Edge representing a task relationship."""
|
|
32
|
+
|
|
33
|
+
from_task: str
|
|
34
|
+
to_task: str
|
|
35
|
+
relationship_type: RelationshipType
|
|
36
|
+
strength: float = 1.0 # 0.0 to 1.0
|
|
37
|
+
metadata: dict = field(default_factory=dict)
|
|
38
|
+
created_at: datetime = field(default_factory=datetime.utcnow)
|
|
39
|
+
|
|
40
|
+
def to_dict(self) -> dict:
|
|
41
|
+
"""Convert to dictionary."""
|
|
42
|
+
return {
|
|
43
|
+
"from_task": self.from_task,
|
|
44
|
+
"to_task": self.to_task,
|
|
45
|
+
"relationship_type": self.relationship_type.value,
|
|
46
|
+
"strength": self.strength,
|
|
47
|
+
"metadata": self.metadata,
|
|
48
|
+
"created_at": self.created_at.isoformat(),
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@classmethod
|
|
52
|
+
def from_dict(cls, data: dict) -> RelationshipEdge:
|
|
53
|
+
"""Create from dictionary."""
|
|
54
|
+
data = data.copy()
|
|
55
|
+
data["relationship_type"] = RelationshipType(data["relationship_type"])
|
|
56
|
+
data["created_at"] = datetime.fromisoformat(data["created_at"])
|
|
57
|
+
return cls(**data)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass
|
|
61
|
+
class TaskNode:
|
|
62
|
+
"""Node representing a task in the knowledge graph."""
|
|
63
|
+
|
|
64
|
+
task_id: str
|
|
65
|
+
memory: TaskMemory | None = None
|
|
66
|
+
incoming_edges: list[RelationshipEdge] = field(default_factory=list)
|
|
67
|
+
outgoing_edges: list[RelationshipEdge] = field(default_factory=list)
|
|
68
|
+
|
|
69
|
+
def get_related_tasks(
|
|
70
|
+
self, relationship_type: RelationshipType | None = None
|
|
71
|
+
) -> list[str]:
|
|
72
|
+
"""
|
|
73
|
+
Get related task IDs.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
relationship_type: Optional relationship type filter
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
List of related task IDs
|
|
80
|
+
"""
|
|
81
|
+
related = set()
|
|
82
|
+
|
|
83
|
+
for edge in self.incoming_edges:
|
|
84
|
+
if relationship_type is None or edge.relationship_type == relationship_type:
|
|
85
|
+
related.add(edge.from_task)
|
|
86
|
+
|
|
87
|
+
for edge in self.outgoing_edges:
|
|
88
|
+
if relationship_type is None or edge.relationship_type == relationship_type:
|
|
89
|
+
related.add(edge.to_task)
|
|
90
|
+
|
|
91
|
+
return list(related)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class KnowledgeGraph:
|
|
95
|
+
"""Graph of task relationships."""
|
|
96
|
+
|
|
97
|
+
def __init__(self, memory_system: TaskMemorySystem | None = None):
|
|
98
|
+
"""
|
|
99
|
+
Initialize knowledge graph.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
memory_system: Optional task memory system for loading memories
|
|
103
|
+
"""
|
|
104
|
+
self.nodes: dict[str, TaskNode] = {}
|
|
105
|
+
self.edges: list[RelationshipEdge] = []
|
|
106
|
+
self.memory_system = memory_system
|
|
107
|
+
|
|
108
|
+
def add_node(self, task_id: str, memory: TaskMemory | None = None):
|
|
109
|
+
"""
|
|
110
|
+
Add a task node to the graph.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
task_id: Task identifier
|
|
114
|
+
memory: Optional task memory
|
|
115
|
+
"""
|
|
116
|
+
if task_id not in self.nodes:
|
|
117
|
+
self.nodes[task_id] = TaskNode(task_id=task_id, memory=memory)
|
|
118
|
+
elif memory:
|
|
119
|
+
self.nodes[task_id].memory = memory
|
|
120
|
+
|
|
121
|
+
def add_edge(
|
|
122
|
+
self,
|
|
123
|
+
from_task: str,
|
|
124
|
+
to_task: str,
|
|
125
|
+
relationship_type: RelationshipType,
|
|
126
|
+
strength: float = 1.0,
|
|
127
|
+
metadata: dict | None = None,
|
|
128
|
+
):
|
|
129
|
+
"""
|
|
130
|
+
Add a relationship edge.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
from_task: Source task ID
|
|
134
|
+
to_task: Target task ID
|
|
135
|
+
relationship_type: Type of relationship
|
|
136
|
+
strength: Relationship strength (0.0 to 1.0)
|
|
137
|
+
metadata: Optional metadata
|
|
138
|
+
"""
|
|
139
|
+
# Ensure nodes exist
|
|
140
|
+
self.add_node(from_task)
|
|
141
|
+
self.add_node(to_task)
|
|
142
|
+
|
|
143
|
+
# Create edge
|
|
144
|
+
edge = RelationshipEdge(
|
|
145
|
+
from_task=from_task,
|
|
146
|
+
to_task=to_task,
|
|
147
|
+
relationship_type=relationship_type,
|
|
148
|
+
strength=strength,
|
|
149
|
+
metadata=metadata or {},
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
# Add to edges list
|
|
153
|
+
self.edges.append(edge)
|
|
154
|
+
|
|
155
|
+
# Update node edges
|
|
156
|
+
self.nodes[from_task].outgoing_edges.append(edge)
|
|
157
|
+
self.nodes[to_task].incoming_edges.append(edge)
|
|
158
|
+
|
|
159
|
+
logger.debug(
|
|
160
|
+
f"Added {relationship_type.value} edge: {from_task} -> {to_task} "
|
|
161
|
+
f"(strength: {strength})"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
def detect_relationships(self, task_id: str, memory: TaskMemory):
|
|
165
|
+
"""
|
|
166
|
+
Automatically detect relationships for a task.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
task_id: Task identifier
|
|
170
|
+
memory: Task memory
|
|
171
|
+
"""
|
|
172
|
+
self.add_node(task_id, memory)
|
|
173
|
+
|
|
174
|
+
# Find similar tasks based on patterns and command
|
|
175
|
+
if self.memory_system:
|
|
176
|
+
similar_memories = self.memory_system.retrieve_memories(
|
|
177
|
+
query=memory.command, agent_id=memory.agent_id, limit=10
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
for similar_memory in similar_memories:
|
|
181
|
+
if similar_memory.task_id != task_id:
|
|
182
|
+
# Calculate similarity strength
|
|
183
|
+
strength = self._calculate_similarity(memory, similar_memory)
|
|
184
|
+
|
|
185
|
+
if strength > 0.5: # Threshold for similarity
|
|
186
|
+
self.add_edge(
|
|
187
|
+
task_id,
|
|
188
|
+
similar_memory.task_id,
|
|
189
|
+
RelationshipType.SIMILAR,
|
|
190
|
+
strength=strength,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
# Add explicit similar_tasks relationships
|
|
194
|
+
for similar_id in memory.similar_tasks:
|
|
195
|
+
if similar_id != task_id:
|
|
196
|
+
self.add_edge(
|
|
197
|
+
task_id, similar_id, RelationshipType.RELATED, strength=0.8
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
def _calculate_similarity(self, memory1: TaskMemory, memory2: TaskMemory) -> float:
|
|
201
|
+
"""
|
|
202
|
+
Calculate similarity between two memories.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
memory1: First memory
|
|
206
|
+
memory2: Second memory
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
Similarity score (0.0 to 1.0)
|
|
210
|
+
"""
|
|
211
|
+
score = 0.0
|
|
212
|
+
|
|
213
|
+
# Command similarity
|
|
214
|
+
if memory1.command.lower() == memory2.command.lower():
|
|
215
|
+
score += 0.4
|
|
216
|
+
elif (
|
|
217
|
+
memory1.command.lower() in memory2.command.lower()
|
|
218
|
+
or memory2.command.lower() in memory1.command.lower()
|
|
219
|
+
):
|
|
220
|
+
score += 0.2
|
|
221
|
+
|
|
222
|
+
# Pattern overlap
|
|
223
|
+
patterns1 = set(memory1.patterns_used)
|
|
224
|
+
patterns2 = set(memory2.patterns_used)
|
|
225
|
+
if patterns1 and patterns2:
|
|
226
|
+
overlap = len(patterns1 & patterns2) / max(len(patterns1), len(patterns2))
|
|
227
|
+
score += overlap * 0.3
|
|
228
|
+
|
|
229
|
+
# Learning overlap
|
|
230
|
+
learnings1 = set(learning.lower() for learning in memory1.key_learnings)
|
|
231
|
+
learnings2 = set(learning.lower() for learning in memory2.key_learnings)
|
|
232
|
+
if learnings1 and learnings2:
|
|
233
|
+
overlap = len(learnings1 & learnings2) / max(
|
|
234
|
+
len(learnings1), len(learnings2)
|
|
235
|
+
)
|
|
236
|
+
score += overlap * 0.3
|
|
237
|
+
|
|
238
|
+
return min(score, 1.0)
|
|
239
|
+
|
|
240
|
+
def get_related_tasks(
|
|
241
|
+
self,
|
|
242
|
+
task_id: str,
|
|
243
|
+
relationship_type: RelationshipType | None = None,
|
|
244
|
+
limit: int | None = None,
|
|
245
|
+
) -> list[str]:
|
|
246
|
+
"""
|
|
247
|
+
Get tasks related to a given task.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
task_id: Task identifier
|
|
251
|
+
relationship_type: Optional relationship type filter
|
|
252
|
+
limit: Optional result limit
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
List of related task IDs
|
|
256
|
+
"""
|
|
257
|
+
if task_id not in self.nodes:
|
|
258
|
+
return []
|
|
259
|
+
|
|
260
|
+
related = self.nodes[task_id].get_related_tasks(relationship_type)
|
|
261
|
+
|
|
262
|
+
if limit:
|
|
263
|
+
related = related[:limit]
|
|
264
|
+
|
|
265
|
+
return related
|
|
266
|
+
|
|
267
|
+
def find_path(
|
|
268
|
+
self, from_task: str, to_task: str, max_depth: int = 3
|
|
269
|
+
) -> list[str] | None:
|
|
270
|
+
"""
|
|
271
|
+
Find a path between two tasks.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
from_task: Source task ID
|
|
275
|
+
to_task: Target task ID
|
|
276
|
+
max_depth: Maximum path depth
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
List of task IDs forming the path, or None if no path found
|
|
280
|
+
"""
|
|
281
|
+
if from_task == to_task:
|
|
282
|
+
return [from_task]
|
|
283
|
+
|
|
284
|
+
if from_task not in self.nodes or to_task not in self.nodes:
|
|
285
|
+
return None
|
|
286
|
+
|
|
287
|
+
# Simple BFS path finding
|
|
288
|
+
queue = [(from_task, [from_task])]
|
|
289
|
+
visited = {from_task}
|
|
290
|
+
|
|
291
|
+
while queue:
|
|
292
|
+
current, path = queue.pop(0)
|
|
293
|
+
|
|
294
|
+
if len(path) > max_depth:
|
|
295
|
+
continue
|
|
296
|
+
|
|
297
|
+
node = self.nodes[current]
|
|
298
|
+
for edge in node.outgoing_edges:
|
|
299
|
+
next_task = edge.to_task
|
|
300
|
+
|
|
301
|
+
if next_task == to_task:
|
|
302
|
+
return path + [next_task]
|
|
303
|
+
|
|
304
|
+
if next_task not in visited:
|
|
305
|
+
visited.add(next_task)
|
|
306
|
+
queue.append((next_task, path + [next_task]))
|
|
307
|
+
|
|
308
|
+
return None
|
|
309
|
+
|
|
310
|
+
def get_subgraph(self, task_ids: set[str]) -> KnowledgeGraph:
|
|
311
|
+
"""
|
|
312
|
+
Get a subgraph containing only specified tasks.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
task_ids: Set of task IDs to include
|
|
316
|
+
|
|
317
|
+
Returns:
|
|
318
|
+
New KnowledgeGraph containing only specified tasks
|
|
319
|
+
"""
|
|
320
|
+
subgraph = KnowledgeGraph(self.memory_system)
|
|
321
|
+
|
|
322
|
+
# Add nodes
|
|
323
|
+
for task_id in task_ids:
|
|
324
|
+
if task_id in self.nodes:
|
|
325
|
+
subgraph.add_node(task_id, self.nodes[task_id].memory)
|
|
326
|
+
|
|
327
|
+
# Add edges
|
|
328
|
+
for edge in self.edges:
|
|
329
|
+
if edge.from_task in task_ids and edge.to_task in task_ids:
|
|
330
|
+
subgraph.add_edge(
|
|
331
|
+
edge.from_task,
|
|
332
|
+
edge.to_task,
|
|
333
|
+
edge.relationship_type,
|
|
334
|
+
edge.strength,
|
|
335
|
+
edge.metadata,
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
return subgraph
|
|
339
|
+
|
|
340
|
+
def to_dict(self) -> dict:
|
|
341
|
+
"""Convert graph to dictionary."""
|
|
342
|
+
return {
|
|
343
|
+
"nodes": {
|
|
344
|
+
task_id: {
|
|
345
|
+
"task_id": node.task_id,
|
|
346
|
+
"memory": node.memory.to_dict() if node.memory else None,
|
|
347
|
+
}
|
|
348
|
+
for task_id, node in self.nodes.items()
|
|
349
|
+
},
|
|
350
|
+
"edges": [edge.to_dict() for edge in self.edges],
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
@classmethod
|
|
354
|
+
def from_dict(
|
|
355
|
+
cls, data: dict, memory_system: TaskMemorySystem | None = None
|
|
356
|
+
) -> KnowledgeGraph:
|
|
357
|
+
"""
|
|
358
|
+
Create graph from dictionary.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
data: Dictionary representation
|
|
362
|
+
memory_system: Optional memory system
|
|
363
|
+
|
|
364
|
+
Returns:
|
|
365
|
+
KnowledgeGraph instance
|
|
366
|
+
"""
|
|
367
|
+
graph = cls(memory_system)
|
|
368
|
+
|
|
369
|
+
# Add nodes
|
|
370
|
+
for task_id, node_data in data.get("nodes", {}).items():
|
|
371
|
+
memory = None
|
|
372
|
+
if node_data.get("memory"):
|
|
373
|
+
memory = TaskMemory.from_dict(node_data["memory"])
|
|
374
|
+
graph.add_node(task_id, memory)
|
|
375
|
+
|
|
376
|
+
# Add edges
|
|
377
|
+
for edge_data in data.get("edges", []):
|
|
378
|
+
edge = RelationshipEdge.from_dict(edge_data)
|
|
379
|
+
graph.edges.append(edge)
|
|
380
|
+
graph.nodes[edge.from_task].outgoing_edges.append(edge)
|
|
381
|
+
graph.nodes[edge.to_task].incoming_edges.append(edge)
|
|
382
|
+
|
|
383
|
+
return graph
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
class GraphQuery:
|
|
387
|
+
"""Query interface for knowledge graph."""
|
|
388
|
+
|
|
389
|
+
def __init__(self, graph: KnowledgeGraph):
|
|
390
|
+
"""
|
|
391
|
+
Initialize graph query.
|
|
392
|
+
|
|
393
|
+
Args:
|
|
394
|
+
graph: Knowledge graph to query
|
|
395
|
+
"""
|
|
396
|
+
self.graph = graph
|
|
397
|
+
|
|
398
|
+
def find_similar_tasks(self, task_id: str, limit: int = 5) -> list[str]:
|
|
399
|
+
"""
|
|
400
|
+
Find tasks similar to a given task.
|
|
401
|
+
|
|
402
|
+
Args:
|
|
403
|
+
task_id: Task identifier
|
|
404
|
+
limit: Maximum results
|
|
405
|
+
|
|
406
|
+
Returns:
|
|
407
|
+
List of similar task IDs
|
|
408
|
+
"""
|
|
409
|
+
return self.graph.get_related_tasks(task_id, RelationshipType.SIMILAR, limit)
|
|
410
|
+
|
|
411
|
+
def find_dependencies(self, task_id: str) -> list[str]:
|
|
412
|
+
"""
|
|
413
|
+
Find tasks that a task depends on.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
task_id: Task identifier
|
|
417
|
+
|
|
418
|
+
Returns:
|
|
419
|
+
List of dependency task IDs
|
|
420
|
+
"""
|
|
421
|
+
return self.graph.get_related_tasks(task_id, RelationshipType.DEPENDS)
|
|
422
|
+
|
|
423
|
+
def find_improvements(self, task_id: str) -> list[str]:
|
|
424
|
+
"""
|
|
425
|
+
Find tasks that improve a given task.
|
|
426
|
+
|
|
427
|
+
Args:
|
|
428
|
+
task_id: Task identifier
|
|
429
|
+
|
|
430
|
+
Returns:
|
|
431
|
+
List of improvement task IDs
|
|
432
|
+
"""
|
|
433
|
+
return self.graph.get_related_tasks(task_id, RelationshipType.IMPROVES)
|
|
434
|
+
|
|
435
|
+
def find_related_domain_tasks(self, task_id: str, limit: int = 10) -> list[str]:
|
|
436
|
+
"""
|
|
437
|
+
Find tasks in the same domain.
|
|
438
|
+
|
|
439
|
+
Args:
|
|
440
|
+
task_id: Task identifier
|
|
441
|
+
limit: Maximum results
|
|
442
|
+
|
|
443
|
+
Returns:
|
|
444
|
+
List of related task IDs
|
|
445
|
+
"""
|
|
446
|
+
return self.graph.get_related_tasks(task_id, RelationshipType.RELATED, limit)
|