@vinaes/succ 1.3.19
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/LICENSE +87 -0
- package/README.md +588 -0
- package/agents/succ-checkpoint-manager.md +51 -0
- package/agents/succ-code-reviewer.md +181 -0
- package/agents/succ-context-optimizer.md +83 -0
- package/agents/succ-debug.md +224 -0
- package/agents/succ-decision-auditor.md +74 -0
- package/agents/succ-deep-search.md +41 -0
- package/agents/succ-diff-reviewer.md +123 -0
- package/agents/succ-explore.md +83 -0
- package/agents/succ-general.md +109 -0
- package/agents/succ-knowledge-indexer.md +45 -0
- package/agents/succ-knowledge-mapper.md +61 -0
- package/agents/succ-memory-curator.md +43 -0
- package/agents/succ-memory-health-monitor.md +55 -0
- package/agents/succ-pattern-detective.md +62 -0
- package/agents/succ-plan.md +172 -0
- package/agents/succ-quality-improvement-coach.md +63 -0
- package/agents/succ-readiness-improver.md +62 -0
- package/agents/succ-session-handoff-orchestrator.md +54 -0
- package/agents/succ-session-reviewer.md +46 -0
- package/agents/succ-style-tracker.md +73 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agents-md.d.ts +16 -0
- package/dist/commands/agents-md.d.ts.map +1 -0
- package/dist/commands/agents-md.js +33 -0
- package/dist/commands/agents-md.js.map +1 -0
- package/dist/commands/analyze-agents.d.ts +20 -0
- package/dist/commands/analyze-agents.d.ts.map +1 -0
- package/dist/commands/analyze-agents.js +305 -0
- package/dist/commands/analyze-agents.js.map +1 -0
- package/dist/commands/analyze-helpers.d.ts +22 -0
- package/dist/commands/analyze-helpers.d.ts.map +1 -0
- package/dist/commands/analyze-helpers.js +38 -0
- package/dist/commands/analyze-helpers.js.map +1 -0
- package/dist/commands/analyze-profile.d.ts +53 -0
- package/dist/commands/analyze-profile.d.ts.map +1 -0
- package/dist/commands/analyze-profile.js +638 -0
- package/dist/commands/analyze-profile.js.map +1 -0
- package/dist/commands/analyze-recursive.d.ts +20 -0
- package/dist/commands/analyze-recursive.d.ts.map +1 -0
- package/dist/commands/analyze-recursive.js +326 -0
- package/dist/commands/analyze-recursive.js.map +1 -0
- package/dist/commands/analyze-utils.d.ts +83 -0
- package/dist/commands/analyze-utils.d.ts.map +1 -0
- package/dist/commands/analyze-utils.js +541 -0
- package/dist/commands/analyze-utils.js.map +1 -0
- package/dist/commands/analyze.d.ts +15 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +265 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/backfill.d.ts +22 -0
- package/dist/commands/backfill.d.ts.map +1 -0
- package/dist/commands/backfill.js +62 -0
- package/dist/commands/backfill.js.map +1 -0
- package/dist/commands/benchmark-quality.d.ts +18 -0
- package/dist/commands/benchmark-quality.d.ts.map +1 -0
- package/dist/commands/benchmark-quality.js +316 -0
- package/dist/commands/benchmark-quality.js.map +1 -0
- package/dist/commands/benchmark-sqlite-vec.d.ts +12 -0
- package/dist/commands/benchmark-sqlite-vec.d.ts.map +1 -0
- package/dist/commands/benchmark-sqlite-vec.js +281 -0
- package/dist/commands/benchmark-sqlite-vec.js.map +1 -0
- package/dist/commands/benchmark.d.ts +57 -0
- package/dist/commands/benchmark.d.ts.map +1 -0
- package/dist/commands/benchmark.js +682 -0
- package/dist/commands/benchmark.js.map +1 -0
- package/dist/commands/chat.d.ts +14 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +84 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +27 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +181 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/clear.d.ts +9 -0
- package/dist/commands/clear.d.ts.map +1 -0
- package/dist/commands/clear.js +31 -0
- package/dist/commands/clear.js.map +1 -0
- package/dist/commands/config.d.ts +26 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +247 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/consolidate.d.ts +21 -0
- package/dist/commands/consolidate.d.ts.map +1 -0
- package/dist/commands/consolidate.js +117 -0
- package/dist/commands/consolidate.js.map +1 -0
- package/dist/commands/daemon.d.ts +48 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +218 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/embedding.d.ts +26 -0
- package/dist/commands/embedding.d.ts.map +1 -0
- package/dist/commands/embedding.js +168 -0
- package/dist/commands/embedding.js.map +1 -0
- package/dist/commands/graph.d.ts +20 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +128 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/index-code.d.ts +23 -0
- package/dist/commands/index-code.d.ts.map +1 -0
- package/dist/commands/index-code.js +218 -0
- package/dist/commands/index-code.js.map +1 -0
- package/dist/commands/index.d.ts +23 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +217 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-templates.d.ts +21 -0
- package/dist/commands/init-templates.d.ts.map +1 -0
- package/dist/commands/init-templates.js +487 -0
- package/dist/commands/init-templates.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +865 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memories.d.ts +47 -0
- package/dist/commands/memories.d.ts.map +1 -0
- package/dist/commands/memories.js +597 -0
- package/dist/commands/memories.js.map +1 -0
- package/dist/commands/migrate.d.ts +19 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +154 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/prd.d.ts +46 -0
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/commands/prd.js +378 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/commands/precompute-context.d.ts +11 -0
- package/dist/commands/precompute-context.d.ts.map +1 -0
- package/dist/commands/precompute-context.js +12 -0
- package/dist/commands/precompute-context.js.map +1 -0
- package/dist/commands/progress.d.ts +16 -0
- package/dist/commands/progress.d.ts.map +1 -0
- package/dist/commands/progress.js +38 -0
- package/dist/commands/progress.js.map +1 -0
- package/dist/commands/reindex.d.ts +17 -0
- package/dist/commands/reindex.d.ts.map +1 -0
- package/dist/commands/reindex.js +83 -0
- package/dist/commands/reindex.js.map +1 -0
- package/dist/commands/retention.d.ts +19 -0
- package/dist/commands/retention.d.ts.map +1 -0
- package/dist/commands/retention.js +162 -0
- package/dist/commands/retention.js.map +1 -0
- package/dist/commands/score.d.ts +10 -0
- package/dist/commands/score.d.ts.map +1 -0
- package/dist/commands/score.js +28 -0
- package/dist/commands/score.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +89 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/session-summary.d.ts +15 -0
- package/dist/commands/session-summary.d.ts.map +1 -0
- package/dist/commands/session-summary.js +16 -0
- package/dist/commands/session-summary.js.map +1 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +222 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/soul.d.ts +9 -0
- package/dist/commands/soul.d.ts.map +1 -0
- package/dist/commands/soul.js +256 -0
- package/dist/commands/soul.js.map +1 -0
- package/dist/commands/stats.d.ts +18 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +138 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +145 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/train-bpe.d.ts +8 -0
- package/dist/commands/train-bpe.d.ts.map +1 -0
- package/dist/commands/train-bpe.js +35 -0
- package/dist/commands/train-bpe.js.map +1 -0
- package/dist/commands/watch.d.ts +22 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +171 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/daemon/analyzer.d.ts +54 -0
- package/dist/daemon/analyzer.d.ts.map +1 -0
- package/dist/daemon/analyzer.js +362 -0
- package/dist/daemon/analyzer.js.map +1 -0
- package/dist/daemon/client.d.ts +87 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +356 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/index.d.ts +12 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +12 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/service.d.ts +51 -0
- package/dist/daemon/service.d.ts.map +1 -0
- package/dist/daemon/service.js +1203 -0
- package/dist/daemon/service.js.map +1 -0
- package/dist/daemon/session-processor.d.ts +85 -0
- package/dist/daemon/session-processor.d.ts.map +1 -0
- package/dist/daemon/session-processor.js +571 -0
- package/dist/daemon/session-processor.js.map +1 -0
- package/dist/daemon/sessions.d.ts +62 -0
- package/dist/daemon/sessions.d.ts.map +1 -0
- package/dist/daemon/sessions.js +192 -0
- package/dist/daemon/sessions.js.map +1 -0
- package/dist/daemon/watcher.d.ts +52 -0
- package/dist/daemon/watcher.d.ts.map +1 -0
- package/dist/daemon/watcher.js +363 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/lib/agents-md-generator.d.ts +33 -0
- package/dist/lib/agents-md-generator.d.ts.map +1 -0
- package/dist/lib/agents-md-generator.js +156 -0
- package/dist/lib/agents-md-generator.js.map +1 -0
- package/dist/lib/ai-readiness.d.ts +132 -0
- package/dist/lib/ai-readiness.d.ts.map +1 -0
- package/dist/lib/ai-readiness.js +702 -0
- package/dist/lib/ai-readiness.js.map +1 -0
- package/dist/lib/analyze-state.d.ts +34 -0
- package/dist/lib/analyze-state.d.ts.map +1 -0
- package/dist/lib/analyze-state.js +106 -0
- package/dist/lib/analyze-state.js.map +1 -0
- package/dist/lib/benchmark.d.ts +250 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +778 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/bm25.d.ts +114 -0
- package/dist/lib/bm25.d.ts.map +1 -0
- package/dist/lib/bm25.js +727 -0
- package/dist/lib/bm25.js.map +1 -0
- package/dist/lib/bpe.d.ts +70 -0
- package/dist/lib/bpe.d.ts.map +1 -0
- package/dist/lib/bpe.js +270 -0
- package/dist/lib/bpe.js.map +1 -0
- package/dist/lib/checkpoint.d.ts +124 -0
- package/dist/lib/checkpoint.d.ts.map +1 -0
- package/dist/lib/checkpoint.js +321 -0
- package/dist/lib/checkpoint.js.map +1 -0
- package/dist/lib/chunker.d.ts +47 -0
- package/dist/lib/chunker.d.ts.map +1 -0
- package/dist/lib/chunker.js +358 -0
- package/dist/lib/chunker.js.map +1 -0
- package/dist/lib/claude-ws-transport.d.ts +76 -0
- package/dist/lib/claude-ws-transport.d.ts.map +1 -0
- package/dist/lib/claude-ws-transport.js +487 -0
- package/dist/lib/claude-ws-transport.js.map +1 -0
- package/dist/lib/compact-briefing.d.ts +22 -0
- package/dist/lib/compact-briefing.d.ts.map +1 -0
- package/dist/lib/compact-briefing.js +180 -0
- package/dist/lib/compact-briefing.js.map +1 -0
- package/dist/lib/config-defaults.d.ts +41 -0
- package/dist/lib/config-defaults.d.ts.map +1 -0
- package/dist/lib/config-defaults.js +99 -0
- package/dist/lib/config-defaults.js.map +1 -0
- package/dist/lib/config-display.d.ts +16 -0
- package/dist/lib/config-display.d.ts.map +1 -0
- package/dist/lib/config-display.js +408 -0
- package/dist/lib/config-display.js.map +1 -0
- package/dist/lib/config-types.d.ts +601 -0
- package/dist/lib/config-types.d.ts.map +1 -0
- package/dist/lib/config-types.js +7 -0
- package/dist/lib/config-types.js.map +1 -0
- package/dist/lib/config-validation.d.ts +19 -0
- package/dist/lib/config-validation.d.ts.map +1 -0
- package/dist/lib/config-validation.js +136 -0
- package/dist/lib/config-validation.js.map +1 -0
- package/dist/lib/config.d.ts +143 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +689 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/consolidate.d.ts +115 -0
- package/dist/lib/consolidate.d.ts.map +1 -0
- package/dist/lib/consolidate.js +600 -0
- package/dist/lib/consolidate.js.map +1 -0
- package/dist/lib/db/bm25-indexes.d.ts +58 -0
- package/dist/lib/db/bm25-indexes.d.ts.map +1 -0
- package/dist/lib/db/bm25-indexes.js +333 -0
- package/dist/lib/db/bm25-indexes.js.map +1 -0
- package/dist/lib/db/bpe.d.ts +18 -0
- package/dist/lib/db/bpe.d.ts.map +1 -0
- package/dist/lib/db/bpe.js +44 -0
- package/dist/lib/db/bpe.js.map +1 -0
- package/dist/lib/db/connection.d.ts +47 -0
- package/dist/lib/db/connection.d.ts.map +1 -0
- package/dist/lib/db/connection.js +114 -0
- package/dist/lib/db/connection.js.map +1 -0
- package/dist/lib/db/documents.d.ts +58 -0
- package/dist/lib/db/documents.d.ts.map +1 -0
- package/dist/lib/db/documents.js +374 -0
- package/dist/lib/db/documents.js.map +1 -0
- package/dist/lib/db/file-hash.d.ts +26 -0
- package/dist/lib/db/file-hash.d.ts.map +1 -0
- package/dist/lib/db/file-hash.js +56 -0
- package/dist/lib/db/file-hash.js.map +1 -0
- package/dist/lib/db/global-memories.d.ts +62 -0
- package/dist/lib/db/global-memories.d.ts.map +1 -0
- package/dist/lib/db/global-memories.js +173 -0
- package/dist/lib/db/global-memories.js.map +1 -0
- package/dist/lib/db/graph.d.ts +163 -0
- package/dist/lib/db/graph.d.ts.map +1 -0
- package/dist/lib/db/graph.js +488 -0
- package/dist/lib/db/graph.js.map +1 -0
- package/dist/lib/db/helpers.d.ts +13 -0
- package/dist/lib/db/helpers.d.ts.map +1 -0
- package/dist/lib/db/helpers.js +21 -0
- package/dist/lib/db/helpers.js.map +1 -0
- package/dist/lib/db/hybrid-search.d.ts +64 -0
- package/dist/lib/db/hybrid-search.d.ts.map +1 -0
- package/dist/lib/db/hybrid-search.js +549 -0
- package/dist/lib/db/hybrid-search.js.map +1 -0
- package/dist/lib/db/index.d.ts +23 -0
- package/dist/lib/db/index.d.ts.map +1 -0
- package/dist/lib/db/index.js +23 -0
- package/dist/lib/db/index.js.map +1 -0
- package/dist/lib/db/memories.d.ts +174 -0
- package/dist/lib/db/memories.d.ts.map +1 -0
- package/dist/lib/db/memories.js +866 -0
- package/dist/lib/db/memories.js.map +1 -0
- package/dist/lib/db/retention.d.ts +64 -0
- package/dist/lib/db/retention.d.ts.map +1 -0
- package/dist/lib/db/retention.js +115 -0
- package/dist/lib/db/retention.js.map +1 -0
- package/dist/lib/db/schema.d.ts +29 -0
- package/dist/lib/db/schema.d.ts.map +1 -0
- package/dist/lib/db/schema.js +832 -0
- package/dist/lib/db/schema.js.map +1 -0
- package/dist/lib/db/skills.d.ts +65 -0
- package/dist/lib/db/skills.d.ts.map +1 -0
- package/dist/lib/db/skills.js +119 -0
- package/dist/lib/db/skills.js.map +1 -0
- package/dist/lib/db/token-frequency.d.ts +34 -0
- package/dist/lib/db/token-frequency.d.ts.map +1 -0
- package/dist/lib/db/token-frequency.js +92 -0
- package/dist/lib/db/token-frequency.js.map +1 -0
- package/dist/lib/db/token-stats.d.ts +43 -0
- package/dist/lib/db/token-stats.d.ts.map +1 -0
- package/dist/lib/db/token-stats.js +59 -0
- package/dist/lib/db/token-stats.js.map +1 -0
- package/dist/lib/db/types.d.ts +57 -0
- package/dist/lib/db/types.d.ts.map +1 -0
- package/dist/lib/db/types.js +5 -0
- package/dist/lib/db/types.js.map +1 -0
- package/dist/lib/db/web-search-history.d.ts +22 -0
- package/dist/lib/db/web-search-history.d.ts.map +1 -0
- package/dist/lib/db/web-search-history.js +107 -0
- package/dist/lib/db/web-search-history.js.map +1 -0
- package/dist/lib/debug/state.d.ts +17 -0
- package/dist/lib/debug/state.d.ts.map +1 -0
- package/dist/lib/debug/state.js +131 -0
- package/dist/lib/debug/state.js.map +1 -0
- package/dist/lib/debug/types.d.ts +74 -0
- package/dist/lib/debug/types.d.ts.map +1 -0
- package/dist/lib/debug/types.js +85 -0
- package/dist/lib/debug/types.js.map +1 -0
- package/dist/lib/embedding-pool.d.ts +37 -0
- package/dist/lib/embedding-pool.d.ts.map +1 -0
- package/dist/lib/embedding-pool.js +159 -0
- package/dist/lib/embedding-pool.js.map +1 -0
- package/dist/lib/embedding-worker.d.ts +7 -0
- package/dist/lib/embedding-worker.d.ts.map +1 -0
- package/dist/lib/embedding-worker.js +49 -0
- package/dist/lib/embedding-worker.js.map +1 -0
- package/dist/lib/embeddings.d.ts +54 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +437 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/errors.d.ts +40 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +66 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/fault-logger.d.ts +35 -0
- package/dist/lib/fault-logger.d.ts.map +1 -0
- package/dist/lib/fault-logger.js +182 -0
- package/dist/lib/fault-logger.js.map +1 -0
- package/dist/lib/graph/centrality.d.ts +34 -0
- package/dist/lib/graph/centrality.d.ts.map +1 -0
- package/dist/lib/graph/centrality.js +76 -0
- package/dist/lib/graph/centrality.js.map +1 -0
- package/dist/lib/graph/cleanup.d.ts +36 -0
- package/dist/lib/graph/cleanup.d.ts.map +1 -0
- package/dist/lib/graph/cleanup.js +96 -0
- package/dist/lib/graph/cleanup.js.map +1 -0
- package/dist/lib/graph/community-detection.d.ts +61 -0
- package/dist/lib/graph/community-detection.d.ts.map +1 -0
- package/dist/lib/graph/community-detection.js +218 -0
- package/dist/lib/graph/community-detection.js.map +1 -0
- package/dist/lib/graph/contextual-proximity.d.ts +41 -0
- package/dist/lib/graph/contextual-proximity.d.ts.map +1 -0
- package/dist/lib/graph/contextual-proximity.js +125 -0
- package/dist/lib/graph/contextual-proximity.js.map +1 -0
- package/dist/lib/graph/llm-relations.d.ts +54 -0
- package/dist/lib/graph/llm-relations.d.ts.map +1 -0
- package/dist/lib/graph/llm-relations.js +265 -0
- package/dist/lib/graph/llm-relations.js.map +1 -0
- package/dist/lib/graph-export.d.ts +13 -0
- package/dist/lib/graph-export.d.ts.map +1 -0
- package/dist/lib/graph-export.js +637 -0
- package/dist/lib/graph-export.js.map +1 -0
- package/dist/lib/graph-scheduler.d.ts +7 -0
- package/dist/lib/graph-scheduler.d.ts.map +1 -0
- package/dist/lib/graph-scheduler.js +21 -0
- package/dist/lib/graph-scheduler.js.map +1 -0
- package/dist/lib/indexer.d.ts +36 -0
- package/dist/lib/indexer.d.ts.map +1 -0
- package/dist/lib/indexer.js +226 -0
- package/dist/lib/indexer.js.map +1 -0
- package/dist/lib/learning-delta.d.ts +35 -0
- package/dist/lib/learning-delta.d.ts.map +1 -0
- package/dist/lib/learning-delta.js +53 -0
- package/dist/lib/learning-delta.js.map +1 -0
- package/dist/lib/llm.d.ts +118 -0
- package/dist/lib/llm.d.ts.map +1 -0
- package/dist/lib/llm.js +439 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +27 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +143 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/md-fetch.d.ts +61 -0
- package/dist/lib/md-fetch.d.ts.map +1 -0
- package/dist/lib/md-fetch.js +141 -0
- package/dist/lib/md-fetch.js.map +1 -0
- package/dist/lib/mmr.d.ts +29 -0
- package/dist/lib/mmr.d.ts.map +1 -0
- package/dist/lib/mmr.js +89 -0
- package/dist/lib/mmr.js.map +1 -0
- package/dist/lib/onboarding/ai-chat.d.ts +11 -0
- package/dist/lib/onboarding/ai-chat.d.ts.map +1 -0
- package/dist/lib/onboarding/ai-chat.js +85 -0
- package/dist/lib/onboarding/ai-chat.js.map +1 -0
- package/dist/lib/onboarding/index.d.ts +7 -0
- package/dist/lib/onboarding/index.d.ts.map +1 -0
- package/dist/lib/onboarding/index.js +7 -0
- package/dist/lib/onboarding/index.js.map +1 -0
- package/dist/lib/onboarding/wizard.d.ts +11 -0
- package/dist/lib/onboarding/wizard.d.ts.map +1 -0
- package/dist/lib/onboarding/wizard.js +104 -0
- package/dist/lib/onboarding/wizard.js.map +1 -0
- package/dist/lib/ort-provider.d.ts +27 -0
- package/dist/lib/ort-provider.d.ts.map +1 -0
- package/dist/lib/ort-provider.js +83 -0
- package/dist/lib/ort-provider.js.map +1 -0
- package/dist/lib/ort-session.d.ts +32 -0
- package/dist/lib/ort-session.d.ts.map +1 -0
- package/dist/lib/ort-session.js +227 -0
- package/dist/lib/ort-session.js.map +1 -0
- package/dist/lib/patterns.d.ts +43 -0
- package/dist/lib/patterns.d.ts.map +1 -0
- package/dist/lib/patterns.js +395 -0
- package/dist/lib/patterns.js.map +1 -0
- package/dist/lib/prd/codebase-context.d.ts +27 -0
- package/dist/lib/prd/codebase-context.d.ts.map +1 -0
- package/dist/lib/prd/codebase-context.js +420 -0
- package/dist/lib/prd/codebase-context.js.map +1 -0
- package/dist/lib/prd/context.d.ts +24 -0
- package/dist/lib/prd/context.d.ts.map +1 -0
- package/dist/lib/prd/context.js +68 -0
- package/dist/lib/prd/context.js.map +1 -0
- package/dist/lib/prd/executor.d.ts +52 -0
- package/dist/lib/prd/executor.d.ts.map +1 -0
- package/dist/lib/prd/executor.js +154 -0
- package/dist/lib/prd/executor.js.map +1 -0
- package/dist/lib/prd/export.d.ts +40 -0
- package/dist/lib/prd/export.d.ts.map +1 -0
- package/dist/lib/prd/export.js +511 -0
- package/dist/lib/prd/export.js.map +1 -0
- package/dist/lib/prd/gates.d.ts +30 -0
- package/dist/lib/prd/gates.d.ts.map +1 -0
- package/dist/lib/prd/gates.js +100 -0
- package/dist/lib/prd/gates.js.map +1 -0
- package/dist/lib/prd/generate.d.ts +56 -0
- package/dist/lib/prd/generate.d.ts.map +1 -0
- package/dist/lib/prd/generate.js +357 -0
- package/dist/lib/prd/generate.js.map +1 -0
- package/dist/lib/prd/parse.d.ts +21 -0
- package/dist/lib/prd/parse.d.ts.map +1 -0
- package/dist/lib/prd/parse.js +270 -0
- package/dist/lib/prd/parse.js.map +1 -0
- package/dist/lib/prd/prompt-builder.d.ts +18 -0
- package/dist/lib/prd/prompt-builder.d.ts.map +1 -0
- package/dist/lib/prd/prompt-builder.js +61 -0
- package/dist/lib/prd/prompt-builder.js.map +1 -0
- package/dist/lib/prd/runner.d.ts +54 -0
- package/dist/lib/prd/runner.d.ts.map +1 -0
- package/dist/lib/prd/runner.js +563 -0
- package/dist/lib/prd/runner.js.map +1 -0
- package/dist/lib/prd/scheduler.d.ts +27 -0
- package/dist/lib/prd/scheduler.d.ts.map +1 -0
- package/dist/lib/prd/scheduler.js +113 -0
- package/dist/lib/prd/scheduler.js.map +1 -0
- package/dist/lib/prd/state.d.ts +77 -0
- package/dist/lib/prd/state.d.ts.map +1 -0
- package/dist/lib/prd/state.js +253 -0
- package/dist/lib/prd/state.js.map +1 -0
- package/dist/lib/prd/team-runner.d.ts +48 -0
- package/dist/lib/prd/team-runner.d.ts.map +1 -0
- package/dist/lib/prd/team-runner.js +261 -0
- package/dist/lib/prd/team-runner.js.map +1 -0
- package/dist/lib/prd/types.d.ts +169 -0
- package/dist/lib/prd/types.d.ts.map +1 -0
- package/dist/lib/prd/types.js +143 -0
- package/dist/lib/prd/types.js.map +1 -0
- package/dist/lib/prd/worktree.d.ts +54 -0
- package/dist/lib/prd/worktree.d.ts.map +1 -0
- package/dist/lib/prd/worktree.js +255 -0
- package/dist/lib/prd/worktree.js.map +1 -0
- package/dist/lib/precompute-context.d.ts +48 -0
- package/dist/lib/precompute-context.d.ts.map +1 -0
- package/dist/lib/precompute-context.js +265 -0
- package/dist/lib/precompute-context.js.map +1 -0
- package/dist/lib/pricing.d.ts +60 -0
- package/dist/lib/pricing.d.ts.map +1 -0
- package/dist/lib/pricing.js +258 -0
- package/dist/lib/pricing.js.map +1 -0
- package/dist/lib/process-registry.d.ts +30 -0
- package/dist/lib/process-registry.d.ts.map +1 -0
- package/dist/lib/process-registry.js +92 -0
- package/dist/lib/process-registry.js.map +1 -0
- package/dist/lib/progress-log.d.ts +44 -0
- package/dist/lib/progress-log.d.ts.map +1 -0
- package/dist/lib/progress-log.js +58 -0
- package/dist/lib/progress-log.js.map +1 -0
- package/dist/lib/public-api.d.ts +56 -0
- package/dist/lib/public-api.d.ts.map +1 -0
- package/dist/lib/public-api.js +63 -0
- package/dist/lib/public-api.js.map +1 -0
- package/dist/lib/quality.d.ts +66 -0
- package/dist/lib/quality.d.ts.map +1 -0
- package/dist/lib/quality.js +486 -0
- package/dist/lib/quality.js.map +1 -0
- package/dist/lib/query-expansion.d.ts +16 -0
- package/dist/lib/query-expansion.d.ts.map +1 -0
- package/dist/lib/query-expansion.js +53 -0
- package/dist/lib/query-expansion.js.map +1 -0
- package/dist/lib/readiness.d.ts +35 -0
- package/dist/lib/readiness.d.ts.map +1 -0
- package/dist/lib/readiness.js +142 -0
- package/dist/lib/readiness.js.map +1 -0
- package/dist/lib/reference-embeddings.d.ts +39 -0
- package/dist/lib/reference-embeddings.d.ts.map +1 -0
- package/dist/lib/reference-embeddings.js +95 -0
- package/dist/lib/reference-embeddings.js.map +1 -0
- package/dist/lib/reflection-synthesizer.d.ts +27 -0
- package/dist/lib/reflection-synthesizer.d.ts.map +1 -0
- package/dist/lib/reflection-synthesizer.js +149 -0
- package/dist/lib/reflection-synthesizer.js.map +1 -0
- package/dist/lib/retention.d.ts +105 -0
- package/dist/lib/retention.d.ts.map +1 -0
- package/dist/lib/retention.js +246 -0
- package/dist/lib/retention.js.map +1 -0
- package/dist/lib/sensitive-filter.d.ts +34 -0
- package/dist/lib/sensitive-filter.d.ts.map +1 -0
- package/dist/lib/sensitive-filter.js +344 -0
- package/dist/lib/sensitive-filter.js.map +1 -0
- package/dist/lib/session-observations.d.ts +59 -0
- package/dist/lib/session-observations.d.ts.map +1 -0
- package/dist/lib/session-observations.js +128 -0
- package/dist/lib/session-observations.js.map +1 -0
- package/dist/lib/session-summary.d.ts +65 -0
- package/dist/lib/session-summary.d.ts.map +1 -0
- package/dist/lib/session-summary.js +344 -0
- package/dist/lib/session-summary.js.map +1 -0
- package/dist/lib/similarity-worker.d.ts +7 -0
- package/dist/lib/similarity-worker.d.ts.map +1 -0
- package/dist/lib/similarity-worker.js +36 -0
- package/dist/lib/similarity-worker.js.map +1 -0
- package/dist/lib/skills.d.ts +78 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +439 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/skyll-client.d.ts +59 -0
- package/dist/lib/skyll-client.d.ts.map +1 -0
- package/dist/lib/skyll-client.js +257 -0
- package/dist/lib/skyll-client.js.map +1 -0
- package/dist/lib/storage/backends/interface.d.ts +383 -0
- package/dist/lib/storage/backends/interface.d.ts.map +1 -0
- package/dist/lib/storage/backends/interface.js +12 -0
- package/dist/lib/storage/backends/interface.js.map +1 -0
- package/dist/lib/storage/backends/postgresql.d.ts +454 -0
- package/dist/lib/storage/backends/postgresql.d.ts.map +1 -0
- package/dist/lib/storage/backends/postgresql.js +2528 -0
- package/dist/lib/storage/backends/postgresql.js.map +1 -0
- package/dist/lib/storage/benchmark.d.ts +16 -0
- package/dist/lib/storage/benchmark.d.ts.map +1 -0
- package/dist/lib/storage/benchmark.js +219 -0
- package/dist/lib/storage/benchmark.js.map +1 -0
- package/dist/lib/storage/dispatcher-export.d.ts +108 -0
- package/dist/lib/storage/dispatcher-export.d.ts.map +1 -0
- package/dist/lib/storage/dispatcher-export.js +593 -0
- package/dist/lib/storage/dispatcher-export.js.map +1 -0
- package/dist/lib/storage/dispatcher.d.ts +468 -0
- package/dist/lib/storage/dispatcher.d.ts.map +1 -0
- package/dist/lib/storage/dispatcher.js +1926 -0
- package/dist/lib/storage/dispatcher.js.map +1 -0
- package/dist/lib/storage/index.d.ts +481 -0
- package/dist/lib/storage/index.d.ts.map +1 -0
- package/dist/lib/storage/index.js +727 -0
- package/dist/lib/storage/index.js.map +1 -0
- package/dist/lib/storage/migration/export-import.d.ts +133 -0
- package/dist/lib/storage/migration/export-import.d.ts.map +1 -0
- package/dist/lib/storage/migration/export-import.js +264 -0
- package/dist/lib/storage/migration/export-import.js.map +1 -0
- package/dist/lib/storage/types.d.ts +313 -0
- package/dist/lib/storage/types.d.ts.map +1 -0
- package/dist/lib/storage/types.js +30 -0
- package/dist/lib/storage/types.js.map +1 -0
- package/dist/lib/storage/vector/interface.d.ts +89 -0
- package/dist/lib/storage/vector/interface.d.ts.map +1 -0
- package/dist/lib/storage/vector/interface.js +10 -0
- package/dist/lib/storage/vector/interface.js.map +1 -0
- package/dist/lib/storage/vector/qdrant.d.ts +221 -0
- package/dist/lib/storage/vector/qdrant.d.ts.map +1 -0
- package/dist/lib/storage/vector/qdrant.js +880 -0
- package/dist/lib/storage/vector/qdrant.js.map +1 -0
- package/dist/lib/supersession.d.ts +26 -0
- package/dist/lib/supersession.d.ts.map +1 -0
- package/dist/lib/supersession.js +97 -0
- package/dist/lib/supersession.js.map +1 -0
- package/dist/lib/temporal.d.ts +140 -0
- package/dist/lib/temporal.d.ts.map +1 -0
- package/dist/lib/temporal.js +303 -0
- package/dist/lib/temporal.js.map +1 -0
- package/dist/lib/token-budget.d.ts +79 -0
- package/dist/lib/token-budget.d.ts.map +1 -0
- package/dist/lib/token-budget.js +146 -0
- package/dist/lib/token-budget.js.map +1 -0
- package/dist/lib/token-counter.d.ts +27 -0
- package/dist/lib/token-counter.d.ts.map +1 -0
- package/dist/lib/token-counter.js +52 -0
- package/dist/lib/token-counter.js.map +1 -0
- package/dist/lib/tree-sitter/chunker-ts.d.ts +24 -0
- package/dist/lib/tree-sitter/chunker-ts.d.ts.map +1 -0
- package/dist/lib/tree-sitter/chunker-ts.js +206 -0
- package/dist/lib/tree-sitter/chunker-ts.js.map +1 -0
- package/dist/lib/tree-sitter/extractor.d.ts +43 -0
- package/dist/lib/tree-sitter/extractor.d.ts.map +1 -0
- package/dist/lib/tree-sitter/extractor.js +297 -0
- package/dist/lib/tree-sitter/extractor.js.map +1 -0
- package/dist/lib/tree-sitter/index.d.ts +13 -0
- package/dist/lib/tree-sitter/index.d.ts.map +1 -0
- package/dist/lib/tree-sitter/index.js +14 -0
- package/dist/lib/tree-sitter/index.js.map +1 -0
- package/dist/lib/tree-sitter/parser.d.ts +70 -0
- package/dist/lib/tree-sitter/parser.d.ts.map +1 -0
- package/dist/lib/tree-sitter/parser.js +354 -0
- package/dist/lib/tree-sitter/parser.js.map +1 -0
- package/dist/lib/tree-sitter/public.d.ts +28 -0
- package/dist/lib/tree-sitter/public.d.ts.map +1 -0
- package/dist/lib/tree-sitter/public.js +50 -0
- package/dist/lib/tree-sitter/public.js.map +1 -0
- package/dist/lib/tree-sitter/queries.d.ts +28 -0
- package/dist/lib/tree-sitter/queries.d.ts.map +1 -0
- package/dist/lib/tree-sitter/queries.js +383 -0
- package/dist/lib/tree-sitter/queries.js.map +1 -0
- package/dist/lib/tree-sitter/types.d.ts +69 -0
- package/dist/lib/tree-sitter/types.d.ts.map +1 -0
- package/dist/lib/tree-sitter/types.js +131 -0
- package/dist/lib/tree-sitter/types.js.map +1 -0
- package/dist/lib/working-memory-pipeline.d.ts +118 -0
- package/dist/lib/working-memory-pipeline.d.ts.map +1 -0
- package/dist/lib/working-memory-pipeline.js +344 -0
- package/dist/lib/working-memory-pipeline.js.map +1 -0
- package/dist/mcp/helpers.d.ts +44 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +244 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +15 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/resources.d.ts +12 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +136 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +131 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/config.d.ts +10 -0
- package/dist/mcp/tools/config.d.ts.map +1 -0
- package/dist/mcp/tools/config.js +236 -0
- package/dist/mcp/tools/config.js.map +1 -0
- package/dist/mcp/tools/dead-end.d.ts +9 -0
- package/dist/mcp/tools/dead-end.d.ts.map +1 -0
- package/dist/mcp/tools/dead-end.js +137 -0
- package/dist/mcp/tools/dead-end.js.map +1 -0
- package/dist/mcp/tools/debug.d.ts +9 -0
- package/dist/mcp/tools/debug.d.ts.map +1 -0
- package/dist/mcp/tools/debug.js +387 -0
- package/dist/mcp/tools/debug.js.map +1 -0
- package/dist/mcp/tools/graph.d.ts +9 -0
- package/dist/mcp/tools/graph.d.ts.map +1 -0
- package/dist/mcp/tools/graph.js +337 -0
- package/dist/mcp/tools/graph.js.map +1 -0
- package/dist/mcp/tools/indexing.d.ts +12 -0
- package/dist/mcp/tools/indexing.d.ts.map +1 -0
- package/dist/mcp/tools/indexing.js +289 -0
- package/dist/mcp/tools/indexing.js.map +1 -0
- package/dist/mcp/tools/memory.d.ts +14 -0
- package/dist/mcp/tools/memory.d.ts.map +1 -0
- package/dist/mcp/tools/memory.js +1170 -0
- package/dist/mcp/tools/memory.js.map +1 -0
- package/dist/mcp/tools/prd.d.ts +12 -0
- package/dist/mcp/tools/prd.d.ts.map +1 -0
- package/dist/mcp/tools/prd.js +276 -0
- package/dist/mcp/tools/prd.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +9 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +279 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/status.d.ts +10 -0
- package/dist/mcp/tools/status.d.ts.map +1 -0
- package/dist/mcp/tools/status.js +296 -0
- package/dist/mcp/tools/status.js.map +1 -0
- package/dist/mcp/tools/web-fetch.d.ts +10 -0
- package/dist/mcp/tools/web-fetch.d.ts.map +1 -0
- package/dist/mcp/tools/web-fetch.js +107 -0
- package/dist/mcp/tools/web-fetch.js.map +1 -0
- package/dist/mcp/tools/web-search.d.ts +14 -0
- package/dist/mcp/tools/web-search.d.ts.map +1 -0
- package/dist/mcp/tools/web-search.js +427 -0
- package/dist/mcp/tools/web-search.js.map +1 -0
- package/dist/mcp/types.d.ts +16 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp-server.d.ts +9 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +9 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/prompts/analyze.d.ts +21 -0
- package/dist/prompts/analyze.d.ts.map +1 -0
- package/dist/prompts/analyze.js +27 -0
- package/dist/prompts/analyze.js.map +1 -0
- package/dist/prompts/briefing.d.ts +27 -0
- package/dist/prompts/briefing.d.ts.map +1 -0
- package/dist/prompts/briefing.js +123 -0
- package/dist/prompts/briefing.js.map +1 -0
- package/dist/prompts/chat.d.ts +8 -0
- package/dist/prompts/chat.d.ts.map +1 -0
- package/dist/prompts/chat.js +39 -0
- package/dist/prompts/chat.js.map +1 -0
- package/dist/prompts/daemon.d.ts +16 -0
- package/dist/prompts/daemon.d.ts.map +1 -0
- package/dist/prompts/daemon.js +46 -0
- package/dist/prompts/daemon.js.map +1 -0
- package/dist/prompts/extraction.d.ts +13 -0
- package/dist/prompts/extraction.d.ts.map +1 -0
- package/dist/prompts/extraction.js +93 -0
- package/dist/prompts/extraction.js.map +1 -0
- package/dist/prompts/index.d.ts +17 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +27 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/memory.d.ts +11 -0
- package/dist/prompts/memory.d.ts.map +1 -0
- package/dist/prompts/memory.js +23 -0
- package/dist/prompts/memory.js.map +1 -0
- package/dist/prompts/onboarding.d.ts +16 -0
- package/dist/prompts/onboarding.d.ts.map +1 -0
- package/dist/prompts/onboarding.js +183 -0
- package/dist/prompts/onboarding.js.map +1 -0
- package/dist/prompts/prd.d.ts +12 -0
- package/dist/prompts/prd.d.ts.map +1 -0
- package/dist/prompts/prd.js +211 -0
- package/dist/prompts/prd.js.map +1 -0
- package/dist/prompts/quality.d.ts +11 -0
- package/dist/prompts/quality.d.ts.map +1 -0
- package/dist/prompts/quality.js +11 -0
- package/dist/prompts/quality.js.map +1 -0
- package/dist/prompts/skills.d.ts +16 -0
- package/dist/prompts/skills.d.ts.map +1 -0
- package/dist/prompts/skills.js +30 -0
- package/dist/prompts/skills.js.map +1 -0
- package/hooks/succ-post-tool.cjs +227 -0
- package/hooks/succ-pre-tool.cjs +312 -0
- package/hooks/succ-session-end.cjs +85 -0
- package/hooks/succ-session-start.cjs +618 -0
- package/hooks/succ-stop-reflection.cjs +87 -0
- package/hooks/succ-user-prompt.cjs +220 -0
- package/package.json +128 -0
|
@@ -0,0 +1,778 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark Metrics Library
|
|
3
|
+
*
|
|
4
|
+
* Provides standard IR (Information Retrieval) metrics for evaluating
|
|
5
|
+
* succ's search and memory recall quality:
|
|
6
|
+
* - Recall@K: What fraction of relevant items were retrieved in top K
|
|
7
|
+
* - MRR (Mean Reciprocal Rank): Average of reciprocal ranks of first relevant result
|
|
8
|
+
* - NDCG (Normalized Discounted Cumulative Gain): Measures ranking quality
|
|
9
|
+
* - Latency metrics: Embedding time, search time, full pipeline time
|
|
10
|
+
*/
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Accuracy Metrics
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Calculate Recall@K
|
|
16
|
+
*
|
|
17
|
+
* What fraction of relevant items appear in the top K results?
|
|
18
|
+
* Recall@K = |relevant ∩ retrieved@K| / |relevant|
|
|
19
|
+
*
|
|
20
|
+
* @param results - Ranked search results (ordered by score desc)
|
|
21
|
+
* @param relevantIds - Set of relevant item IDs (ground truth)
|
|
22
|
+
* @param k - Number of top results to consider
|
|
23
|
+
*/
|
|
24
|
+
export function recallAtK(results, relevantIds, k) {
|
|
25
|
+
if (relevantIds.size === 0)
|
|
26
|
+
return 0;
|
|
27
|
+
const topK = results.slice(0, k);
|
|
28
|
+
const retrievedRelevant = topK.filter((r) => relevantIds.has(r.id)).length;
|
|
29
|
+
return retrievedRelevant / relevantIds.size;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate Precision@K
|
|
33
|
+
*
|
|
34
|
+
* What fraction of top K results are relevant?
|
|
35
|
+
* Precision@K = |relevant ∩ retrieved@K| / K
|
|
36
|
+
*
|
|
37
|
+
* @param results - Ranked search results (ordered by score desc)
|
|
38
|
+
* @param relevantIds - Set of relevant item IDs (ground truth)
|
|
39
|
+
* @param k - Number of top results to consider
|
|
40
|
+
*/
|
|
41
|
+
export function precisionAtK(results, relevantIds, k) {
|
|
42
|
+
if (k === 0)
|
|
43
|
+
return 0;
|
|
44
|
+
const topK = results.slice(0, k);
|
|
45
|
+
const retrievedRelevant = topK.filter((r) => relevantIds.has(r.id)).length;
|
|
46
|
+
return retrievedRelevant / Math.min(k, results.length || 1);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Calculate F1@K
|
|
50
|
+
*
|
|
51
|
+
* Harmonic mean of Precision@K and Recall@K
|
|
52
|
+
* F1@K = 2 * (Precision@K * Recall@K) / (Precision@K + Recall@K)
|
|
53
|
+
*
|
|
54
|
+
* @param results - Ranked search results (ordered by score desc)
|
|
55
|
+
* @param relevantIds - Set of relevant item IDs (ground truth)
|
|
56
|
+
* @param k - Number of top results to consider
|
|
57
|
+
*/
|
|
58
|
+
export function f1AtK(results, relevantIds, k) {
|
|
59
|
+
const precision = precisionAtK(results, relevantIds, k);
|
|
60
|
+
const recall = recallAtK(results, relevantIds, k);
|
|
61
|
+
if (precision + recall === 0)
|
|
62
|
+
return 0;
|
|
63
|
+
return (2 * precision * recall) / (precision + recall);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Calculate Reciprocal Rank
|
|
67
|
+
*
|
|
68
|
+
* RR = 1 / rank of first relevant result
|
|
69
|
+
* Returns 0 if no relevant result found
|
|
70
|
+
*
|
|
71
|
+
* @param results - Ranked search results
|
|
72
|
+
* @param relevantIds - Set of relevant item IDs
|
|
73
|
+
*/
|
|
74
|
+
export function reciprocalRank(results, relevantIds) {
|
|
75
|
+
for (let i = 0; i < results.length; i++) {
|
|
76
|
+
if (relevantIds.has(results[i].id)) {
|
|
77
|
+
return 1 / (i + 1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Calculate Mean Reciprocal Rank across multiple queries
|
|
84
|
+
*
|
|
85
|
+
* MRR = (1/|Q|) * Σ RR(q) for each query q
|
|
86
|
+
*
|
|
87
|
+
* @param queries - Array of benchmark queries with results
|
|
88
|
+
*/
|
|
89
|
+
export function meanReciprocalRank(queries) {
|
|
90
|
+
if (queries.length === 0)
|
|
91
|
+
return 0;
|
|
92
|
+
const sumRR = queries.reduce((sum, q) => sum + reciprocalRank(q.results, q.relevantIds), 0);
|
|
93
|
+
return sumRR / queries.length;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Calculate DCG (Discounted Cumulative Gain)
|
|
97
|
+
*
|
|
98
|
+
* DCG@K = Σ (2^rel(i) - 1) / log2(i + 1) for i = 1 to K
|
|
99
|
+
*
|
|
100
|
+
* @param results - Ranked search results
|
|
101
|
+
* @param relevanceScores - Map of item ID to relevance score (default 1.0 for relevant)
|
|
102
|
+
* @param k - Number of results to consider
|
|
103
|
+
*/
|
|
104
|
+
export function dcg(results, relevanceScores, k) {
|
|
105
|
+
let dcgScore = 0;
|
|
106
|
+
for (let i = 0; i < Math.min(k, results.length); i++) {
|
|
107
|
+
const rel = relevanceScores.get(results[i].id) ?? 0;
|
|
108
|
+
// Using the standard DCG formula: (2^rel - 1) / log2(rank + 1)
|
|
109
|
+
dcgScore += (Math.pow(2, rel) - 1) / Math.log2(i + 2);
|
|
110
|
+
}
|
|
111
|
+
return dcgScore;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Calculate NDCG (Normalized DCG)
|
|
115
|
+
*
|
|
116
|
+
* NDCG@K = DCG@K / IDCG@K
|
|
117
|
+
* where IDCG is the ideal DCG (perfect ranking)
|
|
118
|
+
*
|
|
119
|
+
* @param results - Ranked search results
|
|
120
|
+
* @param relevanceScores - Map of item ID to relevance score
|
|
121
|
+
* @param k - Number of results to consider
|
|
122
|
+
*/
|
|
123
|
+
export function ndcg(results, relevanceScores, k) {
|
|
124
|
+
// Calculate actual DCG
|
|
125
|
+
const actualDcg = dcg(results, relevanceScores, k);
|
|
126
|
+
// Calculate ideal DCG (perfect ranking)
|
|
127
|
+
// Sort all relevance scores descending to get ideal order
|
|
128
|
+
const idealRanking = [...relevanceScores.entries()]
|
|
129
|
+
.sort((a, b) => b[1] - a[1])
|
|
130
|
+
.slice(0, k)
|
|
131
|
+
.map(([id, score]) => ({ id, score }));
|
|
132
|
+
const idealDcg = dcg(idealRanking, relevanceScores, k);
|
|
133
|
+
if (idealDcg === 0)
|
|
134
|
+
return 0;
|
|
135
|
+
return actualDcg / idealDcg;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Calculate all accuracy metrics for a set of queries
|
|
139
|
+
*/
|
|
140
|
+
export function calculateAccuracyMetrics(queries, k = 5) {
|
|
141
|
+
if (queries.length === 0) {
|
|
142
|
+
return {
|
|
143
|
+
recallAtK: 0,
|
|
144
|
+
precisionAtK: 0,
|
|
145
|
+
f1AtK: 0,
|
|
146
|
+
k,
|
|
147
|
+
mrr: 0,
|
|
148
|
+
ndcg: 0,
|
|
149
|
+
queryCount: 0,
|
|
150
|
+
queriesWithHits: 0,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
let totalRecall = 0;
|
|
154
|
+
let totalPrecision = 0;
|
|
155
|
+
let totalF1 = 0;
|
|
156
|
+
let totalNdcg = 0;
|
|
157
|
+
let queriesWithHits = 0;
|
|
158
|
+
for (const q of queries) {
|
|
159
|
+
// For relevance scores, use provided or default to 1.0 for all relevant items
|
|
160
|
+
const relScores = q.relevanceScores ?? new Map([...q.relevantIds].map((id) => [id, 1.0]));
|
|
161
|
+
totalRecall += recallAtK(q.results, q.relevantIds, k);
|
|
162
|
+
totalPrecision += precisionAtK(q.results, q.relevantIds, k);
|
|
163
|
+
totalF1 += f1AtK(q.results, q.relevantIds, k);
|
|
164
|
+
totalNdcg += ndcg(q.results, relScores, k);
|
|
165
|
+
// Check if any relevant item was found
|
|
166
|
+
if (q.results.some((r) => q.relevantIds.has(r.id))) {
|
|
167
|
+
queriesWithHits++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
recallAtK: totalRecall / queries.length,
|
|
172
|
+
precisionAtK: totalPrecision / queries.length,
|
|
173
|
+
f1AtK: totalF1 / queries.length,
|
|
174
|
+
k,
|
|
175
|
+
mrr: meanReciprocalRank(queries),
|
|
176
|
+
ndcg: totalNdcg / queries.length,
|
|
177
|
+
queryCount: queries.length,
|
|
178
|
+
queriesWithHits,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// ============================================================================
|
|
182
|
+
// Latency Metrics
|
|
183
|
+
// ============================================================================
|
|
184
|
+
/**
|
|
185
|
+
* Calculate latency statistics from an array of measurements
|
|
186
|
+
*/
|
|
187
|
+
export function calculateLatencyStats(measurements) {
|
|
188
|
+
if (measurements.length === 0) {
|
|
189
|
+
return { min: 0, max: 0, avg: 0, p50: 0, p95: 0, p99: 0, samples: 0 };
|
|
190
|
+
}
|
|
191
|
+
const sorted = [...measurements].sort((a, b) => a - b);
|
|
192
|
+
const sum = sorted.reduce((a, b) => a + b, 0);
|
|
193
|
+
return {
|
|
194
|
+
min: sorted[0],
|
|
195
|
+
max: sorted[sorted.length - 1],
|
|
196
|
+
avg: sum / sorted.length,
|
|
197
|
+
p50: percentile(sorted, 50),
|
|
198
|
+
p95: percentile(sorted, 95),
|
|
199
|
+
p99: percentile(sorted, 99),
|
|
200
|
+
samples: sorted.length,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Calculate percentile from sorted array
|
|
205
|
+
*/
|
|
206
|
+
function percentile(sorted, p) {
|
|
207
|
+
if (sorted.length === 0)
|
|
208
|
+
return 0;
|
|
209
|
+
const index = (p / 100) * (sorted.length - 1);
|
|
210
|
+
const lower = Math.floor(index);
|
|
211
|
+
const upper = Math.ceil(index);
|
|
212
|
+
if (lower === upper)
|
|
213
|
+
return sorted[lower];
|
|
214
|
+
return sorted[lower] * (upper - index) + sorted[upper] * (index - lower);
|
|
215
|
+
}
|
|
216
|
+
// ============================================================================
|
|
217
|
+
// Formatting
|
|
218
|
+
// ============================================================================
|
|
219
|
+
/**
|
|
220
|
+
* Format accuracy metrics as human-readable string
|
|
221
|
+
*/
|
|
222
|
+
export function formatAccuracyMetrics(metrics) {
|
|
223
|
+
const lines = [
|
|
224
|
+
'┌─────────────────────────────────────────┐',
|
|
225
|
+
'│ Accuracy Metrics │',
|
|
226
|
+
'├─────────────────────────────────────────┤',
|
|
227
|
+
`│ Recall@${metrics.k}: ${(metrics.recallAtK * 100).toFixed(1).padStart(6)}% │`,
|
|
228
|
+
`│ Precision@${metrics.k}: ${(metrics.precisionAtK * 100).toFixed(1).padStart(6)}% │`,
|
|
229
|
+
`│ F1@${metrics.k}: ${(metrics.f1AtK * 100).toFixed(1).padStart(6)}% │`,
|
|
230
|
+
`│ MRR: ${(metrics.mrr * 100).toFixed(1).padStart(6)}% │`,
|
|
231
|
+
`│ NDCG@${metrics.k}: ${(metrics.ndcg * 100).toFixed(1).padStart(6)}% │`,
|
|
232
|
+
'├─────────────────────────────────────────┤',
|
|
233
|
+
`│ Queries: ${metrics.queryCount.toString().padStart(6)} │`,
|
|
234
|
+
`│ With hits: ${metrics.queriesWithHits.toString().padStart(6)} (${((metrics.queriesWithHits / Math.max(metrics.queryCount, 1)) * 100).toFixed(0)}%) │`,
|
|
235
|
+
'└─────────────────────────────────────────┘',
|
|
236
|
+
];
|
|
237
|
+
return lines.join('\n');
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Format latency stats as human-readable string
|
|
241
|
+
*/
|
|
242
|
+
export function formatLatencyStats(stats, name) {
|
|
243
|
+
return `${name.padEnd(12)} │ ${stats.avg.toFixed(1).padStart(7)}ms │ ${stats.p50.toFixed(1).padStart(7)}ms │ ${stats.p95.toFixed(1).padStart(7)}ms │ ${stats.p99.toFixed(1).padStart(7)}ms │`;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Format latency metrics as human-readable string
|
|
247
|
+
*/
|
|
248
|
+
export function formatLatencyMetrics(metrics) {
|
|
249
|
+
const lines = [
|
|
250
|
+
'┌─────────────────────────────────────────────────────────────────┐',
|
|
251
|
+
'│ Latency Metrics │',
|
|
252
|
+
'├──────────────┬─────────┬─────────┬─────────┬─────────┤',
|
|
253
|
+
'│ Operation │ Avg │ P50 │ P95 │ P99 │',
|
|
254
|
+
'├──────────────┼─────────┼─────────┼─────────┼─────────┤',
|
|
255
|
+
`│ ${formatLatencyStats(metrics.embedding, 'Embedding')}`,
|
|
256
|
+
`│ ${formatLatencyStats(metrics.search, 'Search')}`,
|
|
257
|
+
`│ ${formatLatencyStats(metrics.pipeline, 'Pipeline')}`,
|
|
258
|
+
'└──────────────┴─────────┴─────────┴─────────┴─────────┘',
|
|
259
|
+
];
|
|
260
|
+
return lines.join('\n');
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Format full benchmark results
|
|
264
|
+
*/
|
|
265
|
+
export function formatBenchmarkResults(results) {
|
|
266
|
+
const lines = [
|
|
267
|
+
'═══════════════════════════════════════════════════════════════════',
|
|
268
|
+
' SUCC BENCHMARK RESULTS ',
|
|
269
|
+
'═══════════════════════════════════════════════════════════════════',
|
|
270
|
+
'',
|
|
271
|
+
`Timestamp: ${results.timestamp}`,
|
|
272
|
+
`Model: ${results.config.embeddingModel} (${results.config.embeddingMode})`,
|
|
273
|
+
`Memories: ${results.config.totalMemories}`,
|
|
274
|
+
`Test queries: ${results.config.testQueries}`,
|
|
275
|
+
'',
|
|
276
|
+
formatAccuracyMetrics(results.accuracy),
|
|
277
|
+
'',
|
|
278
|
+
formatLatencyMetrics(results.latency),
|
|
279
|
+
'',
|
|
280
|
+
'═══════════════════════════════════════════════════════════════════',
|
|
281
|
+
];
|
|
282
|
+
return lines.join('\n');
|
|
283
|
+
}
|
|
284
|
+
// Extended categories for larger benchmarks
|
|
285
|
+
const EXTENDED_CATEGORIES = {
|
|
286
|
+
typescript: [
|
|
287
|
+
{
|
|
288
|
+
content: 'TypeScript is a strongly typed programming language that builds on JavaScript',
|
|
289
|
+
tags: ['typescript', 'programming', 'language'],
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
content: 'TypeScript interfaces define the shape of objects with type checking',
|
|
293
|
+
tags: ['typescript', 'interfaces', 'types'],
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
content: 'TypeScript generics allow creating reusable components with type safety',
|
|
297
|
+
tags: ['typescript', 'generics', 'reusable'],
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
content: 'TypeScript decorators are a stage 2 proposal for JavaScript',
|
|
301
|
+
tags: ['typescript', 'decorators', 'metadata'],
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
content: 'TypeScript enums provide a way to define named constants',
|
|
305
|
+
tags: ['typescript', 'enums', 'constants'],
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
content: 'TypeScript utility types like Partial, Required, Pick transform types',
|
|
309
|
+
tags: ['typescript', 'utility', 'types'],
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
content: 'TypeScript namespaces organize code and prevent naming collisions',
|
|
313
|
+
tags: ['typescript', 'namespaces', 'modules'],
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
content: 'TypeScript strict mode enables stricter type checking options',
|
|
317
|
+
tags: ['typescript', 'strict', 'config'],
|
|
318
|
+
},
|
|
319
|
+
],
|
|
320
|
+
react: [
|
|
321
|
+
{
|
|
322
|
+
content: 'React is a JavaScript library for building user interfaces',
|
|
323
|
+
tags: ['react', 'frontend', 'ui'],
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
content: 'React hooks like useState and useEffect manage component state and side effects',
|
|
327
|
+
tags: ['react', 'hooks', 'state'],
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
content: 'React components can be functional or class-based',
|
|
331
|
+
tags: ['react', 'components', 'functional'],
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
content: 'React context provides a way to pass data through the component tree',
|
|
335
|
+
tags: ['react', 'context', 'state'],
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
content: 'React Server Components render on the server for better performance',
|
|
339
|
+
tags: ['react', 'server', 'performance'],
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
content: 'React Suspense handles async operations with loading states',
|
|
343
|
+
tags: ['react', 'suspense', 'async'],
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
content: 'React memo prevents unnecessary re-renders of components',
|
|
347
|
+
tags: ['react', 'memo', 'optimization'],
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
content: 'React portals render children into different DOM nodes',
|
|
351
|
+
tags: ['react', 'portals', 'dom'],
|
|
352
|
+
},
|
|
353
|
+
],
|
|
354
|
+
database: [
|
|
355
|
+
{
|
|
356
|
+
content: 'PostgreSQL is a powerful open source relational database',
|
|
357
|
+
tags: ['database', 'postgresql', 'sql'],
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
content: 'SQLite is a self-contained, serverless SQL database engine',
|
|
361
|
+
tags: ['database', 'sqlite', 'embedded'],
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
content: 'Database indexes improve query performance by creating sorted references',
|
|
365
|
+
tags: ['database', 'indexes', 'performance'],
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
content: 'Database transactions ensure ACID properties for data integrity',
|
|
369
|
+
tags: ['database', 'transactions', 'acid'],
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
content: 'MongoDB is a document-oriented NoSQL database',
|
|
373
|
+
tags: ['database', 'mongodb', 'nosql'],
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
content: 'Redis is an in-memory data structure store for caching',
|
|
377
|
+
tags: ['database', 'redis', 'cache'],
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
content: 'Database migrations track schema changes over time',
|
|
381
|
+
tags: ['database', 'migrations', 'schema'],
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
content: 'Connection pooling reuses database connections for efficiency',
|
|
385
|
+
tags: ['database', 'pooling', 'connections'],
|
|
386
|
+
},
|
|
387
|
+
],
|
|
388
|
+
devops: [
|
|
389
|
+
{
|
|
390
|
+
content: 'Docker containers package software into standardized units',
|
|
391
|
+
tags: ['docker', 'containers', 'devops'],
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
content: 'Kubernetes orchestrates containerized applications at scale',
|
|
395
|
+
tags: ['kubernetes', 'orchestration', 'devops'],
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
content: 'CI/CD pipelines automate building, testing, and deploying code',
|
|
399
|
+
tags: ['cicd', 'automation', 'devops'],
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
content: 'Infrastructure as Code defines infrastructure using configuration files',
|
|
403
|
+
tags: ['iac', 'terraform', 'devops'],
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
content: 'GitHub Actions automates workflows directly in repositories',
|
|
407
|
+
tags: ['github', 'actions', 'devops'],
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
content: 'Prometheus monitors systems and collects metrics',
|
|
411
|
+
tags: ['prometheus', 'monitoring', 'devops'],
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
content: 'Helm manages Kubernetes applications with charts',
|
|
415
|
+
tags: ['helm', 'kubernetes', 'devops'],
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
content: 'Ansible automates configuration management across servers',
|
|
419
|
+
tags: ['ansible', 'automation', 'devops'],
|
|
420
|
+
},
|
|
421
|
+
],
|
|
422
|
+
architecture: [
|
|
423
|
+
{
|
|
424
|
+
content: 'Microservices architecture splits applications into small, independent services',
|
|
425
|
+
tags: ['microservices', 'architecture', 'distributed'],
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
content: 'Event-driven architecture uses events to trigger and communicate between services',
|
|
429
|
+
tags: ['events', 'architecture', 'async'],
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
content: 'Domain-Driven Design focuses on the core domain and domain logic',
|
|
433
|
+
tags: ['ddd', 'architecture', 'domain'],
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
content: 'Clean Architecture separates concerns into layers with dependency rules',
|
|
437
|
+
tags: ['clean', 'architecture', 'layers'],
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
content: 'CQRS separates read and write operations for scalability',
|
|
441
|
+
tags: ['cqrs', 'architecture', 'patterns'],
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
content: 'Event Sourcing stores state as a sequence of events',
|
|
445
|
+
tags: ['eventsourcing', 'architecture', 'patterns'],
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
content: 'Hexagonal Architecture organizes code around ports and adapters',
|
|
449
|
+
tags: ['hexagonal', 'architecture', 'ports'],
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
content: 'Saga pattern manages distributed transactions across services',
|
|
453
|
+
tags: ['saga', 'architecture', 'distributed'],
|
|
454
|
+
},
|
|
455
|
+
],
|
|
456
|
+
security: [
|
|
457
|
+
{
|
|
458
|
+
content: 'JWT tokens provide stateless authentication for APIs',
|
|
459
|
+
tags: ['jwt', 'security', 'auth'],
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
content: 'OAuth 2.0 enables secure delegated access to resources',
|
|
463
|
+
tags: ['oauth', 'security', 'auth'],
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
content: 'CORS controls which origins can access your API',
|
|
467
|
+
tags: ['cors', 'security', 'web'],
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
content: 'SQL injection attacks exploit poorly sanitized user input',
|
|
471
|
+
tags: ['sql', 'security', 'vulnerabilities'],
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
content: 'XSS attacks inject malicious scripts into web pages',
|
|
475
|
+
tags: ['xss', 'security', 'vulnerabilities'],
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
content: 'HTTPS encrypts data in transit using TLS',
|
|
479
|
+
tags: ['https', 'security', 'encryption'],
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
content: 'API rate limiting prevents abuse and denial of service',
|
|
483
|
+
tags: ['ratelimit', 'security', 'api'],
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
content: 'Password hashing with bcrypt protects stored credentials',
|
|
487
|
+
tags: ['bcrypt', 'security', 'passwords'],
|
|
488
|
+
},
|
|
489
|
+
],
|
|
490
|
+
testing: [
|
|
491
|
+
{
|
|
492
|
+
content: 'Unit tests verify individual functions in isolation',
|
|
493
|
+
tags: ['unit', 'testing', 'isolation'],
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
content: 'Integration tests verify components work together correctly',
|
|
497
|
+
tags: ['integration', 'testing', 'components'],
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
content: 'End-to-end tests simulate real user scenarios',
|
|
501
|
+
tags: ['e2e', 'testing', 'scenarios'],
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
content: 'Test-driven development writes tests before implementation',
|
|
505
|
+
tags: ['tdd', 'testing', 'methodology'],
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
content: 'Mocking replaces dependencies with controlled implementations',
|
|
509
|
+
tags: ['mocking', 'testing', 'dependencies'],
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
content: 'Code coverage measures how much code is executed by tests',
|
|
513
|
+
tags: ['coverage', 'testing', 'metrics'],
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
content: 'Snapshot testing captures component output for comparison',
|
|
517
|
+
tags: ['snapshot', 'testing', 'ui'],
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
content: 'Property-based testing generates random inputs to find edge cases',
|
|
521
|
+
tags: ['property', 'testing', 'random'],
|
|
522
|
+
},
|
|
523
|
+
],
|
|
524
|
+
performance: [
|
|
525
|
+
{
|
|
526
|
+
content: 'Caching stores frequently accessed data for faster retrieval',
|
|
527
|
+
tags: ['caching', 'performance', 'speed'],
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
content: 'Lazy loading defers resource loading until needed',
|
|
531
|
+
tags: ['lazy', 'performance', 'loading'],
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
content: 'Code splitting breaks bundles into smaller chunks',
|
|
535
|
+
tags: ['splitting', 'performance', 'bundles'],
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
content: 'CDN distributes content closer to users geographically',
|
|
539
|
+
tags: ['cdn', 'performance', 'distribution'],
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
content: 'Database query optimization reduces execution time',
|
|
543
|
+
tags: ['optimization', 'performance', 'database'],
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
content: 'Memory profiling identifies memory leaks and inefficiencies',
|
|
547
|
+
tags: ['memory', 'performance', 'profiling'],
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
content: 'Load balancing distributes traffic across multiple servers',
|
|
551
|
+
tags: ['loadbalancing', 'performance', 'scaling'],
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
content: 'Compression reduces data size for faster transmission',
|
|
555
|
+
tags: ['compression', 'performance', 'network'],
|
|
556
|
+
},
|
|
557
|
+
],
|
|
558
|
+
};
|
|
559
|
+
// Extended queries for larger benchmarks
|
|
560
|
+
const EXTENDED_QUERIES = [
|
|
561
|
+
// TypeScript queries
|
|
562
|
+
{ query: 'strongly typed javascript superset language', categories: ['typescript'] },
|
|
563
|
+
{ query: 'type checking and interfaces in code', categories: ['typescript'] },
|
|
564
|
+
{ query: 'generic type parameters reusable components', categories: ['typescript'] },
|
|
565
|
+
{ query: 'decorators metadata annotations', categories: ['typescript'] },
|
|
566
|
+
// React queries
|
|
567
|
+
{ query: 'UI component library for frontend', categories: ['react'] },
|
|
568
|
+
{ query: 'managing state in functional components', categories: ['react'] },
|
|
569
|
+
{ query: 'server side rendering performance', categories: ['react'] },
|
|
570
|
+
{ query: 'prevent unnecessary component renders', categories: ['react', 'performance'] },
|
|
571
|
+
// Database queries
|
|
572
|
+
{ query: 'SQL relational database open source', categories: ['database'] },
|
|
573
|
+
{ query: 'query performance optimization indexes', categories: ['database', 'performance'] },
|
|
574
|
+
{ query: 'document store nosql database', categories: ['database'] },
|
|
575
|
+
{ query: 'in-memory caching data structure', categories: ['database', 'performance'] },
|
|
576
|
+
// DevOps queries
|
|
577
|
+
{ query: 'container orchestration deployment', categories: ['devops'] },
|
|
578
|
+
{ query: 'automate build test deploy pipeline', categories: ['devops'] },
|
|
579
|
+
{ query: 'infrastructure configuration management', categories: ['devops'] },
|
|
580
|
+
{ query: 'monitoring metrics collection', categories: ['devops'] },
|
|
581
|
+
// Architecture queries
|
|
582
|
+
{ query: 'distributed services communication patterns', categories: ['architecture'] },
|
|
583
|
+
{ query: 'domain logic separation layers', categories: ['architecture'] },
|
|
584
|
+
{ query: 'event sourcing state management', categories: ['architecture'] },
|
|
585
|
+
{ query: 'read write separation scalability', categories: ['architecture'] },
|
|
586
|
+
// Security queries
|
|
587
|
+
{ query: 'token based authentication API', categories: ['security'] },
|
|
588
|
+
{ query: 'prevent injection attacks input validation', categories: ['security'] },
|
|
589
|
+
{ query: 'encrypt data transmission HTTPS', categories: ['security'] },
|
|
590
|
+
{ query: 'rate limiting prevent abuse', categories: ['security'] },
|
|
591
|
+
// Testing queries
|
|
592
|
+
{ query: 'isolated function verification unit tests', categories: ['testing'] },
|
|
593
|
+
{ query: 'component integration verification', categories: ['testing'] },
|
|
594
|
+
{ query: 'test driven development methodology', categories: ['testing'] },
|
|
595
|
+
{ query: 'code coverage test metrics', categories: ['testing'] },
|
|
596
|
+
// Performance queries
|
|
597
|
+
{ query: 'speed up data retrieval caching', categories: ['performance'] },
|
|
598
|
+
{ query: 'reduce bundle size code splitting', categories: ['performance'] },
|
|
599
|
+
{ query: 'distribute load multiple servers', categories: ['performance'] },
|
|
600
|
+
{ query: 'identify memory leaks profiling', categories: ['performance'] },
|
|
601
|
+
// Cross-category queries
|
|
602
|
+
{
|
|
603
|
+
query: 'building scalable web applications',
|
|
604
|
+
categories: ['react', 'architecture', 'performance'],
|
|
605
|
+
},
|
|
606
|
+
{ query: 'secure API development best practices', categories: ['security', 'architecture'] },
|
|
607
|
+
{ query: 'automated testing CI/CD integration', categories: ['testing', 'devops'] },
|
|
608
|
+
{
|
|
609
|
+
query: 'database performance optimization techniques',
|
|
610
|
+
categories: ['database', 'performance'],
|
|
611
|
+
},
|
|
612
|
+
];
|
|
613
|
+
/**
|
|
614
|
+
* Generate a synthetic test dataset for benchmarking.
|
|
615
|
+
* Uses diverse topics with known relationships for ground truth.
|
|
616
|
+
*
|
|
617
|
+
* @param size - 'small' (20 memories, 12 queries), 'medium' (64 memories, 36 queries), 'large' (all)
|
|
618
|
+
*/
|
|
619
|
+
export function generateTestDataset(size = 'small') {
|
|
620
|
+
// Select categories based on size
|
|
621
|
+
const categoryNames = size === 'small'
|
|
622
|
+
? ['typescript', 'react', 'database', 'devops', 'architecture']
|
|
623
|
+
: Object.keys(EXTENDED_CATEGORIES);
|
|
624
|
+
const itemsPerCategory = size === 'small' ? 4 : 8;
|
|
625
|
+
// Build categories object
|
|
626
|
+
const categories = {};
|
|
627
|
+
for (const name of categoryNames) {
|
|
628
|
+
categories[name] = EXTENDED_CATEGORIES[name].slice(0, itemsPerCategory);
|
|
629
|
+
}
|
|
630
|
+
// Flatten memories with category info
|
|
631
|
+
const memories = [];
|
|
632
|
+
let idCounter = 1;
|
|
633
|
+
const categoryIds = {};
|
|
634
|
+
for (const [category, items] of Object.entries(categories)) {
|
|
635
|
+
categoryIds[category] = [];
|
|
636
|
+
for (const item of items) {
|
|
637
|
+
memories.push({ ...item, category });
|
|
638
|
+
categoryIds[category].push(idCounter);
|
|
639
|
+
idCounter++;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
// Generate queries based on size
|
|
643
|
+
const queries = [];
|
|
644
|
+
if (size === 'small') {
|
|
645
|
+
// Original small dataset queries
|
|
646
|
+
queries.push({ query: 'strongly typed javascript superset language', relevantIds: categoryIds.typescript }, { query: 'type checking and interfaces in code', relevantIds: categoryIds.typescript }, { query: 'UI component library for frontend', relevantIds: categoryIds.react }, { query: 'managing state in functional components', relevantIds: categoryIds.react }, { query: 'SQL relational database open source', relevantIds: categoryIds.database }, { query: 'query performance optimization indexes', relevantIds: categoryIds.database }, { query: 'container orchestration deployment', relevantIds: [...categoryIds.devops] }, { query: 'automate build test deploy pipeline', relevantIds: categoryIds.devops }, {
|
|
647
|
+
query: 'distributed services communication patterns',
|
|
648
|
+
relevantIds: categoryIds.architecture,
|
|
649
|
+
}, { query: 'domain logic separation layers', relevantIds: categoryIds.architecture }, {
|
|
650
|
+
query: 'building scalable web applications',
|
|
651
|
+
relevantIds: [...categoryIds.react, ...categoryIds.architecture],
|
|
652
|
+
}, { query: 'data storage and retrieval systems', relevantIds: categoryIds.database });
|
|
653
|
+
}
|
|
654
|
+
else {
|
|
655
|
+
// Extended queries for medium/large
|
|
656
|
+
for (const q of EXTENDED_QUERIES) {
|
|
657
|
+
// Only include queries where all required categories exist
|
|
658
|
+
const relevantCategories = q.categories.filter((c) => categoryIds[c]);
|
|
659
|
+
if (relevantCategories.length > 0) {
|
|
660
|
+
const relevantIds = relevantCategories.flatMap((c) => categoryIds[c] || []);
|
|
661
|
+
queries.push({ query: q.query, relevantIds });
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return { memories, queries };
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Generate a unique benchmark ID based on timestamp and random suffix
|
|
669
|
+
*/
|
|
670
|
+
export function generateBenchmarkId() {
|
|
671
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
672
|
+
const suffix = Math.random().toString(36).slice(2, 6);
|
|
673
|
+
return `bench-${timestamp}-${suffix}`;
|
|
674
|
+
}
|
|
675
|
+
/**
|
|
676
|
+
* Compare two benchmark results and return regression/improvement info
|
|
677
|
+
*/
|
|
678
|
+
export function compareBenchmarks(current, previous) {
|
|
679
|
+
const recallDelta = current.recallAtK - previous.recallAtK;
|
|
680
|
+
const precisionDelta = current.precisionAtK - previous.precisionAtK;
|
|
681
|
+
const f1Delta = current.f1AtK - previous.f1AtK;
|
|
682
|
+
const mrrDelta = current.mrr - previous.mrr;
|
|
683
|
+
const ndcgDelta = current.ndcg - previous.ndcg;
|
|
684
|
+
// Consider it a regression if F1 or MRR dropped by more than 5%
|
|
685
|
+
const isRegression = f1Delta < -0.05 || mrrDelta < -0.05;
|
|
686
|
+
// Consider it an improvement if F1 or MRR improved by more than 5%
|
|
687
|
+
const isImprovement = f1Delta > 0.05 || mrrDelta > 0.05;
|
|
688
|
+
return {
|
|
689
|
+
recallDelta,
|
|
690
|
+
precisionDelta,
|
|
691
|
+
f1Delta,
|
|
692
|
+
mrrDelta,
|
|
693
|
+
ndcgDelta,
|
|
694
|
+
isRegression,
|
|
695
|
+
isImprovement,
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Format benchmark comparison as human-readable string
|
|
700
|
+
*/
|
|
701
|
+
export function formatBenchmarkComparison(current, previous, previousTimestamp) {
|
|
702
|
+
const comparison = compareBenchmarks(current, previous);
|
|
703
|
+
const formatDelta = (d) => {
|
|
704
|
+
const sign = d >= 0 ? '+' : '';
|
|
705
|
+
return `${sign}${(d * 100).toFixed(1)}%`;
|
|
706
|
+
};
|
|
707
|
+
const status = comparison.isRegression
|
|
708
|
+
? '⚠️ REGRESSION DETECTED'
|
|
709
|
+
: comparison.isImprovement
|
|
710
|
+
? '✅ IMPROVEMENT'
|
|
711
|
+
: '➡️ NO SIGNIFICANT CHANGE';
|
|
712
|
+
const lines = [
|
|
713
|
+
'┌─────────────────────────────────────────────────┐',
|
|
714
|
+
'│ Benchmark Comparison │',
|
|
715
|
+
'├─────────────────────────────────────────────────┤',
|
|
716
|
+
`│ ${status.padEnd(47)} │`,
|
|
717
|
+
`│ Previous: ${previousTimestamp.padEnd(36)} │`,
|
|
718
|
+
'├─────────────────────────────────────────────────┤',
|
|
719
|
+
`│ Recall@K: ${formatDelta(comparison.recallDelta).padStart(8)} (${(previous.recallAtK * 100).toFixed(1)}% → ${(current.recallAtK * 100).toFixed(1)}%) │`,
|
|
720
|
+
`│ Precision@K: ${formatDelta(comparison.precisionDelta).padStart(8)} (${(previous.precisionAtK * 100).toFixed(1)}% → ${(current.precisionAtK * 100).toFixed(1)}%) │`,
|
|
721
|
+
`│ F1@K: ${formatDelta(comparison.f1Delta).padStart(8)} (${(previous.f1AtK * 100).toFixed(1)}% → ${(current.f1AtK * 100).toFixed(1)}%) │`,
|
|
722
|
+
`│ MRR: ${formatDelta(comparison.mrrDelta).padStart(8)} (${(previous.mrr * 100).toFixed(1)}% → ${(current.mrr * 100).toFixed(1)}%) │`,
|
|
723
|
+
`│ NDCG@K: ${formatDelta(comparison.ndcgDelta).padStart(8)} (${(previous.ndcg * 100).toFixed(1)}% → ${(current.ndcg * 100).toFixed(1)}%) │`,
|
|
724
|
+
'└─────────────────────────────────────────────────┘',
|
|
725
|
+
];
|
|
726
|
+
return lines.join('\n');
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* Compare hybrid search modes and determine best performer
|
|
730
|
+
*/
|
|
731
|
+
export function compareHybridModes(semantic, bm25, hybrid) {
|
|
732
|
+
// Use F1 as the primary comparison metric
|
|
733
|
+
const semanticF1 = semantic.f1AtK;
|
|
734
|
+
const bm25F1 = bm25.f1AtK;
|
|
735
|
+
const hybridF1 = hybrid.f1AtK;
|
|
736
|
+
let bestMode = 'hybrid';
|
|
737
|
+
if (semanticF1 >= hybridF1 && semanticF1 >= bm25F1) {
|
|
738
|
+
bestMode = 'semantic';
|
|
739
|
+
}
|
|
740
|
+
else if (bm25F1 >= hybridF1 && bm25F1 >= semanticF1) {
|
|
741
|
+
bestMode = 'bm25';
|
|
742
|
+
}
|
|
743
|
+
return {
|
|
744
|
+
semantic,
|
|
745
|
+
bm25,
|
|
746
|
+
hybrid,
|
|
747
|
+
bestMode,
|
|
748
|
+
hybridVsSemantic: hybridF1 - semanticF1,
|
|
749
|
+
hybridVsBm25: hybridF1 - bm25F1,
|
|
750
|
+
};
|
|
751
|
+
}
|
|
752
|
+
/**
|
|
753
|
+
* Format hybrid search comparison as human-readable string
|
|
754
|
+
*/
|
|
755
|
+
export function formatHybridComparison(metrics) {
|
|
756
|
+
const formatPct = (n) => `${(n * 100).toFixed(1)}%`;
|
|
757
|
+
const formatDelta = (d) => {
|
|
758
|
+
const sign = d >= 0 ? '+' : '';
|
|
759
|
+
return `${sign}${(d * 100).toFixed(1)}%`;
|
|
760
|
+
};
|
|
761
|
+
const bestIndicator = (mode) => (mode === metrics.bestMode ? ' ⭐' : '');
|
|
762
|
+
const lines = [
|
|
763
|
+
'┌───────────────────────────────────────────────────────────────┐',
|
|
764
|
+
'│ Hybrid Search Comparison │',
|
|
765
|
+
'├───────────┬──────────┬──────────┬──────────┬──────────┬──────┤',
|
|
766
|
+
'│ Mode │ Recall@K │ Prec@K │ F1@K │ MRR │ Best │',
|
|
767
|
+
'├───────────┼──────────┼──────────┼──────────┼──────────┼──────┤',
|
|
768
|
+
`│ Semantic │ ${formatPct(metrics.semantic.recallAtK).padStart(8)} │ ${formatPct(metrics.semantic.precisionAtK).padStart(8)} │ ${formatPct(metrics.semantic.f1AtK).padStart(8)} │ ${formatPct(metrics.semantic.mrr).padStart(8)} │${bestIndicator('semantic').padStart(5)} │`,
|
|
769
|
+
`│ BM25 │ ${formatPct(metrics.bm25.recallAtK).padStart(8)} │ ${formatPct(metrics.bm25.precisionAtK).padStart(8)} │ ${formatPct(metrics.bm25.f1AtK).padStart(8)} │ ${formatPct(metrics.bm25.mrr).padStart(8)} │${bestIndicator('bm25').padStart(5)} │`,
|
|
770
|
+
`│ Hybrid │ ${formatPct(metrics.hybrid.recallAtK).padStart(8)} │ ${formatPct(metrics.hybrid.precisionAtK).padStart(8)} │ ${formatPct(metrics.hybrid.f1AtK).padStart(8)} │ ${formatPct(metrics.hybrid.mrr).padStart(8)} │${bestIndicator('hybrid').padStart(5)} │`,
|
|
771
|
+
'├───────────┴──────────┴──────────┴──────────┴──────────┴──────┤',
|
|
772
|
+
`│ Hybrid vs Semantic: ${formatDelta(metrics.hybridVsSemantic).padStart(7)} F1 │`,
|
|
773
|
+
`│ Hybrid vs BM25: ${formatDelta(metrics.hybridVsBm25).padStart(7)} F1 │`,
|
|
774
|
+
'└───────────────────────────────────────────────────────────────┘',
|
|
775
|
+
];
|
|
776
|
+
return lines.join('\n');
|
|
777
|
+
}
|
|
778
|
+
//# sourceMappingURL=benchmark.js.map
|