@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,682 @@
|
|
|
1
|
+
import { getEmbedding, getEmbeddingInfo, cleanupEmbeddings } from '../lib/embeddings.js';
|
|
2
|
+
import { saveMemory, searchMemories, hybridSearchMemories, deleteMemory, closeDb, getMemoryStats, } from '../lib/storage/index.js';
|
|
3
|
+
import { setConfigOverride, hasApiKey, LOCAL_MODEL, getSuccDir, getLLMTaskConfig, } from '../lib/config.js';
|
|
4
|
+
import { calculateAccuracyMetrics, calculateLatencyStats, formatAccuracyMetrics, formatLatencyMetrics, generateTestDataset, generateBenchmarkId, formatBenchmarkComparison, compareHybridModes, formatHybridComparison, } from '../lib/benchmark.js';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
// Test data for quick benchmark
|
|
8
|
+
const testMemories = [
|
|
9
|
+
{
|
|
10
|
+
content: 'TypeScript is a strongly typed programming language that builds on JavaScript',
|
|
11
|
+
tags: ['typescript', 'programming'],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
content: 'React is a JavaScript library for building user interfaces',
|
|
15
|
+
tags: ['react', 'frontend'],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
content: 'PostgreSQL is a powerful open source relational database',
|
|
19
|
+
tags: ['database', 'sql'],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
content: 'Docker containers package software into standardized units',
|
|
23
|
+
tags: ['docker', 'devops'],
|
|
24
|
+
},
|
|
25
|
+
{ content: 'Git is a distributed version control system', tags: ['git', 'versioning'] },
|
|
26
|
+
{
|
|
27
|
+
content: 'Node.js is a JavaScript runtime built on Chrome V8 engine',
|
|
28
|
+
tags: ['nodejs', 'backend'],
|
|
29
|
+
},
|
|
30
|
+
{ content: 'GraphQL is a query language for APIs', tags: ['graphql', 'api'] },
|
|
31
|
+
{ content: 'Redis is an in-memory data structure store', tags: ['redis', 'cache'] },
|
|
32
|
+
{
|
|
33
|
+
content: 'Kubernetes orchestrates containerized applications',
|
|
34
|
+
tags: ['k8s', 'orchestration'],
|
|
35
|
+
},
|
|
36
|
+
{ content: 'Webpack is a static module bundler for JavaScript', tags: ['webpack', 'build'] },
|
|
37
|
+
];
|
|
38
|
+
const queries = [
|
|
39
|
+
'typed language javascript',
|
|
40
|
+
'frontend UI components',
|
|
41
|
+
'relational database SQL',
|
|
42
|
+
'container deployment',
|
|
43
|
+
'version control history',
|
|
44
|
+
];
|
|
45
|
+
const accuracyTests = [
|
|
46
|
+
{ query: 'strongly typed javascript superset', expected: 'typescript' },
|
|
47
|
+
{ query: 'UI component library facebook', expected: 'react' },
|
|
48
|
+
{ query: 'SQL database open source', expected: 'database' },
|
|
49
|
+
{ query: 'container packaging software', expected: 'docker' },
|
|
50
|
+
{ query: 'source code versioning', expected: 'git' },
|
|
51
|
+
{ query: 'server-side javascript runtime', expected: 'nodejs' },
|
|
52
|
+
{ query: 'API query language alternative to REST', expected: 'graphql' },
|
|
53
|
+
{ query: 'in-memory cache key-value', expected: 'redis' },
|
|
54
|
+
{ query: 'container orchestration platform', expected: 'k8s' },
|
|
55
|
+
{ query: 'javascript bundler module', expected: 'webpack' },
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Run benchmark for a single embedding mode
|
|
59
|
+
*/
|
|
60
|
+
async function runModeBenchmark(iterations, modeName) {
|
|
61
|
+
const results = [];
|
|
62
|
+
// Warm up
|
|
63
|
+
console.log(`\n Warming up ${modeName} model...`);
|
|
64
|
+
const warmupStart = Date.now();
|
|
65
|
+
await getEmbedding('warmup query');
|
|
66
|
+
console.log(` Model ready in ${Date.now() - warmupStart}ms`);
|
|
67
|
+
const embeddingInfo = getEmbeddingInfo();
|
|
68
|
+
// ============ EMBEDDING BENCHMARK ============
|
|
69
|
+
console.log(`\n [1/5] Embedding generation...`);
|
|
70
|
+
const embedTimes = [];
|
|
71
|
+
for (let i = 0; i < iterations; i++) {
|
|
72
|
+
const text = testMemories[i % testMemories.length].content + ` unique${i}`;
|
|
73
|
+
const start = Date.now();
|
|
74
|
+
await getEmbedding(text);
|
|
75
|
+
embedTimes.push(Date.now() - start);
|
|
76
|
+
}
|
|
77
|
+
results.push(formatResult('Embedding generation', embedTimes));
|
|
78
|
+
// ============ SAVE BENCHMARK ============
|
|
79
|
+
console.log(` [2/5] Memory save...`);
|
|
80
|
+
const saveTimes = [];
|
|
81
|
+
const savedIds = [];
|
|
82
|
+
for (let i = 0; i < iterations; i++) {
|
|
83
|
+
const mem = testMemories[i % testMemories.length];
|
|
84
|
+
const uniqueContent = mem.content + ` (${modeName} test ${i})`;
|
|
85
|
+
const start = Date.now();
|
|
86
|
+
const embedding = await getEmbedding(uniqueContent);
|
|
87
|
+
const result = await saveMemory(uniqueContent, embedding, mem.tags, `benchmark-${modeName}`, {
|
|
88
|
+
deduplicate: false,
|
|
89
|
+
autoLink: false,
|
|
90
|
+
});
|
|
91
|
+
saveTimes.push(Date.now() - start);
|
|
92
|
+
savedIds.push(result.id);
|
|
93
|
+
}
|
|
94
|
+
results.push(formatResult('Memory save (full)', saveTimes));
|
|
95
|
+
// ============ RECALL BENCHMARK ============
|
|
96
|
+
console.log(` [3/5] Memory recall...`);
|
|
97
|
+
const recallTimes = [];
|
|
98
|
+
for (let i = 0; i < iterations; i++) {
|
|
99
|
+
const query = queries[i % queries.length] + ` unique${i}`;
|
|
100
|
+
const start = Date.now();
|
|
101
|
+
const queryEmbedding = await getEmbedding(query);
|
|
102
|
+
await searchMemories(queryEmbedding, 5, 0.3);
|
|
103
|
+
recallTimes.push(Date.now() - start);
|
|
104
|
+
}
|
|
105
|
+
results.push(formatResult('Memory recall (full)', recallTimes));
|
|
106
|
+
// ============ SEARCH-ONLY BENCHMARK ============
|
|
107
|
+
console.log(` [4/5] DB search...`);
|
|
108
|
+
const precomputedEmbeddings = await Promise.all(queries.map((q) => getEmbedding(q)));
|
|
109
|
+
const searchTimes = [];
|
|
110
|
+
for (let i = 0; i < iterations * 10; i++) {
|
|
111
|
+
const embedding = precomputedEmbeddings[i % precomputedEmbeddings.length];
|
|
112
|
+
const start = Date.now();
|
|
113
|
+
await searchMemories(embedding, 5, 0.3);
|
|
114
|
+
searchTimes.push(Date.now() - start);
|
|
115
|
+
}
|
|
116
|
+
results.push(formatResult('DB search only', searchTimes));
|
|
117
|
+
// ============ ACCURACY BENCHMARK ============
|
|
118
|
+
console.log(` [5/5] Accuracy test...`);
|
|
119
|
+
let correct = 0;
|
|
120
|
+
for (const test of accuracyTests) {
|
|
121
|
+
const queryEmbedding = await getEmbedding(test.query);
|
|
122
|
+
const searchResults = await searchMemories(queryEmbedding, 1, 0.0);
|
|
123
|
+
if (searchResults.length > 0) {
|
|
124
|
+
const topResult = searchResults[0];
|
|
125
|
+
const hasExpectedTag = topResult.tags.some((t) => t.toLowerCase().includes(test.expected.toLowerCase()));
|
|
126
|
+
if (hasExpectedTag)
|
|
127
|
+
correct++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const accuracy = {
|
|
131
|
+
name: 'Semantic accuracy',
|
|
132
|
+
total: accuracyTests.length,
|
|
133
|
+
correct,
|
|
134
|
+
accuracy: (correct / accuracyTests.length) * 100,
|
|
135
|
+
};
|
|
136
|
+
// Cleanup benchmark data
|
|
137
|
+
for (const id of savedIds) {
|
|
138
|
+
await deleteMemory(id);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
mode: embeddingInfo.mode,
|
|
142
|
+
model: embeddingInfo.model,
|
|
143
|
+
dimensions: embeddingInfo.dimensions,
|
|
144
|
+
results,
|
|
145
|
+
accuracy,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Run advanced benchmark with IR metrics (Recall@K, MRR, NDCG)
|
|
150
|
+
*/
|
|
151
|
+
async function runAdvancedBenchmark(k = 5, size = 'small') {
|
|
152
|
+
console.log(`\n Running advanced accuracy benchmark (${size} dataset)...`);
|
|
153
|
+
const dataset = generateTestDataset(size);
|
|
154
|
+
const savedIds = [];
|
|
155
|
+
// Insert test memories
|
|
156
|
+
console.log(` Inserting ${dataset.memories.length} test memories...`);
|
|
157
|
+
for (const mem of dataset.memories) {
|
|
158
|
+
const embedding = await getEmbedding(mem.content);
|
|
159
|
+
const result = await saveMemory(mem.content, embedding, mem.tags, 'benchmark-advanced', {
|
|
160
|
+
deduplicate: false,
|
|
161
|
+
autoLink: false,
|
|
162
|
+
});
|
|
163
|
+
savedIds.push(result.id);
|
|
164
|
+
}
|
|
165
|
+
// Map original indices to saved IDs
|
|
166
|
+
const idMapping = new Map();
|
|
167
|
+
for (let i = 0; i < savedIds.length; i++) {
|
|
168
|
+
idMapping.set(i + 1, savedIds[i]); // Original IDs were 1-indexed
|
|
169
|
+
}
|
|
170
|
+
// Run queries and collect results
|
|
171
|
+
const embeddingTimes = [];
|
|
172
|
+
const searchTimes = [];
|
|
173
|
+
const pipelineTimes = [];
|
|
174
|
+
const queryResults = [];
|
|
175
|
+
console.log(` Running ${dataset.queries.length} benchmark queries...`);
|
|
176
|
+
for (const q of dataset.queries) {
|
|
177
|
+
// Map original relevant IDs to saved IDs
|
|
178
|
+
const mappedRelevantIds = new Set(q.relevantIds.map((id) => idMapping.get(id)).filter((id) => id !== undefined));
|
|
179
|
+
const pipelineStart = Date.now();
|
|
180
|
+
// Embedding timing
|
|
181
|
+
const embedStart = Date.now();
|
|
182
|
+
const queryEmbedding = await getEmbedding(q.query);
|
|
183
|
+
embeddingTimes.push(Date.now() - embedStart);
|
|
184
|
+
// Search timing
|
|
185
|
+
const searchStart = Date.now();
|
|
186
|
+
const searchResults = await searchMemories(queryEmbedding, k * 2, 0.0);
|
|
187
|
+
searchTimes.push(Date.now() - searchStart);
|
|
188
|
+
pipelineTimes.push(Date.now() - pipelineStart);
|
|
189
|
+
// Convert to benchmark format
|
|
190
|
+
const benchmarkResults = searchResults.map((r) => ({
|
|
191
|
+
id: r.id,
|
|
192
|
+
score: r.similarity,
|
|
193
|
+
}));
|
|
194
|
+
queryResults.push({
|
|
195
|
+
results: benchmarkResults,
|
|
196
|
+
relevantIds: mappedRelevantIds,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Calculate metrics
|
|
200
|
+
const accuracy = calculateAccuracyMetrics(queryResults, k);
|
|
201
|
+
const latency = {
|
|
202
|
+
embedding: calculateLatencyStats(embeddingTimes),
|
|
203
|
+
search: calculateLatencyStats(searchTimes),
|
|
204
|
+
pipeline: calculateLatencyStats(pipelineTimes),
|
|
205
|
+
};
|
|
206
|
+
// Cleanup
|
|
207
|
+
for (const id of savedIds) {
|
|
208
|
+
await deleteMemory(id);
|
|
209
|
+
}
|
|
210
|
+
return { accuracy, latency };
|
|
211
|
+
}
|
|
212
|
+
// Available local models for benchmarking
|
|
213
|
+
export const LOCAL_MODELS = [
|
|
214
|
+
'Xenova/all-MiniLM-L6-v2', // 384d, fast, default
|
|
215
|
+
'Xenova/bge-small-en-v1.5', // 384d, better accuracy
|
|
216
|
+
'Xenova/bge-base-en-v1.5', // 768d, best local accuracy
|
|
217
|
+
'Xenova/bge-large-en-v1.5', // 1024d, highest quality
|
|
218
|
+
];
|
|
219
|
+
/**
|
|
220
|
+
* Run succ benchmarks (local + optionally OpenRouter)
|
|
221
|
+
*/
|
|
222
|
+
export async function benchmark(options = {}) {
|
|
223
|
+
const iterations = options.iterations || 10;
|
|
224
|
+
const k = options.k || 5;
|
|
225
|
+
const localModel = options.model || LOCAL_MODEL;
|
|
226
|
+
const datasetSize = options.size || 'small';
|
|
227
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
228
|
+
console.log(' SUCC BENCHMARK ');
|
|
229
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
230
|
+
const allModeResults = [];
|
|
231
|
+
// ============ LOCAL BENCHMARK ============
|
|
232
|
+
const modelShort = localModel.split('/').pop() || localModel;
|
|
233
|
+
console.log(`\n┌─────────────────────────────────────────────────────────────┐`);
|
|
234
|
+
console.log(`│ LOCAL EMBEDDINGS (${modelShort.padEnd(39)}) │`);
|
|
235
|
+
console.log(`└─────────────────────────────────────────────────────────────┘`);
|
|
236
|
+
setConfigOverride({
|
|
237
|
+
llm: { embeddings: { mode: 'local', model: localModel } },
|
|
238
|
+
});
|
|
239
|
+
cleanupEmbeddings(); // Reset pipeline
|
|
240
|
+
const localResults = await runModeBenchmark(iterations, 'local');
|
|
241
|
+
// Run advanced benchmark if requested
|
|
242
|
+
if (options.advanced) {
|
|
243
|
+
const { accuracy, latency } = await runAdvancedBenchmark(k, datasetSize);
|
|
244
|
+
localResults.advancedAccuracy = accuracy;
|
|
245
|
+
localResults.latency = latency;
|
|
246
|
+
}
|
|
247
|
+
allModeResults.push(localResults);
|
|
248
|
+
// ============ API BENCHMARK ============
|
|
249
|
+
if (hasApiKey()) {
|
|
250
|
+
console.log('\n┌─────────────────────────────────────────────────────────────┐');
|
|
251
|
+
console.log('│ API EMBEDDINGS (openai/text-embedding-3-small) │');
|
|
252
|
+
console.log('└─────────────────────────────────────────────────────────────┘');
|
|
253
|
+
const embCfg = getLLMTaskConfig('embeddings');
|
|
254
|
+
setConfigOverride({
|
|
255
|
+
llm: {
|
|
256
|
+
embeddings: { mode: 'api', model: 'openai/text-embedding-3-small' },
|
|
257
|
+
api_key: embCfg.api_key,
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
cleanupEmbeddings(); // Reset cache
|
|
261
|
+
const openrouterResults = await runModeBenchmark(iterations, 'api');
|
|
262
|
+
if (options.advanced) {
|
|
263
|
+
const { accuracy, latency } = await runAdvancedBenchmark(k, datasetSize);
|
|
264
|
+
openrouterResults.advancedAccuracy = accuracy;
|
|
265
|
+
openrouterResults.latency = latency;
|
|
266
|
+
}
|
|
267
|
+
allModeResults.push(openrouterResults);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
console.log('\n ⓘ OpenRouter benchmark skipped (no API key)');
|
|
271
|
+
console.log(' Set OPENROUTER_API_KEY env var or add llm.api_key to ~/.succ/config.json');
|
|
272
|
+
}
|
|
273
|
+
// Reset config override
|
|
274
|
+
setConfigOverride(null);
|
|
275
|
+
closeDb();
|
|
276
|
+
// ============ JSON OUTPUT ============
|
|
277
|
+
if (options.json) {
|
|
278
|
+
const jsonResults = allModeResults.map((mr) => ({
|
|
279
|
+
mode: mr.mode,
|
|
280
|
+
model: mr.model,
|
|
281
|
+
dimensions: mr.dimensions,
|
|
282
|
+
latency: mr.results.map((r) => ({
|
|
283
|
+
operation: r.name,
|
|
284
|
+
avgMs: r.avgMs,
|
|
285
|
+
minMs: r.minMs,
|
|
286
|
+
maxMs: r.maxMs,
|
|
287
|
+
opsPerSecond: r.opsPerSecond,
|
|
288
|
+
})),
|
|
289
|
+
accuracy: {
|
|
290
|
+
basic: {
|
|
291
|
+
correct: mr.accuracy.correct,
|
|
292
|
+
total: mr.accuracy.total,
|
|
293
|
+
percentage: mr.accuracy.accuracy,
|
|
294
|
+
},
|
|
295
|
+
advanced: mr.advancedAccuracy
|
|
296
|
+
? {
|
|
297
|
+
recallAtK: mr.advancedAccuracy.recallAtK,
|
|
298
|
+
precisionAtK: mr.advancedAccuracy.precisionAtK,
|
|
299
|
+
f1AtK: mr.advancedAccuracy.f1AtK,
|
|
300
|
+
k: mr.advancedAccuracy.k,
|
|
301
|
+
mrr: mr.advancedAccuracy.mrr,
|
|
302
|
+
ndcg: mr.advancedAccuracy.ndcg,
|
|
303
|
+
queryCount: mr.advancedAccuracy.queryCount,
|
|
304
|
+
queriesWithHits: mr.advancedAccuracy.queriesWithHits,
|
|
305
|
+
}
|
|
306
|
+
: null,
|
|
307
|
+
},
|
|
308
|
+
latencyStats: mr.latency
|
|
309
|
+
? {
|
|
310
|
+
embedding: mr.latency.embedding,
|
|
311
|
+
search: mr.latency.search,
|
|
312
|
+
pipeline: mr.latency.pipeline,
|
|
313
|
+
}
|
|
314
|
+
: null,
|
|
315
|
+
}));
|
|
316
|
+
console.log(JSON.stringify(jsonResults, null, 2));
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
// ============ SUMMARY ============
|
|
320
|
+
console.log('\n═══════════════════════════════════════════════════════════');
|
|
321
|
+
console.log(' SUMMARY ');
|
|
322
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
323
|
+
for (const modeResult of allModeResults) {
|
|
324
|
+
const dimStr = modeResult.dimensions ? `${modeResult.dimensions}d` : '?d';
|
|
325
|
+
console.log(`\n${modeResult.mode.toUpperCase()} (${modeResult.model}, ${dimStr}):`);
|
|
326
|
+
console.log('┌─────────────────────────┬──────────┬──────────┬──────────┐');
|
|
327
|
+
console.log('│ Operation │ Avg (ms) │ Min (ms) │ Max (ms) │');
|
|
328
|
+
console.log('├─────────────────────────┼──────────┼──────────┼──────────┤');
|
|
329
|
+
for (const r of modeResult.results) {
|
|
330
|
+
const name = r.name.padEnd(23);
|
|
331
|
+
const avg = r.avgMs.toFixed(1).padStart(8);
|
|
332
|
+
const min = r.minMs.toFixed(1).padStart(8);
|
|
333
|
+
const max = r.maxMs.toFixed(1).padStart(8);
|
|
334
|
+
console.log(`│ ${name} │ ${avg} │ ${min} │ ${max} │`);
|
|
335
|
+
}
|
|
336
|
+
console.log('└─────────────────────────┴──────────┴──────────┴──────────┘');
|
|
337
|
+
console.log(` Throughput: ${modeResult.results[0].opsPerSecond.toFixed(1)} embed/sec`);
|
|
338
|
+
console.log(` Basic Accuracy: ${modeResult.accuracy.accuracy.toFixed(0)}% (${modeResult.accuracy.correct}/${modeResult.accuracy.total})`);
|
|
339
|
+
// Show advanced metrics if available
|
|
340
|
+
if (modeResult.advancedAccuracy) {
|
|
341
|
+
console.log('\n Advanced IR Metrics:');
|
|
342
|
+
console.log(formatAccuracyMetrics(modeResult.advancedAccuracy));
|
|
343
|
+
}
|
|
344
|
+
if (modeResult.latency) {
|
|
345
|
+
console.log('\n Latency Statistics:');
|
|
346
|
+
console.log(formatLatencyMetrics(modeResult.latency));
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// ============ COMPARISON ============
|
|
350
|
+
if (allModeResults.length > 1) {
|
|
351
|
+
console.log('\n─────────────────────────────────────────────────────────────');
|
|
352
|
+
console.log('COMPARISON:');
|
|
353
|
+
const local = allModeResults[0];
|
|
354
|
+
const openrouter = allModeResults[1];
|
|
355
|
+
const localEmbed = local.results[0].avgMs;
|
|
356
|
+
const orEmbed = openrouter.results[0].avgMs;
|
|
357
|
+
const speedup = orEmbed / Math.max(localEmbed, 0.1);
|
|
358
|
+
console.log(` Local embedding: ${localEmbed.toFixed(1)}ms avg`);
|
|
359
|
+
console.log(` OpenRouter embedding: ${orEmbed.toFixed(1)}ms avg`);
|
|
360
|
+
console.log(` → Local is ${speedup.toFixed(1)}x faster (no network latency)`);
|
|
361
|
+
console.log(` → Both achieve ${local.accuracy.accuracy.toFixed(0)}% semantic accuracy`);
|
|
362
|
+
if (local.advancedAccuracy && openrouter.advancedAccuracy) {
|
|
363
|
+
console.log('\n Advanced Metrics Comparison:');
|
|
364
|
+
console.log(` Local MRR: ${(local.advancedAccuracy.mrr * 100).toFixed(1)}%`);
|
|
365
|
+
console.log(` OpenRouter MRR: ${(openrouter.advancedAccuracy.mrr * 100).toFixed(1)}%`);
|
|
366
|
+
console.log(` Local NDCG: ${(local.advancedAccuracy.ndcg * 100).toFixed(1)}%`);
|
|
367
|
+
console.log(` OpenRouter NDCG: ${(openrouter.advancedAccuracy.ndcg * 100).toFixed(1)}%`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
console.log('\nDatabase: SQLite (better-sqlite3)');
|
|
371
|
+
console.log();
|
|
372
|
+
}
|
|
373
|
+
function formatResult(name, times) {
|
|
374
|
+
const total = times.reduce((a, b) => a + b, 0);
|
|
375
|
+
return {
|
|
376
|
+
name,
|
|
377
|
+
operations: times.length,
|
|
378
|
+
totalMs: total,
|
|
379
|
+
avgMs: total / times.length,
|
|
380
|
+
minMs: Math.min(...times),
|
|
381
|
+
maxMs: Math.max(...times),
|
|
382
|
+
opsPerSecond: times.length > 0 && total > 0 ? (times.length / total) * 1000 : 0,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Run quick benchmark on existing memories (no test data insertion)
|
|
387
|
+
* Uses the actual project's memories for realistic performance measurement
|
|
388
|
+
*/
|
|
389
|
+
export async function benchmarkExisting(options = {}) {
|
|
390
|
+
const k = options.k || 5;
|
|
391
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
392
|
+
console.log(' SUCC BENCHMARK (Existing Data) ');
|
|
393
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
394
|
+
const stats = await getMemoryStats();
|
|
395
|
+
console.log(`\nMemories in database: ${stats.total_memories}`);
|
|
396
|
+
if (stats.total_memories === 0) {
|
|
397
|
+
console.log('\n No memories found. Use `succ remember` to add some first.');
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
// Sample queries for latency testing
|
|
401
|
+
const sampleQueries = [
|
|
402
|
+
'important decision about architecture',
|
|
403
|
+
'error handling implementation',
|
|
404
|
+
'configuration settings',
|
|
405
|
+
'authentication flow',
|
|
406
|
+
'database optimization',
|
|
407
|
+
];
|
|
408
|
+
const embeddingTimes = [];
|
|
409
|
+
const searchTimes = [];
|
|
410
|
+
const pipelineTimes = [];
|
|
411
|
+
console.log('\nRunning latency benchmark...');
|
|
412
|
+
for (const query of sampleQueries) {
|
|
413
|
+
for (let i = 0; i < 10; i++) {
|
|
414
|
+
const pipelineStart = Date.now();
|
|
415
|
+
const embedStart = Date.now();
|
|
416
|
+
const embedding = await getEmbedding(query + ` variation ${i}`);
|
|
417
|
+
embeddingTimes.push(Date.now() - embedStart);
|
|
418
|
+
const searchStart = Date.now();
|
|
419
|
+
await searchMemories(embedding, k, 0.3);
|
|
420
|
+
searchTimes.push(Date.now() - searchStart);
|
|
421
|
+
pipelineTimes.push(Date.now() - pipelineStart);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
const latency = {
|
|
425
|
+
embedding: calculateLatencyStats(embeddingTimes),
|
|
426
|
+
search: calculateLatencyStats(searchTimes),
|
|
427
|
+
pipeline: calculateLatencyStats(pipelineTimes),
|
|
428
|
+
};
|
|
429
|
+
if (options.json) {
|
|
430
|
+
console.log(JSON.stringify({
|
|
431
|
+
totalMemories: stats.total_memories,
|
|
432
|
+
latency: {
|
|
433
|
+
embedding: latency.embedding,
|
|
434
|
+
search: latency.search,
|
|
435
|
+
pipeline: latency.pipeline,
|
|
436
|
+
},
|
|
437
|
+
}, null, 2));
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
console.log('\n' + formatLatencyMetrics(latency));
|
|
441
|
+
const embeddingInfo = getEmbeddingInfo();
|
|
442
|
+
console.log(`\nModel: ${embeddingInfo.model} (${embeddingInfo.mode})`);
|
|
443
|
+
console.log(`Dimensions: ${embeddingInfo.dimensions || 'unknown'}`);
|
|
444
|
+
console.log(`Search limit: top ${k} results`);
|
|
445
|
+
console.log();
|
|
446
|
+
closeDb();
|
|
447
|
+
}
|
|
448
|
+
// ============================================================================
|
|
449
|
+
// Benchmark History Management
|
|
450
|
+
// ============================================================================
|
|
451
|
+
const BENCHMARK_HISTORY_VERSION = 1;
|
|
452
|
+
/**
|
|
453
|
+
* Get the path to the benchmark history file
|
|
454
|
+
*/
|
|
455
|
+
function getBenchmarkHistoryPath() {
|
|
456
|
+
const succDir = getSuccDir();
|
|
457
|
+
return path.join(succDir, 'benchmarks', 'history.json');
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Load benchmark history from disk
|
|
461
|
+
*/
|
|
462
|
+
export function loadBenchmarkHistory() {
|
|
463
|
+
const historyPath = getBenchmarkHistoryPath();
|
|
464
|
+
if (!fs.existsSync(historyPath)) {
|
|
465
|
+
return { version: BENCHMARK_HISTORY_VERSION, entries: [] };
|
|
466
|
+
}
|
|
467
|
+
try {
|
|
468
|
+
const content = fs.readFileSync(historyPath, 'utf-8');
|
|
469
|
+
const history = JSON.parse(content);
|
|
470
|
+
return history;
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
console.warn(' Warning: Could not load benchmark history, starting fresh');
|
|
474
|
+
return { version: BENCHMARK_HISTORY_VERSION, entries: [] };
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Save benchmark history to disk
|
|
479
|
+
*/
|
|
480
|
+
export function saveBenchmarkHistory(history) {
|
|
481
|
+
const historyPath = getBenchmarkHistoryPath();
|
|
482
|
+
const dir = path.dirname(historyPath);
|
|
483
|
+
if (!fs.existsSync(dir)) {
|
|
484
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
485
|
+
}
|
|
486
|
+
fs.writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Add a benchmark entry to history
|
|
490
|
+
*/
|
|
491
|
+
export function addBenchmarkToHistory(history, entry) {
|
|
492
|
+
const newEntry = {
|
|
493
|
+
...entry,
|
|
494
|
+
id: generateBenchmarkId(),
|
|
495
|
+
timestamp: new Date().toISOString(),
|
|
496
|
+
};
|
|
497
|
+
history.entries.push(newEntry);
|
|
498
|
+
// Keep only last 100 entries
|
|
499
|
+
if (history.entries.length > 100) {
|
|
500
|
+
history.entries = history.entries.slice(-100);
|
|
501
|
+
}
|
|
502
|
+
return newEntry;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Get the most recent benchmark entry matching criteria
|
|
506
|
+
*/
|
|
507
|
+
export function getLatestBenchmark(history, mode, model) {
|
|
508
|
+
const filtered = history.entries.filter((e) => {
|
|
509
|
+
if (mode && e.mode !== mode)
|
|
510
|
+
return false;
|
|
511
|
+
if (model && e.model !== model)
|
|
512
|
+
return false;
|
|
513
|
+
return true;
|
|
514
|
+
});
|
|
515
|
+
return filtered.length > 0 ? filtered[filtered.length - 1] : undefined;
|
|
516
|
+
}
|
|
517
|
+
// ============================================================================
|
|
518
|
+
// Hybrid Search Benchmark
|
|
519
|
+
// ============================================================================
|
|
520
|
+
/**
|
|
521
|
+
* Run hybrid search benchmark comparing semantic, BM25, and hybrid modes
|
|
522
|
+
*/
|
|
523
|
+
export async function runHybridBenchmark(k = 5, size = 'small') {
|
|
524
|
+
console.log(`\n Running hybrid search benchmark (${size} dataset)...`);
|
|
525
|
+
const dataset = generateTestDataset(size);
|
|
526
|
+
const savedIds = [];
|
|
527
|
+
// Insert test memories
|
|
528
|
+
console.log(` Inserting ${dataset.memories.length} test memories...`);
|
|
529
|
+
for (const mem of dataset.memories) {
|
|
530
|
+
const embedding = await getEmbedding(mem.content);
|
|
531
|
+
const result = await saveMemory(mem.content, embedding, mem.tags, 'benchmark-hybrid', {
|
|
532
|
+
deduplicate: false,
|
|
533
|
+
autoLink: false,
|
|
534
|
+
});
|
|
535
|
+
savedIds.push(result.id);
|
|
536
|
+
}
|
|
537
|
+
// Map original indices to saved IDs
|
|
538
|
+
const idMapping = new Map();
|
|
539
|
+
for (let i = 0; i < savedIds.length; i++) {
|
|
540
|
+
idMapping.set(i + 1, savedIds[i]);
|
|
541
|
+
}
|
|
542
|
+
// Collect results for all three modes
|
|
543
|
+
const semanticResults = [];
|
|
544
|
+
const bm25Results = [];
|
|
545
|
+
const hybridResults = [];
|
|
546
|
+
console.log(` Running ${dataset.queries.length} queries in 3 modes...`);
|
|
547
|
+
for (const q of dataset.queries) {
|
|
548
|
+
const mappedRelevantIds = new Set(q.relevantIds.map((id) => idMapping.get(id)).filter((id) => id !== undefined));
|
|
549
|
+
const queryEmbedding = await getEmbedding(q.query);
|
|
550
|
+
// Semantic-only search
|
|
551
|
+
const semanticSearch = await searchMemories(queryEmbedding, k * 2, 0.0);
|
|
552
|
+
semanticResults.push({
|
|
553
|
+
results: semanticSearch.map((r) => ({ id: r.id, score: r.similarity })),
|
|
554
|
+
relevantIds: mappedRelevantIds,
|
|
555
|
+
});
|
|
556
|
+
// Hybrid search (RRF fusion) - alpha=0.5 for balanced fusion
|
|
557
|
+
const hybridSearch = await hybridSearchMemories(q.query, queryEmbedding, k * 2, 0.0, 0.5);
|
|
558
|
+
hybridResults.push({
|
|
559
|
+
results: hybridSearch.map((r) => ({ id: r.id, score: r.similarity })),
|
|
560
|
+
relevantIds: mappedRelevantIds,
|
|
561
|
+
});
|
|
562
|
+
// BM25-only search (use hybrid with alpha=0.0 for pure BM25)
|
|
563
|
+
const bm25Search = await hybridSearchMemories(q.query, queryEmbedding, k * 2, 0.0, 0.0);
|
|
564
|
+
bm25Results.push({
|
|
565
|
+
results: bm25Search.map((r) => ({ id: r.id, score: r.similarity })),
|
|
566
|
+
relevantIds: mappedRelevantIds,
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
// Calculate metrics for each mode
|
|
570
|
+
const semanticMetrics = calculateAccuracyMetrics(semanticResults, k);
|
|
571
|
+
const bm25Metrics = calculateAccuracyMetrics(bm25Results, k);
|
|
572
|
+
const hybridMetrics = calculateAccuracyMetrics(hybridResults, k);
|
|
573
|
+
// Cleanup
|
|
574
|
+
for (const id of savedIds) {
|
|
575
|
+
await deleteMemory(id);
|
|
576
|
+
}
|
|
577
|
+
return compareHybridModes(semanticMetrics, bm25Metrics, hybridMetrics);
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Run benchmark with save and compare options
|
|
581
|
+
*/
|
|
582
|
+
export async function benchmarkWithHistory(options = {}) {
|
|
583
|
+
const k = options.k || 5;
|
|
584
|
+
const datasetSize = options.size || 'small';
|
|
585
|
+
const localModel = options.model || LOCAL_MODEL;
|
|
586
|
+
// Run the standard benchmark first
|
|
587
|
+
await benchmark(options);
|
|
588
|
+
// If hybrid mode requested, run hybrid comparison
|
|
589
|
+
if (options.hybrid && options.advanced) {
|
|
590
|
+
console.log('\n┌─────────────────────────────────────────────────────────────┐');
|
|
591
|
+
console.log('│ HYBRID SEARCH COMPARISON │');
|
|
592
|
+
console.log('└─────────────────────────────────────────────────────────────┘');
|
|
593
|
+
setConfigOverride({
|
|
594
|
+
llm: { embeddings: { mode: 'local', model: localModel } },
|
|
595
|
+
});
|
|
596
|
+
cleanupEmbeddings();
|
|
597
|
+
const hybridMetrics = await runHybridBenchmark(k, datasetSize);
|
|
598
|
+
console.log('\n' + formatHybridComparison(hybridMetrics));
|
|
599
|
+
setConfigOverride(null);
|
|
600
|
+
}
|
|
601
|
+
// Handle save/compare
|
|
602
|
+
if (options.save || options.compare) {
|
|
603
|
+
const history = loadBenchmarkHistory();
|
|
604
|
+
if (options.advanced) {
|
|
605
|
+
// We need to re-run to get metrics for saving
|
|
606
|
+
// For simplicity, assume the last run was with local embeddings
|
|
607
|
+
setConfigOverride({
|
|
608
|
+
llm: { embeddings: { mode: 'local', model: localModel } },
|
|
609
|
+
});
|
|
610
|
+
cleanupEmbeddings();
|
|
611
|
+
const { accuracy, latency } = await runAdvancedBenchmark(k, datasetSize);
|
|
612
|
+
if (options.compare) {
|
|
613
|
+
const latest = getLatestBenchmark(history, 'local', localModel);
|
|
614
|
+
if (latest) {
|
|
615
|
+
console.log('\n' + formatBenchmarkComparison(accuracy, latest.accuracy, latest.timestamp));
|
|
616
|
+
}
|
|
617
|
+
else {
|
|
618
|
+
console.log('\n No previous benchmark found for comparison.');
|
|
619
|
+
console.log(' Run with --save first to establish a baseline.');
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
if (options.save) {
|
|
623
|
+
const embeddingInfo = getEmbeddingInfo();
|
|
624
|
+
addBenchmarkToHistory(history, {
|
|
625
|
+
mode: embeddingInfo.mode,
|
|
626
|
+
model: embeddingInfo.model,
|
|
627
|
+
datasetSize,
|
|
628
|
+
searchMode: options.hybrid ? 'hybrid' : 'semantic',
|
|
629
|
+
accuracy,
|
|
630
|
+
latency,
|
|
631
|
+
config: {
|
|
632
|
+
embeddingModel: embeddingInfo.model,
|
|
633
|
+
embeddingMode: embeddingInfo.mode,
|
|
634
|
+
totalMemories: generateTestDataset(datasetSize).memories.length,
|
|
635
|
+
testQueries: generateTestDataset(datasetSize).queries.length,
|
|
636
|
+
},
|
|
637
|
+
});
|
|
638
|
+
saveBenchmarkHistory(history);
|
|
639
|
+
console.log(`\n ✓ Benchmark saved to history (${history.entries.length} total entries)`);
|
|
640
|
+
}
|
|
641
|
+
setConfigOverride(null);
|
|
642
|
+
}
|
|
643
|
+
else {
|
|
644
|
+
console.log('\n Note: --save and --compare require --advanced mode');
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
closeDb();
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* List benchmark history entries
|
|
651
|
+
*/
|
|
652
|
+
export async function listBenchmarkHistory(options = {}) {
|
|
653
|
+
const limit = options.limit || 10;
|
|
654
|
+
const history = loadBenchmarkHistory();
|
|
655
|
+
if (history.entries.length === 0) {
|
|
656
|
+
console.log('No benchmark history found.');
|
|
657
|
+
console.log('Run `succ benchmark --advanced --save` to start tracking.');
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
const entries = history.entries.slice(-limit).reverse();
|
|
661
|
+
if (options.json) {
|
|
662
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
666
|
+
console.log(' BENCHMARK HISTORY ');
|
|
667
|
+
console.log('═══════════════════════════════════════════════════════════\n');
|
|
668
|
+
console.log('┌────────────────────┬──────────┬──────────┬──────────┬──────────┐');
|
|
669
|
+
console.log('│ Timestamp │ Recall@K │ Prec@K │ F1@K │ MRR │');
|
|
670
|
+
console.log('├────────────────────┼──────────┼──────────┼──────────┼──────────┤');
|
|
671
|
+
for (const entry of entries) {
|
|
672
|
+
const ts = entry.timestamp.slice(0, 16).replace('T', ' ');
|
|
673
|
+
const recall = `${(entry.accuracy.recallAtK * 100).toFixed(1)}%`.padStart(8);
|
|
674
|
+
const precision = `${(entry.accuracy.precisionAtK * 100).toFixed(1)}%`.padStart(8);
|
|
675
|
+
const f1 = `${(entry.accuracy.f1AtK * 100).toFixed(1)}%`.padStart(8);
|
|
676
|
+
const mrr = `${(entry.accuracy.mrr * 100).toFixed(1)}%`.padStart(8);
|
|
677
|
+
console.log(`│ ${ts} │ ${recall} │ ${precision} │ ${f1} │ ${mrr} │`);
|
|
678
|
+
}
|
|
679
|
+
console.log('└────────────────────┴──────────┴──────────┴──────────┴──────────┘');
|
|
680
|
+
console.log(`\nShowing last ${entries.length} of ${history.entries.length} entries`);
|
|
681
|
+
}
|
|
682
|
+
//# sourceMappingURL=benchmark.js.map
|