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,445 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# track-cost-savings.sh - Log skill executions and calculate ROI metrics
|
|
5
|
+
# Tracks cost savings from script execution vs AI agent usage
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
DB_PATH="${DB_PATH:-${SCRIPT_DIR}/workflow-codification.db}"
|
|
9
|
+
|
|
10
|
+
# Cost constants
|
|
11
|
+
AI_COST_PER_MILLION=0.50 # $0.50 per 1M tokens (Z.ai glm-4.6)
|
|
12
|
+
SCRIPT_COST=0.0001 # Negligible script execution cost
|
|
13
|
+
AVG_AI_INPUT_TOKENS=2000 # Average input tokens for skill-equivalent task
|
|
14
|
+
AVG_AI_OUTPUT_TOKENS=1000 # Average output tokens for skill-equivalent task
|
|
15
|
+
|
|
16
|
+
# Initialize database schema
|
|
17
|
+
init_database() {
|
|
18
|
+
sqlite3 "$DB_PATH" <<'EOF'
|
|
19
|
+
CREATE TABLE IF NOT EXISTS skill_executions (
|
|
20
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
21
|
+
skill_name TEXT NOT NULL,
|
|
22
|
+
skill_version TEXT NOT NULL,
|
|
23
|
+
execution_time_ms INTEGER NOT NULL,
|
|
24
|
+
exit_code INTEGER NOT NULL,
|
|
25
|
+
tokens_avoided INTEGER NOT NULL,
|
|
26
|
+
cost_avoided_usd REAL NOT NULL,
|
|
27
|
+
timestamp TEXT DEFAULT (datetime('now')),
|
|
28
|
+
agent_type TEXT,
|
|
29
|
+
task_description TEXT,
|
|
30
|
+
metadata TEXT
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_executions_skill ON skill_executions(skill_name);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_executions_timestamp ON skill_executions(timestamp);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_executions_exit_code ON skill_executions(exit_code);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS roi_snapshots (
|
|
38
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
39
|
+
snapshot_date TEXT DEFAULT (date('now')),
|
|
40
|
+
total_executions INTEGER NOT NULL,
|
|
41
|
+
total_cost_avoided_usd REAL NOT NULL,
|
|
42
|
+
total_tokens_avoided INTEGER NOT NULL,
|
|
43
|
+
avg_execution_time_ms REAL NOT NULL,
|
|
44
|
+
top_skill_name TEXT,
|
|
45
|
+
top_skill_savings_usd REAL,
|
|
46
|
+
metadata TEXT
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_roi_snapshots_date ON roi_snapshots(snapshot_date);
|
|
50
|
+
EOF
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Calculate AI cost based on tokens
|
|
54
|
+
calculate_ai_cost() {
|
|
55
|
+
local input_tokens="${1:-$AVG_AI_INPUT_TOKENS}"
|
|
56
|
+
local output_tokens="${2:-$AVG_AI_OUTPUT_TOKENS}"
|
|
57
|
+
|
|
58
|
+
local total_tokens=$((input_tokens + output_tokens))
|
|
59
|
+
local cost=$(echo "scale=6; ($total_tokens * $AI_COST_PER_MILLION) / 1000000" | bc)
|
|
60
|
+
|
|
61
|
+
echo "$cost"
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Calculate cost savings
|
|
65
|
+
calculate_savings() {
|
|
66
|
+
local ai_cost="$1"
|
|
67
|
+
local script_cost="${2:-$SCRIPT_COST}"
|
|
68
|
+
|
|
69
|
+
local savings=$(echo "scale=6; $ai_cost - $script_cost" | bc)
|
|
70
|
+
echo "$savings"
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Log skill execution
|
|
74
|
+
log_execution() {
|
|
75
|
+
local skill_name="$1"
|
|
76
|
+
local skill_version="$2"
|
|
77
|
+
local execution_time_ms="$3"
|
|
78
|
+
local exit_code="$4"
|
|
79
|
+
local tokens_avoided="${5:-$((AVG_AI_INPUT_TOKENS + AVG_AI_OUTPUT_TOKENS))}"
|
|
80
|
+
local agent_type="${6:-}"
|
|
81
|
+
local task_description="${7:-}"
|
|
82
|
+
local metadata="${8:-{}}"
|
|
83
|
+
|
|
84
|
+
# Calculate costs
|
|
85
|
+
local input_tokens=$((tokens_avoided * 2 / 3))
|
|
86
|
+
local output_tokens=$((tokens_avoided / 3))
|
|
87
|
+
local ai_cost
|
|
88
|
+
ai_cost=$(calculate_ai_cost "$input_tokens" "$output_tokens")
|
|
89
|
+
local cost_avoided
|
|
90
|
+
cost_avoided=$(calculate_savings "$ai_cost")
|
|
91
|
+
|
|
92
|
+
# Insert execution record
|
|
93
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
94
|
+
INSERT INTO skill_executions (
|
|
95
|
+
skill_name,
|
|
96
|
+
skill_version,
|
|
97
|
+
execution_time_ms,
|
|
98
|
+
exit_code,
|
|
99
|
+
tokens_avoided,
|
|
100
|
+
cost_avoided_usd,
|
|
101
|
+
agent_type,
|
|
102
|
+
task_description,
|
|
103
|
+
metadata
|
|
104
|
+
) VALUES (
|
|
105
|
+
'$skill_name',
|
|
106
|
+
'$skill_version',
|
|
107
|
+
$execution_time_ms,
|
|
108
|
+
$exit_code,
|
|
109
|
+
$tokens_avoided,
|
|
110
|
+
$cost_avoided,
|
|
111
|
+
'$agent_type',
|
|
112
|
+
'$task_description',
|
|
113
|
+
'$metadata'
|
|
114
|
+
);
|
|
115
|
+
EOF
|
|
116
|
+
|
|
117
|
+
echo "Logged execution: $skill_name (saved \$$cost_avoided)"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# Generate ROI snapshot
|
|
121
|
+
generate_roi_snapshot() {
|
|
122
|
+
local snapshot_date="${1:-$(date +%Y-%m-%d)}"
|
|
123
|
+
|
|
124
|
+
# Calculate aggregate metrics
|
|
125
|
+
local total_executions
|
|
126
|
+
total_executions=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
|
|
127
|
+
|
|
128
|
+
if [[ "$total_executions" -eq 0 ]]; then
|
|
129
|
+
echo "No executions found for date: $snapshot_date"
|
|
130
|
+
return 0
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
local total_cost_avoided
|
|
134
|
+
total_cost_avoided=$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
|
|
135
|
+
|
|
136
|
+
local total_tokens_avoided
|
|
137
|
+
total_tokens_avoided=$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(tokens_avoided), 0) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
|
|
138
|
+
|
|
139
|
+
local avg_execution_time
|
|
140
|
+
avg_execution_time=$(sqlite3 "$DB_PATH" "SELECT COALESCE(AVG(execution_time_ms), 0) FROM skill_executions WHERE date(timestamp) = '$snapshot_date';")
|
|
141
|
+
|
|
142
|
+
# Get top performing skill
|
|
143
|
+
local top_skill_data
|
|
144
|
+
top_skill_data=$(sqlite3 "$DB_PATH" "SELECT skill_name, SUM(cost_avoided_usd) FROM skill_executions WHERE date(timestamp) = '$snapshot_date' GROUP BY skill_name ORDER BY SUM(cost_avoided_usd) DESC LIMIT 1;")
|
|
145
|
+
|
|
146
|
+
local top_skill_name
|
|
147
|
+
local top_skill_savings
|
|
148
|
+
if [[ -n "$top_skill_data" ]]; then
|
|
149
|
+
top_skill_name=$(echo "$top_skill_data" | cut -d'|' -f1)
|
|
150
|
+
top_skill_savings=$(echo "$top_skill_data" | cut -d'|' -f2)
|
|
151
|
+
else
|
|
152
|
+
top_skill_name=""
|
|
153
|
+
top_skill_savings="0"
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
# Insert snapshot
|
|
157
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
158
|
+
INSERT INTO roi_snapshots (
|
|
159
|
+
snapshot_date,
|
|
160
|
+
total_executions,
|
|
161
|
+
total_cost_avoided_usd,
|
|
162
|
+
total_tokens_avoided,
|
|
163
|
+
avg_execution_time_ms,
|
|
164
|
+
top_skill_name,
|
|
165
|
+
top_skill_savings_usd,
|
|
166
|
+
metadata
|
|
167
|
+
) VALUES (
|
|
168
|
+
'$snapshot_date',
|
|
169
|
+
$total_executions,
|
|
170
|
+
$total_cost_avoided,
|
|
171
|
+
$total_tokens_avoided,
|
|
172
|
+
$avg_execution_time,
|
|
173
|
+
'$top_skill_name',
|
|
174
|
+
$top_skill_savings,
|
|
175
|
+
'{}'
|
|
176
|
+
);
|
|
177
|
+
EOF
|
|
178
|
+
|
|
179
|
+
echo "Generated ROI snapshot for $snapshot_date"
|
|
180
|
+
echo "Total executions: $total_executions"
|
|
181
|
+
echo "Total cost avoided: \$$total_cost_avoided"
|
|
182
|
+
echo "Top skill: $top_skill_name (\$$top_skill_savings)"
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# Query per-skill ROI ranking
|
|
186
|
+
query_skill_roi_ranking() {
|
|
187
|
+
local period="${1:-30}" # Default: last 30 days
|
|
188
|
+
|
|
189
|
+
sqlite3 -header -column "$DB_PATH" <<EOF
|
|
190
|
+
SELECT
|
|
191
|
+
skill_name,
|
|
192
|
+
COUNT(*) as executions,
|
|
193
|
+
SUM(cost_avoided_usd) as total_savings_usd,
|
|
194
|
+
AVG(cost_avoided_usd) as avg_savings_per_execution,
|
|
195
|
+
AVG(execution_time_ms) as avg_execution_time_ms,
|
|
196
|
+
SUM(tokens_avoided) as total_tokens_avoided
|
|
197
|
+
FROM skill_executions
|
|
198
|
+
WHERE timestamp >= datetime('now', '-$period days')
|
|
199
|
+
GROUP BY skill_name
|
|
200
|
+
ORDER BY total_savings_usd DESC;
|
|
201
|
+
EOF
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
# Calculate monthly/annual projections
|
|
205
|
+
calculate_projections() {
|
|
206
|
+
local period_days="${1:-30}"
|
|
207
|
+
|
|
208
|
+
# Get average daily metrics
|
|
209
|
+
local daily_executions
|
|
210
|
+
daily_executions=$(sqlite3 "$DB_PATH" "SELECT COALESCE(COUNT(*) / $period_days, 0) FROM skill_executions WHERE timestamp >= datetime('now', '-$period_days days');")
|
|
211
|
+
|
|
212
|
+
local daily_savings
|
|
213
|
+
daily_savings=$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd) / $period_days, 0) FROM skill_executions WHERE timestamp >= datetime('now', '-$period_days days');")
|
|
214
|
+
|
|
215
|
+
# Calculate projections
|
|
216
|
+
local monthly_executions=$(echo "$daily_executions * 30" | bc)
|
|
217
|
+
local monthly_savings=$(echo "scale=2; $daily_savings * 30" | bc)
|
|
218
|
+
local annual_savings=$(echo "scale=2; $daily_savings * 365" | bc)
|
|
219
|
+
|
|
220
|
+
cat <<PROJECTIONS
|
|
221
|
+
Cost Savings Projections (based on last $period_days days):
|
|
222
|
+
---------------------------------------------------------
|
|
223
|
+
Daily Average:
|
|
224
|
+
- Executions: $daily_executions
|
|
225
|
+
- Savings: \$$daily_savings
|
|
226
|
+
|
|
227
|
+
Monthly Projection:
|
|
228
|
+
- Executions: $monthly_executions
|
|
229
|
+
- Savings: \$$monthly_savings
|
|
230
|
+
|
|
231
|
+
Annual Projection:
|
|
232
|
+
- Savings: \$$annual_savings
|
|
233
|
+
PROJECTIONS
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
# Export dashboard metrics
|
|
237
|
+
export_dashboard_metrics() {
|
|
238
|
+
local output_format="${1:-json}"
|
|
239
|
+
|
|
240
|
+
case "$output_format" in
|
|
241
|
+
json)
|
|
242
|
+
cat <<JSON
|
|
243
|
+
{
|
|
244
|
+
"total_executions": $(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM skill_executions;"),
|
|
245
|
+
"total_cost_avoided_usd": $(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions;"),
|
|
246
|
+
"total_tokens_avoided": $(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(tokens_avoided), 0) FROM skill_executions;"),
|
|
247
|
+
"avg_execution_time_ms": $(sqlite3 "$DB_PATH" "SELECT COALESCE(AVG(execution_time_ms), 0) FROM skill_executions;"),
|
|
248
|
+
"success_rate": $(sqlite3 "$DB_PATH" "SELECT COALESCE(CAST(SUM(CASE WHEN exit_code = 0 THEN 1 ELSE 0 END) AS REAL) / COUNT(*), 0) FROM skill_executions;"),
|
|
249
|
+
"last_30_days": {
|
|
250
|
+
"executions": $(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM skill_executions WHERE timestamp >= datetime('now', '-30 days');"),
|
|
251
|
+
"cost_avoided_usd": $(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_avoided_usd), 0) FROM skill_executions WHERE timestamp >= datetime('now', '-30 days');")
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
JSON
|
|
255
|
+
;;
|
|
256
|
+
table)
|
|
257
|
+
sqlite3 -header -column "$DB_PATH" <<SQL
|
|
258
|
+
SELECT
|
|
259
|
+
'All Time' as period,
|
|
260
|
+
COUNT(*) as executions,
|
|
261
|
+
SUM(cost_avoided_usd) as cost_avoided_usd,
|
|
262
|
+
AVG(execution_time_ms) as avg_time_ms
|
|
263
|
+
FROM skill_executions
|
|
264
|
+
UNION ALL
|
|
265
|
+
SELECT
|
|
266
|
+
'Last 30 Days' as period,
|
|
267
|
+
COUNT(*) as executions,
|
|
268
|
+
SUM(cost_avoided_usd) as cost_avoided_usd,
|
|
269
|
+
AVG(execution_time_ms) as avg_time_ms
|
|
270
|
+
FROM skill_executions
|
|
271
|
+
WHERE timestamp >= datetime('now', '-30 days')
|
|
272
|
+
UNION ALL
|
|
273
|
+
SELECT
|
|
274
|
+
'Last 7 Days' as period,
|
|
275
|
+
COUNT(*) as executions,
|
|
276
|
+
SUM(cost_avoided_usd) as cost_avoided_usd,
|
|
277
|
+
AVG(execution_time_ms) as avg_time_ms
|
|
278
|
+
FROM skill_executions
|
|
279
|
+
WHERE timestamp >= datetime('now', '-7 days');
|
|
280
|
+
SQL
|
|
281
|
+
;;
|
|
282
|
+
*)
|
|
283
|
+
echo "Unknown format: $output_format" >&2
|
|
284
|
+
exit 1
|
|
285
|
+
;;
|
|
286
|
+
esac
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
# Main execution
|
|
290
|
+
main() {
|
|
291
|
+
# Initialize database
|
|
292
|
+
init_database
|
|
293
|
+
|
|
294
|
+
# Parse arguments
|
|
295
|
+
local action=""
|
|
296
|
+
local skill_name=""
|
|
297
|
+
local skill_version=""
|
|
298
|
+
local execution_time_ms=""
|
|
299
|
+
local exit_code=""
|
|
300
|
+
local tokens_avoided=""
|
|
301
|
+
local agent_type=""
|
|
302
|
+
local task_description=""
|
|
303
|
+
local metadata="{}"
|
|
304
|
+
local period="30"
|
|
305
|
+
local output_format="json"
|
|
306
|
+
|
|
307
|
+
while [[ $# -gt 0 ]]; do
|
|
308
|
+
case $1 in
|
|
309
|
+
--action)
|
|
310
|
+
action="$2"
|
|
311
|
+
shift 2
|
|
312
|
+
;;
|
|
313
|
+
--skill-name)
|
|
314
|
+
skill_name="$2"
|
|
315
|
+
shift 2
|
|
316
|
+
;;
|
|
317
|
+
--skill-version)
|
|
318
|
+
skill_version="$2"
|
|
319
|
+
shift 2
|
|
320
|
+
;;
|
|
321
|
+
--execution-time-ms)
|
|
322
|
+
execution_time_ms="$2"
|
|
323
|
+
shift 2
|
|
324
|
+
;;
|
|
325
|
+
--exit-code)
|
|
326
|
+
exit_code="$2"
|
|
327
|
+
shift 2
|
|
328
|
+
;;
|
|
329
|
+
--tokens-avoided)
|
|
330
|
+
tokens_avoided="$2"
|
|
331
|
+
shift 2
|
|
332
|
+
;;
|
|
333
|
+
--agent-type)
|
|
334
|
+
agent_type="$2"
|
|
335
|
+
shift 2
|
|
336
|
+
;;
|
|
337
|
+
--task-description)
|
|
338
|
+
task_description="$2"
|
|
339
|
+
shift 2
|
|
340
|
+
;;
|
|
341
|
+
--metadata)
|
|
342
|
+
metadata="$2"
|
|
343
|
+
shift 2
|
|
344
|
+
;;
|
|
345
|
+
--period)
|
|
346
|
+
period="$2"
|
|
347
|
+
shift 2
|
|
348
|
+
;;
|
|
349
|
+
--format)
|
|
350
|
+
output_format="$2"
|
|
351
|
+
shift 2
|
|
352
|
+
;;
|
|
353
|
+
--help)
|
|
354
|
+
cat <<HELP
|
|
355
|
+
Usage: track-cost-savings.sh --action <ACTION> [OPTIONS]
|
|
356
|
+
|
|
357
|
+
Actions:
|
|
358
|
+
log Log skill execution
|
|
359
|
+
snapshot Generate ROI snapshot
|
|
360
|
+
ranking Query per-skill ROI ranking
|
|
361
|
+
projections Calculate monthly/annual projections
|
|
362
|
+
dashboard Export dashboard metrics
|
|
363
|
+
|
|
364
|
+
Log Options:
|
|
365
|
+
--skill-name STRING Skill name (required)
|
|
366
|
+
--skill-version STRING Skill version (required)
|
|
367
|
+
--execution-time-ms INTEGER Execution time in milliseconds (required)
|
|
368
|
+
--exit-code INTEGER Exit code (required)
|
|
369
|
+
--tokens-avoided INTEGER Tokens avoided (default: 3000)
|
|
370
|
+
--agent-type STRING Agent type (optional)
|
|
371
|
+
--task-description STRING Task description (optional)
|
|
372
|
+
--metadata JSON Additional metadata (optional)
|
|
373
|
+
|
|
374
|
+
Ranking/Projections Options:
|
|
375
|
+
--period INTEGER Analysis period in days (default: 30)
|
|
376
|
+
|
|
377
|
+
Dashboard Options:
|
|
378
|
+
--format STRING Output format: json|table (default: json)
|
|
379
|
+
|
|
380
|
+
Environment Variables:
|
|
381
|
+
DB_PATH Path to SQLite database (default: ./workflow-codification.db)
|
|
382
|
+
|
|
383
|
+
Examples:
|
|
384
|
+
# Log execution
|
|
385
|
+
track-cost-savings.sh --action log \\
|
|
386
|
+
--skill-name "cfn-coordination" \\
|
|
387
|
+
--skill-version "1.0.0" \\
|
|
388
|
+
--execution-time-ms 150 \\
|
|
389
|
+
--exit-code 0 \\
|
|
390
|
+
--tokens-avoided 3000
|
|
391
|
+
|
|
392
|
+
# Generate daily ROI snapshot
|
|
393
|
+
track-cost-savings.sh --action snapshot
|
|
394
|
+
|
|
395
|
+
# Query skill ROI ranking (last 30 days)
|
|
396
|
+
track-cost-savings.sh --action ranking --period 30
|
|
397
|
+
|
|
398
|
+
# Calculate projections
|
|
399
|
+
track-cost-savings.sh --action projections --period 30
|
|
400
|
+
|
|
401
|
+
# Export dashboard metrics
|
|
402
|
+
track-cost-savings.sh --action dashboard --format json
|
|
403
|
+
HELP
|
|
404
|
+
exit 0
|
|
405
|
+
;;
|
|
406
|
+
*)
|
|
407
|
+
echo "Unknown argument: $1" >&2
|
|
408
|
+
exit 1
|
|
409
|
+
;;
|
|
410
|
+
esac
|
|
411
|
+
done
|
|
412
|
+
|
|
413
|
+
# Execute action
|
|
414
|
+
case "$action" in
|
|
415
|
+
log)
|
|
416
|
+
if [[ -z "$skill_name" || -z "$skill_version" || -z "$execution_time_ms" || -z "$exit_code" ]]; then
|
|
417
|
+
echo "Error: --skill-name, --skill-version, --execution-time-ms, and --exit-code are required" >&2
|
|
418
|
+
exit 1
|
|
419
|
+
fi
|
|
420
|
+
log_execution "$skill_name" "$skill_version" "$execution_time_ms" "$exit_code" \
|
|
421
|
+
"$tokens_avoided" "$agent_type" "$task_description" "$metadata"
|
|
422
|
+
;;
|
|
423
|
+
snapshot)
|
|
424
|
+
generate_roi_snapshot
|
|
425
|
+
;;
|
|
426
|
+
ranking)
|
|
427
|
+
query_skill_roi_ranking "$period"
|
|
428
|
+
;;
|
|
429
|
+
projections)
|
|
430
|
+
calculate_projections "$period"
|
|
431
|
+
;;
|
|
432
|
+
dashboard)
|
|
433
|
+
export_dashboard_metrics "$output_format"
|
|
434
|
+
;;
|
|
435
|
+
*)
|
|
436
|
+
echo "Error: Invalid action. Use --help for usage information." >&2
|
|
437
|
+
exit 1
|
|
438
|
+
;;
|
|
439
|
+
esac
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
# Execute main if not sourced
|
|
443
|
+
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
444
|
+
main "$@"
|
|
445
|
+
fi
|
|
@@ -5,6 +5,10 @@ set -euo pipefail
|
|
|
5
5
|
# Records edge cases, detects patterns, and triggers skill update proposals
|
|
6
6
|
|
|
7
7
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
|
|
9
|
+
# Source parameterized query library for SQL injection prevention
|
|
10
|
+
source "${SCRIPT_DIR}/../bootstrap/sqlite-params.sh"
|
|
11
|
+
|
|
8
12
|
DB_PATH="${DB_PATH:-${SCRIPT_DIR}/workflow-codification.db}"
|
|
9
13
|
RECURRENCE_THRESHOLD=3
|
|
10
14
|
|
|
@@ -57,21 +61,16 @@ record_edge_case() {
|
|
|
57
61
|
local edge_case_hash
|
|
58
62
|
edge_case_hash=$(generate_edge_case_hash "$skill_name" "$exit_code" "$input_params")
|
|
59
63
|
|
|
60
|
-
# Check if edge case already exists
|
|
64
|
+
# Check if edge case already exists (parameterized query)
|
|
61
65
|
local existing_count
|
|
62
|
-
existing_count=$(
|
|
66
|
+
existing_count=$(sqlite_select "$DB_PATH" "SELECT occurrence_count FROM edge_cases WHERE edge_case_hash = ?1" "$edge_case_hash" 2>/dev/null || echo "0")
|
|
63
67
|
|
|
64
68
|
if [[ -n "$existing_count" && "$existing_count" != "0" ]]; then
|
|
65
|
-
# Update existing edge case
|
|
69
|
+
# Update existing edge case (parameterized query)
|
|
66
70
|
local new_count=$((existing_count + 1))
|
|
67
|
-
|
|
68
|
-
UPDATE edge_cases
|
|
69
|
-
|
|
70
|
-
timestamp = datetime('now'),
|
|
71
|
-
actual_output = '$actual_output',
|
|
72
|
-
error_message = '$error_message'
|
|
73
|
-
WHERE edge_case_hash = '$edge_case_hash';
|
|
74
|
-
EOF
|
|
71
|
+
sqlite_update "$DB_PATH" \
|
|
72
|
+
"UPDATE edge_cases SET occurrence_count = ?1, timestamp = datetime('now'), actual_output = ?2, error_message = ?3 WHERE edge_case_hash = ?4" \
|
|
73
|
+
"$new_count" "$actual_output" "$error_message" "$edge_case_hash"
|
|
75
74
|
echo "Updated edge case (occurrence: $new_count): $edge_case_hash"
|
|
76
75
|
|
|
77
76
|
# Check if threshold reached
|
|
@@ -86,30 +85,10 @@ EOF
|
|
|
86
85
|
--occurrence-count "$new_count"
|
|
87
86
|
fi
|
|
88
87
|
else
|
|
89
|
-
# Insert new edge case
|
|
90
|
-
|
|
91
|
-
INSERT INTO edge_cases (
|
|
92
|
-
|
|
93
|
-
skill_version,
|
|
94
|
-
exit_code,
|
|
95
|
-
input_params,
|
|
96
|
-
expected_output,
|
|
97
|
-
actual_output,
|
|
98
|
-
error_message,
|
|
99
|
-
edge_case_hash,
|
|
100
|
-
metadata
|
|
101
|
-
) VALUES (
|
|
102
|
-
'$skill_name',
|
|
103
|
-
'$skill_version',
|
|
104
|
-
$exit_code,
|
|
105
|
-
'$input_params',
|
|
106
|
-
'$expected_output',
|
|
107
|
-
'$actual_output',
|
|
108
|
-
'$error_message',
|
|
109
|
-
'$edge_case_hash',
|
|
110
|
-
'$metadata'
|
|
111
|
-
);
|
|
112
|
-
EOF
|
|
88
|
+
# Insert new edge case (parameterized query)
|
|
89
|
+
sqlite_insert "$DB_PATH" \
|
|
90
|
+
"INSERT INTO edge_cases (skill_name, skill_version, exit_code, input_params, expected_output, actual_output, error_message, edge_case_hash, metadata) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)" \
|
|
91
|
+
"$skill_name" "$skill_version" "$exit_code" "$input_params" "$expected_output" "$actual_output" "$error_message" "$edge_case_hash" "$metadata"
|
|
113
92
|
echo "Recorded new edge case: $edge_case_hash"
|
|
114
93
|
fi
|
|
115
94
|
}
|
|
@@ -118,35 +97,24 @@ EOF
|
|
|
118
97
|
query_recurring_edge_cases() {
|
|
119
98
|
local skill_name="${1:-}"
|
|
120
99
|
|
|
121
|
-
|
|
100
|
+
# Use parameterized query for filtering by skill_name
|
|
122
101
|
if [[ -n "$skill_name" ]]; then
|
|
123
|
-
|
|
102
|
+
sqlite_select "$DB_PATH" \
|
|
103
|
+
"SELECT skill_name, skill_version, exit_code, occurrence_count, status, timestamp, edge_case_hash FROM edge_cases WHERE skill_name = ?1 AND occurrence_count >= ?2 ORDER BY occurrence_count DESC, timestamp DESC" \
|
|
104
|
+
"$skill_name" "$RECURRENCE_THRESHOLD" | sqlite3 -header -column "$DB_PATH" ".mode column"
|
|
124
105
|
else
|
|
125
|
-
|
|
106
|
+
sqlite_select "$DB_PATH" \
|
|
107
|
+
"SELECT skill_name, skill_version, exit_code, occurrence_count, status, timestamp, edge_case_hash FROM edge_cases WHERE occurrence_count >= ?1 ORDER BY occurrence_count DESC, timestamp DESC" \
|
|
108
|
+
"$RECURRENCE_THRESHOLD" | sqlite3 -header -column "$DB_PATH" ".mode column"
|
|
126
109
|
fi
|
|
127
|
-
|
|
128
|
-
sqlite3 -header -column "$DB_PATH" <<EOF
|
|
129
|
-
SELECT
|
|
130
|
-
skill_name,
|
|
131
|
-
skill_version,
|
|
132
|
-
exit_code,
|
|
133
|
-
occurrence_count,
|
|
134
|
-
status,
|
|
135
|
-
timestamp,
|
|
136
|
-
edge_case_hash
|
|
137
|
-
FROM edge_cases
|
|
138
|
-
$where_clause occurrence_count >= $RECURRENCE_THRESHOLD
|
|
139
|
-
ORDER BY occurrence_count DESC, timestamp DESC;
|
|
140
|
-
EOF
|
|
141
110
|
}
|
|
142
111
|
|
|
143
112
|
# Get edge case details
|
|
144
113
|
get_edge_case_details() {
|
|
145
114
|
local edge_case_hash="$1"
|
|
146
115
|
|
|
147
|
-
|
|
148
|
-
SELECT * FROM edge_cases WHERE edge_case_hash =
|
|
149
|
-
EOF
|
|
116
|
+
# Use parameterized query with JSON output mode
|
|
117
|
+
sqlite_select "$DB_PATH" "SELECT * FROM edge_cases WHERE edge_case_hash = ?1" "$edge_case_hash" | sqlite3 -json "$DB_PATH" ".mode json"
|
|
150
118
|
}
|
|
151
119
|
|
|
152
120
|
# Update edge case status
|
|
@@ -154,11 +122,10 @@ update_edge_case_status() {
|
|
|
154
122
|
local edge_case_hash="$1"
|
|
155
123
|
local status="$2"
|
|
156
124
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
SET status =
|
|
160
|
-
|
|
161
|
-
EOF
|
|
125
|
+
# Use parameterized query for status update
|
|
126
|
+
sqlite_update "$DB_PATH" \
|
|
127
|
+
"UPDATE edge_cases SET status = ?1 WHERE edge_case_hash = ?2" \
|
|
128
|
+
"$status" "$edge_case_hash"
|
|
162
129
|
echo "Updated edge case status to: $status"
|
|
163
130
|
}
|
|
164
131
|
|
package/dist/ace/ace-curator.js
CHANGED
|
@@ -27,8 +27,16 @@ let DefaultMergeStrategy = class DefaultMergeStrategy {
|
|
|
27
27
|
prioritize(reflections) {
|
|
28
28
|
// Prioritize based on complexity, recency, and insights
|
|
29
29
|
return reflections.reduce((priority, reflection)=>{
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Recency: Higher score for more recent (lower age)
|
|
31
|
+
// Invert the age calculation so recent = higher score
|
|
32
|
+
const ageInSeconds = (Date.now() - reflection.timestamp) / 1000;
|
|
33
|
+
const recencyScore = Math.max(0, 1000000 - ageInSeconds) / 1000000;
|
|
34
|
+
const priorityScore = reflection.complexity * 0.5 + recencyScore * 0.3 + reflection.insights.length * 0.2;
|
|
35
|
+
const currentPriorityScore = priority ? (()=>{
|
|
36
|
+
const currentAgeInSeconds = (Date.now() - priority.timestamp) / 1000;
|
|
37
|
+
const currentRecencyScore = Math.max(0, 1000000 - currentAgeInSeconds) / 1000000;
|
|
38
|
+
return priority.complexity * 0.5 + currentRecencyScore * 0.3 + priority.insights.length * 0.2;
|
|
39
|
+
})() : -1;
|
|
32
40
|
return priorityScore > currentPriorityScore ? reflection : priority;
|
|
33
41
|
}, null);
|
|
34
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ace/ace-curator.ts"],"sourcesContent":["import { CognitiveReflection } from './ace-reflector.js';\r\nimport { DualWriteManager } from '../memory/dual-write-pattern.js';\r\n\r\nexport interface ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any>;\r\n prioritize(contexts: CognitiveReflection[]): CognitiveReflection;\r\n}\r\n\r\nexport class ACECurator {\r\n private dualWriteManager: DualWriteManager;\r\n\r\n constructor(\r\n redisConfig: Record<string, any> = {},\r\n sqlitePath: string = './ace-curation.sqlite'\r\n ) {\r\n this.dualWriteManager = new DualWriteManager(\r\n redisConfig,\r\n sqlitePath\r\n );\r\n }\r\n\r\n async mergeContexts(\r\n contexts: Record<string, any>[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<Record<string, any>> {\r\n const mergedContext = strategy.merge(contexts);\r\n\r\n // Store merged context\r\n await this.dualWriteManager.write(\r\n `merged-context-${Date.now()}`,\r\n mergedContext\r\n );\r\n\r\n return mergedContext;\r\n }\r\n\r\n async prioritizeReflections(\r\n reflections: CognitiveReflection[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<CognitiveReflection> {\r\n const prioritizedReflection = strategy.prioritize(reflections);\r\n\r\n // Store prioritized reflection\r\n await this.dualWriteManager.write(\r\n `prioritized-reflection-${prioritizedReflection.id}`,\r\n prioritizedReflection\r\n );\r\n\r\n return prioritizedReflection;\r\n }\r\n}\r\n\r\nclass DefaultMergeStrategy implements ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any> {\r\n // Recursive deep merge with priority and deduplication\r\n return contexts.reduce((merged, context) => {\r\n return this.deepMerge(merged, context);\r\n }, {});\r\n }\r\n\r\n prioritize(reflections: CognitiveReflection[]): CognitiveReflection {\r\n // Prioritize based on complexity, recency, and insights\r\n return reflections.reduce((priority, reflection) => {\r\n
|
|
1
|
+
{"version":3,"sources":["../../src/ace/ace-curator.ts"],"sourcesContent":["import { CognitiveReflection } from './ace-reflector.js';\r\nimport { DualWriteManager } from '../memory/dual-write-pattern.js';\r\n\r\nexport interface ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any>;\r\n prioritize(contexts: CognitiveReflection[]): CognitiveReflection;\r\n}\r\n\r\nexport class ACECurator {\r\n private dualWriteManager: DualWriteManager;\r\n\r\n constructor(\r\n redisConfig: Record<string, any> = {},\r\n sqlitePath: string = './ace-curation.sqlite'\r\n ) {\r\n this.dualWriteManager = new DualWriteManager(\r\n redisConfig,\r\n sqlitePath\r\n );\r\n }\r\n\r\n async mergeContexts(\r\n contexts: Record<string, any>[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<Record<string, any>> {\r\n const mergedContext = strategy.merge(contexts);\r\n\r\n // Store merged context\r\n await this.dualWriteManager.write(\r\n `merged-context-${Date.now()}`,\r\n mergedContext\r\n );\r\n\r\n return mergedContext;\r\n }\r\n\r\n async prioritizeReflections(\r\n reflections: CognitiveReflection[],\r\n strategy: ContextMergeStrategy = new DefaultMergeStrategy()\r\n ): Promise<CognitiveReflection> {\r\n const prioritizedReflection = strategy.prioritize(reflections);\r\n\r\n // Store prioritized reflection\r\n await this.dualWriteManager.write(\r\n `prioritized-reflection-${prioritizedReflection.id}`,\r\n prioritizedReflection\r\n );\r\n\r\n return prioritizedReflection;\r\n }\r\n}\r\n\r\nclass DefaultMergeStrategy implements ContextMergeStrategy {\r\n merge(contexts: Record<string, any>[]): Record<string, any> {\r\n // Recursive deep merge with priority and deduplication\r\n return contexts.reduce((merged, context) => {\r\n return this.deepMerge(merged, context);\r\n }, {});\r\n }\r\n\r\n prioritize(reflections: CognitiveReflection[]): CognitiveReflection {\r\n // Prioritize based on complexity, recency, and insights\r\n return reflections.reduce((priority, reflection) => {\r\n // Recency: Higher score for more recent (lower age)\r\n // Invert the age calculation so recent = higher score\r\n const ageInSeconds = (Date.now() - reflection.timestamp) / 1000;\r\n const recencyScore = Math.max(0, 1000000 - ageInSeconds) / 1000000;\r\n\r\n const priorityScore = (\r\n reflection.complexity * 0.5 +\r\n recencyScore * 0.3 +\r\n reflection.insights.length * 0.2\r\n );\r\n\r\n const currentPriorityScore = priority ? (\r\n (() => {\r\n const currentAgeInSeconds = (Date.now() - priority.timestamp) / 1000;\r\n const currentRecencyScore = Math.max(0, 1000000 - currentAgeInSeconds) / 1000000;\r\n return (\r\n priority.complexity * 0.5 +\r\n currentRecencyScore * 0.3 +\r\n priority.insights.length * 0.2\r\n );\r\n })()\r\n ) : -1;\r\n\r\n return priorityScore > currentPriorityScore ? reflection : priority;\r\n }, null as CognitiveReflection | null)!;\r\n }\r\n\r\n private deepMerge(\r\n target: Record<string, any>,\r\n source: Record<string, any>\r\n ): Record<string, any> {\r\n for (const key in source) {\r\n if (source.hasOwnProperty(key)) {\r\n if (\r\n source[key] instanceof Object &&\r\n !(source[key] instanceof Array)\r\n ) {\r\n target[key] = this.deepMerge(\r\n target[key] || {},\r\n source[key]\r\n );\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n}\r\n\r\nexport default ACECurator;"],"names":["DualWriteManager","ACECurator","dualWriteManager","redisConfig","sqlitePath","mergeContexts","contexts","strategy","DefaultMergeStrategy","mergedContext","merge","write","Date","now","prioritizeReflections","reflections","prioritizedReflection","prioritize","id","reduce","merged","context","deepMerge","priority","reflection","ageInSeconds","timestamp","recencyScore","Math","max","priorityScore","complexity","insights","length","currentPriorityScore","currentAgeInSeconds","currentRecencyScore","target","source","key","hasOwnProperty","Object","Array"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,kCAAkC;AAOnE,OAAO,MAAMC;IACHC,iBAAmC;IAE3C,YACEC,cAAmC,CAAC,CAAC,EACrCC,aAAqB,uBAAuB,CAC5C;QACA,IAAI,CAACF,gBAAgB,GAAG,IAAIF,iBAC1BG,aACAC;IAEJ;IAEA,MAAMC,cACJC,QAA+B,EAC/BC,WAAiC,IAAIC,sBAAsB,EAC7B;QAC9B,MAAMC,gBAAgBF,SAASG,KAAK,CAACJ;QAErC,uBAAuB;QACvB,MAAM,IAAI,CAACJ,gBAAgB,CAACS,KAAK,CAC/B,CAAC,eAAe,EAAEC,KAAKC,GAAG,IAAI,EAC9BJ;QAGF,OAAOA;IACT;IAEA,MAAMK,sBACJC,WAAkC,EAClCR,WAAiC,IAAIC,sBAAsB,EAC7B;QAC9B,MAAMQ,wBAAwBT,SAASU,UAAU,CAACF;QAElD,+BAA+B;QAC/B,MAAM,IAAI,CAACb,gBAAgB,CAACS,KAAK,CAC/B,CAAC,uBAAuB,EAAEK,sBAAsBE,EAAE,EAAE,EACpDF;QAGF,OAAOA;IACT;AACF;AAEA,IAAA,AAAMR,uBAAN,MAAMA;IACJE,MAAMJ,QAA+B,EAAuB;QAC1D,uDAAuD;QACvD,OAAOA,SAASa,MAAM,CAAC,CAACC,QAAQC;YAC9B,OAAO,IAAI,CAACC,SAAS,CAACF,QAAQC;QAChC,GAAG,CAAC;IACN;IAEAJ,WAAWF,WAAkC,EAAuB;QAClE,wDAAwD;QACxD,OAAOA,YAAYI,MAAM,CAAC,CAACI,UAAUC;YACnC,oDAAoD;YACpD,sDAAsD;YACtD,MAAMC,eAAe,AAACb,CAAAA,KAAKC,GAAG,KAAKW,WAAWE,SAAS,AAAD,IAAK;YAC3D,MAAMC,eAAeC,KAAKC,GAAG,CAAC,GAAG,UAAUJ,gBAAgB;YAE3D,MAAMK,gBACJN,WAAWO,UAAU,GAAG,MACxBJ,eAAe,MACfH,WAAWQ,QAAQ,CAACC,MAAM,GAAG;YAG/B,MAAMC,uBAAuBX,WAC3B,AAAC,CAAA;gBACC,MAAMY,sBAAsB,AAACvB,CAAAA,KAAKC,GAAG,KAAKU,SAASG,SAAS,AAAD,IAAK;gBAChE,MAAMU,sBAAsBR,KAAKC,GAAG,CAAC,GAAG,UAAUM,uBAAuB;gBACzE,OACEZ,SAASQ,UAAU,GAAG,MACtBK,sBAAsB,MACtBb,SAASS,QAAQ,CAACC,MAAM,GAAG;YAE/B,CAAA,MACE,CAAC;YAEL,OAAOH,gBAAgBI,uBAAuBV,aAAaD;QAC7D,GAAG;IACL;IAEQD,UACNe,MAA2B,EAC3BC,MAA2B,EACN;QACrB,IAAK,MAAMC,OAAOD,OAAQ;YACxB,IAAIA,OAAOE,cAAc,CAACD,MAAM;gBAC9B,IACED,MAAM,CAACC,IAAI,YAAYE,UACvB,CAAEH,CAAAA,MAAM,CAACC,IAAI,YAAYG,KAAI,GAC7B;oBACAL,MAAM,CAACE,IAAI,GAAG,IAAI,CAACjB,SAAS,CAC1Be,MAAM,CAACE,IAAI,IAAI,CAAC,GAChBD,MAAM,CAACC,IAAI;gBAEf,OAAO;oBACLF,MAAM,CAACE,IAAI,GAAGD,MAAM,CAACC,IAAI;gBAC3B;YACF;QACF;QACA,OAAOF;IACT;AACF;AAEA,eAAepC,WAAW"}
|
|
@@ -8,6 +8,10 @@ export class ACEGenerator {
|
|
|
8
8
|
this.curator = new ACECurator();
|
|
9
9
|
}
|
|
10
10
|
async generateContext(baseContext, options = {}) {
|
|
11
|
+
// Validate baseContext is not null or undefined
|
|
12
|
+
if (baseContext === null || baseContext === undefined) {
|
|
13
|
+
throw new Error('baseContext cannot be null or undefined');
|
|
14
|
+
}
|
|
11
15
|
const { maxComplexity = 5, allowAdaptation = true, fallbackStrategy = this.defaultFallbackStrategy } = options;
|
|
12
16
|
try {
|
|
13
17
|
// Initial reflection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ace/ace-generator.ts"],"sourcesContent":["import { ACEReflector, CognitiveReflection } from './ace-reflector.js';\r\nimport { ACECurator } from './ace-curator.js';\r\n\r\nexport interface ContextGenerationOptions {\r\n maxComplexity?: number;\r\n allowAdaptation?: boolean;\r\n fallbackStrategy?: (context: any) => any;\r\n}\r\n\r\nexport class ACEGenerator {\r\n private reflector: ACEReflector;\r\n private curator: ACECurator;\r\n\r\n constructor() {\r\n this.reflector = new ACEReflector();\r\n this.curator = new ACECurator();\r\n }\r\n\r\n async generateContext(\r\n baseContext: Record<string, any>,\r\n options: ContextGenerationOptions = {}\r\n ): Promise<Record<string, any>> {\r\n const {\r\n maxComplexity = 5,\r\n allowAdaptation = true,\r\n fallbackStrategy = this.defaultFallbackStrategy\r\n } = options;\r\n\r\n try {\r\n // Initial reflection\r\n const reflection = await this.reflector.reflect(\r\n baseContext,\r\n { complexity: this.calculateComplexity(baseContext) }\r\n );\r\n\r\n // Check complexity\r\n if (reflection.complexity > maxComplexity) {\r\n if (!allowAdaptation) {\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n // Context adaptation\r\n const adaptedContext = await this.adaptContext(reflection);\r\n\r\n return adaptedContext;\r\n } catch (error) {\r\n console.error('Context generation failed:', error);\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private async adaptContext(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>> {\r\n // Advanced context adaptation\r\n const contexts = [\r\n reflection.context,\r\n // Optional: fetch previous similar contexts\r\n await this.fetchSimilarContexts(reflection)\r\n ].filter(Boolean);\r\n\r\n return this.curator.mergeContexts(contexts);\r\n }\r\n\r\n private async fetchSimilarContexts(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>[]> {\r\n // Placeholder for advanced context similarity search\r\n // In production, implement semantic similarity algorithm\r\n return [];\r\n }\r\n\r\n private defaultFallbackStrategy(\r\n context: Record<string, any>\r\n ): Record<string, any> {\r\n return {\r\n ...context,\r\n adaptationWarning: 'Context generation limited'\r\n };\r\n }\r\n}\r\n\r\nexport default ACEGenerator;"],"names":["ACEReflector","ACECurator","ACEGenerator","reflector","curator","generateContext","baseContext","options","maxComplexity","allowAdaptation","fallbackStrategy","defaultFallbackStrategy","reflection","reflect","complexity","calculateComplexity","adaptedContext","adaptContext","error","console","context","keyCount","Object","keys","length","contentLength","JSON","stringify","Math","log","contexts","fetchSimilarContexts","filter","Boolean","mergeContexts","adaptationWarning"],"mappings":"AAAA,SAASA,YAAY,QAA6B,qBAAqB;AACvE,SAASC,UAAU,QAAQ,mBAAmB;AAQ9C,OAAO,MAAMC;IACHC,UAAwB;IACxBC,QAAoB;IAE5B,aAAc;QACZ,IAAI,CAACD,SAAS,GAAG,IAAIH;QACrB,IAAI,CAACI,OAAO,GAAG,IAAIH;IACrB;IAEA,MAAMI,gBACJC,WAAgC,EAChCC,UAAoC,CAAC,CAAC,EACR;QAC9B,MAAM,EACJC,gBAAgB,CAAC,EACjBC,kBAAkB,IAAI,EACtBC,mBAAmB,IAAI,CAACC,uBAAuB,EAChD,
|
|
1
|
+
{"version":3,"sources":["../../src/ace/ace-generator.ts"],"sourcesContent":["import { ACEReflector, CognitiveReflection } from './ace-reflector.js';\r\nimport { ACECurator } from './ace-curator.js';\r\n\r\nexport interface ContextGenerationOptions {\r\n maxComplexity?: number;\r\n allowAdaptation?: boolean;\r\n fallbackStrategy?: (context: any) => any;\r\n}\r\n\r\nexport class ACEGenerator {\r\n private reflector: ACEReflector;\r\n private curator: ACECurator;\r\n\r\n constructor() {\r\n this.reflector = new ACEReflector();\r\n this.curator = new ACECurator();\r\n }\r\n\r\n async generateContext(\r\n baseContext: Record<string, any>,\r\n options: ContextGenerationOptions = {}\r\n ): Promise<Record<string, any>> {\r\n // Validate baseContext is not null or undefined\r\n if (baseContext === null || baseContext === undefined) {\r\n throw new Error('baseContext cannot be null or undefined');\r\n }\r\n\r\n const {\r\n maxComplexity = 5,\r\n allowAdaptation = true,\r\n fallbackStrategy = this.defaultFallbackStrategy\r\n } = options;\r\n\r\n try {\r\n // Initial reflection\r\n const reflection = await this.reflector.reflect(\r\n baseContext,\r\n { complexity: this.calculateComplexity(baseContext) }\r\n );\r\n\r\n // Check complexity\r\n if (reflection.complexity > maxComplexity) {\r\n if (!allowAdaptation) {\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n // Context adaptation\r\n const adaptedContext = await this.adaptContext(reflection);\r\n\r\n return adaptedContext;\r\n } catch (error) {\r\n console.error('Context generation failed:', error);\r\n return fallbackStrategy(baseContext);\r\n }\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private async adaptContext(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>> {\r\n // Advanced context adaptation\r\n const contexts = [\r\n reflection.context,\r\n // Optional: fetch previous similar contexts\r\n await this.fetchSimilarContexts(reflection)\r\n ].filter(Boolean);\r\n\r\n return this.curator.mergeContexts(contexts);\r\n }\r\n\r\n private async fetchSimilarContexts(\r\n reflection: CognitiveReflection\r\n ): Promise<Record<string, any>[]> {\r\n // Placeholder for advanced context similarity search\r\n // In production, implement semantic similarity algorithm\r\n return [];\r\n }\r\n\r\n private defaultFallbackStrategy(\r\n context: Record<string, any>\r\n ): Record<string, any> {\r\n return {\r\n ...context,\r\n adaptationWarning: 'Context generation limited'\r\n };\r\n }\r\n}\r\n\r\nexport default ACEGenerator;"],"names":["ACEReflector","ACECurator","ACEGenerator","reflector","curator","generateContext","baseContext","options","undefined","Error","maxComplexity","allowAdaptation","fallbackStrategy","defaultFallbackStrategy","reflection","reflect","complexity","calculateComplexity","adaptedContext","adaptContext","error","console","context","keyCount","Object","keys","length","contentLength","JSON","stringify","Math","log","contexts","fetchSimilarContexts","filter","Boolean","mergeContexts","adaptationWarning"],"mappings":"AAAA,SAASA,YAAY,QAA6B,qBAAqB;AACvE,SAASC,UAAU,QAAQ,mBAAmB;AAQ9C,OAAO,MAAMC;IACHC,UAAwB;IACxBC,QAAoB;IAE5B,aAAc;QACZ,IAAI,CAACD,SAAS,GAAG,IAAIH;QACrB,IAAI,CAACI,OAAO,GAAG,IAAIH;IACrB;IAEA,MAAMI,gBACJC,WAAgC,EAChCC,UAAoC,CAAC,CAAC,EACR;QAC9B,gDAAgD;QAChD,IAAID,gBAAgB,QAAQA,gBAAgBE,WAAW;YACrD,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAM,EACJC,gBAAgB,CAAC,EACjBC,kBAAkB,IAAI,EACtBC,mBAAmB,IAAI,CAACC,uBAAuB,EAChD,GAAGN;QAEJ,IAAI;YACF,qBAAqB;YACrB,MAAMO,aAAa,MAAM,IAAI,CAACX,SAAS,CAACY,OAAO,CAC7CT,aACA;gBAAEU,YAAY,IAAI,CAACC,mBAAmB,CAACX;YAAa;YAGtD,mBAAmB;YACnB,IAAIQ,WAAWE,UAAU,GAAGN,eAAe;gBACzC,IAAI,CAACC,iBAAiB;oBACpB,OAAOC,iBAAiBN;gBAC1B;YACF;YAEA,qBAAqB;YACrB,MAAMY,iBAAiB,MAAM,IAAI,CAACC,YAAY,CAACL;YAE/C,OAAOI;QACT,EAAE,OAAOE,OAAO;YACdC,QAAQD,KAAK,CAAC,8BAA8BA;YAC5C,OAAOR,iBAAiBN;QAC1B;IACF;IAEQW,oBACNK,OAA4B,EACpB;QACR,MAAMC,WAAWC,OAAOC,IAAI,CAACH,SAASI,MAAM;QAC5C,MAAMC,gBAAgBC,KAAKC,SAAS,CAACP,SAASI,MAAM;QACpD,OAAOI,KAAKC,GAAG,CAACR,WAAWI,iBAAiBG,KAAKC,GAAG,CAAC;IACvD;IAEA,MAAcZ,aACZL,UAA+B,EACD;QAC9B,8BAA8B;QAC9B,MAAMkB,WAAW;YACflB,WAAWQ,OAAO;YAClB,4CAA4C;YAC5C,MAAM,IAAI,CAACW,oBAAoB,CAACnB;SACjC,CAACoB,MAAM,CAACC;QAET,OAAO,IAAI,CAAC/B,OAAO,CAACgC,aAAa,CAACJ;IACpC;IAEA,MAAcC,qBACZnB,UAA+B,EACC;QAChC,qDAAqD;QACrD,yDAAyD;QACzD,OAAO,EAAE;IACX;IAEQD,wBACNS,OAA4B,EACP;QACrB,OAAO;YACL,GAAGA,OAAO;YACVe,mBAAmB;QACrB;IACF;AACF;AAEA,eAAenC,aAAa"}
|