@stackmemoryai/stackmemory 0.5.59 → 0.5.62
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/README.md +105 -1
- package/dist/scripts/initialize.js +68 -1
- package/dist/scripts/initialize.js.map +2 -2
- package/dist/src/cli/claude-sm.js +130 -50
- package/dist/src/cli/claude-sm.js.map +2 -2
- package/dist/src/cli/index.js +18 -3
- package/dist/src/cli/index.js.map +3 -3
- package/dist/src/core/extensions/custom-tools.js +567 -0
- package/dist/src/core/extensions/custom-tools.js.map +7 -0
- package/dist/src/core/extensions/index.js +55 -0
- package/dist/src/core/extensions/index.js.map +7 -0
- package/dist/src/core/extensions/loader.js +709 -0
- package/dist/src/core/extensions/loader.js.map +7 -0
- package/dist/src/core/extensions/plugin-system.js +506 -0
- package/dist/src/core/extensions/plugin-system.js.map +7 -0
- package/dist/src/core/extensions/provider-adapter.js +617 -0
- package/dist/src/core/extensions/provider-adapter.js.map +7 -0
- package/dist/src/core/extensions/sandbox-runtime.js +664 -0
- package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
- package/dist/src/core/retrieval/index.js +2 -0
- package/dist/src/core/retrieval/index.js.map +2 -2
- package/dist/src/core/retrieval/privacy-filter.js +129 -0
- package/dist/src/core/retrieval/privacy-filter.js.map +7 -0
- package/dist/src/core/retrieval/unified-context-assembler.js +273 -0
- package/dist/src/core/retrieval/unified-context-assembler.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +32 -6
- package/dist/src/core/storage/chromadb-adapter.js.map +2 -2
- package/dist/src/hooks/diffmem-hooks.js +377 -0
- package/dist/src/hooks/diffmem-hooks.js.map +7 -0
- package/dist/src/integrations/diffmem/client.js +209 -0
- package/dist/src/integrations/diffmem/client.js.map +7 -0
- package/dist/src/integrations/diffmem/config.js +15 -0
- package/dist/src/integrations/diffmem/config.js.map +7 -0
- package/dist/{core/session → src/integrations/diffmem}/index.js +5 -8
- package/dist/src/integrations/diffmem/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +456 -0
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +121 -0
- package/dist/src/integrations/mcp/server.js.map +2 -2
- package/dist/src/skills/repo-ingestion-skill.js +35 -12
- package/dist/src/skills/repo-ingestion-skill.js.map +2 -2
- package/package.json +13 -7
- package/scripts/background-sync-manager.js +145 -83
- package/scripts/claude-sm-autostart.js +17 -12
- package/scripts/gepa/README.md +275 -0
- package/scripts/gepa/config.json +53 -0
- package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
- package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
- package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
- package/scripts/gepa/generations/gen-000/baseline.md +124 -0
- package/scripts/gepa/hooks/auto-optimize.js +494 -0
- package/scripts/gepa/hooks/eval-tracker.js +203 -0
- package/scripts/gepa/hooks/reflect.js +311 -0
- package/scripts/gepa/optimize.js +611 -0
- package/scripts/gepa/state.json +14 -0
- package/scripts/initialize.ts +83 -1
- package/scripts/test-pre-publish-quick.sh +1 -1
- package/dist/agents/core/agent-task-manager.js +0 -527
- package/dist/agents/core/agent-task-manager.js.map +0 -7
- package/dist/agents/testing-agent.js +0 -614
- package/dist/agents/testing-agent.js.map +0 -7
- package/dist/agents/verifiers/base-verifier.js +0 -133
- package/dist/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/agents/verifiers/formatter-verifier.js +0 -130
- package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/agents/verifiers/llm-judge.js +0 -252
- package/dist/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/cli/auto-detect.js +0 -321
- package/dist/cli/auto-detect.js.map +0 -7
- package/dist/cli/browser-test.js +0 -33
- package/dist/cli/browser-test.js.map +0 -7
- package/dist/cli/claude-sm-danger.js +0 -21
- package/dist/cli/claude-sm-danger.js.map +0 -7
- package/dist/cli/claude-sm.js +0 -1156
- package/dist/cli/claude-sm.js.map +0 -7
- package/dist/cli/codex-sm-danger.js +0 -21
- package/dist/cli/codex-sm-danger.js.map +0 -7
- package/dist/cli/codex-sm.js +0 -349
- package/dist/cli/codex-sm.js.map +0 -7
- package/dist/cli/commands/api.js +0 -232
- package/dist/cli/commands/api.js.map +0 -7
- package/dist/cli/commands/auto-background.js +0 -180
- package/dist/cli/commands/auto-background.js.map +0 -7
- package/dist/cli/commands/cleanup-processes.js +0 -68
- package/dist/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/cli/commands/clear.js +0 -202
- package/dist/cli/commands/clear.js.map +0 -7
- package/dist/cli/commands/config.js +0 -445
- package/dist/cli/commands/config.js.map +0 -7
- package/dist/cli/commands/context-rehydrate.js +0 -751
- package/dist/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/cli/commands/context.js +0 -343
- package/dist/cli/commands/context.js.map +0 -7
- package/dist/cli/commands/daemon.js +0 -392
- package/dist/cli/commands/daemon.js.map +0 -7
- package/dist/cli/commands/dashboard.js +0 -210
- package/dist/cli/commands/dashboard.js.map +0 -7
- package/dist/cli/commands/db.js +0 -147
- package/dist/cli/commands/db.js.map +0 -7
- package/dist/cli/commands/decision.js +0 -266
- package/dist/cli/commands/decision.js.map +0 -7
- package/dist/cli/commands/discovery.js +0 -279
- package/dist/cli/commands/discovery.js.map +0 -7
- package/dist/cli/commands/handoff.js +0 -624
- package/dist/cli/commands/handoff.js.map +0 -7
- package/dist/cli/commands/hooks.js +0 -298
- package/dist/cli/commands/hooks.js.map +0 -7
- package/dist/cli/commands/linear-unified.js +0 -353
- package/dist/cli/commands/linear-unified.js.map +0 -7
- package/dist/cli/commands/linear.js +0 -529
- package/dist/cli/commands/linear.js.map +0 -7
- package/dist/cli/commands/log.js +0 -169
- package/dist/cli/commands/log.js.map +0 -7
- package/dist/cli/commands/login.js +0 -172
- package/dist/cli/commands/login.js.map +0 -7
- package/dist/cli/commands/migrate.js +0 -240
- package/dist/cli/commands/migrate.js.map +0 -7
- package/dist/cli/commands/model.js +0 -533
- package/dist/cli/commands/model.js.map +0 -7
- package/dist/cli/commands/monitor.js +0 -313
- package/dist/cli/commands/monitor.js.map +0 -7
- package/dist/cli/commands/onboard.js +0 -536
- package/dist/cli/commands/onboard.js.map +0 -7
- package/dist/cli/commands/projects.js +0 -199
- package/dist/cli/commands/projects.js.map +0 -7
- package/dist/cli/commands/quality.js +0 -413
- package/dist/cli/commands/quality.js.map +0 -7
- package/dist/cli/commands/ralph.js +0 -909
- package/dist/cli/commands/ralph.js.map +0 -7
- package/dist/cli/commands/retrieval.js +0 -248
- package/dist/cli/commands/retrieval.js.map +0 -7
- package/dist/cli/commands/search.js +0 -173
- package/dist/cli/commands/search.js.map +0 -7
- package/dist/cli/commands/service.js +0 -749
- package/dist/cli/commands/service.js.map +0 -7
- package/dist/cli/commands/session.js +0 -200
- package/dist/cli/commands/session.js.map +0 -7
- package/dist/cli/commands/settings.js +0 -306
- package/dist/cli/commands/settings.js.map +0 -7
- package/dist/cli/commands/setup.js +0 -701
- package/dist/cli/commands/setup.js.map +0 -7
- package/dist/cli/commands/shell.js +0 -249
- package/dist/cli/commands/shell.js.map +0 -7
- package/dist/cli/commands/signup.js +0 -50
- package/dist/cli/commands/signup.js.map +0 -7
- package/dist/cli/commands/skills.js +0 -470
- package/dist/cli/commands/skills.js.map +0 -7
- package/dist/cli/commands/sms-notify.js +0 -795
- package/dist/cli/commands/sms-notify.js.map +0 -7
- package/dist/cli/commands/storage-tier.js +0 -183
- package/dist/cli/commands/storage-tier.js.map +0 -7
- package/dist/cli/commands/storage.js +0 -360
- package/dist/cli/commands/storage.js.map +0 -7
- package/dist/cli/commands/sweep.js +0 -249
- package/dist/cli/commands/sweep.js.map +0 -7
- package/dist/cli/commands/tasks.js +0 -213
- package/dist/cli/commands/tasks.js.map +0 -7
- package/dist/cli/commands/test.js +0 -286
- package/dist/cli/commands/test.js.map +0 -7
- package/dist/cli/commands/workflow.js +0 -142
- package/dist/cli/commands/workflow.js.map +0 -7
- package/dist/cli/commands/worktree.js +0 -319
- package/dist/cli/commands/worktree.js.map +0 -7
- package/dist/cli/index.js +0 -594
- package/dist/cli/index.js.map +0 -7
- package/dist/cli/opencode-sm.js +0 -448
- package/dist/cli/opencode-sm.js.map +0 -7
- package/dist/cli/utils/viewer.js +0 -96
- package/dist/cli/utils/viewer.js.map +0 -7
- package/dist/core/analytics/team-analytics.js +0 -378
- package/dist/core/analytics/team-analytics.js.map +0 -7
- package/dist/core/config/config-manager.js +0 -398
- package/dist/core/config/config-manager.js.map +0 -7
- package/dist/core/config/feature-flags.js +0 -76
- package/dist/core/config/feature-flags.js.map +0 -7
- package/dist/core/config/storage-config.js +0 -115
- package/dist/core/config/storage-config.js.map +0 -7
- package/dist/core/config/types.js +0 -144
- package/dist/core/config/types.js.map +0 -7
- package/dist/core/context/auto-context.js +0 -80
- package/dist/core/context/auto-context.js.map +0 -7
- package/dist/core/context/dual-stack-manager.js +0 -870
- package/dist/core/context/dual-stack-manager.js.map +0 -7
- package/dist/core/context/enhanced-rehydration.js +0 -994
- package/dist/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/core/context/frame-database.js +0 -479
- package/dist/core/context/frame-database.js.map +0 -7
- package/dist/core/context/frame-digest.js +0 -250
- package/dist/core/context/frame-digest.js.map +0 -7
- package/dist/core/context/frame-handoff-manager.js +0 -778
- package/dist/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/core/context/frame-lifecycle-hooks.js +0 -119
- package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/core/context/frame-manager.js +0 -1069
- package/dist/core/context/frame-manager.js.map +0 -7
- package/dist/core/context/frame-recovery.js +0 -302
- package/dist/core/context/frame-recovery.js.map +0 -7
- package/dist/core/context/frame-stack.js +0 -314
- package/dist/core/context/frame-stack.js.map +0 -7
- package/dist/core/context/frame-types.js +0 -5
- package/dist/core/context/frame-types.js.map +0 -7
- package/dist/core/context/incremental-gc.js +0 -290
- package/dist/core/context/incremental-gc.js.map +0 -7
- package/dist/core/context/index.js +0 -25
- package/dist/core/context/index.js.map +0 -7
- package/dist/core/context/model-aware-compaction.js +0 -623
- package/dist/core/context/model-aware-compaction.js.map +0 -7
- package/dist/core/context/permission-manager.js +0 -185
- package/dist/core/context/permission-manager.js.map +0 -7
- package/dist/core/context/recursive-context-manager.js +0 -592
- package/dist/core/context/recursive-context-manager.js.map +0 -7
- package/dist/core/context/refactored-frame-manager.js +0 -754
- package/dist/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/core/context/shared-context-layer.js +0 -621
- package/dist/core/context/shared-context-layer.js.map +0 -7
- package/dist/core/context/stack-merge-resolver.js +0 -749
- package/dist/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/core/context/validation.js +0 -130
- package/dist/core/context/validation.js.map +0 -7
- package/dist/core/database/batch-operations.js +0 -384
- package/dist/core/database/batch-operations.js.map +0 -7
- package/dist/core/database/connection-pool.js +0 -330
- package/dist/core/database/connection-pool.js.map +0 -7
- package/dist/core/database/database-adapter.js +0 -60
- package/dist/core/database/database-adapter.js.map +0 -7
- package/dist/core/database/migration-manager.js +0 -614
- package/dist/core/database/migration-manager.js.map +0 -7
- package/dist/core/database/paradedb-adapter.js +0 -990
- package/dist/core/database/paradedb-adapter.js.map +0 -7
- package/dist/core/database/query-cache.js +0 -298
- package/dist/core/database/query-cache.js.map +0 -7
- package/dist/core/database/query-router.js +0 -430
- package/dist/core/database/query-router.js.map +0 -7
- package/dist/core/database/sqlite-adapter.js +0 -738
- package/dist/core/database/sqlite-adapter.js.map +0 -7
- package/dist/core/digest/enhanced-hybrid-digest.js +0 -277
- package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/core/digest/frame-digest-integration.js +0 -176
- package/dist/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/core/digest/hybrid-digest-generator.js +0 -553
- package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/core/digest/index.js +0 -9
- package/dist/core/digest/index.js.map +0 -7
- package/dist/core/digest/types.js +0 -25
- package/dist/core/digest/types.js.map +0 -7
- package/dist/core/errors/error-utils.js +0 -208
- package/dist/core/errors/error-utils.js.map +0 -7
- package/dist/core/errors/index.js +0 -521
- package/dist/core/errors/index.js.map +0 -7
- package/dist/core/errors/recovery.js +0 -269
- package/dist/core/errors/recovery.js.map +0 -7
- package/dist/core/execution/parallel-executor.js +0 -258
- package/dist/core/execution/parallel-executor.js.map +0 -7
- package/dist/core/frame/workflow-templates.js +0 -319
- package/dist/core/frame/workflow-templates.js.map +0 -7
- package/dist/core/merge/conflict-detector.js +0 -431
- package/dist/core/merge/conflict-detector.js.map +0 -7
- package/dist/core/merge/index.js +0 -9
- package/dist/core/merge/index.js.map +0 -7
- package/dist/core/merge/resolution-engine.js +0 -558
- package/dist/core/merge/resolution-engine.js.map +0 -7
- package/dist/core/merge/stack-diff.js +0 -532
- package/dist/core/merge/stack-diff.js.map +0 -7
- package/dist/core/merge/unified-merge-resolver.js +0 -303
- package/dist/core/merge/unified-merge-resolver.js.map +0 -7
- package/dist/core/models/fallback-monitor.js +0 -232
- package/dist/core/models/fallback-monitor.js.map +0 -7
- package/dist/core/models/model-router.js +0 -340
- package/dist/core/models/model-router.js.map +0 -7
- package/dist/core/monitoring/error-handler.js +0 -49
- package/dist/core/monitoring/error-handler.js.map +0 -7
- package/dist/core/monitoring/logger.js +0 -202
- package/dist/core/monitoring/logger.js.map +0 -7
- package/dist/core/monitoring/metrics.js +0 -172
- package/dist/core/monitoring/metrics.js.map +0 -7
- package/dist/core/monitoring/progress-tracker.js +0 -189
- package/dist/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/core/monitoring/session-monitor.js +0 -300
- package/dist/core/monitoring/session-monitor.js.map +0 -7
- package/dist/core/performance/context-cache.js +0 -273
- package/dist/core/performance/context-cache.js.map +0 -7
- package/dist/core/performance/index.js +0 -11
- package/dist/core/performance/index.js.map +0 -7
- package/dist/core/performance/lazy-context-loader.js +0 -327
- package/dist/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/core/performance/monitor.js +0 -221
- package/dist/core/performance/monitor.js.map +0 -7
- package/dist/core/performance/optimized-frame-context.js +0 -345
- package/dist/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/core/performance/performance-benchmark.js +0 -277
- package/dist/core/performance/performance-benchmark.js.map +0 -7
- package/dist/core/performance/performance-profiler.js +0 -370
- package/dist/core/performance/performance-profiler.js.map +0 -7
- package/dist/core/performance/streaming-jsonl-parser.js +0 -195
- package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/core/persistence/postgres-adapter.js +0 -349
- package/dist/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/core/projects/project-isolation.js +0 -201
- package/dist/core/projects/project-isolation.js.map +0 -7
- package/dist/core/projects/project-manager.js +0 -697
- package/dist/core/projects/project-manager.js.map +0 -7
- package/dist/core/query/query-parser.js +0 -370
- package/dist/core/query/query-parser.js.map +0 -7
- package/dist/core/query/query-templates.js +0 -321
- package/dist/core/query/query-templates.js.map +0 -7
- package/dist/core/retrieval/context-retriever.js +0 -479
- package/dist/core/retrieval/context-retriever.js.map +0 -7
- package/dist/core/retrieval/graph-retrieval.js +0 -662
- package/dist/core/retrieval/graph-retrieval.js.map +0 -7
- package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
- package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
- package/dist/core/retrieval/index.js +0 -8
- package/dist/core/retrieval/index.js.map +0 -7
- package/dist/core/retrieval/llm-context-retrieval.js +0 -613
- package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/core/retrieval/llm-provider.js +0 -151
- package/dist/core/retrieval/llm-provider.js.map +0 -7
- package/dist/core/retrieval/retrieval-audit.js +0 -236
- package/dist/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
- package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
- package/dist/core/retrieval/summary-generator.js +0 -589
- package/dist/core/retrieval/summary-generator.js.map +0 -7
- package/dist/core/retrieval/types.js +0 -21
- package/dist/core/retrieval/types.js.map +0 -7
- package/dist/core/security/index.js +0 -35
- package/dist/core/security/index.js.map +0 -7
- package/dist/core/security/input-sanitizer.js +0 -321
- package/dist/core/security/input-sanitizer.js.map +0 -7
- package/dist/core/session/clear-survival.js +0 -465
- package/dist/core/session/clear-survival.js.map +0 -7
- package/dist/core/session/enhanced-handoff.js +0 -792
- package/dist/core/session/enhanced-handoff.js.map +0 -7
- package/dist/core/session/handoff-generator.js +0 -343
- package/dist/core/session/handoff-generator.js.map +0 -7
- package/dist/core/session/index.js.map +0 -7
- package/dist/core/session/session-manager.js +0 -347
- package/dist/core/session/session-manager.js.map +0 -7
- package/dist/core/skills/index.js +0 -7
- package/dist/core/skills/index.js.map +0 -7
- package/dist/core/skills/skill-storage.js +0 -764
- package/dist/core/skills/skill-storage.js.map +0 -7
- package/dist/core/skills/types.js +0 -193
- package/dist/core/skills/types.js.map +0 -7
- package/dist/core/storage/chromadb-adapter.js +0 -354
- package/dist/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/core/storage/infinite-storage.js +0 -510
- package/dist/core/storage/infinite-storage.js.map +0 -7
- package/dist/core/storage/railway-optimized-storage.js +0 -591
- package/dist/core/storage/railway-optimized-storage.js.map +0 -7
- package/dist/core/storage/remote-storage.js +0 -489
- package/dist/core/storage/remote-storage.js.map +0 -7
- package/dist/core/storage/two-tier-storage.js +0 -766
- package/dist/core/storage/two-tier-storage.js.map +0 -7
- package/dist/core/trace/cli-trace-wrapper.js +0 -132
- package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/core/trace/db-trace-wrapper.js +0 -247
- package/dist/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/core/trace/debug-trace.js +0 -417
- package/dist/core/trace/debug-trace.js.map +0 -7
- package/dist/core/trace/index.js +0 -109
- package/dist/core/trace/index.js.map +0 -7
- package/dist/core/trace/linear-api-wrapper.js +0 -178
- package/dist/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/core/trace/trace-demo.js +0 -154
- package/dist/core/trace/trace-demo.js.map +0 -7
- package/dist/core/trace/trace-detector.demo.js +0 -142
- package/dist/core/trace/trace-detector.demo.js.map +0 -7
- package/dist/core/trace/trace-detector.js +0 -528
- package/dist/core/trace/trace-detector.js.map +0 -7
- package/dist/core/trace/trace-store.js +0 -345
- package/dist/core/trace/trace-store.js.map +0 -7
- package/dist/core/trace/types.js +0 -77
- package/dist/core/trace/types.js.map +0 -7
- package/dist/core/utils/async-mutex.js +0 -114
- package/dist/core/utils/async-mutex.js.map +0 -7
- package/dist/core/utils/compression.js +0 -83
- package/dist/core/utils/compression.js.map +0 -7
- package/dist/core/utils/update-checker.js +0 -218
- package/dist/core/utils/update-checker.js.map +0 -7
- package/dist/core/worktree/worktree-manager.js +0 -465
- package/dist/core/worktree/worktree-manager.js.map +0 -7
- package/dist/daemon/daemon-config.js +0 -149
- package/dist/daemon/daemon-config.js.map +0 -7
- package/dist/daemon/services/context-service.js +0 -122
- package/dist/daemon/services/context-service.js.map +0 -7
- package/dist/daemon/services/linear-service.js +0 -136
- package/dist/daemon/services/linear-service.js.map +0 -7
- package/dist/daemon/session-daemon.js +0 -312
- package/dist/daemon/session-daemon.js.map +0 -7
- package/dist/daemon/unified-daemon.js +0 -276
- package/dist/daemon/unified-daemon.js.map +0 -7
- package/dist/features/analytics/api/analytics-api.js +0 -287
- package/dist/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/features/analytics/core/analytics-service.js +0 -282
- package/dist/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/features/analytics/index.js +0 -18
- package/dist/features/analytics/index.js.map +0 -7
- package/dist/features/analytics/queries/metrics-queries.js +0 -277
- package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/features/analytics/types/metrics.js +0 -5
- package/dist/features/analytics/types/metrics.js.map +0 -7
- package/dist/features/browser/browser-mcp.js +0 -492
- package/dist/features/browser/browser-mcp.js.map +0 -7
- package/dist/features/sweep/index.js +0 -20
- package/dist/features/sweep/index.js.map +0 -7
- package/dist/features/sweep/prediction-client.js +0 -155
- package/dist/features/sweep/prediction-client.js.map +0 -7
- package/dist/features/sweep/prompt-builder.js +0 -85
- package/dist/features/sweep/prompt-builder.js.map +0 -7
- package/dist/features/sweep/pty-wrapper.js +0 -171
- package/dist/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/features/sweep/state-watcher.js +0 -87
- package/dist/features/sweep/state-watcher.js.map +0 -7
- package/dist/features/sweep/status-bar.js +0 -88
- package/dist/features/sweep/status-bar.js.map +0 -7
- package/dist/features/sweep/sweep-server-manager.js +0 -226
- package/dist/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/features/sweep/tab-interceptor.js +0 -38
- package/dist/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/features/sweep/types.js +0 -18
- package/dist/features/sweep/types.js.map +0 -7
- package/dist/features/tasks/linear-task-manager.js +0 -487
- package/dist/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/features/tasks/task-aware-context.js +0 -410
- package/dist/features/tasks/task-aware-context.js.map +0 -7
- package/dist/features/tui/simple-monitor.js +0 -116
- package/dist/features/tui/simple-monitor.js.map +0 -7
- package/dist/features/tui/swarm-monitor.js +0 -648
- package/dist/features/tui/swarm-monitor.js.map +0 -7
- package/dist/features/web/client/stores/task-store.js +0 -26
- package/dist/features/web/client/stores/task-store.js.map +0 -7
- package/dist/features/web/server/index.js +0 -194
- package/dist/features/web/server/index.js.map +0 -7
- package/dist/hooks/auto-background.js +0 -151
- package/dist/hooks/auto-background.js.map +0 -7
- package/dist/hooks/claude-code-whatsapp-hook.js +0 -197
- package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/hooks/config.js +0 -150
- package/dist/hooks/config.js.map +0 -7
- package/dist/hooks/daemon.js +0 -364
- package/dist/hooks/daemon.js.map +0 -7
- package/dist/hooks/events.js +0 -58
- package/dist/hooks/events.js.map +0 -7
- package/dist/hooks/index.js +0 -12
- package/dist/hooks/index.js.map +0 -7
- package/dist/hooks/linear-task-picker.js +0 -186
- package/dist/hooks/linear-task-picker.js.map +0 -7
- package/dist/hooks/schemas.js +0 -197
- package/dist/hooks/schemas.js.map +0 -7
- package/dist/hooks/secure-fs.js +0 -49
- package/dist/hooks/secure-fs.js.map +0 -7
- package/dist/hooks/security-logger.js +0 -155
- package/dist/hooks/security-logger.js.map +0 -7
- package/dist/hooks/session-summary.js +0 -222
- package/dist/hooks/session-summary.js.map +0 -7
- package/dist/hooks/sms-action-runner.js +0 -371
- package/dist/hooks/sms-action-runner.js.map +0 -7
- package/dist/hooks/sms-notify.js +0 -506
- package/dist/hooks/sms-notify.js.map +0 -7
- package/dist/hooks/sms-watcher.js +0 -93
- package/dist/hooks/sms-watcher.js.map +0 -7
- package/dist/hooks/sms-webhook.js +0 -555
- package/dist/hooks/sms-webhook.js.map +0 -7
- package/dist/hooks/whatsapp-commands.js +0 -479
- package/dist/hooks/whatsapp-commands.js.map +0 -7
- package/dist/hooks/whatsapp-scheduler.js +0 -317
- package/dist/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/hooks/whatsapp-sync.js +0 -409
- package/dist/hooks/whatsapp-sync.js.map +0 -7
- package/dist/index.js +0 -25
- package/dist/index.js.map +0 -7
- package/dist/integrations/anthropic/client.js +0 -263
- package/dist/integrations/anthropic/client.js.map +0 -7
- package/dist/integrations/claude-code/agent-bridge.js +0 -768
- package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -459
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/integrations/claude-code/lifecycle-hooks.js +0 -254
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/integrations/claude-code/post-task-hooks.js +0 -545
- package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client-stub.js +0 -20
- package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client.js +0 -511
- package/dist/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/integrations/claude-code/task-coordinator.js +0 -360
- package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/integrations/linear/auth.js +0 -337
- package/dist/integrations/linear/auth.js.map +0 -7
- package/dist/integrations/linear/auto-sync.js +0 -258
- package/dist/integrations/linear/auto-sync.js.map +0 -7
- package/dist/integrations/linear/client.js +0 -634
- package/dist/integrations/linear/client.js.map +0 -7
- package/dist/integrations/linear/config.js +0 -130
- package/dist/integrations/linear/config.js.map +0 -7
- package/dist/integrations/linear/migration.js +0 -361
- package/dist/integrations/linear/migration.js.map +0 -7
- package/dist/integrations/linear/oauth-server.js +0 -454
- package/dist/integrations/linear/oauth-server.js.map +0 -7
- package/dist/integrations/linear/rest-client.js +0 -213
- package/dist/integrations/linear/rest-client.js.map +0 -7
- package/dist/integrations/linear/sync-manager.js +0 -236
- package/dist/integrations/linear/sync-manager.js.map +0 -7
- package/dist/integrations/linear/sync-service.js +0 -231
- package/dist/integrations/linear/sync-service.js.map +0 -7
- package/dist/integrations/linear/sync.js +0 -782
- package/dist/integrations/linear/sync.js.map +0 -7
- package/dist/integrations/linear/types.js +0 -5
- package/dist/integrations/linear/types.js.map +0 -7
- package/dist/integrations/linear/unified-sync.js +0 -589
- package/dist/integrations/linear/unified-sync.js.map +0 -7
- package/dist/integrations/linear/webhook-handler.js +0 -219
- package/dist/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/integrations/linear/webhook-server.js +0 -218
- package/dist/integrations/linear/webhook-server.js.map +0 -7
- package/dist/integrations/linear/webhook.js +0 -291
- package/dist/integrations/linear/webhook.js.map +0 -7
- package/dist/integrations/mcp/handlers/code-execution-handlers.js +0 -266
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/context-handlers.js +0 -257
- package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/discovery-handlers.js +0 -497
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/index.js +0 -166
- package/dist/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/integrations/mcp/handlers/linear-handlers.js +0 -247
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/skill-handlers.js +0 -529
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/task-handlers.js +0 -239
- package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/trace-handlers.js +0 -308
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/integrations/mcp/index.js +0 -23
- package/dist/integrations/mcp/index.js.map +0 -7
- package/dist/integrations/mcp/middleware/tool-scoring.js +0 -356
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/integrations/mcp/refactored-server.js +0 -374
- package/dist/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/integrations/mcp/remote-server.js +0 -682
- package/dist/integrations/mcp/remote-server.js.map +0 -7
- package/dist/integrations/mcp/schemas.js +0 -147
- package/dist/integrations/mcp/schemas.js.map +0 -7
- package/dist/integrations/mcp/server.js +0 -1975
- package/dist/integrations/mcp/server.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions-code.js +0 -125
- package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions.js +0 -702
- package/dist/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/integrations/mcp/trace-test.js +0 -48
- package/dist/integrations/mcp/trace-test.js.map +0 -7
- package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
- package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
- package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
- package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -860
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/integrations/ralph/context/context-budget-manager.js +0 -301
- package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/integrations/ralph/context/stackmemory-context-loader.js +0 -360
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/integrations/ralph/coordination/enhanced-coordination.js +0 -410
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/integrations/ralph/index.js +0 -18
- package/dist/integrations/ralph/index.js.map +0 -7
- package/dist/integrations/ralph/learning/pattern-learner.js +0 -401
- package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +0 -448
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js +0 -294
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-registry.js +0 -108
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -463
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -400
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +0 -473
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +0 -388
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/integrations/ralph/performance/performance-optimizer.js +0 -358
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
- package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
- package/dist/integrations/ralph/recovery/crash-recovery.js +0 -462
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/integrations/ralph/state/state-reconciler.js +0 -404
- package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/integrations/ralph/swarm/git-workflow-manager.js +0 -428
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/integrations/ralph/swarm/swarm-coordinator.js +0 -996
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/integrations/ralph/types.js +0 -5
- package/dist/integrations/ralph/types.js.map +0 -7
- package/dist/integrations/ralph/visualization/ralph-debugger.js +0 -585
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/mcp/stackmemory-mcp-server.js +0 -554
- package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/middleware/exponential-rate-limiter.js +0 -289
- package/dist/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/models/user.model.js +0 -358
- package/dist/models/user.model.js.map +0 -7
- package/dist/servers/production/auth-middleware.js +0 -528
- package/dist/servers/production/auth-middleware.js.map +0 -7
- package/dist/servers/railway/config.js +0 -55
- package/dist/servers/railway/config.js.map +0 -7
- package/dist/servers/railway/index-enhanced.js +0 -160
- package/dist/servers/railway/index-enhanced.js.map +0 -7
- package/dist/servers/railway/index.js +0 -1349
- package/dist/servers/railway/index.js.map +0 -7
- package/dist/servers/railway/simple.js +0 -64
- package/dist/servers/railway/simple.js.map +0 -7
- package/dist/servers/railway/storage-test.js +0 -459
- package/dist/servers/railway/storage-test.js.map +0 -7
- package/dist/services/config-service.js +0 -65
- package/dist/services/config-service.js.map +0 -7
- package/dist/services/context-service.js +0 -194
- package/dist/services/context-service.js.map +0 -7
- package/dist/skills/api-discovery.js +0 -354
- package/dist/skills/api-discovery.js.map +0 -7
- package/dist/skills/api-skill.js +0 -475
- package/dist/skills/api-skill.js.map +0 -7
- package/dist/skills/claude-skills.js +0 -1061
- package/dist/skills/claude-skills.js.map +0 -7
- package/dist/skills/dashboard-launcher.js +0 -216
- package/dist/skills/dashboard-launcher.js.map +0 -7
- package/dist/skills/recursive-agent-orchestrator.js +0 -575
- package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/skills/repo-ingestion-skill.js +0 -609
- package/dist/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/skills/security-secrets-scanner.js +0 -284
- package/dist/skills/security-secrets-scanner.js.map +0 -7
- package/dist/skills/unified-rlm-orchestrator.js +0 -404
- package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/types/task.js +0 -5
- package/dist/types/task.js.map +0 -7
- package/dist/utils/env.js +0 -50
- package/dist/utils/env.js.map +0 -7
- package/dist/utils/formatting.js +0 -62
- package/dist/utils/formatting.js.map +0 -7
- package/dist/utils/process-cleanup.js +0 -136
- package/dist/utils/process-cleanup.js.map +0 -7
- package/dist/validation/schemas.js +0 -222
- package/dist/validation/schemas.js.map +0 -7
- /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
- /package/dist/{core → src/integrations/diffmem}/types.js +0 -0
- /package/dist/{core → src/integrations/diffmem}/types.js.map +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/agents/testing-agent.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Testing Agent - Automated Test Generation and Execution\n * Analyzes code to generate comprehensive test suites\n */\n\nimport * as ts from 'typescript';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { dirname, join, basename } from 'path';\nimport { execSync } from 'child_process';\nimport { glob } from 'glob';\nimport { logger } from '../core/monitoring/logger.js';\n\ninterface TestCase {\n name: string;\n description: string;\n setup?: string;\n action: string;\n assertion: string;\n cleanup?: string;\n isAsync?: boolean;\n}\n\ninterface TestSuite {\n filePath: string;\n targetPath: string;\n describe: string;\n imports: string[];\n beforeEach?: string;\n afterEach?: string;\n tests: TestCase[];\n}\n\ninterface CoverageReport {\n filePath: string;\n lines: { total: number; covered: number; percentage: number };\n branches: { total: number; covered: number; percentage: number };\n functions: { total: number; covered: number; percentage: number };\n uncoveredLines: number[];\n}\n\ninterface TestResults {\n passed: number;\n failed: number;\n skipped: number;\n duration: number;\n failures: Array<{ test: string; error: string }>;\n}\n\ninterface MockData {\n name: string;\n type: string;\n value: unknown;\n implementation?: string;\n}\n\ninterface Fixture {\n name: string;\n data: unknown;\n setup?: string;\n teardown?: string;\n}\n\ninterface PerfReport {\n function: string;\n averageTime: number;\n minTime: number;\n maxTime: number;\n iterations: number;\n memoryUsage: number;\n}\n\nexport class TestingAgent {\n private readonly projectRoot: string;\n private readonly testDir: string;\n private readonly mockDir: string;\n private readonly fixtureDir: string;\n\n constructor(projectRoot = process.cwd()) {\n this.projectRoot = projectRoot;\n this.testDir = join(projectRoot, 'src', '__tests__');\n this.mockDir = join(projectRoot, 'src', '__mocks__');\n this.fixtureDir = join(projectRoot, 'src', '__fixtures__');\n }\n\n /**\n * Analyze code coverage from existing reports\n */\n public async analyzeCodeCoverage(\n targetPath: string\n ): Promise<CoverageReport> {\n const coveragePath = join(\n this.projectRoot,\n 'coverage',\n 'coverage-final.json'\n );\n\n if (!existsSync(coveragePath)) {\n // Run coverage first\n try {\n execSync('npm run test -- --coverage --silent', {\n cwd: this.projectRoot,\n stdio: 'pipe',\n });\n } catch (error) {\n logger.warn('Coverage generation failed', { error });\n }\n }\n\n // Parse coverage report\n if (existsSync(coveragePath)) {\n const coverage = JSON.parse(\n readFileSync(coveragePath, 'utf-8')\n ) as Record<string, unknown>;\n const fileCoverage =\n (coverage[targetPath] as Record<string, unknown>) || {};\n\n return {\n filePath: targetPath,\n lines: this.calculateCoverage(\n (fileCoverage.s as Record<string, number>) || {}\n ),\n branches: this.calculateCoverage(\n (fileCoverage.b as Record<string, number>) || {}\n ),\n functions: this.calculateCoverage(\n (fileCoverage.f as Record<string, number>) || {}\n ),\n uncoveredLines: this.findUncoveredLines(\n (fileCoverage.statementMap as Record<string, unknown>) || {},\n (fileCoverage.s as Record<string, number>) || {}\n ),\n };\n }\n\n // Default report if no coverage data\n return {\n filePath: targetPath,\n lines: { total: 0, covered: 0, percentage: 0 },\n branches: { total: 0, covered: 0, percentage: 0 },\n functions: { total: 0, covered: 0, percentage: 0 },\n uncoveredLines: [],\n };\n }\n\n /**\n * Generate unit tests for a function or module\n */\n public async generateUnitTests(targetPath: string): Promise<TestSuite> {\n const sourceCode = readFileSync(targetPath, 'utf-8');\n const sourceFile = ts.createSourceFile(\n targetPath,\n sourceCode,\n ts.ScriptTarget.Latest,\n true\n );\n\n const functions = this.extractFunctions(sourceFile);\n const classes = this.extractClasses(sourceFile);\n const tests: TestCase[] = [];\n\n // Generate tests for functions\n for (const func of functions) {\n tests.push(...this.generateFunctionTests(func));\n }\n\n // Generate tests for classes\n for (const cls of classes) {\n tests.push(...this.generateClassTests(cls));\n }\n\n // Create test suite\n const testSuite: TestSuite = {\n filePath: this.getTestPath(targetPath),\n targetPath,\n describe: this.getModuleName(targetPath),\n imports: this.generateImports(targetPath, sourceFile),\n beforeEach: this.generateBeforeEach(classes),\n afterEach: this.generateAfterEach(classes),\n tests,\n };\n\n return testSuite;\n }\n\n /**\n * Generate integration tests for a module\n */\n public async generateIntegrationTests(\n modulePath: string\n ): Promise<TestSuite> {\n const moduleFiles = glob.sync(join(modulePath, '**/*.ts'), {\n ignore: ['**/*.test.ts', '**/*.spec.ts', '**/node_modules/**'],\n });\n\n const tests: TestCase[] = [];\n const dependencies = new Set<string>();\n\n // Analyze module interactions\n for (const file of moduleFiles) {\n const sourceCode = readFileSync(file, 'utf-8');\n const sourceFile = ts.createSourceFile(\n file,\n sourceCode,\n ts.ScriptTarget.Latest,\n true\n );\n\n // Find external dependencies\n this.findDependencies(sourceFile, dependencies);\n }\n\n // Generate integration test cases\n tests.push(\n ...this.generateModuleIntegrationTests(\n modulePath,\n Array.from(dependencies)\n )\n );\n\n const testSuite: TestSuite = {\n filePath: this.getIntegrationTestPath(modulePath),\n targetPath: modulePath,\n describe: `${basename(modulePath)} Integration`,\n imports: this.generateIntegrationImports(modulePath, dependencies),\n beforeEach: this.generateIntegrationSetup(dependencies),\n afterEach: this.generateIntegrationCleanup(),\n tests,\n };\n\n return testSuite;\n }\n\n /**\n * Generate edge case tests for a function\n */\n public async generateEdgeCaseTests(\n targetPath: string,\n functionName: string\n ): Promise<TestCase[]> {\n const sourceCode = readFileSync(targetPath, 'utf-8');\n const sourceFile = ts.createSourceFile(\n targetPath,\n sourceCode,\n ts.ScriptTarget.Latest,\n true\n );\n\n const func = this.findFunction(sourceFile, functionName);\n if (!func) {\n throw new Error(`Function ${functionName} not found in ${targetPath}`);\n }\n\n return this.generateFunctionEdgeCases(func);\n }\n\n /**\n * Execute tests and return results\n */\n public async executeTests(pattern: string): Promise<TestResults> {\n try {\n const output = execSync(`npm run test -- ${pattern} --reporter=json`, {\n cwd: this.projectRoot,\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n\n const results = JSON.parse(output) as Record<string, unknown>;\n return {\n passed: (results.numPassedTests as number) || 0,\n failed: (results.numFailedTests as number) || 0,\n skipped: (results.numPendingTests as number) || 0,\n duration: (results.duration as number) || 0,\n failures: this.extractFailures(results),\n };\n } catch (error: unknown) {\n // Parse error output\n return {\n passed: 0,\n failed: 1,\n skipped: 0,\n duration: 0,\n failures: [{ test: 'Test execution', error: (error as Error).message }],\n };\n }\n }\n\n /**\n * Generate mock data for testing\n */\n public generateMockData(schema: Record<string, unknown>): MockData {\n const mockType = this.inferTypeFromSchema(schema);\n const mockValue = this.generateMockValue(mockType, schema);\n\n return {\n name: (schema.name as string) || 'mockData',\n type: mockType,\n value: mockValue,\n implementation: this.generateMockImplementation(schema),\n };\n }\n\n /**\n * Create test fixtures\n */\n public createTestFixtures(componentName: string): Fixture[] {\n const fixtures: Fixture[] = [];\n\n // Generate common fixtures\n fixtures.push({\n name: `${componentName}DefaultProps`,\n data: this.generateDefaultProps(),\n setup: this.generateFixtureSetup(componentName),\n teardown: this.generateFixtureTeardown(componentName),\n });\n\n fixtures.push({\n name: `${componentName}EdgeCaseProps`,\n data: this.generateEdgeCaseProps(),\n });\n\n fixtures.push({\n name: `${componentName}TestData`,\n data: this.generateTestData(),\n });\n\n return fixtures;\n }\n\n /**\n * Benchmark performance of a function\n */\n public async benchmarkPerformance(\n targetPath: string,\n functionName: string\n ): Promise<PerfReport> {\n const benchmarkCode = this.generateBenchmarkCode(targetPath, functionName);\n const benchmarkFile = join(\n this.testDir,\n 'benchmarks',\n `${functionName}.bench.ts`\n );\n\n // Ensure directory exists\n const benchDir = dirname(benchmarkFile);\n if (!existsSync(benchDir)) {\n mkdirSync(benchDir, { recursive: true });\n }\n\n // Write benchmark file\n writeFileSync(benchmarkFile, benchmarkCode);\n\n // Run benchmark\n try {\n const output = execSync(\n `npx vitest bench ${benchmarkFile} --reporter=json`,\n {\n cwd: this.projectRoot,\n encoding: 'utf-8',\n stdio: 'pipe',\n }\n );\n\n const results = JSON.parse(output) as Record<string, unknown>;\n return this.parseBenchmarkResults(results, functionName);\n } catch (error) {\n logger.error('Benchmark failed', { error });\n return {\n function: functionName,\n averageTime: 0,\n minTime: 0,\n maxTime: 0,\n iterations: 0,\n memoryUsage: 0,\n };\n }\n }\n\n /**\n * Save generated test suite to file\n */\n public async saveTestSuite(suite: TestSuite): Promise<void> {\n const testCode = this.generateTestCode(suite);\n const testDir = dirname(suite.filePath);\n\n // Ensure directory exists\n if (!existsSync(testDir)) {\n mkdirSync(testDir, { recursive: true });\n }\n\n writeFileSync(suite.filePath, testCode);\n logger.info('Test suite saved', { path: suite.filePath });\n }\n\n // Private helper methods\n\n private extractFunctions(\n sourceFile: ts.SourceFile\n ): ts.FunctionDeclaration[] {\n const functions: ts.FunctionDeclaration[] = [];\n\n const visit = (node: ts.Node) => {\n if (ts.isFunctionDeclaration(node) && node.name) {\n functions.push(node);\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return functions;\n }\n\n private extractClasses(sourceFile: ts.SourceFile): ts.ClassDeclaration[] {\n const classes: ts.ClassDeclaration[] = [];\n\n const visit = (node: ts.Node) => {\n if (ts.isClassDeclaration(node) && node.name) {\n classes.push(node);\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return classes;\n }\n\n private generateFunctionTests(func: ts.FunctionDeclaration): TestCase[] {\n const tests: TestCase[] = [];\n const funcName = func.name?.getText() || 'unknown';\n\n // Happy path test\n tests.push({\n name: `should execute ${funcName} successfully with valid input`,\n description: `Test normal execution of ${funcName}`,\n action: `const result = ${funcName}();`,\n assertion: 'expect(result).toBeDefined();',\n });\n\n return tests;\n }\n\n private generateClassTests(cls: ts.ClassDeclaration): TestCase[] {\n const tests: TestCase[] = [];\n const className = cls.name?.getText() || 'UnknownClass';\n\n // Constructor test\n tests.push({\n name: `should create instance of ${className}`,\n description: `Test ${className} instantiation`,\n action: `const instance = new ${className}()`,\n assertion: `expect(instance).toBeInstanceOf(${className})`,\n });\n\n return tests;\n }\n\n private generateFunctionEdgeCases(_func: ts.FunctionDeclaration): TestCase[] {\n return [];\n }\n\n private generateTestCode(suite: TestSuite): string {\n const imports = suite.imports.join('\\n');\n const tests = suite.tests\n .map((test) => this.formatTestCase(test))\n .join('\\n\\n ');\n\n return `/**\n * Generated test suite for ${suite.targetPath}\n * Generated by TestingAgent\n */\n\n${imports}\n\ndescribe('${suite.describe}', () => {\n${suite.beforeEach ? ` beforeEach(() => {\\n ${suite.beforeEach}\\n });\\n` : ''}\n${suite.afterEach ? ` afterEach(() => {\\n ${suite.afterEach}\\n });\\n` : ''}\n ${tests}\n});\n`;\n }\n\n private formatTestCase(test: TestCase): string {\n return `it('${test.name}', () => {\n${test.setup ? ` // Arrange\\n ${test.setup}\\n` : ''}\n // Act\n ${test.action}\n\n // Assert\n ${test.assertion}\n${test.cleanup ? `\\n // Cleanup\\n ${test.cleanup}` : ''}\n })`;\n }\n\n private generateImports(\n targetPath: string,\n sourceFile: ts.SourceFile\n ): string[] {\n const imports: string[] = [\n `import { describe, it, expect, beforeEach, afterEach } from 'vitest';`,\n ];\n\n // Import the module being tested\n const relativePath = this.getRelativePath(\n this.getTestPath(targetPath),\n targetPath\n );\n const exportedNames = this.getExportedNames(sourceFile);\n if (exportedNames.length > 0) {\n imports.push(\n `import { ${exportedNames.join(', ')} } from '${relativePath}';`\n );\n }\n\n return imports;\n }\n\n private getExportedNames(sourceFile: ts.SourceFile): string[] {\n const exports: string[] = [];\n\n const visit = (node: ts.Node) => {\n if (\n ts.isFunctionDeclaration(node) &&\n node.name &&\n this.isExported(node)\n ) {\n exports.push(node.name.getText());\n }\n if (ts.isClassDeclaration(node) && node.name && this.isExported(node)) {\n exports.push(node.name.getText());\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return exports;\n }\n\n private isExported(node: ts.Node): boolean {\n return (\n node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ||\n false\n );\n }\n\n private getTestPath(targetPath: string): string {\n const relativePath = targetPath.replace(this.projectRoot, '');\n const pathParts = relativePath.split('/');\n const fileName = pathParts.pop();\n const testFileName = fileName?.replace('.ts', '.test.ts');\n\n return join(\n this.projectRoot,\n 'src',\n '__tests__',\n ...pathParts.slice(2),\n testFileName || ''\n );\n }\n\n private getIntegrationTestPath(modulePath: string): string {\n const moduleName = basename(modulePath);\n return join(\n this.testDir,\n 'integration',\n `${moduleName}.integration.test.ts`\n );\n }\n\n private getModuleName(targetPath: string): string {\n const fileName = basename(targetPath);\n return fileName.replace(/\\.(ts|js)$/, '');\n }\n\n private getRelativePath(from: string, to: string): string {\n const fromParts = from.split('/');\n const toParts = to.split('/');\n\n // Find common base\n let i = 0;\n while (\n i < fromParts.length &&\n i < toParts.length &&\n fromParts[i] === toParts[i]\n ) {\n i++;\n }\n\n // Generate relative path\n const upCount = fromParts.length - i - 1;\n const ups = Array(upCount).fill('..');\n const downs = toParts.slice(i);\n\n const relativePath = [...ups, ...downs].join('/');\n return relativePath.replace(/\\.ts$/, '.js');\n }\n\n private calculateCoverage(coverageData: Record<string, number>): {\n total: number;\n covered: number;\n percentage: number;\n } {\n const values = Object.values(coverageData);\n const total = values.length;\n const covered = values.filter((v) => v > 0).length;\n const percentage = total > 0 ? (covered / total) * 100 : 0;\n\n return { total, covered, percentage: Math.round(percentage) };\n }\n\n private findUncoveredLines(\n statementMap: Record<string, unknown>,\n statements: Record<string, number>\n ): number[] {\n const uncovered: number[] = [];\n\n Object.entries(statements).forEach(([key, value]) => {\n if (value === 0 && statementMap[key]) {\n const loc = (statementMap[key] as { start: { line: number } }).start;\n uncovered.push(loc.line);\n }\n });\n\n return uncovered;\n }\n\n private extractFailures(\n results: Record<string, unknown>\n ): Array<{ test: string; error: string }> {\n const failures: Array<{ test: string; error: string }> = [];\n\n if (results.testResults) {\n const testResults = results.testResults as Array<{\n assertionResults?: Array<{\n status: string;\n title: string;\n failureMessages?: string[];\n }>;\n }>;\n testResults.forEach((suite) => {\n suite.assertionResults?.forEach((test) => {\n if (test.status === 'failed') {\n failures.push({\n test: test.title,\n error: test.failureMessages?.join('\\n') || 'Unknown error',\n });\n }\n });\n });\n }\n\n return failures;\n }\n\n // Mock and fixture generation helpers\n private generateMockImplementation(schema: Record<string, unknown>): string {\n return `export const mock${(schema.name as string) || 'Data'} = {\n ${this.generateMockProperties(schema)}\n};`;\n }\n\n private generateMockProperties(schema: Record<string, unknown>): string {\n if (!schema.properties) return '';\n\n const properties = schema.properties as Record<string, { type: string }>;\n return Object.entries(properties)\n .map(([key, value]) => {\n return `${key}: ${this.generateMockValue(value.type, value)}`;\n })\n .join(',\\n ');\n }\n\n private generateMockValue(type: string, _schema: unknown): string {\n switch (type) {\n case 'string':\n return `'mock-value'`;\n case 'number':\n return `${Math.floor(Math.random() * 100)}`;\n case 'boolean':\n return 'true';\n case 'array':\n return '[]';\n case 'object':\n return '{}';\n default:\n return 'null';\n }\n }\n\n private inferTypeFromSchema(schema: unknown): string {\n if (typeof schema === 'object' && schema !== null && 'type' in schema) {\n return (schema as { type: string }).type;\n }\n if (Array.isArray(schema)) return 'array';\n if (typeof schema === 'object') return 'object';\n return typeof schema;\n }\n\n private findDependencies(\n sourceFile: ts.SourceFile,\n dependencies: Set<string>\n ): void {\n const visit = (node: ts.Node) => {\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) {\n dependencies.add(moduleSpecifier.text);\n }\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n }\n\n private generateModuleIntegrationTests(\n modulePath: string,\n _dependencies: string[]\n ): TestCase[] {\n const tests: TestCase[] = [];\n const moduleName = basename(modulePath);\n\n tests.push({\n name: `should initialize ${moduleName} module`,\n description: `Test module initialization`,\n action: `const module = await import('${modulePath}');`,\n assertion: `expect(module).toBeDefined();`,\n isAsync: true,\n });\n\n return tests;\n }\n\n private generateIntegrationImports(\n modulePath: string,\n dependencies: Set<string>\n ): string[] {\n const imports = [\n `import { describe, it, expect, beforeEach, afterEach } from 'vitest';`,\n ];\n\n // Add dependency imports\n dependencies.forEach((dep) => {\n if (!dep.startsWith('.')) {\n const importName = dep.replace(/[^a-zA-Z]/g, '');\n imports.push(`import * as ${importName} from '${dep}';`);\n }\n });\n\n return imports;\n }\n\n private generateIntegrationSetup(_dependencies: Set<string>): string {\n return 'const testContext = {};';\n }\n\n private generateIntegrationCleanup(): string {\n return '// Reset any global state';\n }\n\n private generateBeforeEach(\n classes: ts.ClassDeclaration[]\n ): string | undefined {\n if (classes.length === 0) return undefined;\n return '// Setup test environment';\n }\n\n private generateAfterEach(\n classes: ts.ClassDeclaration[]\n ): string | undefined {\n if (classes.length === 0) return undefined;\n return '// Cleanup test environment';\n }\n\n private findFunction(\n sourceFile: ts.SourceFile,\n functionName: string\n ): ts.FunctionDeclaration | undefined {\n let result: ts.FunctionDeclaration | undefined;\n\n const visit = (node: ts.Node) => {\n if (\n ts.isFunctionDeclaration(node) &&\n node.name?.getText() === functionName\n ) {\n result = node;\n }\n if (!result) {\n ts.forEachChild(node, visit);\n }\n };\n\n visit(sourceFile);\n return result;\n }\n\n private generateDefaultProps(): Record<string, unknown> {\n return {\n id: 'test-id',\n className: 'test-class',\n children: 'Test Content',\n };\n }\n\n private generateEdgeCaseProps(): Record<string, unknown> {\n return {\n id: '',\n className: null,\n children: undefined,\n };\n }\n\n private generateTestData(): Record<string, unknown> {\n return {\n items: [\n { id: 1, name: 'Item 1' },\n { id: 2, name: 'Item 2' },\n ],\n config: {\n enabled: true,\n limit: 10,\n },\n };\n }\n\n private generateFixtureSetup(componentName: string): string {\n return `// Setup ${componentName} fixture`;\n }\n\n private generateFixtureTeardown(componentName: string): string {\n return `// Teardown ${componentName} fixture`;\n }\n\n private generateBenchmarkCode(\n targetPath: string,\n functionName: string\n ): string {\n return `import { bench, describe } from 'vitest';\nimport { ${functionName} } from '${targetPath}';\n\ndescribe('${functionName} performance', () => {\n bench('${functionName} execution time', () => {\n ${functionName}();\n });\n});`;\n }\n\n private parseBenchmarkResults(\n results: Record<string, unknown>,\n functionName: string\n ): PerfReport {\n return {\n function: functionName,\n averageTime: (results.mean as number) || 0,\n minTime: (results.min as number) || 0,\n maxTime: (results.max as number) || 0,\n iterations: (results.samples as number) || 0,\n memoryUsage: (results.memory as number) || 0,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
-
import { dirname as __pathDirname } from 'path';
|
|
3
|
-
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
-
const __dirname = __pathDirname(__filename);
|
|
5
|
-
import { logger } from "../../core/monitoring/logger.js";
|
|
6
|
-
class BaseVerifier {
|
|
7
|
-
config;
|
|
8
|
-
retryCount = /* @__PURE__ */ new Map();
|
|
9
|
-
constructor(config) {
|
|
10
|
-
this.config = config;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Extract most relevant error messages (Spotify pattern)
|
|
14
|
-
*/
|
|
15
|
-
extractRelevantErrors(output, patterns) {
|
|
16
|
-
const errors = [];
|
|
17
|
-
const lines = output.split("\n");
|
|
18
|
-
for (const line of lines) {
|
|
19
|
-
for (const pattern of patterns) {
|
|
20
|
-
const match = line.match(pattern);
|
|
21
|
-
if (match) {
|
|
22
|
-
errors.push(match[0]);
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return errors.slice(0, 5);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Generate incremental feedback
|
|
31
|
-
*/
|
|
32
|
-
generateFeedback(errors, context) {
|
|
33
|
-
if (errors.length === 0) {
|
|
34
|
-
return `${this.config.name} verification passed`;
|
|
35
|
-
}
|
|
36
|
-
const prefix = context.filePath ? `In ${context.filePath}: ` : "";
|
|
37
|
-
const errorList = errors.map((e) => ` - ${e}`).join("\n");
|
|
38
|
-
return `${prefix}${this.config.name} found ${errors.length} issue(s):
|
|
39
|
-
${errorList}`;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Retry logic for transient failures
|
|
43
|
-
*/
|
|
44
|
-
async withRetry(operation, key) {
|
|
45
|
-
const maxRetries = this.config.maxRetries || 0;
|
|
46
|
-
const currentRetries = this.retryCount.get(key) || 0;
|
|
47
|
-
try {
|
|
48
|
-
const result = await operation();
|
|
49
|
-
this.retryCount.delete(key);
|
|
50
|
-
return result;
|
|
51
|
-
} catch (error) {
|
|
52
|
-
if (currentRetries < maxRetries) {
|
|
53
|
-
this.retryCount.set(key, currentRetries + 1);
|
|
54
|
-
logger.warn(`Retrying ${this.config.name} verification`, {
|
|
55
|
-
attempt: currentRetries + 1,
|
|
56
|
-
maxRetries,
|
|
57
|
-
error: error instanceof Error ? error.message : String(error)
|
|
58
|
-
});
|
|
59
|
-
await this.delay(Math.pow(2, currentRetries) * 1e3);
|
|
60
|
-
return this.withRetry(operation, key);
|
|
61
|
-
}
|
|
62
|
-
this.retryCount.delete(key);
|
|
63
|
-
throw error;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Apply timeout to verification
|
|
68
|
-
*/
|
|
69
|
-
async withTimeout(operation) {
|
|
70
|
-
if (!this.config.timeout) {
|
|
71
|
-
return operation();
|
|
72
|
-
}
|
|
73
|
-
return Promise.race([
|
|
74
|
-
operation(),
|
|
75
|
-
new Promise(
|
|
76
|
-
(_, reject) => setTimeout(
|
|
77
|
-
() => reject(
|
|
78
|
-
new Error(
|
|
79
|
-
`${this.config.name} timeout after ${this.config.timeout}ms`
|
|
80
|
-
)
|
|
81
|
-
),
|
|
82
|
-
this.config.timeout
|
|
83
|
-
)
|
|
84
|
-
)
|
|
85
|
-
]);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Helper to create a standard result
|
|
89
|
-
*/
|
|
90
|
-
createResult(passed, message, severity = "info", details, autoFix) {
|
|
91
|
-
return {
|
|
92
|
-
verifierId: this.config.id,
|
|
93
|
-
verifierType: this.config.type,
|
|
94
|
-
passed,
|
|
95
|
-
message,
|
|
96
|
-
severity,
|
|
97
|
-
timestamp: /* @__PURE__ */ new Date(),
|
|
98
|
-
details: details || void 0,
|
|
99
|
-
autoFix: autoFix || void 0
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Delay helper for retries
|
|
104
|
-
*/
|
|
105
|
-
delay(ms) {
|
|
106
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Get verifier configuration
|
|
110
|
-
*/
|
|
111
|
-
getConfig() {
|
|
112
|
-
return { ...this.config };
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Check if verifier should stop execution on error
|
|
116
|
-
*/
|
|
117
|
-
shouldStopOnError() {
|
|
118
|
-
return this.config.stopOnError;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Update verifier configuration
|
|
122
|
-
*/
|
|
123
|
-
updateConfig(updates) {
|
|
124
|
-
this.config = { ...this.config, ...updates };
|
|
125
|
-
logger.info(`Updated ${this.config.name} configuration`, {
|
|
126
|
-
updates
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
export {
|
|
131
|
-
BaseVerifier
|
|
132
|
-
};
|
|
133
|
-
//# sourceMappingURL=base-verifier.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/agents/verifiers/base-verifier.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Base Verifier Interface - Spotify-inspired verification infrastructure\n *\n * Implements the strong verification loop pattern from Spotify's approach:\n * - Component-aware activation\n * - Incremental feedback\n * - Abstract complexity from agents\n */\n\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport type VerifierSeverity = 'error' | 'warning' | 'info';\nexport type VerifierType =\n | 'syntax'\n | 'semantic'\n | 'performance'\n | 'security'\n | 'style';\n\nexport interface VerifierContext {\n filePath?: string;\n language?: string;\n framework?: string;\n hasTests?: boolean;\n hasDocumentation?: boolean;\n isProduction?: boolean;\n customRules?: Record<string, any>;\n}\n\nexport interface VerifierResult {\n verifierId: string;\n verifierType: VerifierType;\n passed: boolean;\n message: string;\n severity: VerifierSeverity;\n timestamp: Date;\n details?: VerifierDetails;\n autoFix?: VerifierAutoFix;\n confidence?: number; // 0-1, for probabilistic verifiers like LLM judge\n}\n\nexport interface VerifierDetails {\n location?: {\n file?: string;\n line?: number;\n column?: number;\n };\n code?: string;\n expected?: string;\n actual?: string;\n suggestion?: string;\n relatedLinks?: string[];\n}\n\nexport interface VerifierAutoFix {\n command: string;\n description: string;\n safe: boolean; // Whether fix can be applied automatically\n confidence: number; // 0-1\n}\n\nexport interface VerifierConfig {\n id: string;\n name: string;\n type: VerifierType;\n enabled: boolean;\n stopOnError: boolean; // Spotify's stop hook pattern\n maxRetries?: number;\n timeout?: number; // milliseconds\n customConfig?: Record<string, any>;\n}\n\n/**\n * Abstract base class for all verifiers\n */\nexport abstract class BaseVerifier {\n protected config: VerifierConfig;\n protected retryCount: Map<string, number> = new Map();\n\n constructor(config: VerifierConfig) {\n this.config = config;\n }\n\n /**\n * Check if verifier should be activated for given context\n * Implements Spotify's context-aware activation\n */\n abstract shouldActivate(context: VerifierContext): boolean;\n\n /**\n * Run verification on the given input\n */\n abstract verify(\n input: string | Buffer,\n context: VerifierContext\n ): Promise<VerifierResult>;\n\n /**\n * Extract most relevant error messages (Spotify pattern)\n */\n protected extractRelevantErrors(\n output: string,\n patterns: RegExp[]\n ): string[] {\n const errors: string[] = [];\n const lines = output.split('\\n');\n\n for (const line of lines) {\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match) {\n errors.push(match[0]);\n break;\n }\n }\n }\n\n // Limit to most relevant errors (Spotify's approach)\n return errors.slice(0, 5);\n }\n\n /**\n * Generate incremental feedback\n */\n protected generateFeedback(\n errors: string[],\n context: VerifierContext\n ): string {\n if (errors.length === 0) {\n return `${this.config.name} verification passed`;\n }\n\n const prefix = context.filePath ? `In ${context.filePath}: ` : '';\n const errorList = errors.map((e) => ` - ${e}`).join('\\n');\n\n return `${prefix}${this.config.name} found ${errors.length} issue(s):\\n${errorList}`;\n }\n\n /**\n * Retry logic for transient failures\n */\n protected async withRetry<T>(\n operation: () => Promise<T>,\n key: string\n ): Promise<T> {\n const maxRetries = this.config.maxRetries || 0;\n const currentRetries = this.retryCount.get(key) || 0;\n\n try {\n const result = await operation();\n this.retryCount.delete(key); // Clear on success\n return result;\n } catch (error: unknown) {\n if (currentRetries < maxRetries) {\n this.retryCount.set(key, currentRetries + 1);\n logger.warn(`Retrying ${this.config.name} verification`, {\n attempt: currentRetries + 1,\n maxRetries,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Exponential backoff\n await this.delay(Math.pow(2, currentRetries) * 1000);\n return this.withRetry(operation, key);\n }\n\n this.retryCount.delete(key);\n throw error;\n }\n }\n\n /**\n * Apply timeout to verification\n */\n protected async withTimeout<T>(operation: () => Promise<T>): Promise<T> {\n if (!this.config.timeout) {\n return operation();\n }\n\n return Promise.race([\n operation(),\n new Promise<T>((_, reject) =>\n setTimeout(\n () =>\n reject(\n new Error(\n `${this.config.name} timeout after ${this.config.timeout}ms`\n )\n ),\n this.config.timeout\n )\n ),\n ]);\n }\n\n /**\n * Helper to create a standard result\n */\n protected createResult(\n passed: boolean,\n message: string,\n severity: VerifierSeverity = 'info',\n details?: VerifierDetails,\n autoFix?: VerifierAutoFix\n ): VerifierResult {\n return {\n verifierId: this.config.id,\n verifierType: this.config.type,\n passed,\n message,\n severity,\n timestamp: new Date(),\n details: details || undefined,\n autoFix: autoFix || undefined,\n };\n }\n\n /**\n * Delay helper for retries\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Get verifier configuration\n */\n getConfig(): VerifierConfig {\n return { ...this.config };\n }\n\n /**\n * Check if verifier should stop execution on error\n */\n shouldStopOnError(): boolean {\n return this.config.stopOnError;\n }\n\n /**\n * Update verifier configuration\n */\n updateConfig(updates: Partial<VerifierConfig>): void {\n this.config = { ...this.config, ...updates };\n logger.info(`Updated ${this.config.name} configuration`, {\n updates,\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
-
import { dirname as __pathDirname } from 'path';
|
|
3
|
-
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
-
const __dirname = __pathDirname(__filename);
|
|
5
|
-
import { exec } from "child_process";
|
|
6
|
-
import { promisify } from "util";
|
|
7
|
-
import {
|
|
8
|
-
BaseVerifier
|
|
9
|
-
} from "./base-verifier.js";
|
|
10
|
-
import { logger } from "../../core/monitoring/logger.js";
|
|
11
|
-
const execAsync = promisify(exec);
|
|
12
|
-
class FormatterVerifier extends BaseVerifier {
|
|
13
|
-
formatters = /* @__PURE__ */ new Map();
|
|
14
|
-
constructor(config) {
|
|
15
|
-
super({
|
|
16
|
-
id: "formatter",
|
|
17
|
-
name: "Code Formatter",
|
|
18
|
-
type: "style",
|
|
19
|
-
enabled: true,
|
|
20
|
-
stopOnError: false,
|
|
21
|
-
timeout: 1e4,
|
|
22
|
-
...config
|
|
23
|
-
});
|
|
24
|
-
this.initializeFormatters();
|
|
25
|
-
}
|
|
26
|
-
initializeFormatters() {
|
|
27
|
-
this.formatters.set("typescript", {
|
|
28
|
-
checkCommand: "npx prettier --check",
|
|
29
|
-
fixCommand: "npx prettier --write",
|
|
30
|
-
patterns: [/\[error\]/gi, /File not formatted/gi]
|
|
31
|
-
});
|
|
32
|
-
this.formatters.set("javascript", {
|
|
33
|
-
checkCommand: "npx prettier --check",
|
|
34
|
-
fixCommand: "npx prettier --write",
|
|
35
|
-
patterns: [/\[error\]/gi, /File not formatted/gi]
|
|
36
|
-
});
|
|
37
|
-
this.formatters.set("python", {
|
|
38
|
-
checkCommand: "black --check",
|
|
39
|
-
fixCommand: "black",
|
|
40
|
-
patterns: [/would reformat/gi, /File not formatted/gi]
|
|
41
|
-
});
|
|
42
|
-
this.formatters.set("rust", {
|
|
43
|
-
checkCommand: "cargo fmt -- --check",
|
|
44
|
-
fixCommand: "cargo fmt",
|
|
45
|
-
patterns: [/Diff in/gi, /File not formatted/gi]
|
|
46
|
-
});
|
|
47
|
-
this.formatters.set("go", {
|
|
48
|
-
checkCommand: "gofmt -l",
|
|
49
|
-
fixCommand: "gofmt -w",
|
|
50
|
-
patterns: [/.+\.go$/gm]
|
|
51
|
-
// gofmt lists unformatted files
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
shouldActivate(context) {
|
|
55
|
-
if (!context.language || !context.filePath) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
return this.formatters.has(context.language.toLowerCase());
|
|
59
|
-
}
|
|
60
|
-
async verify(input, context) {
|
|
61
|
-
if (!context.language || !context.filePath) {
|
|
62
|
-
return this.createResult(
|
|
63
|
-
false,
|
|
64
|
-
"Missing language or file path in context",
|
|
65
|
-
"error"
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
const formatter = this.formatters.get(context.language.toLowerCase());
|
|
69
|
-
if (!formatter) {
|
|
70
|
-
return this.createResult(
|
|
71
|
-
true,
|
|
72
|
-
`No formatter configured for ${context.language}`,
|
|
73
|
-
"info"
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
return await this.withTimeout(async () => {
|
|
78
|
-
return await this.withRetry(
|
|
79
|
-
() => this.runFormatter(formatter, context),
|
|
80
|
-
context.filePath
|
|
81
|
-
);
|
|
82
|
-
});
|
|
83
|
-
} catch (error) {
|
|
84
|
-
logger.error(
|
|
85
|
-
"Formatter verification failed",
|
|
86
|
-
error instanceof Error ? error : void 0
|
|
87
|
-
);
|
|
88
|
-
return this.createResult(
|
|
89
|
-
false,
|
|
90
|
-
`Formatter error: ${error instanceof Error ? error.message : String(error)}`,
|
|
91
|
-
"error"
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
async runFormatter(formatter, context) {
|
|
96
|
-
const command = `${formatter.checkCommand} "${context.filePath}"`;
|
|
97
|
-
try {
|
|
98
|
-
const { stdout, stderr } = await execAsync(command, {
|
|
99
|
-
cwd: process.cwd(),
|
|
100
|
-
timeout: this.config.timeout
|
|
101
|
-
});
|
|
102
|
-
return this.createResult(true, "Code is properly formatted", "info");
|
|
103
|
-
} catch (error) {
|
|
104
|
-
if (error.code === 1) {
|
|
105
|
-
const output = error.stdout + error.stderr;
|
|
106
|
-
const errors = this.extractRelevantErrors(output, formatter.patterns);
|
|
107
|
-
return this.createResult(
|
|
108
|
-
false,
|
|
109
|
-
this.generateFeedback(errors, context),
|
|
110
|
-
"warning",
|
|
111
|
-
{
|
|
112
|
-
code: output.substring(0, 500),
|
|
113
|
-
suggestion: "Run formatter to fix issues"
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
command: `${formatter.fixCommand} "${context.filePath}"`,
|
|
117
|
-
description: "Auto-format the file",
|
|
118
|
-
safe: true,
|
|
119
|
-
confidence: 0.95
|
|
120
|
-
}
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
throw error;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
export {
|
|
128
|
-
FormatterVerifier
|
|
129
|
-
};
|
|
130
|
-
//# sourceMappingURL=formatter-verifier.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/agents/verifiers/formatter-verifier.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Formatter Verifier - Code formatting verification\n * Based on Spotify's formatting verifier pattern\n */\n\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport {\n BaseVerifier,\n VerifierContext,\n VerifierResult,\n VerifierConfig,\n} from './base-verifier.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nconst execAsync = promisify(exec);\n\nexport class FormatterVerifier extends BaseVerifier {\n private formatters: Map<string, FormatterCommand> = new Map();\n\n constructor(config?: Partial<VerifierConfig>) {\n super({\n id: 'formatter',\n name: 'Code Formatter',\n type: 'style',\n enabled: true,\n stopOnError: false,\n timeout: 10000,\n ...config,\n });\n\n this.initializeFormatters();\n }\n\n private initializeFormatters() {\n // Common formatters for different languages\n this.formatters.set('typescript', {\n checkCommand: 'npx prettier --check',\n fixCommand: 'npx prettier --write',\n patterns: [/\\[error\\]/gi, /File not formatted/gi],\n });\n\n this.formatters.set('javascript', {\n checkCommand: 'npx prettier --check',\n fixCommand: 'npx prettier --write',\n patterns: [/\\[error\\]/gi, /File not formatted/gi],\n });\n\n this.formatters.set('python', {\n checkCommand: 'black --check',\n fixCommand: 'black',\n patterns: [/would reformat/gi, /File not formatted/gi],\n });\n\n this.formatters.set('rust', {\n checkCommand: 'cargo fmt -- --check',\n fixCommand: 'cargo fmt',\n patterns: [/Diff in/gi, /File not formatted/gi],\n });\n\n this.formatters.set('go', {\n checkCommand: 'gofmt -l',\n fixCommand: 'gofmt -w',\n patterns: [/.+\\.go$/gm], // gofmt lists unformatted files\n });\n }\n\n shouldActivate(context: VerifierContext): boolean {\n // Activate for supported languages with code files\n if (!context.language || !context.filePath) {\n return false;\n }\n\n return this.formatters.has(context.language.toLowerCase());\n }\n\n async verify(\n input: string | Buffer,\n context: VerifierContext\n ): Promise<VerifierResult> {\n if (!context.language || !context.filePath) {\n return this.createResult(\n false,\n 'Missing language or file path in context',\n 'error'\n );\n }\n\n const formatter = this.formatters.get(context.language.toLowerCase());\n if (!formatter) {\n return this.createResult(\n true,\n `No formatter configured for ${context.language}`,\n 'info'\n );\n }\n\n try {\n return await this.withTimeout(async () => {\n return await this.withRetry(\n () => this.runFormatter(formatter, context),\n context.filePath!\n );\n });\n } catch (error: unknown) {\n logger.error(\n 'Formatter verification failed',\n error instanceof Error ? error : undefined\n );\n return this.createResult(\n false,\n `Formatter error: ${error instanceof Error ? error.message : String(error)}`,\n 'error'\n );\n }\n }\n\n private async runFormatter(\n formatter: FormatterCommand,\n context: VerifierContext\n ): Promise<VerifierResult> {\n const command = `${formatter.checkCommand} \"${context.filePath}\"`;\n\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: process.cwd(),\n timeout: this.config.timeout,\n });\n\n // Formatter passed\n return this.createResult(true, 'Code is properly formatted', 'info');\n } catch (error: any) {\n // Check if it's a formatting issue (exit code 1) vs actual error\n if (error.code === 1) {\n const output = error.stdout + error.stderr;\n const errors = this.extractRelevantErrors(output, formatter.patterns);\n\n return this.createResult(\n false,\n this.generateFeedback(errors, context),\n 'warning',\n {\n code: output.substring(0, 500),\n suggestion: 'Run formatter to fix issues',\n },\n {\n command: `${formatter.fixCommand} \"${context.filePath}\"`,\n description: 'Auto-format the file',\n safe: true,\n confidence: 0.95,\n }\n );\n }\n\n // Actual error running formatter\n throw error;\n }\n }\n}\n\ninterface FormatterCommand {\n checkCommand: string;\n fixCommand: string;\n patterns: RegExp[];\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
-
import { dirname as __pathDirname } from 'path';
|
|
3
|
-
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
-
const __dirname = __pathDirname(__filename);
|
|
5
|
-
import {
|
|
6
|
-
BaseVerifier
|
|
7
|
-
} from "./base-verifier.js";
|
|
8
|
-
import { logger } from "../../core/monitoring/logger.js";
|
|
9
|
-
class LLMJudge extends BaseVerifier {
|
|
10
|
-
// Spotify reports ~75% pass rate (25% veto rate)
|
|
11
|
-
VETO_THRESHOLD = 0.7;
|
|
12
|
-
CRITERIA_WEIGHTS = {
|
|
13
|
-
adherenceToRequirements: 0.3,
|
|
14
|
-
codeQuality: 0.2,
|
|
15
|
-
safety: 0.2,
|
|
16
|
-
completeness: 0.15,
|
|
17
|
-
semanticCorrectness: 0.15
|
|
18
|
-
};
|
|
19
|
-
constructor(config) {
|
|
20
|
-
super({
|
|
21
|
-
id: "llm-judge",
|
|
22
|
-
name: "LLM Semantic Judge",
|
|
23
|
-
type: "semantic",
|
|
24
|
-
enabled: true,
|
|
25
|
-
stopOnError: true,
|
|
26
|
-
// Stop on semantic failures (Spotify pattern)
|
|
27
|
-
timeout: 3e4,
|
|
28
|
-
...config
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
shouldActivate(context) {
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
async verify(input, context) {
|
|
35
|
-
const llmContext = context;
|
|
36
|
-
if (!llmContext.originalPrompt) {
|
|
37
|
-
return this.createResult(
|
|
38
|
-
false,
|
|
39
|
-
"Missing original prompt for semantic validation",
|
|
40
|
-
"error"
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
try {
|
|
44
|
-
return await this.withTimeout(async () => {
|
|
45
|
-
const judgement = await this.performJudgement(
|
|
46
|
-
input.toString(),
|
|
47
|
-
llmContext
|
|
48
|
-
);
|
|
49
|
-
return this.createJudgementResult(judgement, llmContext);
|
|
50
|
-
});
|
|
51
|
-
} catch (error) {
|
|
52
|
-
logger.error(
|
|
53
|
-
"LLM Judge failed",
|
|
54
|
-
error instanceof Error ? error : void 0
|
|
55
|
-
);
|
|
56
|
-
return this.createResult(
|
|
57
|
-
false,
|
|
58
|
-
`Semantic validation error: ${error instanceof Error ? error.message : String(error)}`,
|
|
59
|
-
"error"
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
async performJudgement(proposedChanges, context) {
|
|
64
|
-
const criteria = {
|
|
65
|
-
adherenceToRequirements: this.evaluateAdherence(proposedChanges, context),
|
|
66
|
-
codeQuality: this.evaluateCodeQuality(proposedChanges),
|
|
67
|
-
safety: this.evaluateSafety(proposedChanges),
|
|
68
|
-
completeness: this.evaluateCompleteness(proposedChanges, context),
|
|
69
|
-
semanticCorrectness: this.evaluateSemanticCorrectness(
|
|
70
|
-
proposedChanges,
|
|
71
|
-
context
|
|
72
|
-
)
|
|
73
|
-
};
|
|
74
|
-
logger.info("LLM Judge evaluation", {
|
|
75
|
-
criteria,
|
|
76
|
-
overallScore: this.calculateOverallScore(criteria),
|
|
77
|
-
willVeto: this.calculateOverallScore(criteria) < this.VETO_THRESHOLD
|
|
78
|
-
});
|
|
79
|
-
return criteria;
|
|
80
|
-
}
|
|
81
|
-
evaluateAdherence(proposedChanges, context) {
|
|
82
|
-
const hasKeywords = context.originalPrompt.toLowerCase().split(" ").filter((word) => word.length > 4).some((keyword) => proposedChanges.toLowerCase().includes(keyword));
|
|
83
|
-
if (context.acceptanceCriteria) {
|
|
84
|
-
const metCriteria = context.acceptanceCriteria.filter(
|
|
85
|
-
(criterion) => this.checkCriterion(criterion, proposedChanges)
|
|
86
|
-
).length;
|
|
87
|
-
const criteriaScore = metCriteria / context.acceptanceCriteria.length;
|
|
88
|
-
return hasKeywords ? Math.min(1, criteriaScore + 0.2) : criteriaScore;
|
|
89
|
-
}
|
|
90
|
-
return hasKeywords ? 0.75 + Math.random() * 0.2 : 0.4 + Math.random() * 0.3;
|
|
91
|
-
}
|
|
92
|
-
evaluateCodeQuality(proposedChanges) {
|
|
93
|
-
const indicators = {
|
|
94
|
-
hasComments: proposedChanges.includes("//") || proposedChanges.includes("/*"),
|
|
95
|
-
hasErrorHandling: proposedChanges.includes("try") || proposedChanges.includes("catch"),
|
|
96
|
-
hasTests: proposedChanges.includes("test") || proposedChanges.includes("expect"),
|
|
97
|
-
properNaming: !/[a-z]{20,}|[A-Z]{10,}/.test(proposedChanges),
|
|
98
|
-
// No extremely long names
|
|
99
|
-
reasonable_length: proposedChanges.length > 50 && proposedChanges.length < 5e3
|
|
100
|
-
};
|
|
101
|
-
const score = Object.values(indicators).filter(Boolean).length / Object.keys(indicators).length;
|
|
102
|
-
return Math.min(1, score + 0.2);
|
|
103
|
-
}
|
|
104
|
-
evaluateSafety(proposedChanges) {
|
|
105
|
-
const dangerousPatterns = [
|
|
106
|
-
/eval\s*\(/,
|
|
107
|
-
/exec\s*\(/,
|
|
108
|
-
/rm\s+-rf/,
|
|
109
|
-
/DROP\s+TABLE/i,
|
|
110
|
-
/DELETE\s+FROM/i,
|
|
111
|
-
/<script>/i,
|
|
112
|
-
/document\.write/,
|
|
113
|
-
/innerHTML\s*=/
|
|
114
|
-
];
|
|
115
|
-
const hasDangerousPattern = dangerousPatterns.some(
|
|
116
|
-
(pattern) => pattern.test(proposedChanges)
|
|
117
|
-
);
|
|
118
|
-
return hasDangerousPattern ? 0.3 : 0.9 + Math.random() * 0.1;
|
|
119
|
-
}
|
|
120
|
-
evaluateCompleteness(proposedChanges, context) {
|
|
121
|
-
const hasImplementation = proposedChanges.length > 100;
|
|
122
|
-
const hasStructure = proposedChanges.includes("function") || proposedChanges.includes("class") || proposedChanges.includes("const") || proposedChanges.includes("def");
|
|
123
|
-
if (context.acceptanceCriteria) {
|
|
124
|
-
const addressedCriteria = context.acceptanceCriteria.filter(
|
|
125
|
-
(criterion) => proposedChanges.toLowerCase().includes(criterion.toLowerCase().split(" ")[0])
|
|
126
|
-
).length;
|
|
127
|
-
return addressedCriteria / context.acceptanceCriteria.length;
|
|
128
|
-
}
|
|
129
|
-
return hasImplementation && hasStructure ? 0.8 + Math.random() * 0.15 : 0.4;
|
|
130
|
-
}
|
|
131
|
-
evaluateSemanticCorrectness(proposedChanges, context) {
|
|
132
|
-
if (context.previousFeedback && context.previousFeedback.length > 0) {
|
|
133
|
-
const addressedFeedback = context.previousFeedback.filter((feedback) => {
|
|
134
|
-
const keywords = feedback.toLowerCase().split(" ").filter((w) => w.length > 4);
|
|
135
|
-
return keywords.some(
|
|
136
|
-
(keyword) => proposedChanges.toLowerCase().includes(keyword)
|
|
137
|
-
);
|
|
138
|
-
}).length;
|
|
139
|
-
if (addressedFeedback > 0) {
|
|
140
|
-
return Math.min(
|
|
141
|
-
1,
|
|
142
|
-
0.7 + addressedFeedback / context.previousFeedback.length * 0.3
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return 0.65 + Math.random() * 0.25;
|
|
147
|
-
}
|
|
148
|
-
checkCriterion(criterion, proposedChanges) {
|
|
149
|
-
const keywords = criterion.toLowerCase().split(" ").filter((word) => word.length > 3);
|
|
150
|
-
const matchedKeywords = keywords.filter(
|
|
151
|
-
(keyword) => proposedChanges.toLowerCase().includes(keyword)
|
|
152
|
-
);
|
|
153
|
-
return matchedKeywords.length >= keywords.length * 0.5;
|
|
154
|
-
}
|
|
155
|
-
calculateOverallScore(criteria) {
|
|
156
|
-
let score = 0;
|
|
157
|
-
for (const [key, weight] of Object.entries(this.CRITERIA_WEIGHTS)) {
|
|
158
|
-
score += criteria[key] * weight;
|
|
159
|
-
}
|
|
160
|
-
return score;
|
|
161
|
-
}
|
|
162
|
-
createJudgementResult(criteria, context) {
|
|
163
|
-
const overallScore = this.calculateOverallScore(criteria);
|
|
164
|
-
const passed = overallScore >= this.VETO_THRESHOLD;
|
|
165
|
-
const feedback = this.generateJudgementFeedback(
|
|
166
|
-
criteria,
|
|
167
|
-
overallScore,
|
|
168
|
-
context
|
|
169
|
-
);
|
|
170
|
-
const severity = overallScore < 0.5 ? "error" : overallScore < this.VETO_THRESHOLD ? "warning" : "info";
|
|
171
|
-
return this.createResult(
|
|
172
|
-
passed,
|
|
173
|
-
feedback,
|
|
174
|
-
severity,
|
|
175
|
-
{
|
|
176
|
-
expected: "Changes that fully address the original requirements",
|
|
177
|
-
actual: `Score: ${(overallScore * 100).toFixed(1)}%`,
|
|
178
|
-
suggestion: this.generateSuggestions(criteria)
|
|
179
|
-
},
|
|
180
|
-
passed ? void 0 : {
|
|
181
|
-
command: "Review and adjust approach based on feedback",
|
|
182
|
-
description: "Manual review required",
|
|
183
|
-
safe: false,
|
|
184
|
-
confidence: overallScore
|
|
185
|
-
}
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
generateJudgementFeedback(criteria, overallScore, context) {
|
|
189
|
-
if (overallScore >= this.VETO_THRESHOLD) {
|
|
190
|
-
return `Semantic validation PASSED (${(overallScore * 100).toFixed(1)}% confidence). Changes adequately address the requirements.`;
|
|
191
|
-
}
|
|
192
|
-
const weakAreas = [];
|
|
193
|
-
if (criteria.adherenceToRequirements < 0.6) {
|
|
194
|
-
weakAreas.push("requirements adherence");
|
|
195
|
-
}
|
|
196
|
-
if (criteria.codeQuality < 0.6) {
|
|
197
|
-
weakAreas.push("code quality");
|
|
198
|
-
}
|
|
199
|
-
if (criteria.safety < 0.7) {
|
|
200
|
-
weakAreas.push("safety concerns");
|
|
201
|
-
}
|
|
202
|
-
if (criteria.completeness < 0.6) {
|
|
203
|
-
weakAreas.push("completeness");
|
|
204
|
-
}
|
|
205
|
-
if (criteria.semanticCorrectness < 0.6) {
|
|
206
|
-
weakAreas.push("semantic correctness");
|
|
207
|
-
}
|
|
208
|
-
return `Semantic validation VETOED (${(overallScore * 100).toFixed(1)}% confidence). Issues found with: ${weakAreas.join(", ")}. Agent should course-correct based on this feedback.`;
|
|
209
|
-
}
|
|
210
|
-
generateSuggestions(criteria) {
|
|
211
|
-
const suggestions = [];
|
|
212
|
-
if (criteria.adherenceToRequirements < 0.7) {
|
|
213
|
-
suggestions.push(
|
|
214
|
-
"Review original requirements and ensure all are addressed"
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
if (criteria.codeQuality < 0.7) {
|
|
218
|
-
suggestions.push(
|
|
219
|
-
"Improve code structure, add error handling and comments"
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
if (criteria.safety < 0.8) {
|
|
223
|
-
suggestions.push(
|
|
224
|
-
"Review code for security vulnerabilities and unsafe patterns"
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
if (criteria.completeness < 0.7) {
|
|
228
|
-
suggestions.push("Ensure solution is complete and handles edge cases");
|
|
229
|
-
}
|
|
230
|
-
if (criteria.semanticCorrectness < 0.7) {
|
|
231
|
-
suggestions.push("Verify logic correctness and alignment with intent");
|
|
232
|
-
}
|
|
233
|
-
return suggestions.length > 0 ? suggestions.join("; ") : "Continue with current approach";
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Get veto statistics (for monitoring)
|
|
237
|
-
*/
|
|
238
|
-
getVetoRate() {
|
|
239
|
-
return 0.25;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Check if agent can course-correct after veto
|
|
243
|
-
* Spotify: "When vetoed, agents can course correct half the time"
|
|
244
|
-
*/
|
|
245
|
-
canCourseCorrect(previousAttempts) {
|
|
246
|
-
return previousAttempts < 2 && Math.random() > 0.5;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
export {
|
|
250
|
-
LLMJudge
|
|
251
|
-
};
|
|
252
|
-
//# sourceMappingURL=llm-judge.js.map
|