claude-flow-novice 2.15.3 → 2.15.5
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.
- package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +29 -6
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +34 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +29 -6
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +238 -29
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +6 -2
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +34 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/config-manager.js +109 -91
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +201 -0
- package/dist/cli/conversation-fork-cleanup.js.map +1 -0
- package/dist/cli/conversation-fork.js +16 -3
- package/dist/cli/conversation-fork.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
- package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
- package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
- package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
- package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
- package/package.json +35 -4
- package/readme/README.md +53 -5
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/scripts/verify-redis-cleanup.sh +173 -0
- package/tests/README.md +84 -0
- package/tests/test-memory-leak-task-mode.sh +435 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correlation Key Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides correlation key generation and parsing for cross-database lookups.
|
|
5
|
+
* Part of Task 0.4: Database Query Abstraction Layer (MVP)
|
|
6
|
+
*
|
|
7
|
+
* Format: {type}:{id}:{entity}:{subtype}
|
|
8
|
+
* Examples:
|
|
9
|
+
* - task:abc123:agent:backend-developer
|
|
10
|
+
* - task:abc123:skill:auth-validation
|
|
11
|
+
* - agent:agent-456:execution:iteration-1
|
|
12
|
+
*/ /**
|
|
13
|
+
* Build correlation key string
|
|
14
|
+
*/ export function buildCorrelationKey(key) {
|
|
15
|
+
const parts = [
|
|
16
|
+
key.type,
|
|
17
|
+
key.id
|
|
18
|
+
];
|
|
19
|
+
if (key.entity) {
|
|
20
|
+
parts.push(key.entity);
|
|
21
|
+
}
|
|
22
|
+
if (key.subtype) {
|
|
23
|
+
parts.push(key.subtype);
|
|
24
|
+
}
|
|
25
|
+
return parts.join(':');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parse correlation key string
|
|
29
|
+
*/ export function parseCorrelationKey(keyString) {
|
|
30
|
+
const parts = keyString.split(':');
|
|
31
|
+
if (parts.length < 2) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const [type, id, entity, subtype] = parts;
|
|
35
|
+
if (!isValidKeyType(type)) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
type: type,
|
|
40
|
+
id,
|
|
41
|
+
entity,
|
|
42
|
+
subtype
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if correlation key type is valid
|
|
47
|
+
*/ function isValidKeyType(type) {
|
|
48
|
+
return [
|
|
49
|
+
'task',
|
|
50
|
+
'agent',
|
|
51
|
+
'skill',
|
|
52
|
+
'execution'
|
|
53
|
+
].includes(type);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build task correlation key
|
|
57
|
+
*/ export function buildTaskKey(taskId, entity) {
|
|
58
|
+
return buildCorrelationKey({
|
|
59
|
+
type: 'task',
|
|
60
|
+
id: taskId,
|
|
61
|
+
entity
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build agent correlation key
|
|
66
|
+
*/ export function buildAgentKey(agentId, entity) {
|
|
67
|
+
return buildCorrelationKey({
|
|
68
|
+
type: 'agent',
|
|
69
|
+
id: agentId,
|
|
70
|
+
entity
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Build skill correlation key
|
|
75
|
+
*/ export function buildSkillKey(skillId, entity) {
|
|
76
|
+
return buildCorrelationKey({
|
|
77
|
+
type: 'skill',
|
|
78
|
+
id: skillId,
|
|
79
|
+
entity
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Build execution correlation key
|
|
84
|
+
*/ export function buildExecutionKey(executionId, entity) {
|
|
85
|
+
return buildCorrelationKey({
|
|
86
|
+
type: 'execution',
|
|
87
|
+
id: executionId,
|
|
88
|
+
entity
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract task ID from correlation key
|
|
93
|
+
*/ export function extractTaskId(keyString) {
|
|
94
|
+
const key = parseCorrelationKey(keyString);
|
|
95
|
+
return key && key.type === 'task' ? key.id : null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extract agent ID from correlation key
|
|
99
|
+
*/ export function extractAgentId(keyString) {
|
|
100
|
+
const key = parseCorrelationKey(keyString);
|
|
101
|
+
return key && key.type === 'agent' ? key.id : null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if correlation key matches pattern
|
|
105
|
+
*/ export function matchesPattern(keyString, pattern) {
|
|
106
|
+
const key = parseCorrelationKey(keyString);
|
|
107
|
+
if (!key) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
if (pattern.type && key.type !== pattern.type) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
if (pattern.id && key.id !== pattern.id) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
if (pattern.entity && key.entity !== pattern.entity) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
if (pattern.subtype && key.subtype !== pattern.subtype) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Entity type mapping for cross-database queries
|
|
126
|
+
*/ export const ENTITY_TYPE_MAP = {
|
|
127
|
+
agent: [
|
|
128
|
+
'execution',
|
|
129
|
+
'result',
|
|
130
|
+
'metadata'
|
|
131
|
+
],
|
|
132
|
+
skill: [
|
|
133
|
+
'invocation',
|
|
134
|
+
'result',
|
|
135
|
+
'metadata'
|
|
136
|
+
],
|
|
137
|
+
task: [
|
|
138
|
+
'agent',
|
|
139
|
+
'skill',
|
|
140
|
+
'artifact',
|
|
141
|
+
'event'
|
|
142
|
+
],
|
|
143
|
+
execution: [
|
|
144
|
+
'step',
|
|
145
|
+
'log',
|
|
146
|
+
'metric'
|
|
147
|
+
]
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Generate wildcard pattern string for Redis SCAN operations
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* buildWildcardPattern({ type: 'task', id: '*', entity: 'agent' })
|
|
155
|
+
* // Returns: "task:*:agent"
|
|
156
|
+
*
|
|
157
|
+
* buildWildcardPattern({ type: '*', id: 'abc123' })
|
|
158
|
+
* // Returns: "*:abc123"
|
|
159
|
+
* ```
|
|
160
|
+
*/ export function buildWildcardPattern(pattern) {
|
|
161
|
+
const parts = [];
|
|
162
|
+
parts.push(pattern.type || '*');
|
|
163
|
+
parts.push(pattern.id || '*');
|
|
164
|
+
if (pattern.entity !== undefined) {
|
|
165
|
+
parts.push(pattern.entity);
|
|
166
|
+
}
|
|
167
|
+
if (pattern.subtype !== undefined) {
|
|
168
|
+
parts.push(pattern.subtype);
|
|
169
|
+
}
|
|
170
|
+
return parts.join(':');
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Validate correlation key with detailed error messages
|
|
174
|
+
*
|
|
175
|
+
* @param keyString - Correlation key string to validate
|
|
176
|
+
* @returns Validation errors (empty array if valid)
|
|
177
|
+
*/ export function validateCorrelationKey(keyString) {
|
|
178
|
+
const errors = [];
|
|
179
|
+
// Check for null/undefined
|
|
180
|
+
if (!keyString || typeof keyString !== 'string') {
|
|
181
|
+
errors.push({
|
|
182
|
+
code: 'MISSING_REQUIRED',
|
|
183
|
+
message: 'Correlation key must be a non-empty string',
|
|
184
|
+
value: String(keyString)
|
|
185
|
+
});
|
|
186
|
+
return errors;
|
|
187
|
+
}
|
|
188
|
+
// Check format (minimum 2 parts: type:id)
|
|
189
|
+
const parts = keyString.split(':');
|
|
190
|
+
if (parts.length < 2) {
|
|
191
|
+
errors.push({
|
|
192
|
+
code: 'INVALID_FORMAT',
|
|
193
|
+
message: 'Correlation key must have at least 2 parts (type:id)',
|
|
194
|
+
value: keyString
|
|
195
|
+
});
|
|
196
|
+
return errors;
|
|
197
|
+
}
|
|
198
|
+
const [type, id, entity, subtype] = parts;
|
|
199
|
+
// Validate type
|
|
200
|
+
if (![
|
|
201
|
+
'task',
|
|
202
|
+
'agent',
|
|
203
|
+
'skill',
|
|
204
|
+
'execution'
|
|
205
|
+
].includes(type)) {
|
|
206
|
+
errors.push({
|
|
207
|
+
code: 'INVALID_TYPE',
|
|
208
|
+
message: `Invalid correlation type. Must be one of: task, agent, skill, execution`,
|
|
209
|
+
field: 'type',
|
|
210
|
+
value: type
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// Validate ID (non-empty)
|
|
214
|
+
if (!id || id.trim() === '') {
|
|
215
|
+
errors.push({
|
|
216
|
+
code: 'MISSING_REQUIRED',
|
|
217
|
+
message: 'Correlation ID cannot be empty',
|
|
218
|
+
field: 'id',
|
|
219
|
+
value: id
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
// Validate entity (if present, check against type map)
|
|
223
|
+
if (entity && type && isValidKeyType(type)) {
|
|
224
|
+
const validEntities = ENTITY_TYPE_MAP[type];
|
|
225
|
+
if (validEntities && !validEntities.includes(entity)) {
|
|
226
|
+
errors.push({
|
|
227
|
+
code: 'INVALID_PATTERN',
|
|
228
|
+
message: `Invalid entity '${entity}' for type '${type}'. Valid entities: ${validEntities.join(', ')}`,
|
|
229
|
+
field: 'entity',
|
|
230
|
+
value: entity
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return errors;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Check if correlation key is valid
|
|
238
|
+
*
|
|
239
|
+
* @param keyString - Correlation key to check
|
|
240
|
+
* @returns True if valid, false otherwise
|
|
241
|
+
*/ export function isValidCorrelationKey(keyString) {
|
|
242
|
+
return validateCorrelationKey(keyString).length === 0;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get entity types for a correlation key type
|
|
246
|
+
*
|
|
247
|
+
* @param type - Correlation key type
|
|
248
|
+
* @returns Array of valid entity types
|
|
249
|
+
*/ export function getEntityTypes(type) {
|
|
250
|
+
return ENTITY_TYPE_MAP[type] || [];
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Build multiple correlation keys in batch
|
|
254
|
+
*
|
|
255
|
+
* @param keys - Array of correlation key parts
|
|
256
|
+
* @returns Array of correlation key strings
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```typescript
|
|
260
|
+
* buildBatch([
|
|
261
|
+
* { type: 'task', id: 'task-1', entity: 'agent' },
|
|
262
|
+
* { type: 'task', id: 'task-1', entity: 'skill' },
|
|
263
|
+
* ])
|
|
264
|
+
* // Returns: ['task:task-1:agent', 'task:task-1:skill']
|
|
265
|
+
* ```
|
|
266
|
+
*/ export function buildBatch(keys) {
|
|
267
|
+
return keys.map(buildCorrelationKey);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Parse multiple correlation keys in batch
|
|
271
|
+
*
|
|
272
|
+
* @param keyStrings - Array of correlation key strings
|
|
273
|
+
* @returns Array of parsed correlation keys (nulls filtered out)
|
|
274
|
+
*/ export function parseBatch(keyStrings) {
|
|
275
|
+
return keyStrings.map(parseCorrelationKey).filter((key)=>key !== null);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Match correlation key against wildcard pattern
|
|
279
|
+
*
|
|
280
|
+
* @param keyString - Correlation key to match
|
|
281
|
+
* @param pattern - Wildcard pattern
|
|
282
|
+
* @returns True if key matches pattern
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* matchesWildcard('task:abc123:agent:backend', {
|
|
287
|
+
* type: 'task',
|
|
288
|
+
* id: '*',
|
|
289
|
+
* entity: 'agent'
|
|
290
|
+
* }) // Returns: true
|
|
291
|
+
*
|
|
292
|
+
* matchesWildcard('agent:xyz:execution', {
|
|
293
|
+
* type: 'task'
|
|
294
|
+
* }) // Returns: false
|
|
295
|
+
* ```
|
|
296
|
+
*/ export function matchesWildcard(keyString, pattern) {
|
|
297
|
+
const key = parseCorrelationKey(keyString);
|
|
298
|
+
if (!key) {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
// Check type
|
|
302
|
+
if (pattern.type && pattern.type !== '*' && key.type !== pattern.type) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
// Check ID
|
|
306
|
+
if (pattern.id && pattern.id !== '*' && key.id !== pattern.id) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
// Check entity
|
|
310
|
+
if (pattern.entity !== undefined && pattern.entity !== '*' && key.entity !== pattern.entity) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
// Check subtype
|
|
314
|
+
if (pattern.subtype !== undefined && pattern.subtype !== '*' && key.subtype !== pattern.subtype) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Filter correlation keys by wildcard pattern
|
|
321
|
+
*
|
|
322
|
+
* @param keyStrings - Array of correlation keys
|
|
323
|
+
* @param pattern - Wildcard pattern to filter by
|
|
324
|
+
* @returns Filtered array of keys matching pattern
|
|
325
|
+
*/ export function filterByPattern(keyStrings, pattern) {
|
|
326
|
+
return keyStrings.filter((key)=>matchesWildcard(key, pattern));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
//# sourceMappingURL=correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/database-service/correlation.ts"],"sourcesContent":["/**\r\n * Correlation Key Utilities\r\n *\r\n * Provides correlation key generation and parsing for cross-database lookups.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n *\r\n * Format: {type}:{id}:{entity}:{subtype}\r\n * Examples:\r\n * - task:abc123:agent:backend-developer\r\n * - task:abc123:skill:auth-validation\r\n * - agent:agent-456:execution:iteration-1\r\n */\r\n\r\nimport { CorrelationKey } from './types.js';\r\n\r\n/**\r\n * Build correlation key string\r\n */\r\nexport function buildCorrelationKey(key: CorrelationKey): string {\r\n const parts = [key.type, key.id];\r\n\r\n if (key.entity) {\r\n parts.push(key.entity);\r\n }\r\n\r\n if (key.subtype) {\r\n parts.push(key.subtype);\r\n }\r\n\r\n return parts.join(':');\r\n}\r\n\r\n/**\r\n * Parse correlation key string\r\n */\r\nexport function parseCorrelationKey(keyString: string): CorrelationKey | null {\r\n const parts = keyString.split(':');\r\n\r\n if (parts.length < 2) {\r\n return null;\r\n }\r\n\r\n const [type, id, entity, subtype] = parts;\r\n\r\n if (!isValidKeyType(type)) {\r\n return null;\r\n }\r\n\r\n return {\r\n type: type as CorrelationKey['type'],\r\n id,\r\n entity,\r\n subtype,\r\n };\r\n}\r\n\r\n/**\r\n * Check if correlation key type is valid\r\n */\r\nfunction isValidKeyType(type: string): type is CorrelationKey['type'] {\r\n return ['task', 'agent', 'skill', 'execution'].includes(type);\r\n}\r\n\r\n/**\r\n * Build task correlation key\r\n */\r\nexport function buildTaskKey(taskId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'task',\r\n id: taskId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Build agent correlation key\r\n */\r\nexport function buildAgentKey(agentId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'agent',\r\n id: agentId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Build skill correlation key\r\n */\r\nexport function buildSkillKey(skillId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'skill',\r\n id: skillId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Build execution correlation key\r\n */\r\nexport function buildExecutionKey(executionId: string, entity?: string): string {\r\n return buildCorrelationKey({\r\n type: 'execution',\r\n id: executionId,\r\n entity,\r\n });\r\n}\r\n\r\n/**\r\n * Extract task ID from correlation key\r\n */\r\nexport function extractTaskId(keyString: string): string | null {\r\n const key = parseCorrelationKey(keyString);\r\n return key && key.type === 'task' ? key.id : null;\r\n}\r\n\r\n/**\r\n * Extract agent ID from correlation key\r\n */\r\nexport function extractAgentId(keyString: string): string | null {\r\n const key = parseCorrelationKey(keyString);\r\n return key && key.type === 'agent' ? key.id : null;\r\n}\r\n\r\n/**\r\n * Check if correlation key matches pattern\r\n */\r\nexport function matchesPattern(keyString: string, pattern: Partial<CorrelationKey>): boolean {\r\n const key = parseCorrelationKey(keyString);\r\n\r\n if (!key) {\r\n return false;\r\n }\r\n\r\n if (pattern.type && key.type !== pattern.type) {\r\n return false;\r\n }\r\n\r\n if (pattern.id && key.id !== pattern.id) {\r\n return false;\r\n }\r\n\r\n if (pattern.entity && key.entity !== pattern.entity) {\r\n return false;\r\n }\r\n\r\n if (pattern.subtype && key.subtype !== pattern.subtype) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Wildcard pattern for correlation key queries\r\n * Part of Task 3.3: Query Correlation Key Layer\r\n */\r\nexport interface WildcardPattern {\r\n type?: 'task' | 'agent' | 'skill' | 'execution' | '*';\r\n id?: string | '*';\r\n entity?: string | '*';\r\n subtype?: string | '*';\r\n}\r\n\r\n/**\r\n * Validation error details\r\n */\r\nexport interface ValidationError {\r\n code: 'INVALID_FORMAT' | 'INVALID_TYPE' | 'MISSING_REQUIRED' | 'INVALID_PATTERN';\r\n message: string;\r\n field?: string;\r\n value?: string;\r\n}\r\n\r\n/**\r\n * Entity type mapping for cross-database queries\r\n */\r\nexport const ENTITY_TYPE_MAP = {\r\n agent: ['execution', 'result', 'metadata'],\r\n skill: ['invocation', 'result', 'metadata'],\r\n task: ['agent', 'skill', 'artifact', 'event'],\r\n execution: ['step', 'log', 'metric'],\r\n} as const;\r\n\r\n/**\r\n * Generate wildcard pattern string for Redis SCAN operations\r\n *\r\n * @example\r\n * ```typescript\r\n * buildWildcardPattern({ type: 'task', id: '*', entity: 'agent' })\r\n * // Returns: \"task:*:agent\"\r\n *\r\n * buildWildcardPattern({ type: '*', id: 'abc123' })\r\n * // Returns: \"*:abc123\"\r\n * ```\r\n */\r\nexport function buildWildcardPattern(pattern: WildcardPattern): string {\r\n const parts: string[] = [];\r\n\r\n parts.push(pattern.type || '*');\r\n parts.push(pattern.id || '*');\r\n\r\n if (pattern.entity !== undefined) {\r\n parts.push(pattern.entity);\r\n }\r\n\r\n if (pattern.subtype !== undefined) {\r\n parts.push(pattern.subtype);\r\n }\r\n\r\n return parts.join(':');\r\n}\r\n\r\n/**\r\n * Validate correlation key with detailed error messages\r\n *\r\n * @param keyString - Correlation key string to validate\r\n * @returns Validation errors (empty array if valid)\r\n */\r\nexport function validateCorrelationKey(keyString: string): ValidationError[] {\r\n const errors: ValidationError[] = [];\r\n\r\n // Check for null/undefined\r\n if (!keyString || typeof keyString !== 'string') {\r\n errors.push({\r\n code: 'MISSING_REQUIRED',\r\n message: 'Correlation key must be a non-empty string',\r\n value: String(keyString),\r\n });\r\n return errors;\r\n }\r\n\r\n // Check format (minimum 2 parts: type:id)\r\n const parts = keyString.split(':');\r\n if (parts.length < 2) {\r\n errors.push({\r\n code: 'INVALID_FORMAT',\r\n message: 'Correlation key must have at least 2 parts (type:id)',\r\n value: keyString,\r\n });\r\n return errors;\r\n }\r\n\r\n const [type, id, entity, subtype] = parts;\r\n\r\n // Validate type\r\n if (!['task', 'agent', 'skill', 'execution'].includes(type)) {\r\n errors.push({\r\n code: 'INVALID_TYPE',\r\n message: `Invalid correlation type. Must be one of: task, agent, skill, execution`,\r\n field: 'type',\r\n value: type,\r\n });\r\n }\r\n\r\n // Validate ID (non-empty)\r\n if (!id || id.trim() === '') {\r\n errors.push({\r\n code: 'MISSING_REQUIRED',\r\n message: 'Correlation ID cannot be empty',\r\n field: 'id',\r\n value: id,\r\n });\r\n }\r\n\r\n // Validate entity (if present, check against type map)\r\n if (entity && type && isValidKeyType(type)) {\r\n const validEntities = ENTITY_TYPE_MAP[type];\r\n if (validEntities && !validEntities.includes(entity as any)) {\r\n errors.push({\r\n code: 'INVALID_PATTERN',\r\n message: `Invalid entity '${entity}' for type '${type}'. Valid entities: ${validEntities.join(', ')}`,\r\n field: 'entity',\r\n value: entity,\r\n });\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n/**\r\n * Check if correlation key is valid\r\n *\r\n * @param keyString - Correlation key to check\r\n * @returns True if valid, false otherwise\r\n */\r\nexport function isValidCorrelationKey(keyString: string): boolean {\r\n return validateCorrelationKey(keyString).length === 0;\r\n}\r\n\r\n/**\r\n * Get entity types for a correlation key type\r\n *\r\n * @param type - Correlation key type\r\n * @returns Array of valid entity types\r\n */\r\nexport function getEntityTypes(type: CorrelationKey['type']): readonly string[] {\r\n return ENTITY_TYPE_MAP[type] || [];\r\n}\r\n\r\n/**\r\n * Build multiple correlation keys in batch\r\n *\r\n * @param keys - Array of correlation key parts\r\n * @returns Array of correlation key strings\r\n *\r\n * @example\r\n * ```typescript\r\n * buildBatch([\r\n * { type: 'task', id: 'task-1', entity: 'agent' },\r\n * { type: 'task', id: 'task-1', entity: 'skill' },\r\n * ])\r\n * // Returns: ['task:task-1:agent', 'task:task-1:skill']\r\n * ```\r\n */\r\nexport function buildBatch(keys: CorrelationKey[]): string[] {\r\n return keys.map(buildCorrelationKey);\r\n}\r\n\r\n/**\r\n * Parse multiple correlation keys in batch\r\n *\r\n * @param keyStrings - Array of correlation key strings\r\n * @returns Array of parsed correlation keys (nulls filtered out)\r\n */\r\nexport function parseBatch(keyStrings: string[]): CorrelationKey[] {\r\n return keyStrings\r\n .map(parseCorrelationKey)\r\n .filter((key): key is CorrelationKey => key !== null);\r\n}\r\n\r\n/**\r\n * Match correlation key against wildcard pattern\r\n *\r\n * @param keyString - Correlation key to match\r\n * @param pattern - Wildcard pattern\r\n * @returns True if key matches pattern\r\n *\r\n * @example\r\n * ```typescript\r\n * matchesWildcard('task:abc123:agent:backend', {\r\n * type: 'task',\r\n * id: '*',\r\n * entity: 'agent'\r\n * }) // Returns: true\r\n *\r\n * matchesWildcard('agent:xyz:execution', {\r\n * type: 'task'\r\n * }) // Returns: false\r\n * ```\r\n */\r\nexport function matchesWildcard(keyString: string, pattern: WildcardPattern): boolean {\r\n const key = parseCorrelationKey(keyString);\r\n\r\n if (!key) {\r\n return false;\r\n }\r\n\r\n // Check type\r\n if (pattern.type && pattern.type !== '*' && key.type !== pattern.type) {\r\n return false;\r\n }\r\n\r\n // Check ID\r\n if (pattern.id && pattern.id !== '*' && key.id !== pattern.id) {\r\n return false;\r\n }\r\n\r\n // Check entity\r\n if (pattern.entity !== undefined && pattern.entity !== '*' && key.entity !== pattern.entity) {\r\n return false;\r\n }\r\n\r\n // Check subtype\r\n if (pattern.subtype !== undefined && pattern.subtype !== '*' && key.subtype !== pattern.subtype) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Filter correlation keys by wildcard pattern\r\n *\r\n * @param keyStrings - Array of correlation keys\r\n * @param pattern - Wildcard pattern to filter by\r\n * @returns Filtered array of keys matching pattern\r\n */\r\nexport function filterByPattern(keyStrings: string[], pattern: WildcardPattern): string[] {\r\n return keyStrings.filter(key => matchesWildcard(key, pattern));\r\n}\r\n"],"names":["buildCorrelationKey","key","parts","type","id","entity","push","subtype","join","parseCorrelationKey","keyString","split","length","isValidKeyType","includes","buildTaskKey","taskId","buildAgentKey","agentId","buildSkillKey","skillId","buildExecutionKey","executionId","extractTaskId","extractAgentId","matchesPattern","pattern","ENTITY_TYPE_MAP","agent","skill","task","execution","buildWildcardPattern","undefined","validateCorrelationKey","errors","code","message","value","String","field","trim","validEntities","isValidCorrelationKey","getEntityTypes","buildBatch","keys","map","parseBatch","keyStrings","filter","matchesWildcard","filterByPattern"],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Error Handling Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized error handling for database operations.
|
|
5
|
+
* Part of Task 0.4: Database Query Abstraction Layer (MVP)
|
|
6
|
+
*/ /**
|
|
7
|
+
* Database error codes
|
|
8
|
+
*/ export var DatabaseErrorCode = /*#__PURE__*/ function(DatabaseErrorCode) {
|
|
9
|
+
DatabaseErrorCode["CONNECTION_FAILED"] = "DB_CONNECTION_FAILED";
|
|
10
|
+
DatabaseErrorCode["QUERY_FAILED"] = "DB_QUERY_FAILED";
|
|
11
|
+
DatabaseErrorCode["TRANSACTION_FAILED"] = "DB_TRANSACTION_FAILED";
|
|
12
|
+
DatabaseErrorCode["VALIDATION_FAILED"] = "DB_VALIDATION_FAILED";
|
|
13
|
+
DatabaseErrorCode["NOT_FOUND"] = "DB_NOT_FOUND";
|
|
14
|
+
DatabaseErrorCode["DUPLICATE_KEY"] = "DB_DUPLICATE_KEY";
|
|
15
|
+
DatabaseErrorCode["TIMEOUT"] = "DB_TIMEOUT";
|
|
16
|
+
DatabaseErrorCode["CONSTRAINT_VIOLATION"] = "DB_CONSTRAINT_VIOLATION";
|
|
17
|
+
DatabaseErrorCode["UNKNOWN_ERROR"] = "DB_UNKNOWN_ERROR";
|
|
18
|
+
return DatabaseErrorCode;
|
|
19
|
+
}({});
|
|
20
|
+
/**
|
|
21
|
+
* Create standardized database error
|
|
22
|
+
*/ export function createDatabaseError(code, message, originalError, context) {
|
|
23
|
+
return {
|
|
24
|
+
code,
|
|
25
|
+
message,
|
|
26
|
+
originalError,
|
|
27
|
+
context
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create failed operation result
|
|
32
|
+
*/ export function createFailedResult(error) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create successful operation result
|
|
40
|
+
*/ export function createSuccessResult(data, rowsAffected, insertId) {
|
|
41
|
+
return {
|
|
42
|
+
success: true,
|
|
43
|
+
data,
|
|
44
|
+
rowsAffected,
|
|
45
|
+
insertId
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Wrap database operation with error handling
|
|
50
|
+
*/ export async function wrapDatabaseOperation(operation, errorCode, errorMessage, context) {
|
|
51
|
+
try {
|
|
52
|
+
const data = await operation();
|
|
53
|
+
return createSuccessResult(data);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
const error = createDatabaseError(errorCode, errorMessage, err instanceof Error ? err : new Error(String(err)), context);
|
|
56
|
+
return createFailedResult(error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if error is a specific database error code
|
|
61
|
+
*/ export function isDatabaseError(error, code) {
|
|
62
|
+
return error && typeof error === 'object' && error.code === code;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Map SQLite error to database error code
|
|
66
|
+
*/ export function mapSQLiteError(error) {
|
|
67
|
+
const message = error.message.toLowerCase();
|
|
68
|
+
if (message.includes('unique constraint')) {
|
|
69
|
+
return "DB_DUPLICATE_KEY";
|
|
70
|
+
}
|
|
71
|
+
if (message.includes('foreign key constraint')) {
|
|
72
|
+
return "DB_CONSTRAINT_VIOLATION";
|
|
73
|
+
}
|
|
74
|
+
if (message.includes('not found')) {
|
|
75
|
+
return "DB_NOT_FOUND";
|
|
76
|
+
}
|
|
77
|
+
if (message.includes('timeout')) {
|
|
78
|
+
return "DB_TIMEOUT";
|
|
79
|
+
}
|
|
80
|
+
return "DB_QUERY_FAILED";
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Map PostgreSQL error to database error code
|
|
84
|
+
*/ export function mapPostgresError(error) {
|
|
85
|
+
const code = error.code;
|
|
86
|
+
// PostgreSQL error codes
|
|
87
|
+
if (code === '23505') {
|
|
88
|
+
return "DB_DUPLICATE_KEY";
|
|
89
|
+
}
|
|
90
|
+
if (code === '23503') {
|
|
91
|
+
return "DB_CONSTRAINT_VIOLATION";
|
|
92
|
+
}
|
|
93
|
+
if (code === '42P01') {
|
|
94
|
+
return "DB_NOT_FOUND";
|
|
95
|
+
}
|
|
96
|
+
if (code === '57014') {
|
|
97
|
+
return "DB_TIMEOUT";
|
|
98
|
+
}
|
|
99
|
+
if (code?.startsWith('08')) {
|
|
100
|
+
return "DB_CONNECTION_FAILED";
|
|
101
|
+
}
|
|
102
|
+
return "DB_QUERY_FAILED";
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Map Redis error to database error code
|
|
106
|
+
*/ export function mapRedisError(error) {
|
|
107
|
+
const message = error.message.toLowerCase();
|
|
108
|
+
if (message.includes('connection')) {
|
|
109
|
+
return "DB_CONNECTION_FAILED";
|
|
110
|
+
}
|
|
111
|
+
if (message.includes('timeout')) {
|
|
112
|
+
return "DB_TIMEOUT";
|
|
113
|
+
}
|
|
114
|
+
if (message.includes('not found') || message.includes('nil')) {
|
|
115
|
+
return "DB_NOT_FOUND";
|
|
116
|
+
}
|
|
117
|
+
return "DB_QUERY_FAILED";
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/database-service/errors.ts"],"sourcesContent":["/**\r\n * Database Error Handling Utilities\r\n *\r\n * Provides standardized error handling for database operations.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n */\r\n\r\nimport { DatabaseError, OperationResult } from './types.js';\r\n\r\n/**\r\n * Database error codes\r\n */\r\nexport enum DatabaseErrorCode {\r\n CONNECTION_FAILED = 'DB_CONNECTION_FAILED',\r\n QUERY_FAILED = 'DB_QUERY_FAILED',\r\n TRANSACTION_FAILED = 'DB_TRANSACTION_FAILED',\r\n VALIDATION_FAILED = 'DB_VALIDATION_FAILED',\r\n NOT_FOUND = 'DB_NOT_FOUND',\r\n DUPLICATE_KEY = 'DB_DUPLICATE_KEY',\r\n TIMEOUT = 'DB_TIMEOUT',\r\n CONSTRAINT_VIOLATION = 'DB_CONSTRAINT_VIOLATION',\r\n UNKNOWN_ERROR = 'DB_UNKNOWN_ERROR',\r\n}\r\n\r\n/**\r\n * Create standardized database error\r\n */\r\nexport function createDatabaseError(\r\n code: DatabaseErrorCode,\r\n message: string,\r\n originalError?: Error,\r\n context?: Record<string, any>\r\n): DatabaseError {\r\n return {\r\n code,\r\n message,\r\n originalError,\r\n context,\r\n };\r\n}\r\n\r\n/**\r\n * Create failed operation result\r\n */\r\nexport function createFailedResult<T = any>(error: DatabaseError): OperationResult<T> {\r\n return {\r\n success: false,\r\n error,\r\n };\r\n}\r\n\r\n/**\r\n * Create successful operation result\r\n */\r\nexport function createSuccessResult<T = any>(\r\n data?: T,\r\n rowsAffected?: number,\r\n insertId?: string | number\r\n): OperationResult<T> {\r\n return {\r\n success: true,\r\n data,\r\n rowsAffected,\r\n insertId,\r\n };\r\n}\r\n\r\n/**\r\n * Wrap database operation with error handling\r\n */\r\nexport async function wrapDatabaseOperation<T>(\r\n operation: () => Promise<T>,\r\n errorCode: DatabaseErrorCode,\r\n errorMessage: string,\r\n context?: Record<string, any>\r\n): Promise<OperationResult<T>> {\r\n try {\r\n const data = await operation();\r\n return createSuccessResult(data);\r\n } catch (err) {\r\n const error = createDatabaseError(\r\n errorCode,\r\n errorMessage,\r\n err instanceof Error ? err : new Error(String(err)),\r\n context\r\n );\r\n return createFailedResult(error);\r\n }\r\n}\r\n\r\n/**\r\n * Check if error is a specific database error code\r\n */\r\nexport function isDatabaseError(error: any, code: DatabaseErrorCode): boolean {\r\n return error && typeof error === 'object' && error.code === code;\r\n}\r\n\r\n/**\r\n * Map SQLite error to database error code\r\n */\r\nexport function mapSQLiteError(error: Error): DatabaseErrorCode {\r\n const message = error.message.toLowerCase();\r\n\r\n if (message.includes('unique constraint')) {\r\n return DatabaseErrorCode.DUPLICATE_KEY;\r\n }\r\n if (message.includes('foreign key constraint')) {\r\n return DatabaseErrorCode.CONSTRAINT_VIOLATION;\r\n }\r\n if (message.includes('not found')) {\r\n return DatabaseErrorCode.NOT_FOUND;\r\n }\r\n if (message.includes('timeout')) {\r\n return DatabaseErrorCode.TIMEOUT;\r\n }\r\n\r\n return DatabaseErrorCode.QUERY_FAILED;\r\n}\r\n\r\n/**\r\n * Map PostgreSQL error to database error code\r\n */\r\nexport function mapPostgresError(error: any): DatabaseErrorCode {\r\n const code = error.code;\r\n\r\n // PostgreSQL error codes\r\n if (code === '23505') {\r\n return DatabaseErrorCode.DUPLICATE_KEY;\r\n }\r\n if (code === '23503') {\r\n return DatabaseErrorCode.CONSTRAINT_VIOLATION;\r\n }\r\n if (code === '42P01') {\r\n return DatabaseErrorCode.NOT_FOUND;\r\n }\r\n if (code === '57014') {\r\n return DatabaseErrorCode.TIMEOUT;\r\n }\r\n if (code?.startsWith('08')) {\r\n return DatabaseErrorCode.CONNECTION_FAILED;\r\n }\r\n\r\n return DatabaseErrorCode.QUERY_FAILED;\r\n}\r\n\r\n/**\r\n * Map Redis error to database error code\r\n */\r\nexport function mapRedisError(error: Error): DatabaseErrorCode {\r\n const message = error.message.toLowerCase();\r\n\r\n if (message.includes('connection')) {\r\n return DatabaseErrorCode.CONNECTION_FAILED;\r\n }\r\n if (message.includes('timeout')) {\r\n return DatabaseErrorCode.TIMEOUT;\r\n }\r\n if (message.includes('not found') || message.includes('nil')) {\r\n return DatabaseErrorCode.NOT_FOUND;\r\n }\r\n\r\n return DatabaseErrorCode.QUERY_FAILED;\r\n}\r\n"],"names":["DatabaseErrorCode","createDatabaseError","code","message","originalError","context","createFailedResult","error","success","createSuccessResult","data","rowsAffected","insertId","wrapDatabaseOperation","operation","errorCode","errorMessage","err","Error","String","isDatabaseError","mapSQLiteError","toLowerCase","includes","mapPostgresError","startsWith","mapRedisError"],"mappings":"AAAA;;;;;CAKC,GAID;;CAEC,GACD,OAAO,IAAA,AAAKA,2CAAAA;;;;;;;;;;WAAAA;MAUX;AAED;;CAEC,GACD,OAAO,SAASC,oBACdC,IAAuB,EACvBC,OAAe,EACfC,aAAqB,EACrBC,OAA6B;IAE7B,OAAO;QACLH;QACAC;QACAC;QACAC;IACF;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,mBAA4BC,KAAoB;IAC9D,OAAO;QACLC,SAAS;QACTD;IACF;AACF;AAEA;;CAEC,GACD,OAAO,SAASE,oBACdC,IAAQ,EACRC,YAAqB,EACrBC,QAA0B;IAE1B,OAAO;QACLJ,SAAS;QACTE;QACAC;QACAC;IACF;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,sBACpBC,SAA2B,EAC3BC,SAA4B,EAC5BC,YAAoB,EACpBX,OAA6B;IAE7B,IAAI;QACF,MAAMK,OAAO,MAAMI;QACnB,OAAOL,oBAAoBC;IAC7B,EAAE,OAAOO,KAAK;QACZ,MAAMV,QAAQN,oBACZc,WACAC,cACAC,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF,OAC9CZ;QAEF,OAAOC,mBAAmBC;IAC5B;AACF;AAEA;;CAEC,GACD,OAAO,SAASa,gBAAgBb,KAAU,EAAEL,IAAuB;IACjE,OAAOK,SAAS,OAAOA,UAAU,YAAYA,MAAML,IAAI,KAAKA;AAC9D;AAEA;;CAEC,GACD,OAAO,SAASmB,eAAed,KAAY;IACzC,MAAMJ,UAAUI,MAAMJ,OAAO,CAACmB,WAAW;IAEzC,IAAInB,QAAQoB,QAAQ,CAAC,sBAAsB;QACzC;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,2BAA2B;QAC9C;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,cAAc;QACjC;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,YAAY;QAC/B;IACF;IAEA;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,iBAAiBjB,KAAU;IACzC,MAAML,OAAOK,MAAML,IAAI;IAEvB,yBAAyB;IACzB,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,SAAS,SAAS;QACpB;IACF;IACA,IAAIA,MAAMuB,WAAW,OAAO;QAC1B;IACF;IAEA;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,cAAcnB,KAAY;IACxC,MAAMJ,UAAUI,MAAMJ,OAAO,CAACmB,WAAW;IAEzC,IAAInB,QAAQoB,QAAQ,CAAC,eAAe;QAClC;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,YAAY;QAC/B;IACF;IACA,IAAIpB,QAAQoB,QAAQ,CAAC,gBAAgBpB,QAAQoB,QAAQ,CAAC,QAAQ;QAC5D;IACF;IAEA;AACF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Service - Main Entry Point
|
|
3
|
+
*
|
|
4
|
+
* Unified database abstraction layer for Redis, SQLite, and PostgreSQL.
|
|
5
|
+
* Part of Task 0.4: Database Query Abstraction Layer (MVP)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const dbService = new DatabaseService({
|
|
10
|
+
* redis: { type: 'redis', host: 'localhost', port: 6379 },
|
|
11
|
+
* sqlite: { type: 'sqlite', database: './data.db' },
|
|
12
|
+
* postgres: { type: 'postgres', connectionString: 'postgresql://...' }
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* await dbService.connect();
|
|
16
|
+
*
|
|
17
|
+
* // Get data by correlation key across all databases
|
|
18
|
+
* const data = await dbService.getByCorrelationKey({
|
|
19
|
+
* type: 'task',
|
|
20
|
+
* id: 'abc123',
|
|
21
|
+
* entity: 'agent'
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/ import { RedisAdapter } from './redis-adapter.js';
|
|
25
|
+
import { SQLiteAdapter } from './sqlite-adapter.js';
|
|
26
|
+
import { PostgresAdapter } from './postgres-adapter.js';
|
|
27
|
+
import { TransactionManager } from './transaction-manager.js';
|
|
28
|
+
import { buildCorrelationKey, parseCorrelationKey, buildTaskKey, buildAgentKey, buildSkillKey, buildExecutionKey } from './correlation.js';
|
|
29
|
+
import { DatabaseErrorCode, createDatabaseError } from './errors.js';
|
|
30
|
+
export class DatabaseService {
|
|
31
|
+
adapters = new Map();
|
|
32
|
+
transactionManager;
|
|
33
|
+
config;
|
|
34
|
+
constructor(config){
|
|
35
|
+
this.config = config;
|
|
36
|
+
this.transactionManager = new TransactionManager();
|
|
37
|
+
// Initialize adapters
|
|
38
|
+
if (config.redis) {
|
|
39
|
+
this.adapters.set('redis', new RedisAdapter(config.redis));
|
|
40
|
+
}
|
|
41
|
+
if (config.sqlite) {
|
|
42
|
+
this.adapters.set('sqlite', new SQLiteAdapter(config.sqlite));
|
|
43
|
+
}
|
|
44
|
+
if (config.postgres) {
|
|
45
|
+
this.adapters.set('postgres', new PostgresAdapter(config.postgres));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Connect to all configured databases
|
|
50
|
+
*/ async connect() {
|
|
51
|
+
const promises = Array.from(this.adapters.values()).map((adapter)=>adapter.connect());
|
|
52
|
+
await Promise.all(promises);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Disconnect from all databases
|
|
56
|
+
*/ async disconnect() {
|
|
57
|
+
const promises = Array.from(this.adapters.values()).map((adapter)=>adapter.disconnect());
|
|
58
|
+
await Promise.all(promises);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get adapter for specific database
|
|
62
|
+
*/ getAdapter(type) {
|
|
63
|
+
const adapter = this.adapters.get(type);
|
|
64
|
+
if (!adapter) {
|
|
65
|
+
throw createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, `Database adapter not configured: ${type}`, undefined, {
|
|
66
|
+
type
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return adapter;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get record by correlation key across all databases
|
|
73
|
+
*/ async getByCorrelationKey(key) {
|
|
74
|
+
const correlationKeyString = buildCorrelationKey(key);
|
|
75
|
+
const result = {
|
|
76
|
+
correlationKey: correlationKeyString,
|
|
77
|
+
timestamp: new Date()
|
|
78
|
+
};
|
|
79
|
+
// Query each database in parallel
|
|
80
|
+
const promises = [];
|
|
81
|
+
if (this.adapters.has('redis')) {
|
|
82
|
+
promises.push(this.adapters.get('redis').get(correlationKeyString).then((data)=>{
|
|
83
|
+
if (data !== null && data !== undefined) result.redis = data;
|
|
84
|
+
}).catch((err)=>console.warn('Redis lookup failed:', err)));
|
|
85
|
+
}
|
|
86
|
+
if (this.adapters.has('sqlite')) {
|
|
87
|
+
promises.push(this.adapters.get('sqlite').get(correlationKeyString).then((data)=>{
|
|
88
|
+
if (data !== null && data !== undefined) result.sqlite = data;
|
|
89
|
+
}).catch((err)=>console.warn('SQLite lookup failed:', err)));
|
|
90
|
+
}
|
|
91
|
+
if (this.adapters.has('postgres')) {
|
|
92
|
+
promises.push(this.adapters.get('postgres').get(correlationKeyString).then((data)=>{
|
|
93
|
+
if (data !== null && data !== undefined) result.postgres = data;
|
|
94
|
+
}).catch((err)=>console.warn('PostgreSQL lookup failed:', err)));
|
|
95
|
+
}
|
|
96
|
+
await Promise.all(promises);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Execute cross-database transaction
|
|
101
|
+
*/ async executeTransaction(operations) {
|
|
102
|
+
const adapters = operations.map((op)=>this.getAdapter(op.database));
|
|
103
|
+
const ops = operations.map((op)=>op.operation);
|
|
104
|
+
return this.transactionManager.executeTransaction(adapters, ops);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Build correlation key
|
|
108
|
+
*/ buildCorrelationKey(key) {
|
|
109
|
+
return buildCorrelationKey(key);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Parse correlation key
|
|
113
|
+
*/ parseCorrelationKey(key) {
|
|
114
|
+
return parseCorrelationKey(key);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get transaction manager
|
|
118
|
+
*/ getTransactionManager() {
|
|
119
|
+
return this.transactionManager;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if all configured databases are connected
|
|
123
|
+
*/ isConnected() {
|
|
124
|
+
return Array.from(this.adapters.values()).every((adapter)=>adapter.isConnected());
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get database statistics including connection pool metrics
|
|
128
|
+
*/ getStats() {
|
|
129
|
+
const poolStats = {};
|
|
130
|
+
// Get pool stats from each adapter
|
|
131
|
+
if (this.adapters.has('redis')) {
|
|
132
|
+
const adapter = this.adapters.get('redis');
|
|
133
|
+
poolStats.redis = adapter.getPoolStats?.();
|
|
134
|
+
}
|
|
135
|
+
if (this.adapters.has('sqlite')) {
|
|
136
|
+
const adapter = this.adapters.get('sqlite');
|
|
137
|
+
poolStats.sqlite = adapter.getPoolStats?.();
|
|
138
|
+
}
|
|
139
|
+
if (this.adapters.has('postgres')) {
|
|
140
|
+
const adapter = this.adapters.get('postgres');
|
|
141
|
+
poolStats.postgres = adapter.getPoolStats?.();
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
adapters: {
|
|
145
|
+
redis: this.adapters.has('redis') && this.adapters.get('redis').isConnected(),
|
|
146
|
+
sqlite: this.adapters.has('sqlite') && this.adapters.get('sqlite').isConnected(),
|
|
147
|
+
postgres: this.adapters.has('postgres') && this.adapters.get('postgres').isConnected()
|
|
148
|
+
},
|
|
149
|
+
transactions: {
|
|
150
|
+
active: this.transactionManager.getActiveCount()
|
|
151
|
+
},
|
|
152
|
+
connectionPools: poolStats
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Re-export types and utilities
|
|
157
|
+
export * from './types.js';
|
|
158
|
+
export * from './errors.js';
|
|
159
|
+
export * from './correlation.js';
|
|
160
|
+
export { RedisAdapter } from './redis-adapter.js';
|
|
161
|
+
export { SQLiteAdapter } from './sqlite-adapter.js';
|
|
162
|
+
export { PostgresAdapter } from './postgres-adapter.js';
|
|
163
|
+
export { TransactionManager } from './transaction-manager.js';
|
|
164
|
+
export { ConnectionPoolManager } from './connection-pool-manager.js';
|
|
165
|
+
// Re-export correlation utilities
|
|
166
|
+
export { buildTaskKey, buildAgentKey, buildSkillKey, buildExecutionKey };
|
|
167
|
+
|
|
168
|
+
//# sourceMappingURL=index.js.map
|