claude-flow-novice 2.15.3 → 2.15.4
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 +16 -2
- 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 +184 -23
- 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 +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -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 +16 -2
- 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 +184 -23
- 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 +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -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/agent-loader.js +146 -165
- package/dist/agents/agent-loader.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/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/package.json +201 -177
- package/readme/README.md +19 -4
- 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/.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,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Validation Middleware
|
|
3
|
+
*
|
|
4
|
+
* Task: P2-3.2 - JSON Schema Validation Enforcement
|
|
5
|
+
* Provides Express middleware for automatic schema validation
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* app.post('/api/pattern-deployment',
|
|
10
|
+
* validateRequest('database-handoffs/pattern-deployment', '1.0.0'),
|
|
11
|
+
* handlePatternDeployment
|
|
12
|
+
* );
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @module schema-validation
|
|
16
|
+
*/ import { IntegrationSchemaValidator } from '../lib/integration-schema-validator.js';
|
|
17
|
+
import { StandardError, ErrorCode } from '../lib/errors.js';
|
|
18
|
+
import { getGlobalLogger } from '../lib/logging.js';
|
|
19
|
+
import path from 'path';
|
|
20
|
+
const logger = getGlobalLogger();
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Global Validator Instance
|
|
23
|
+
// ============================================================================
|
|
24
|
+
let globalValidator = null;
|
|
25
|
+
/**
|
|
26
|
+
* Initialize global validator instance
|
|
27
|
+
*/ export async function initializeSchemaValidation(schemaPath) {
|
|
28
|
+
const resolvedPath = schemaPath || path.join(process.cwd(), 'schemas/integration-points');
|
|
29
|
+
globalValidator = new IntegrationSchemaValidator({
|
|
30
|
+
schemaPath: resolvedPath,
|
|
31
|
+
enableCache: true,
|
|
32
|
+
strictMode: true
|
|
33
|
+
});
|
|
34
|
+
await globalValidator.initialize();
|
|
35
|
+
logger.info('Schema validation middleware initialized', {
|
|
36
|
+
schemaPath: resolvedPath
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get global validator instance
|
|
41
|
+
*/ function getValidator() {
|
|
42
|
+
if (!globalValidator) {
|
|
43
|
+
throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Schema validator not initialized. Call initializeSchemaValidation() first.', {
|
|
44
|
+
initialized: false
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return globalValidator;
|
|
48
|
+
}
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Middleware Functions
|
|
51
|
+
// ============================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Validate request body against schema
|
|
54
|
+
*
|
|
55
|
+
* @param schemaId - Schema identifier (e.g., "database-handoffs/pattern-deployment")
|
|
56
|
+
* @param version - Schema version (optional, defaults to latest)
|
|
57
|
+
* @param options - Validation options
|
|
58
|
+
*/ export function validateRequest(schemaId, version, options = {}) {
|
|
59
|
+
return async (req, res, next)=>{
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
try {
|
|
62
|
+
const validator = getValidator();
|
|
63
|
+
// Validate request body
|
|
64
|
+
await validator.validate(req.body, schemaId, version);
|
|
65
|
+
const duration = Date.now() - startTime;
|
|
66
|
+
logger.debug('Request validation succeeded', {
|
|
67
|
+
schemaId,
|
|
68
|
+
version,
|
|
69
|
+
path: req.path,
|
|
70
|
+
method: req.method,
|
|
71
|
+
duration
|
|
72
|
+
});
|
|
73
|
+
// Store validated data in request for downstream use
|
|
74
|
+
if (options.attachValidatedData) {
|
|
75
|
+
req.validatedData = req.body;
|
|
76
|
+
}
|
|
77
|
+
next();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
const duration = Date.now() - startTime;
|
|
80
|
+
logger.warn('Request validation failed', {
|
|
81
|
+
schemaId,
|
|
82
|
+
version,
|
|
83
|
+
path: req.path,
|
|
84
|
+
method: req.method,
|
|
85
|
+
duration,
|
|
86
|
+
error: error instanceof Error ? error.message : String(error)
|
|
87
|
+
});
|
|
88
|
+
if (error instanceof StandardError) {
|
|
89
|
+
res.status(400).json({
|
|
90
|
+
error: 'Validation Failed',
|
|
91
|
+
message: error.message,
|
|
92
|
+
code: error.code,
|
|
93
|
+
details: error.context?.errors || [],
|
|
94
|
+
suggestions: error.context?.suggestions || []
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
res.status(500).json({
|
|
98
|
+
error: 'Internal Server Error',
|
|
99
|
+
message: 'Schema validation error'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Validate response body against schema
|
|
107
|
+
*
|
|
108
|
+
* @param schemaId - Schema identifier
|
|
109
|
+
* @param version - Schema version (optional)
|
|
110
|
+
*/ export function validateResponse(schemaId, version) {
|
|
111
|
+
return async (req, res, next)=>{
|
|
112
|
+
const originalSend = res.send;
|
|
113
|
+
const originalJson = res.json;
|
|
114
|
+
// Intercept res.send()
|
|
115
|
+
res.send = function(data) {
|
|
116
|
+
validateResponseData(data, schemaId, version, req, res);
|
|
117
|
+
return originalSend.call(this, data);
|
|
118
|
+
};
|
|
119
|
+
// Intercept res.json()
|
|
120
|
+
res.json = function(data) {
|
|
121
|
+
validateResponseData(data, schemaId, version, req, res);
|
|
122
|
+
return originalJson.call(this, data);
|
|
123
|
+
};
|
|
124
|
+
next();
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Validate response data helper
|
|
129
|
+
*/ async function validateResponseData(data, schemaId, version, req, res) {
|
|
130
|
+
const startTime = Date.now();
|
|
131
|
+
try {
|
|
132
|
+
const validator = getValidator();
|
|
133
|
+
// Only validate if response is successful (2xx)
|
|
134
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
135
|
+
await validator.validate(data, schemaId, version);
|
|
136
|
+
const duration = Date.now() - startTime;
|
|
137
|
+
logger.debug('Response validation succeeded', {
|
|
138
|
+
schemaId,
|
|
139
|
+
version,
|
|
140
|
+
path: req.path,
|
|
141
|
+
statusCode: res.statusCode,
|
|
142
|
+
duration
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
} catch (error) {
|
|
146
|
+
const duration = Date.now() - startTime;
|
|
147
|
+
logger.error('Response validation failed', error, {
|
|
148
|
+
schemaId,
|
|
149
|
+
version,
|
|
150
|
+
path: req.path,
|
|
151
|
+
statusCode: res.statusCode,
|
|
152
|
+
duration
|
|
153
|
+
});
|
|
154
|
+
// Log error but don't modify response
|
|
155
|
+
// Response validation failures are logged for monitoring
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Validate both request and response
|
|
160
|
+
*/ export function validateRequestResponse(requestSchemaId, responseSchemaId, requestVersion, responseVersion) {
|
|
161
|
+
return [
|
|
162
|
+
validateRequest(requestSchemaId, requestVersion),
|
|
163
|
+
validateResponse(responseSchemaId, responseVersion)
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create validation middleware with custom error handler
|
|
168
|
+
*/ export function createValidationMiddleware(options) {
|
|
169
|
+
return async (req, res, next)=>{
|
|
170
|
+
const startTime = Date.now();
|
|
171
|
+
try {
|
|
172
|
+
const validator = getValidator();
|
|
173
|
+
// Determine schema based on request path or custom function
|
|
174
|
+
let schemaId;
|
|
175
|
+
let version;
|
|
176
|
+
if (options.schemaResolver) {
|
|
177
|
+
const resolved = options.schemaResolver(req);
|
|
178
|
+
schemaId = resolved.schemaId;
|
|
179
|
+
version = resolved.version;
|
|
180
|
+
} else if (options.schemaId) {
|
|
181
|
+
schemaId = options.schemaId;
|
|
182
|
+
version = options.version;
|
|
183
|
+
} else {
|
|
184
|
+
throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'No schema resolver or schemaId provided', {
|
|
185
|
+
options
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
// Validate request body
|
|
189
|
+
await validator.validate(req.body, schemaId, version);
|
|
190
|
+
const duration = Date.now() - startTime;
|
|
191
|
+
logger.debug('Validation middleware succeeded', {
|
|
192
|
+
schemaId,
|
|
193
|
+
version,
|
|
194
|
+
path: req.path,
|
|
195
|
+
duration
|
|
196
|
+
});
|
|
197
|
+
next();
|
|
198
|
+
} catch (error) {
|
|
199
|
+
const duration = Date.now() - startTime;
|
|
200
|
+
logger.warn('Validation middleware failed', {
|
|
201
|
+
path: req.path,
|
|
202
|
+
duration,
|
|
203
|
+
error: error instanceof Error ? error.message : String(error)
|
|
204
|
+
});
|
|
205
|
+
if (options.errorHandler) {
|
|
206
|
+
options.errorHandler(error, req, res, next);
|
|
207
|
+
} else {
|
|
208
|
+
// Default error handler
|
|
209
|
+
if (error instanceof StandardError) {
|
|
210
|
+
res.status(400).json({
|
|
211
|
+
error: 'Validation Failed',
|
|
212
|
+
message: error.message,
|
|
213
|
+
code: error.code,
|
|
214
|
+
details: error.context?.errors || []
|
|
215
|
+
});
|
|
216
|
+
} else {
|
|
217
|
+
res.status(500).json({
|
|
218
|
+
error: 'Internal Server Error',
|
|
219
|
+
message: 'Validation error'
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Validate query parameters against schema
|
|
228
|
+
*/ export function validateQueryParams(schemaId, version) {
|
|
229
|
+
return async (req, res, next)=>{
|
|
230
|
+
try {
|
|
231
|
+
const validator = getValidator();
|
|
232
|
+
// Validate query parameters
|
|
233
|
+
await validator.validate(req.query, schemaId, version);
|
|
234
|
+
logger.debug('Query parameter validation succeeded', {
|
|
235
|
+
schemaId,
|
|
236
|
+
version,
|
|
237
|
+
path: req.path
|
|
238
|
+
});
|
|
239
|
+
next();
|
|
240
|
+
} catch (error) {
|
|
241
|
+
logger.warn('Query parameter validation failed', {
|
|
242
|
+
schemaId,
|
|
243
|
+
version,
|
|
244
|
+
path: req.path,
|
|
245
|
+
error: error instanceof Error ? error.message : String(error)
|
|
246
|
+
});
|
|
247
|
+
if (error instanceof StandardError) {
|
|
248
|
+
res.status(400).json({
|
|
249
|
+
error: 'Invalid Query Parameters',
|
|
250
|
+
message: error.message,
|
|
251
|
+
details: error.context?.errors || []
|
|
252
|
+
});
|
|
253
|
+
} else {
|
|
254
|
+
res.status(500).json({
|
|
255
|
+
error: 'Internal Server Error'
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Batch validation middleware
|
|
263
|
+
* Validates an array of items in request body
|
|
264
|
+
*/ export function validateBatch(schemaId, version, options = {}) {
|
|
265
|
+
return async (req, res, next)=>{
|
|
266
|
+
try {
|
|
267
|
+
const validator = getValidator();
|
|
268
|
+
// Ensure request body is an array
|
|
269
|
+
if (!Array.isArray(req.body)) {
|
|
270
|
+
throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Request body must be an array for batch validation', {
|
|
271
|
+
bodyType: typeof req.body
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
// Validate batch
|
|
275
|
+
const result = await validator.validateBatch(req.body, schemaId, version, {
|
|
276
|
+
failFast: options.failFast
|
|
277
|
+
});
|
|
278
|
+
if (!result.valid) {
|
|
279
|
+
res.status(400).json({
|
|
280
|
+
error: 'Batch Validation Failed',
|
|
281
|
+
message: `${result.invalidRecords} of ${result.totalRecords} records failed validation`,
|
|
282
|
+
totalRecords: result.totalRecords,
|
|
283
|
+
validRecords: result.validRecords,
|
|
284
|
+
invalidRecords: result.invalidRecords,
|
|
285
|
+
errors: result.errors
|
|
286
|
+
});
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
logger.debug('Batch validation succeeded', {
|
|
290
|
+
schemaId,
|
|
291
|
+
version,
|
|
292
|
+
totalRecords: result.totalRecords
|
|
293
|
+
});
|
|
294
|
+
next();
|
|
295
|
+
} catch (error) {
|
|
296
|
+
if (error instanceof StandardError) {
|
|
297
|
+
res.status(400).json({
|
|
298
|
+
error: 'Batch Validation Error',
|
|
299
|
+
message: error.message,
|
|
300
|
+
code: error.code
|
|
301
|
+
});
|
|
302
|
+
} else {
|
|
303
|
+
res.status(500).json({
|
|
304
|
+
error: 'Internal Server Error'
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
// ============================================================================
|
|
311
|
+
// Utility Functions
|
|
312
|
+
// ============================================================================
|
|
313
|
+
/**
|
|
314
|
+
* Create schema resolver based on route patterns
|
|
315
|
+
*
|
|
316
|
+
* Example:
|
|
317
|
+
* ```typescript
|
|
318
|
+
* const resolver = createRouteSchemaResolver({
|
|
319
|
+
* '/api/patterns': 'database-handoffs/pattern-deployment',
|
|
320
|
+
* '/api/metrics': 'database-handoffs/execution-metrics',
|
|
321
|
+
* });
|
|
322
|
+
* ```
|
|
323
|
+
*/ export function createRouteSchemaResolver(routeMap) {
|
|
324
|
+
return (req)=>{
|
|
325
|
+
const schemaId = routeMap[req.path];
|
|
326
|
+
if (!schemaId) {
|
|
327
|
+
throw new StandardError(ErrorCode.CONFIGURATION_ERROR, `No schema mapping found for route: ${req.path}`, {
|
|
328
|
+
path: req.path,
|
|
329
|
+
availableRoutes: Object.keys(routeMap)
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
schemaId
|
|
334
|
+
};
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Shutdown schema validation middleware
|
|
339
|
+
*/ export async function shutdownSchemaValidation() {
|
|
340
|
+
if (globalValidator) {
|
|
341
|
+
await globalValidator.shutdown();
|
|
342
|
+
globalValidator = null;
|
|
343
|
+
logger.info('Schema validation middleware shutdown complete');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
//# sourceMappingURL=schema-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/schema-validation.ts"],"sourcesContent":["/**\r\n * Schema Validation Middleware\r\n *\r\n * Task: P2-3.2 - JSON Schema Validation Enforcement\r\n * Provides Express middleware for automatic schema validation\r\n *\r\n * Usage:\r\n * ```typescript\r\n * app.post('/api/pattern-deployment',\r\n * validateRequest('database-handoffs/pattern-deployment', '1.0.0'),\r\n * handlePatternDeployment\r\n * );\r\n * ```\r\n *\r\n * @module schema-validation\r\n */\r\n\r\nimport { Request, Response, NextFunction, RequestHandler } from 'express';\r\nimport { IntegrationSchemaValidator } from '../lib/integration-schema-validator.js';\r\nimport { StandardError, ErrorCode } from '../lib/errors.js';\r\nimport { getGlobalLogger } from '../lib/logging.js';\r\nimport path from 'path';\r\n\r\nconst logger = getGlobalLogger();\r\n\r\n// ============================================================================\r\n// Global Validator Instance\r\n// ============================================================================\r\n\r\nlet globalValidator: IntegrationSchemaValidator | null = null;\r\n\r\n/**\r\n * Initialize global validator instance\r\n */\r\nexport async function initializeSchemaValidation(schemaPath?: string): Promise<void> {\r\n const resolvedPath = schemaPath || path.join(process.cwd(), 'schemas/integration-points');\r\n\r\n globalValidator = new IntegrationSchemaValidator({\r\n schemaPath: resolvedPath,\r\n enableCache: true,\r\n strictMode: true,\r\n });\r\n\r\n await globalValidator.initialize();\r\n\r\n logger.info('Schema validation middleware initialized', {\r\n schemaPath: resolvedPath,\r\n });\r\n}\r\n\r\n/**\r\n * Get global validator instance\r\n */\r\nfunction getValidator(): IntegrationSchemaValidator {\r\n if (!globalValidator) {\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n 'Schema validator not initialized. Call initializeSchemaValidation() first.',\r\n { initialized: false }\r\n );\r\n }\r\n\r\n return globalValidator;\r\n}\r\n\r\n// ============================================================================\r\n// Middleware Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Validate request body against schema\r\n *\r\n * @param schemaId - Schema identifier (e.g., \"database-handoffs/pattern-deployment\")\r\n * @param version - Schema version (optional, defaults to latest)\r\n * @param options - Validation options\r\n */\r\nexport function validateRequest(\r\n schemaId: string,\r\n version?: string,\r\n options: ValidationOptions = {}\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const validator = getValidator();\r\n\r\n // Validate request body\r\n await validator.validate(req.body, schemaId, version);\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n logger.debug('Request validation succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n method: req.method,\r\n duration,\r\n });\r\n\r\n // Store validated data in request for downstream use\r\n if (options.attachValidatedData) {\r\n (req as any).validatedData = req.body;\r\n }\r\n\r\n next();\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n logger.warn('Request validation failed', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n method: req.method,\r\n duration,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Validation Failed',\r\n message: error.message,\r\n code: error.code,\r\n details: error.context?.errors || [],\r\n suggestions: error.context?.suggestions || [],\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n message: 'Schema validation error',\r\n });\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validate response body against schema\r\n *\r\n * @param schemaId - Schema identifier\r\n * @param version - Schema version (optional)\r\n */\r\nexport function validateResponse(\r\n schemaId: string,\r\n version?: string\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n const originalSend = res.send;\r\n const originalJson = res.json;\r\n\r\n // Intercept res.send()\r\n res.send = function (data: any): Response {\r\n validateResponseData(data, schemaId, version, req, res);\r\n return originalSend.call(this, data);\r\n };\r\n\r\n // Intercept res.json()\r\n res.json = function (data: any): Response {\r\n validateResponseData(data, schemaId, version, req, res);\r\n return originalJson.call(this, data);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n\r\n/**\r\n * Validate response data helper\r\n */\r\nasync function validateResponseData(\r\n data: any,\r\n schemaId: string,\r\n version: string | undefined,\r\n req: Request,\r\n res: Response\r\n): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const validator = getValidator();\r\n\r\n // Only validate if response is successful (2xx)\r\n if (res.statusCode >= 200 && res.statusCode < 300) {\r\n await validator.validate(data, schemaId, version);\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n logger.debug('Response validation succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n statusCode: res.statusCode,\r\n duration,\r\n });\r\n }\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n logger.error('Response validation failed', error as Error, {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n statusCode: res.statusCode,\r\n duration,\r\n });\r\n\r\n // Log error but don't modify response\r\n // Response validation failures are logged for monitoring\r\n }\r\n}\r\n\r\n/**\r\n * Validate both request and response\r\n */\r\nexport function validateRequestResponse(\r\n requestSchemaId: string,\r\n responseSchemaId: string,\r\n requestVersion?: string,\r\n responseVersion?: string\r\n): RequestHandler[] {\r\n return [\r\n validateRequest(requestSchemaId, requestVersion),\r\n validateResponse(responseSchemaId, responseVersion),\r\n ];\r\n}\r\n\r\n/**\r\n * Create validation middleware with custom error handler\r\n */\r\nexport function createValidationMiddleware(options: MiddlewareOptions): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const validator = getValidator();\r\n\r\n // Determine schema based on request path or custom function\r\n let schemaId: string;\r\n let version: string | undefined;\r\n\r\n if (options.schemaResolver) {\r\n const resolved = options.schemaResolver(req);\r\n schemaId = resolved.schemaId;\r\n version = resolved.version;\r\n } else if (options.schemaId) {\r\n schemaId = options.schemaId;\r\n version = options.version;\r\n } else {\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n 'No schema resolver or schemaId provided',\r\n { options }\r\n );\r\n }\r\n\r\n // Validate request body\r\n await validator.validate(req.body, schemaId, version);\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n logger.debug('Validation middleware succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n duration,\r\n });\r\n\r\n next();\r\n } catch (error) {\r\n const duration = Date.now() - startTime;\r\n\r\n logger.warn('Validation middleware failed', {\r\n path: req.path,\r\n duration,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n\r\n if (options.errorHandler) {\r\n options.errorHandler(error as Error, req, res, next);\r\n } else {\r\n // Default error handler\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Validation Failed',\r\n message: error.message,\r\n code: error.code,\r\n details: error.context?.errors || [],\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n message: 'Validation error',\r\n });\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validate query parameters against schema\r\n */\r\nexport function validateQueryParams(\r\n schemaId: string,\r\n version?: string\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const validator = getValidator();\r\n\r\n // Validate query parameters\r\n await validator.validate(req.query, schemaId, version);\r\n\r\n logger.debug('Query parameter validation succeeded', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n });\r\n\r\n next();\r\n } catch (error) {\r\n logger.warn('Query parameter validation failed', {\r\n schemaId,\r\n version,\r\n path: req.path,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Invalid Query Parameters',\r\n message: error.message,\r\n details: error.context?.errors || [],\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n });\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Batch validation middleware\r\n * Validates an array of items in request body\r\n */\r\nexport function validateBatch(\r\n schemaId: string,\r\n version?: string,\r\n options: BatchValidationMiddlewareOptions = {}\r\n): RequestHandler {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const validator = getValidator();\r\n\r\n // Ensure request body is an array\r\n if (!Array.isArray(req.body)) {\r\n throw new StandardError(\r\n ErrorCode.VALIDATION_FAILED,\r\n 'Request body must be an array for batch validation',\r\n { bodyType: typeof req.body }\r\n );\r\n }\r\n\r\n // Validate batch\r\n const result = await validator.validateBatch(req.body, schemaId, version, {\r\n failFast: options.failFast,\r\n });\r\n\r\n if (!result.valid) {\r\n res.status(400).json({\r\n error: 'Batch Validation Failed',\r\n message: `${result.invalidRecords} of ${result.totalRecords} records failed validation`,\r\n totalRecords: result.totalRecords,\r\n validRecords: result.validRecords,\r\n invalidRecords: result.invalidRecords,\r\n errors: result.errors,\r\n });\r\n return;\r\n }\r\n\r\n logger.debug('Batch validation succeeded', {\r\n schemaId,\r\n version,\r\n totalRecords: result.totalRecords,\r\n });\r\n\r\n next();\r\n } catch (error) {\r\n if (error instanceof StandardError) {\r\n res.status(400).json({\r\n error: 'Batch Validation Error',\r\n message: error.message,\r\n code: error.code,\r\n });\r\n } else {\r\n res.status(500).json({\r\n error: 'Internal Server Error',\r\n });\r\n }\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n\r\nexport interface ValidationOptions {\r\n /**\r\n * Attach validated data to request object\r\n * @default false\r\n */\r\n attachValidatedData?: boolean;\r\n}\r\n\r\nexport interface SchemaResolverResult {\r\n schemaId: string;\r\n version?: string;\r\n}\r\n\r\nexport interface MiddlewareOptions {\r\n /**\r\n * Schema ID (if static)\r\n */\r\n schemaId?: string;\r\n\r\n /**\r\n * Schema version (if static)\r\n */\r\n version?: string;\r\n\r\n /**\r\n * Function to resolve schema dynamically based on request\r\n */\r\n schemaResolver?: (req: Request) => SchemaResolverResult;\r\n\r\n /**\r\n * Custom error handler\r\n */\r\n errorHandler?: (error: Error, req: Request, res: Response, next: NextFunction) => void;\r\n}\r\n\r\nexport interface BatchValidationMiddlewareOptions {\r\n /**\r\n * Stop on first validation error\r\n * @default false\r\n */\r\n failFast?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create schema resolver based on route patterns\r\n *\r\n * Example:\r\n * ```typescript\r\n * const resolver = createRouteSchemaResolver({\r\n * '/api/patterns': 'database-handoffs/pattern-deployment',\r\n * '/api/metrics': 'database-handoffs/execution-metrics',\r\n * });\r\n * ```\r\n */\r\nexport function createRouteSchemaResolver(\r\n routeMap: Record<string, string>\r\n): (req: Request) => SchemaResolverResult {\r\n return (req: Request): SchemaResolverResult => {\r\n const schemaId = routeMap[req.path];\r\n\r\n if (!schemaId) {\r\n throw new StandardError(\r\n ErrorCode.CONFIGURATION_ERROR,\r\n `No schema mapping found for route: ${req.path}`,\r\n { path: req.path, availableRoutes: Object.keys(routeMap) }\r\n );\r\n }\r\n\r\n return { schemaId };\r\n };\r\n}\r\n\r\n/**\r\n * Shutdown schema validation middleware\r\n */\r\nexport async function shutdownSchemaValidation(): Promise<void> {\r\n if (globalValidator) {\r\n await globalValidator.shutdown();\r\n globalValidator = null;\r\n\r\n logger.info('Schema validation middleware shutdown complete');\r\n }\r\n}\r\n"],"names":["IntegrationSchemaValidator","StandardError","ErrorCode","getGlobalLogger","path","logger","globalValidator","initializeSchemaValidation","schemaPath","resolvedPath","join","process","cwd","enableCache","strictMode","initialize","info","getValidator","CONFIGURATION_ERROR","initialized","validateRequest","schemaId","version","options","req","res","next","startTime","Date","now","validator","validate","body","duration","debug","method","attachValidatedData","validatedData","error","warn","Error","message","String","status","json","code","details","context","errors","suggestions","validateResponse","originalSend","send","originalJson","data","validateResponseData","call","statusCode","validateRequestResponse","requestSchemaId","responseSchemaId","requestVersion","responseVersion","createValidationMiddleware","schemaResolver","resolved","errorHandler","validateQueryParams","query","validateBatch","Array","isArray","VALIDATION_FAILED","bodyType","result","failFast","valid","invalidRecords","totalRecords","validRecords","createRouteSchemaResolver","routeMap","availableRoutes","Object","keys","shutdownSchemaValidation","shutdown"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/anthropic-provider.ts"],"sourcesContent":["import Anthropic from '@anthropic-ai/sdk';\r\nimport { LLMProviderInterface, LLMMessageOptions, LLMModel, ProviderError } from './provider-interface';\r\n\r\nexport class AnthropicProvider implements LLMProviderInterface {\r\n private client: Anthropic;\r\n private defaultModel: string;\r\n\r\n constructor(apiKey?: string, defaultModel: string = 'claude-3-5-haiku-20240620') {\r\n this.client = new Anthropic({\r\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY\r\n });\r\n this.defaultModel = defaultModel;\r\n }\r\n\r\n async sendMessage(prompt: string, options: LLMMessageOptions = {}): Promise<string> {\r\n try {\r\n const response = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n return response.content[0].text;\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to send message to Anthropic',\r\n 'ANTHROPIC_SEND_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamMessage(prompt: string, options: LLMMessageOptions = {}): AsyncGenerator<string, void, unknown> {\r\n try {\r\n const stream = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n stream: true,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n for await (const messageStreamEvent of stream) {\r\n if (messageStreamEvent.type === 'content_block_delta') {\r\n yield messageStreamEvent.delta.text;\r\n }\r\n }\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to stream message from Anthropic',\r\n 'ANTHROPIC_STREAM_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async getModels(): Promise<LLMModel[]> {\r\n return [\r\n {\r\n id: 'claude-3-5-haiku-20240620',\r\n name: 'Claude 3.5 Haiku',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n },\r\n {\r\n id: 'claude-3-opus-20240229',\r\n name: 'Claude 3 Opus',\r\n context_window: 200000,\r\n pricing: { input: 0.00015, output: 0.00075 }\r\n },\r\n {\r\n id: 'claude-3-sonnet-20240229',\r\n name: 'Claude 3 Sonnet',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n }\r\n ];\r\n }\r\n\r\n async checkHealth(): Promise<{\r\n status: 'healthy' | 'degraded' | 'unavailable';\r\n latency?: number;\r\n models_available?: number;\r\n }> {\r\n try {\r\n const startTime = Date.now();\r\n await this.sendMessage('Health check', { maxTokens: 10 });\r\n const latency = Date.now() - startTime;\r\n\r\n const models = await this.getModels();\r\n\r\n return {\r\n status: latency < 500 ? 'healthy' : 'degraded',\r\n latency,\r\n models_available: models.length\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'unavailable',\r\n latency: undefined,\r\n models_available: 0\r\n };\r\n }\r\n }\r\n}"],"names":["Anthropic","ProviderError","AnthropicProvider","client","defaultModel","apiKey","process","env","ANTHROPIC_API_KEY","sendMessage","prompt","options","response","messages","create","model","max_tokens","maxTokens","temperature","system","role","content","text","error","originalError","streamMessage","stream","messageStreamEvent","type","delta","getModels","id","name","context_window","pricing","input","output","checkHealth","startTime","Date","now","latency","models","status","models_available","length","undefined"],"mappings":"AAAA,OAAOA,eAAe,oBAAoB;AAC1C,SAA4DC,aAAa,QAAQ,
|
|
1
|
+
{"version":3,"sources":["../../src/providers/anthropic-provider.ts"],"sourcesContent":["import Anthropic from '@anthropic-ai/sdk';\r\nimport { LLMProviderInterface, LLMMessageOptions, LLMModel, ProviderError } from './provider-interface.js';\r\n\r\nexport class AnthropicProvider implements LLMProviderInterface {\r\n private client: Anthropic;\r\n private defaultModel: string;\r\n\r\n constructor(apiKey?: string, defaultModel: string = 'claude-3-5-haiku-20240620') {\r\n this.client = new Anthropic({\r\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY\r\n });\r\n this.defaultModel = defaultModel;\r\n }\r\n\r\n async sendMessage(prompt: string, options: LLMMessageOptions = {}): Promise<string> {\r\n try {\r\n const response = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n return response.content[0].text;\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to send message to Anthropic',\r\n 'ANTHROPIC_SEND_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async *streamMessage(prompt: string, options: LLMMessageOptions = {}): AsyncGenerator<string, void, unknown> {\r\n try {\r\n const stream = await this.client.messages.create({\r\n model: options.model || this.defaultModel,\r\n max_tokens: options.maxTokens || 4096,\r\n temperature: options.temperature || 0.7,\r\n system: options.system,\r\n stream: true,\r\n messages: [{ role: 'user', content: prompt }]\r\n });\r\n\r\n for await (const messageStreamEvent of stream) {\r\n if (messageStreamEvent.type === 'content_block_delta') {\r\n yield messageStreamEvent.delta.text;\r\n }\r\n }\r\n } catch (error) {\r\n throw new ProviderError(\r\n 'Failed to stream message from Anthropic',\r\n 'ANTHROPIC_STREAM_ERROR',\r\n { originalError: error }\r\n );\r\n }\r\n }\r\n\r\n async getModels(): Promise<LLMModel[]> {\r\n return [\r\n {\r\n id: 'claude-3-5-haiku-20240620',\r\n name: 'Claude 3.5 Haiku',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n },\r\n {\r\n id: 'claude-3-opus-20240229',\r\n name: 'Claude 3 Opus',\r\n context_window: 200000,\r\n pricing: { input: 0.00015, output: 0.00075 }\r\n },\r\n {\r\n id: 'claude-3-sonnet-20240229',\r\n name: 'Claude 3 Sonnet',\r\n context_window: 200000,\r\n pricing: { input: 0.00003, output: 0.00015 }\r\n }\r\n ];\r\n }\r\n\r\n async checkHealth(): Promise<{\r\n status: 'healthy' | 'degraded' | 'unavailable';\r\n latency?: number;\r\n models_available?: number;\r\n }> {\r\n try {\r\n const startTime = Date.now();\r\n await this.sendMessage('Health check', { maxTokens: 10 });\r\n const latency = Date.now() - startTime;\r\n\r\n const models = await this.getModels();\r\n\r\n return {\r\n status: latency < 500 ? 'healthy' : 'degraded',\r\n latency,\r\n models_available: models.length\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'unavailable',\r\n latency: undefined,\r\n models_available: 0\r\n };\r\n }\r\n }\r\n}"],"names":["Anthropic","ProviderError","AnthropicProvider","client","defaultModel","apiKey","process","env","ANTHROPIC_API_KEY","sendMessage","prompt","options","response","messages","create","model","max_tokens","maxTokens","temperature","system","role","content","text","error","originalError","streamMessage","stream","messageStreamEvent","type","delta","getModels","id","name","context_window","pricing","input","output","checkHealth","startTime","Date","now","latency","models","status","models_available","length","undefined"],"mappings":"AAAA,OAAOA,eAAe,oBAAoB;AAC1C,SAA4DC,aAAa,QAAQ,0BAA0B;AAE3G,OAAO,MAAMC;IACHC,OAAkB;IAClBC,aAAqB;IAE7B,YAAYC,MAAe,EAAED,eAAuB,2BAA2B,CAAE;QAC/E,IAAI,CAACD,MAAM,GAAG,IAAIH,UAAU;YAC1BK,QAAQA,UAAUC,QAAQC,GAAG,CAACC,iBAAiB;QACjD;QACA,IAAI,CAACJ,YAAY,GAAGA;IACtB;IAEA,MAAMK,YAAYC,MAAc,EAAEC,UAA6B,CAAC,CAAC,EAAmB;QAClF,IAAI;YACF,MAAMC,WAAW,MAAM,IAAI,CAACT,MAAM,CAACU,QAAQ,CAACC,MAAM,CAAC;gBACjDC,OAAOJ,QAAQI,KAAK,IAAI,IAAI,CAACX,YAAY;gBACzCY,YAAYL,QAAQM,SAAS,IAAI;gBACjCC,aAAaP,QAAQO,WAAW,IAAI;gBACpCC,QAAQR,QAAQQ,MAAM;gBACtBN,UAAU;oBAAC;wBAAEO,MAAM;wBAAQC,SAASX;oBAAO;iBAAE;YAC/C;YAEA,OAAOE,SAASS,OAAO,CAAC,EAAE,CAACC,IAAI;QACjC,EAAE,OAAOC,OAAO;YACd,MAAM,IAAItB,cACR,uCACA,wBACA;gBAAEuB,eAAeD;YAAM;QAE3B;IACF;IAEA,OAAOE,cAAcf,MAAc,EAAEC,UAA6B,CAAC,CAAC,EAAyC;QAC3G,IAAI;YACF,MAAMe,SAAS,MAAM,IAAI,CAACvB,MAAM,CAACU,QAAQ,CAACC,MAAM,CAAC;gBAC/CC,OAAOJ,QAAQI,KAAK,IAAI,IAAI,CAACX,YAAY;gBACzCY,YAAYL,QAAQM,SAAS,IAAI;gBACjCC,aAAaP,QAAQO,WAAW,IAAI;gBACpCC,QAAQR,QAAQQ,MAAM;gBACtBO,QAAQ;gBACRb,UAAU;oBAAC;wBAAEO,MAAM;wBAAQC,SAASX;oBAAO;iBAAE;YAC/C;YAEA,WAAW,MAAMiB,sBAAsBD,OAAQ;gBAC7C,IAAIC,mBAAmBC,IAAI,KAAK,uBAAuB;oBACrD,MAAMD,mBAAmBE,KAAK,CAACP,IAAI;gBACrC;YACF;QACF,EAAE,OAAOC,OAAO;YACd,MAAM,IAAItB,cACR,2CACA,0BACA;gBAAEuB,eAAeD;YAAM;QAE3B;IACF;IAEA,MAAMO,YAAiC;QACrC,OAAO;YACL;gBACEC,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;YACA;gBACEL,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;YACA;gBACEL,IAAI;gBACJC,MAAM;gBACNC,gBAAgB;gBAChBC,SAAS;oBAAEC,OAAO;oBAASC,QAAQ;gBAAQ;YAC7C;SACD;IACH;IAEA,MAAMC,cAIH;QACD,IAAI;YACF,MAAMC,YAAYC,KAAKC,GAAG;YAC1B,MAAM,IAAI,CAAC/B,WAAW,CAAC,gBAAgB;gBAAEQ,WAAW;YAAG;YACvD,MAAMwB,UAAUF,KAAKC,GAAG,KAAKF;YAE7B,MAAMI,SAAS,MAAM,IAAI,CAACZ,SAAS;YAEnC,OAAO;gBACLa,QAAQF,UAAU,MAAM,YAAY;gBACpCA;gBACAG,kBAAkBF,OAAOG,MAAM;YACjC;QACF,EAAE,OAAOtB,OAAO;YACd,OAAO;gBACLoB,QAAQ;gBACRF,SAASK;gBACTF,kBAAkB;YACpB;QACF;IACF;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ProviderError } from './provider-interface';
|
|
2
|
-
import { AnthropicProvider } from './anthropic-provider';
|
|
1
|
+
import { ProviderError } from './provider-interface.js';
|
|
2
|
+
import { AnthropicProvider } from './anthropic-provider.js';
|
|
3
3
|
export class ProviderFactory {
|
|
4
4
|
static providers = new Map([
|
|
5
5
|
[
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/provider-factory.ts"],"sourcesContent":["import { LLMProviderInterface, ProviderError } from './provider-interface';\r\nimport { AnthropicProvider } from './anthropic-provider';\r\n\r\nexport type ProviderType = 'anthropic' | 'openai' | 'azure' | 'google';\r\n\r\nexport class ProviderFactory {\r\n private static providers: Map<ProviderType, new (apiKey?: string) => LLMProviderInterface> = new Map([\r\n ['anthropic', AnthropicProvider]\r\n // Placeholder for future providers\r\n // ['openai', OpenAIProvider],\r\n // ['azure', AzureProvider],\r\n // ['google', GoogleProvider]\r\n ]);\r\n\r\n /**\r\n * Create a provider instance\r\n * @param type Provider type\r\n * @param apiKey Optional API key (defaults to env variable)\r\n * @returns LLM Provider instance\r\n */\r\n static createProvider(type: ProviderType, apiKey?: string): LLMProviderInterface {\r\n const ProviderClass = this.providers.get(type);\r\n\r\n if (!ProviderClass) {\r\n throw new ProviderError(\r\n `Provider ${type} is not supported`,\r\n 'PROVIDER_NOT_FOUND',\r\n { availableProviders: Array.from(this.providers.keys()) }\r\n );\r\n }\r\n\r\n return new ProviderClass(apiKey);\r\n }\r\n\r\n /**\r\n * Register a new provider\r\n * @param type Provider type\r\n * @param providerClass Provider implementation class\r\n */\r\n static registerProvider(\r\n type: ProviderType,\r\n providerClass: new (apiKey?: string) => LLMProviderInterface\r\n ): void {\r\n this.providers.set(type, providerClass);\r\n }\r\n\r\n /**\r\n * Get available provider types\r\n * @returns List of registered provider types\r\n */\r\n static getAvailableProviders(): ProviderType[] {\r\n return Array.from(this.providers.keys());\r\n }\r\n}"],"names":["ProviderError","AnthropicProvider","ProviderFactory","providers","Map","createProvider","type","apiKey","ProviderClass","get","availableProviders","Array","from","keys","registerProvider","providerClass","set","getAvailableProviders"],"mappings":"AAAA,SAA+BA,aAAa,QAAQ,
|
|
1
|
+
{"version":3,"sources":["../../src/providers/provider-factory.ts"],"sourcesContent":["import { LLMProviderInterface, ProviderError } from './provider-interface.js';\r\nimport { AnthropicProvider } from './anthropic-provider.js';\r\n\r\nexport type ProviderType = 'anthropic' | 'openai' | 'azure' | 'google';\r\n\r\nexport class ProviderFactory {\r\n private static providers: Map<ProviderType, new (apiKey?: string) => LLMProviderInterface> = new Map([\r\n ['anthropic', AnthropicProvider]\r\n // Placeholder for future providers\r\n // ['openai', OpenAIProvider],\r\n // ['azure', AzureProvider],\r\n // ['google', GoogleProvider]\r\n ]);\r\n\r\n /**\r\n * Create a provider instance\r\n * @param type Provider type\r\n * @param apiKey Optional API key (defaults to env variable)\r\n * @returns LLM Provider instance\r\n */\r\n static createProvider(type: ProviderType, apiKey?: string): LLMProviderInterface {\r\n const ProviderClass = this.providers.get(type);\r\n\r\n if (!ProviderClass) {\r\n throw new ProviderError(\r\n `Provider ${type} is not supported`,\r\n 'PROVIDER_NOT_FOUND',\r\n { availableProviders: Array.from(this.providers.keys()) }\r\n );\r\n }\r\n\r\n return new ProviderClass(apiKey);\r\n }\r\n\r\n /**\r\n * Register a new provider\r\n * @param type Provider type\r\n * @param providerClass Provider implementation class\r\n */\r\n static registerProvider(\r\n type: ProviderType,\r\n providerClass: new (apiKey?: string) => LLMProviderInterface\r\n ): void {\r\n this.providers.set(type, providerClass);\r\n }\r\n\r\n /**\r\n * Get available provider types\r\n * @returns List of registered provider types\r\n */\r\n static getAvailableProviders(): ProviderType[] {\r\n return Array.from(this.providers.keys());\r\n }\r\n}"],"names":["ProviderError","AnthropicProvider","ProviderFactory","providers","Map","createProvider","type","apiKey","ProviderClass","get","availableProviders","Array","from","keys","registerProvider","providerClass","set","getAvailableProviders"],"mappings":"AAAA,SAA+BA,aAAa,QAAQ,0BAA0B;AAC9E,SAASC,iBAAiB,QAAQ,0BAA0B;AAI5D,OAAO,MAAMC;IACX,OAAeC,YAA8E,IAAIC,IAAI;QACnG;YAAC;YAAaH;SAAkB;KAKjC,EAAE;IAEH;;;;;GAKC,GACD,OAAOI,eAAeC,IAAkB,EAAEC,MAAe,EAAwB;QAC/E,MAAMC,gBAAgB,IAAI,CAACL,SAAS,CAACM,GAAG,CAACH;QAEzC,IAAI,CAACE,eAAe;YAClB,MAAM,IAAIR,cACR,CAAC,SAAS,EAAEM,KAAK,iBAAiB,CAAC,EACnC,sBACA;gBAAEI,oBAAoBC,MAAMC,IAAI,CAAC,IAAI,CAACT,SAAS,CAACU,IAAI;YAAI;QAE5D;QAEA,OAAO,IAAIL,cAAcD;IAC3B;IAEA;;;;GAIC,GACD,OAAOO,iBACLR,IAAkB,EAClBS,aAA4D,EACtD;QACN,IAAI,CAACZ,SAAS,CAACa,GAAG,CAACV,MAAMS;IAC3B;IAEA;;;GAGC,GACD,OAAOE,wBAAwC;QAC7C,OAAON,MAAMC,IAAI,CAAC,IAAI,CAACT,SAAS,CAACU,IAAI;IACvC;AACF"}
|