toolnet-memory 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -28
- package/bin/toolnet-memory +55 -55
- package/bundle/agy.js +88 -0
- package/bundle/codex.js +92 -0
- package/bundle/context-runtime.js +56 -0
- package/bundle/context.js +62 -0
- package/bundle/doctor.js +3 -0
- package/bundle/full-index.js +8 -0
- package/bundle/learner.js +8 -0
- package/bundle/mcp.js +7 -0
- package/bundle/opencode.js +314 -0
- package/bundle/project-manual.js +54 -0
- package/bundle/setup.js +31 -0
- package/bundle/snapshot.js +4 -0
- package/bundle/work-continuity.js +12 -0
- package/package.json +9 -6
- package/dist/packages/cli/commands.js +0 -1
- package/dist/packages/cli/index.js +0 -1
- package/dist/packages/sdk/client.js +0 -78
- package/dist/packages/sdk/index.js +0 -1
- package/dist/packages/sdk/types.js +0 -1
- package/dist/src/api/index.js +0 -1
- package/dist/src/api/routes/health.js +0 -1
- package/dist/src/api/routes/index.js +0 -1
- package/dist/src/api/routes/memory.js +0 -1
- package/dist/src/api/routes/projects.js +0 -1
- package/dist/src/api/routes/search.js +0 -1
- package/dist/src/api/server.js +0 -1
- package/dist/src/capture/activity-capture.js +0 -21
- package/dist/src/capture/command-capture.js +0 -12
- package/dist/src/capture/error-capture.js +0 -14
- package/dist/src/capture/event-deduplicator.js +0 -28
- package/dist/src/capture/event-queue.js +0 -20
- package/dist/src/capture/file-capture.js +0 -23
- package/dist/src/capture/index.js +0 -8
- package/dist/src/capture/session-capture.js +0 -18
- package/dist/src/capture/tool-capture.js +0 -13
- package/dist/src/code-intelligence/analysis/analysis-engine.js +0 -26
- package/dist/src/code-intelligence/analysis/dead-code-analyzer.js +0 -127
- package/dist/src/code-intelligence/analysis/dependency-analyzer.js +0 -66
- package/dist/src/code-intelligence/analysis/index.js +0 -4
- package/dist/src/code-intelligence/analysis/types.js +0 -1
- package/dist/src/code-intelligence/architecture/architecture-engine.js +0 -48
- package/dist/src/code-intelligence/architecture/clusters.js +0 -322
- package/dist/src/code-intelligence/architecture/entry-points.js +0 -150
- package/dist/src/code-intelligence/architecture/hotspots.js +0 -136
- package/dist/src/code-intelligence/architecture/index.js +0 -6
- package/dist/src/code-intelligence/architecture/layers.js +0 -197
- package/dist/src/code-intelligence/architecture/types.js +0 -1
- package/dist/src/code-intelligence/chunks/index.js +0 -2
- package/dist/src/code-intelligence/chunks/smart-chunker.js +0 -125
- package/dist/src/code-intelligence/chunks/types.js +0 -1
- package/dist/src/code-intelligence/git/git-diff.js +0 -109
- package/dist/src/code-intelligence/git/index.js +0 -1
- package/dist/src/code-intelligence/graph/architecture.js +0 -26
- package/dist/src/code-intelligence/graph/graph-builder.js +0 -213
- package/dist/src/code-intelligence/graph/graph-store.js +0 -57
- package/dist/src/code-intelligence/graph/index.js +0 -1
- package/dist/src/code-intelligence/graph/relationships.js +0 -1
- package/dist/src/code-intelligence/graph/trace.js +0 -65
- package/dist/src/code-intelligence/impact/blast-radius.js +0 -160
- package/dist/src/code-intelligence/impact/change-mapper.js +0 -69
- package/dist/src/code-intelligence/impact/edit-tool-detector.js +0 -92
- package/dist/src/code-intelligence/impact/impact-analyzer.js +0 -60
- package/dist/src/code-intelligence/impact/impact-guard.js +0 -33
- package/dist/src/code-intelligence/impact/index.js +0 -5
- package/dist/src/code-intelligence/incremental/file-hash.js +0 -8
- package/dist/src/code-intelligence/incremental/incremental-indexer.js +0 -106
- package/dist/src/code-intelligence/incremental/manifest-builder.js +0 -19
- package/dist/src/code-intelligence/incremental/manifest.js +0 -31
- package/dist/src/code-intelligence/index.js +0 -23
- package/dist/src/code-intelligence/indexer/file-watcher.js +0 -1
- package/dist/src/code-intelligence/indexer/incremental-indexer.js +0 -1
- package/dist/src/code-intelligence/indexer/index.js +0 -1
- package/dist/src/code-intelligence/indexer/repository-indexer.js +0 -31
- package/dist/src/code-intelligence/indexer/repository-scanner.js +0 -50
- package/dist/src/code-intelligence/parsers/index.js +0 -1
- package/dist/src/code-intelligence/parsers/tree-sitter/index.js +0 -1
- package/dist/src/code-intelligence/parsers/tree-sitter/languages.js +0 -1
- package/dist/src/code-intelligence/parsers/tree-sitter/parser.js +0 -1
- package/dist/src/code-intelligence/parsers/typescript-parser.js +0 -190
- package/dist/src/code-intelligence/query/graph-query-engine.js +0 -275
- package/dist/src/code-intelligence/query/index.js +0 -2
- package/dist/src/code-intelligence/query/types.js +0 -1
- package/dist/src/code-intelligence/resolution/index.js +0 -2
- package/dist/src/code-intelligence/resolution/types.js +0 -1
- package/dist/src/code-intelligence/resolution/typescript-resolver.js +0 -316
- package/dist/src/code-intelligence/rich/index.js +0 -1
- package/dist/src/code-intelligence/rich/rich-graph-enricher.js +0 -463
- package/dist/src/code-intelligence/semantic/index.js +0 -2
- package/dist/src/code-intelligence/semantic/semantic-code-engine.js +0 -213
- package/dist/src/code-intelligence/semantic/source-priority.js +0 -22
- package/dist/src/code-intelligence/symbols/index.js +0 -1
- package/dist/src/code-intelligence/symbols/reference-resolver.js +0 -21
- package/dist/src/code-intelligence/symbols/symbol-extractor.js +0 -1
- package/dist/src/code-intelligence/test-analysis.js +0 -72
- package/dist/src/code-intelligence/test-architecture.js +0 -67
- package/dist/src/code-intelligence/test-impact.js +0 -47
- package/dist/src/code-intelligence/test-incremental.js +0 -24
- package/dist/src/code-intelligence/test-index.js +0 -39
- package/dist/src/code-intelligence/test-resolution.js +0 -54
- package/dist/src/code-intelligence/test-rich-graph.js +0 -48
- package/dist/src/code-intelligence/test-semantic.js +0 -57
- package/dist/src/code-intelligence/test-visualization.js +0 -36
- package/dist/src/code-intelligence/types.js +0 -1
- package/dist/src/code-intelligence/visualization/index.js +0 -2
- package/dist/src/code-intelligence/visualization/types.js +0 -1
- package/dist/src/code-intelligence/visualization/visualization-builder.js +0 -104
- package/dist/src/core/config.js +0 -66
- package/dist/src/core/global-env.js +0 -70
- package/dist/src/core/importance.js +0 -30
- package/dist/src/core/index.js +0 -5
- package/dist/src/core/memory-engine.js +0 -183
- package/dist/src/core/project-manager.js +0 -243
- package/dist/src/core/types.js +0 -1
- package/dist/src/embeddings/batch-embedder.js +0 -1
- package/dist/src/embeddings/cache.js +0 -1
- package/dist/src/embeddings/embedder.js +0 -51
- package/dist/src/embeddings/index.js +0 -4
- package/dist/src/embeddings/local.js +0 -37
- package/dist/src/embeddings/provider.js +0 -1
- package/dist/src/embeddings/remote.js +0 -76
- package/dist/src/embeddings/test-connection.js +0 -16
- package/dist/src/hooks/after-edit.js +0 -3
- package/dist/src/hooks/after-tool.js +0 -3
- package/dist/src/hooks/auto-context.js +0 -68
- package/dist/src/hooks/auto-impact-guard.js +0 -94
- package/dist/src/hooks/auto-retrieval.js +0 -27
- package/dist/src/hooks/before-agent.js +0 -18
- package/dist/src/hooks/before-compact.js +0 -3
- package/dist/src/hooks/before-edit.js +0 -20
- package/dist/src/hooks/index.js +0 -11
- package/dist/src/hooks/runtime.js +0 -110
- package/dist/src/hooks/session-end.js +0 -3
- package/dist/src/hooks/session-start.js +0 -3
- package/dist/src/index.js +0 -22
- package/dist/src/mcp/bootstrap.js +0 -68
- package/dist/src/mcp/context.js +0 -1
- package/dist/src/mcp/index.js +0 -3
- package/dist/src/mcp/server.js +0 -45
- package/dist/src/mcp/tools/analyze-impact.js +0 -41
- package/dist/src/mcp/tools/dead-code.js +0 -55
- package/dist/src/mcp/tools/find-callers.js +0 -24
- package/dist/src/mcp/tools/find-dependencies.js +0 -57
- package/dist/src/mcp/tools/find-symbol.js +0 -7
- package/dist/src/mcp/tools/get-architecture.js +0 -11
- package/dist/src/mcp/tools/graph-dependents.js +0 -24
- package/dist/src/mcp/tools/graph-neighborhood.js +0 -58
- package/dist/src/mcp/tools/graph-path.js +0 -43
- package/dist/src/mcp/tools/graph-query-utils.js +0 -32
- package/dist/src/mcp/tools/impact-guard.js +0 -34
- package/dist/src/mcp/tools/index-repository.js +0 -1
- package/dist/src/mcp/tools/index.js +0 -20
- package/dist/src/mcp/tools/memory-decisions.js +0 -1
- package/dist/src/mcp/tools/memory-forget.js +0 -14
- package/dist/src/mcp/tools/memory-recent.js +0 -1
- package/dist/src/mcp/tools/memory-remember.js +0 -33
- package/dist/src/mcp/tools/memory-rules.js +0 -1
- package/dist/src/mcp/tools/memory-search.js +0 -18
- package/dist/src/mcp/tools/memory-todos.js +0 -1
- package/dist/src/mcp/tools/project-context.js +0 -25
- package/dist/src/mcp/tools/search-code.js +0 -21
- package/dist/src/mcp/tools/semantic-code-search.js +0 -33
- package/dist/src/mcp/tools/snapshot-create.js +0 -13
- package/dist/src/mcp/tools/snapshot-list.js +0 -7
- package/dist/src/mcp/tools/snapshot-restore.js +0 -13
- package/dist/src/mcp/tools/trace-calls.js +0 -37
- package/dist/src/memory/activity.js +0 -5
- package/dist/src/memory/conflict-detector.js +0 -105
- package/dist/src/memory/consolidator.js +0 -104
- package/dist/src/memory/decay.js +0 -59
- package/dist/src/memory/decisions.js +0 -3
- package/dist/src/memory/deduplicate.js +0 -25
- package/dist/src/memory/index.js +0 -11
- package/dist/src/memory/maintenance.js +0 -16
- package/dist/src/memory/remember.js +0 -3
- package/dist/src/memory/rules.js +0 -3
- package/dist/src/memory/search.js +0 -3
- package/dist/src/memory/summaries.js +0 -1
- package/dist/src/memory/todos.js +0 -3
- package/dist/src/processor/decision-extractor.js +0 -13
- package/dist/src/processor/importance-scorer.js +0 -22
- package/dist/src/processor/index.js +0 -7
- package/dist/src/processor/memory-extractor.js +0 -59
- package/dist/src/processor/memory-processor.js +0 -105
- package/dist/src/processor/rule-extractor.js +0 -13
- package/dist/src/processor/summarizer.js +0 -71
- package/dist/src/processor/todo-extractor.js +0 -12
- package/dist/src/production/config-check.js +0 -34
- package/dist/src/production/doctor.js +0 -58
- package/dist/src/production/full-index.js +0 -114
- package/dist/src/production/health.js +0 -58
- package/dist/src/production/index-pipeline.js +0 -151
- package/dist/src/production/index.js +0 -4
- package/dist/src/production/project-lock.js +0 -95
- package/dist/src/production/project-status.js +0 -16
- package/dist/src/production/recovery.js +0 -15
- package/dist/src/production/setup.js +0 -219
- package/dist/src/production/snapshot-cli.js +0 -58
- package/dist/src/project-manual/cli.js +0 -77
- package/dist/src/project-manual/index.js +0 -2
- package/dist/src/project-manual/manager.js +0 -147
- package/dist/src/project-manual/types.js +0 -1
- package/dist/src/retrieval/bm25/index.js +0 -1
- package/dist/src/retrieval/bm25/search.js +0 -1
- package/dist/src/retrieval/bm25.js +0 -30
- package/dist/src/retrieval/context-budget.js +0 -1
- package/dist/src/retrieval/context-builder.js +0 -22
- package/dist/src/retrieval/graph/index.js +0 -1
- package/dist/src/retrieval/graph/search.js +0 -1
- package/dist/src/retrieval/hybrid/hybrid-search.js +0 -1
- package/dist/src/retrieval/hybrid/index.js +0 -1
- package/dist/src/retrieval/hybrid-search.js +0 -68
- package/dist/src/retrieval/importance.js +0 -16
- package/dist/src/retrieval/index.js +0 -12
- package/dist/src/retrieval/query-analyzer.js +0 -32
- package/dist/src/retrieval/query-classifier.js +0 -1
- package/dist/src/retrieval/query-expansion.js +0 -1
- package/dist/src/retrieval/recency.js +0 -12
- package/dist/src/retrieval/reranker/index.js +0 -1
- package/dist/src/retrieval/reranker/reranker.js +0 -1
- package/dist/src/retrieval/retrieval-engine.js +0 -17
- package/dist/src/retrieval/tokenizer.js +0 -9
- package/dist/src/retrieval/type-priority.js +0 -10
- package/dist/src/retrieval/types.js +0 -1
- package/dist/src/retrieval/vector/index.js +0 -4
- package/dist/src/retrieval/vector/metadata-filter.js +0 -1
- package/dist/src/retrieval/vector/persistence.js +0 -67
- package/dist/src/retrieval/vector/search.js +0 -12
- package/dist/src/retrieval/vector/test-persistence.js +0 -36
- package/dist/src/retrieval/vector/upsert.js +0 -40
- package/dist/src/retrieval/vector/vector-store.js +0 -89
- package/dist/src/retrieval/vector-hybrid-engine.js +0 -91
- package/dist/src/runtime/bootstrap.js +0 -28
- package/dist/src/runtime/graceful.js +0 -17
- package/dist/src/runtime/index.js +0 -3
- package/dist/src/runtime/toolnet-memory-runtime.js +0 -156
- package/dist/src/security/encryption.js +0 -1
- package/dist/src/security/file-filter.js +0 -30
- package/dist/src/security/index.js +0 -3
- package/dist/src/security/sanitizer.js +0 -49
- package/dist/src/security/secret-scanner.js +0 -56
- package/dist/src/session/agy/adapter.js +0 -159
- package/dist/src/session/agy/cli.js +0 -87
- package/dist/src/session/agy/hook-installer.js +0 -62
- package/dist/src/session/agy/hook.js +0 -167
- package/dist/src/session/agy/index.js +0 -5
- package/dist/src/session/agy/project-resolver.js +0 -27
- package/dist/src/session/agy/recovery.js +0 -112
- package/dist/src/session/agy/transcript.js +0 -191
- package/dist/src/session/codex/adapter.js +0 -138
- package/dist/src/session/codex/cli.js +0 -236
- package/dist/src/session/codex/context-hook-installer.js +0 -70
- package/dist/src/session/codex/context-hook.js +0 -69
- package/dist/src/session/codex/discovery.js +0 -138
- package/dist/src/session/codex/index.js +0 -6
- package/dist/src/session/codex/notify-installer.js +0 -135
- package/dist/src/session/codex/project-resolver.js +0 -25
- package/dist/src/session/codex/recovery.js +0 -27
- package/dist/src/session/codex/rollout.js +0 -186
- package/dist/src/session/core.js +0 -239
- package/dist/src/session/identity.js +0 -57
- package/dist/src/session/index.js +0 -9
- package/dist/src/session/learner/cli.js +0 -62
- package/dist/src/session/learner/extractor.js +0 -461
- package/dist/src/session/learner/index.js +0 -4
- package/dist/src/session/learner/journal.js +0 -159
- package/dist/src/session/learner/learner.js +0 -124
- package/dist/src/session/learner/types.js +0 -1
- package/dist/src/session/opencode/adapter.js +0 -553
- package/dist/src/session/opencode/cli.js +0 -121
- package/dist/src/session/opencode/index.js +0 -2
- package/dist/src/session/opencode/plugin-installer.js +0 -230
- package/dist/src/session/store.js +0 -242
- package/dist/src/session/types.js +0 -1
- package/dist/src/session/utils.js +0 -47
- package/dist/src/session/wal.js +0 -303
- package/dist/src/snapshot/index.js +0 -2
- package/dist/src/snapshot/manager.js +0 -130
- package/dist/src/snapshot/test-snapshot.js +0 -28
- package/dist/src/snapshot/types.js +0 -1
- package/dist/src/storage/architecture-store.js +0 -37
- package/dist/src/storage/cleanup-health.js +0 -20
- package/dist/src/storage/code-analysis-store.js +0 -35
- package/dist/src/storage/code-chunk-store.js +0 -25
- package/dist/src/storage/code-graph-store.js +0 -24
- package/dist/src/storage/code-manifest-store.js +0 -24
- package/dist/src/storage/code-vector-store.js +0 -25
- package/dist/src/storage/github/client.js +0 -1
- package/dist/src/storage/github/index.js +0 -1
- package/dist/src/storage/google-drive/client.js +0 -1
- package/dist/src/storage/google-drive/index.js +0 -1
- package/dist/src/storage/huggingface/client.js +0 -116
- package/dist/src/storage/huggingface/index.js +0 -1
- package/dist/src/storage/index.js +0 -16
- package/dist/src/storage/list-bucket-raw.js +0 -14
- package/dist/src/storage/list-bucket-tree.js +0 -38
- package/dist/src/storage/local/client.js +0 -99
- package/dist/src/storage/local/index.js +0 -1
- package/dist/src/storage/memory-store.js +0 -30
- package/dist/src/storage/project/cleanup-layout-v1.js +0 -72
- package/dist/src/storage/project/folder.js +0 -15
- package/dist/src/storage/project/index.js +0 -3
- package/dist/src/storage/project/layout.js +0 -74
- package/dist/src/storage/project/migrate-layout-v2.js +0 -101
- package/dist/src/storage/project/migrate.js +0 -73
- package/dist/src/storage/project/scoped-provider.js +0 -165
- package/dist/src/storage/provider.js +0 -26
- package/dist/src/storage/retrying-provider.js +0 -23
- package/dist/src/storage/test-connection.js +0 -32
- package/dist/src/storage/type-resolution-store.js +0 -26
- package/dist/src/storage/types.js +0 -1
- package/dist/src/storage/vector-store.js +0 -30
- package/dist/src/storage/visualization-store.js +0 -25
- package/dist/src/sync/compressor.js +0 -1
- package/dist/src/sync/conflict-resolver.js +0 -1
- package/dist/src/sync/downloader.js +0 -1
- package/dist/src/sync/index.js +0 -1
- package/dist/src/sync/sync-engine.js +0 -1
- package/dist/src/sync/upload-queue.js +0 -1
- package/dist/src/utils/retry.js +0 -29
- package/dist/src/visualization/server.js +0 -270
- package/dist/src/work-continuity/brief-cache.js +0 -107
- package/dist/src/work-continuity/brief.js +0 -349
- package/dist/src/work-continuity/cli.js +0 -96
- package/dist/src/work-continuity/context-cli.js +0 -106
- package/dist/src/work-continuity/context-runtime-cli.js +0 -88
- package/dist/src/work-continuity/extractor.js +0 -339
- package/dist/src/work-continuity/handoff.js +0 -185
- package/dist/src/work-continuity/index.js +0 -14
- package/dist/src/work-continuity/injection.js +0 -84
- package/dist/src/work-continuity/journal.js +0 -49
- package/dist/src/work-continuity/learner.js +0 -127
- package/dist/src/work-continuity/reducer.js +0 -316
- package/dist/src/work-continuity/semantic-extractor.js +0 -360
- package/dist/src/work-continuity/semantic-journal.js +0 -55
- package/dist/src/work-continuity/semantic-learner.js +0 -125
- package/dist/src/work-continuity/semantic-reducer.js +0 -268
- package/dist/src/work-continuity/semantic-types.js +0 -1
- package/dist/src/work-continuity/types.js +0 -1
- package/dist/visualization/public/index.html +0 -2896
- package/dist/visualization/public/vendor/3d-force-graph.min.js +0 -5
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export class QueryAnalyzer {
|
|
2
|
-
analyze(query) {
|
|
3
|
-
const text = query.toLowerCase();
|
|
4
|
-
const preferredTypes = [];
|
|
5
|
-
if (text.includes("quyết định") ||
|
|
6
|
-
text.includes("decision") ||
|
|
7
|
-
text.includes("đã chọn")) {
|
|
8
|
-
preferredTypes.push("decision");
|
|
9
|
-
}
|
|
10
|
-
if (text.includes("todo") ||
|
|
11
|
-
text.includes("cần làm") ||
|
|
12
|
-
text.includes("tiếp theo") ||
|
|
13
|
-
text.includes("chưa xong")) {
|
|
14
|
-
preferredTypes.push("todo");
|
|
15
|
-
}
|
|
16
|
-
if (text.includes("quy tắc") ||
|
|
17
|
-
text.includes("rule") ||
|
|
18
|
-
text.includes("không được") ||
|
|
19
|
-
text.includes("bắt buộc")) {
|
|
20
|
-
preferredTypes.push("rule");
|
|
21
|
-
}
|
|
22
|
-
if (text.includes("tóm tắt") ||
|
|
23
|
-
text.includes("summary") ||
|
|
24
|
-
text.includes("đã làm")) {
|
|
25
|
-
preferredTypes.push("summary");
|
|
26
|
-
}
|
|
27
|
-
return {
|
|
28
|
-
query,
|
|
29
|
-
preferredTypes,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export function recencyScore(memory, now = Date.now()) {
|
|
2
|
-
const raw = memory.updatedAt ??
|
|
3
|
-
memory.createdAt;
|
|
4
|
-
const timestamp = new Date(raw).getTime();
|
|
5
|
-
if (!Number.isFinite(timestamp)) {
|
|
6
|
-
return 0;
|
|
7
|
-
}
|
|
8
|
-
const ageDays = Math.max(0, now - timestamp) /
|
|
9
|
-
86_400_000;
|
|
10
|
-
// ~50% score sau 30 ngày
|
|
11
|
-
return Math.exp((-Math.LN2 * ageDays) / 30);
|
|
12
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { HybridSearch, } from "./hybrid-search.js";
|
|
2
|
-
import { ContextBuilder, } from "./context-builder.js";
|
|
3
|
-
export class RetrievalEngine {
|
|
4
|
-
memory;
|
|
5
|
-
searcher = new HybridSearch();
|
|
6
|
-
contextBuilder = new ContextBuilder();
|
|
7
|
-
constructor(memory) {
|
|
8
|
-
this.memory = memory;
|
|
9
|
-
}
|
|
10
|
-
search(projectId, query, options = {}) {
|
|
11
|
-
return this.searcher.search(query, this.memory.list(projectId), options);
|
|
12
|
-
}
|
|
13
|
-
context(projectId, query, options = {}) {
|
|
14
|
-
const results = this.search(projectId, query, options);
|
|
15
|
-
return this.contextBuilder.build(results);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { VectorIndexer, } from "./upsert.js";
|
|
2
|
-
export class VectorPersistenceManager {
|
|
3
|
-
projectId;
|
|
4
|
-
model;
|
|
5
|
-
embeddings;
|
|
6
|
-
store;
|
|
7
|
-
persistence;
|
|
8
|
-
constructor(projectId, model, embeddings, store, persistence) {
|
|
9
|
-
this.projectId = projectId;
|
|
10
|
-
this.model = model;
|
|
11
|
-
this.embeddings = embeddings;
|
|
12
|
-
this.store = store;
|
|
13
|
-
this.persistence = persistence;
|
|
14
|
-
}
|
|
15
|
-
async initialize(memories) {
|
|
16
|
-
let loaded = 0;
|
|
17
|
-
const snapshot = await this.persistence.load(this.projectId);
|
|
18
|
-
if (snapshot &&
|
|
19
|
-
snapshot.model ===
|
|
20
|
-
this.model) {
|
|
21
|
-
loaded =
|
|
22
|
-
this.store.importRecords(snapshot.records);
|
|
23
|
-
}
|
|
24
|
-
/*
|
|
25
|
-
* Xóa vector không còn memory tương ứng.
|
|
26
|
-
*/
|
|
27
|
-
const validIds = new Set(memories.map((memory) => memory.id));
|
|
28
|
-
let removed = 0;
|
|
29
|
-
for (const record of this.store.exportProject(this.projectId)) {
|
|
30
|
-
if (!validIds.has(record.id)) {
|
|
31
|
-
if (this.store.remove(record.id)) {
|
|
32
|
-
removed++;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const indexer = new VectorIndexer(this.embeddings, this.store);
|
|
37
|
-
const indexed = await indexer.index(memories);
|
|
38
|
-
const records = this.store.exportProject(this.projectId);
|
|
39
|
-
const dimensions = records[0]
|
|
40
|
-
?.vector.length ??
|
|
41
|
-
this.embeddings
|
|
42
|
-
.dimensions ??
|
|
43
|
-
0;
|
|
44
|
-
let saved = false;
|
|
45
|
-
if (indexed > 0 ||
|
|
46
|
-
removed > 0 ||
|
|
47
|
-
!snapshot) {
|
|
48
|
-
await this.persistence.save({
|
|
49
|
-
version: 1,
|
|
50
|
-
projectId: this.projectId,
|
|
51
|
-
model: this.model,
|
|
52
|
-
dimensions,
|
|
53
|
-
updatedAt: new Date()
|
|
54
|
-
.toISOString(),
|
|
55
|
-
records,
|
|
56
|
-
});
|
|
57
|
-
saved = true;
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
loaded,
|
|
61
|
-
indexed,
|
|
62
|
-
removed,
|
|
63
|
-
total: records.length,
|
|
64
|
-
saved,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export class VectorSearch {
|
|
2
|
-
embeddings;
|
|
3
|
-
store;
|
|
4
|
-
constructor(embeddings, store) {
|
|
5
|
-
this.embeddings = embeddings;
|
|
6
|
-
this.store = store;
|
|
7
|
-
}
|
|
8
|
-
async search(projectId, query, limit = 10) {
|
|
9
|
-
const vector = await this.embeddings.embed(query);
|
|
10
|
-
return this.store.search(projectId, vector, limit);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import "dotenv/config";
|
|
2
|
-
import { MemoryEngine, ProjectManager, loadConfig, } from "../../core/index.js";
|
|
3
|
-
import { createEmbeddingProvider, } from "../../embeddings/index.js";
|
|
4
|
-
import { createStorageProvider, MemoryStore, PersistentVectorStore, ProjectScopedStorageProvider, } from "../../storage/index.js";
|
|
5
|
-
import { VectorPersistenceManager, VectorStore, } from "./index.js";
|
|
6
|
-
async function main() {
|
|
7
|
-
const config = loadConfig();
|
|
8
|
-
const project = new ProjectManager()
|
|
9
|
-
.detect();
|
|
10
|
-
const memory = new MemoryEngine();
|
|
11
|
-
const rawStorage = createStorageProvider({
|
|
12
|
-
provider: config.storage.provider,
|
|
13
|
-
huggingface: config.storage.huggingface,
|
|
14
|
-
localRoot: config.storage.localRoot,
|
|
15
|
-
});
|
|
16
|
-
const storage = new ProjectScopedStorageProvider(rawStorage, project.id, project.name, project.remote ?? project.name);
|
|
17
|
-
const memoryStore = new MemoryStore(storage);
|
|
18
|
-
memory.importRecords(await memoryStore.load(project.id));
|
|
19
|
-
const embeddings = createEmbeddingProvider();
|
|
20
|
-
const vectors = new VectorStore();
|
|
21
|
-
const persistence = new PersistentVectorStore(storage);
|
|
22
|
-
const model = process.env
|
|
23
|
-
.HF_EMBEDDING_MODEL ??
|
|
24
|
-
"sentence-transformers/all-MiniLM-L6-v2";
|
|
25
|
-
const manager = new VectorPersistenceManager(project.id, model, embeddings, vectors, persistence);
|
|
26
|
-
const stats = await manager.initialize(memory.list(project.id));
|
|
27
|
-
console.log({
|
|
28
|
-
ok: true,
|
|
29
|
-
memories: memory.list(project.id).length,
|
|
30
|
-
...stats,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
main().catch((error) => {
|
|
34
|
-
console.error(error);
|
|
35
|
-
process.exit(1);
|
|
36
|
-
});
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export class VectorIndexer {
|
|
2
|
-
embeddings;
|
|
3
|
-
store;
|
|
4
|
-
constructor(embeddings, store) {
|
|
5
|
-
this.embeddings = embeddings;
|
|
6
|
-
this.store = store;
|
|
7
|
-
}
|
|
8
|
-
async index(memories) {
|
|
9
|
-
const pending = memories.filter((memory) => !this.store.has(memory.id));
|
|
10
|
-
if (pending.length === 0) {
|
|
11
|
-
return 0;
|
|
12
|
-
}
|
|
13
|
-
const vectors = await this.embeddings
|
|
14
|
-
.embedMany(pending.map((memory) => [
|
|
15
|
-
memory.type,
|
|
16
|
-
memory.content,
|
|
17
|
-
...(memory.tags ?? []),
|
|
18
|
-
].join(" ")));
|
|
19
|
-
let indexed = 0;
|
|
20
|
-
for (let i = 0; i < pending.length; i++) {
|
|
21
|
-
const memory = pending[i];
|
|
22
|
-
const vector = vectors[i];
|
|
23
|
-
if (!memory ||
|
|
24
|
-
!vector) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
this.store.upsert({
|
|
28
|
-
id: memory.id,
|
|
29
|
-
projectId: memory.projectId,
|
|
30
|
-
vector,
|
|
31
|
-
metadata: {
|
|
32
|
-
type: memory.type,
|
|
33
|
-
updatedAt: memory.updatedAt,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
indexed++;
|
|
37
|
-
}
|
|
38
|
-
return indexed;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
export class VectorStore {
|
|
2
|
-
records = new Map();
|
|
3
|
-
upsert(record) {
|
|
4
|
-
this.records.set(record.id, record);
|
|
5
|
-
}
|
|
6
|
-
get(id) {
|
|
7
|
-
return this.records.get(id);
|
|
8
|
-
}
|
|
9
|
-
has(id) {
|
|
10
|
-
return this.records.has(id);
|
|
11
|
-
}
|
|
12
|
-
remove(id) {
|
|
13
|
-
return this.records.delete(id);
|
|
14
|
-
}
|
|
15
|
-
clearProject(projectId) {
|
|
16
|
-
let deleted = 0;
|
|
17
|
-
for (const [id, record] of this.records) {
|
|
18
|
-
if (record.projectId ===
|
|
19
|
-
projectId) {
|
|
20
|
-
this.records.delete(id);
|
|
21
|
-
deleted++;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return deleted;
|
|
25
|
-
}
|
|
26
|
-
exportProject(projectId) {
|
|
27
|
-
return [...this.records.values()]
|
|
28
|
-
.filter((record) => record.projectId ===
|
|
29
|
-
projectId);
|
|
30
|
-
}
|
|
31
|
-
importRecords(records) {
|
|
32
|
-
let imported = 0;
|
|
33
|
-
for (const record of records) {
|
|
34
|
-
if (!record?.id ||
|
|
35
|
-
!record?.projectId ||
|
|
36
|
-
!Array.isArray(record.vector)) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
this.records.set(record.id, record);
|
|
40
|
-
imported++;
|
|
41
|
-
}
|
|
42
|
-
return imported;
|
|
43
|
-
}
|
|
44
|
-
search(projectId, queryVector, limit = 10) {
|
|
45
|
-
const results = [];
|
|
46
|
-
for (const record of this.records.values()) {
|
|
47
|
-
if (record.projectId !==
|
|
48
|
-
projectId) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
const score = cosineSimilarity(queryVector, record.vector);
|
|
52
|
-
results.push({
|
|
53
|
-
id: record.id,
|
|
54
|
-
score,
|
|
55
|
-
metadata: record.metadata,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
return results
|
|
59
|
-
.sort((a, b) => b.score - a.score)
|
|
60
|
-
.slice(0, limit);
|
|
61
|
-
}
|
|
62
|
-
size() {
|
|
63
|
-
return this.records.size;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
export function cosineSimilarity(a, b) {
|
|
67
|
-
if (a.length === 0 ||
|
|
68
|
-
b.length === 0 ||
|
|
69
|
-
a.length !== b.length) {
|
|
70
|
-
return 0;
|
|
71
|
-
}
|
|
72
|
-
let dot = 0;
|
|
73
|
-
let normA = 0;
|
|
74
|
-
let normB = 0;
|
|
75
|
-
for (let i = 0; i < a.length; i++) {
|
|
76
|
-
const av = a[i] ?? 0;
|
|
77
|
-
const bv = b[i] ?? 0;
|
|
78
|
-
dot += av * bv;
|
|
79
|
-
normA += av * av;
|
|
80
|
-
normB += bv * bv;
|
|
81
|
-
}
|
|
82
|
-
if (normA === 0 ||
|
|
83
|
-
normB === 0) {
|
|
84
|
-
return 0;
|
|
85
|
-
}
|
|
86
|
-
return (dot /
|
|
87
|
-
(Math.sqrt(normA) *
|
|
88
|
-
Math.sqrt(normB)));
|
|
89
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { HybridSearch, } from "./hybrid-search.js";
|
|
2
|
-
import { ContextBuilder, } from "./context-builder.js";
|
|
3
|
-
import { VectorIndexer, } from "./vector/upsert.js";
|
|
4
|
-
import { VectorSearch, } from "./vector/search.js";
|
|
5
|
-
import { VectorStore, } from "./vector/vector-store.js";
|
|
6
|
-
export class VectorHybridEngine {
|
|
7
|
-
memory;
|
|
8
|
-
lexical = new HybridSearch();
|
|
9
|
-
contextBuilder = new ContextBuilder();
|
|
10
|
-
store;
|
|
11
|
-
indexer;
|
|
12
|
-
vectorSearch;
|
|
13
|
-
constructor(memory, embeddings, store = new VectorStore()) {
|
|
14
|
-
this.memory = memory;
|
|
15
|
-
this.store =
|
|
16
|
-
store;
|
|
17
|
-
this.indexer =
|
|
18
|
-
new VectorIndexer(embeddings, this.store);
|
|
19
|
-
this.vectorSearch =
|
|
20
|
-
new VectorSearch(embeddings, this.store);
|
|
21
|
-
}
|
|
22
|
-
async rebuild(projectId) {
|
|
23
|
-
this.store.clearProject(projectId);
|
|
24
|
-
return this.indexer.index(this.memory.list(projectId));
|
|
25
|
-
}
|
|
26
|
-
async search(projectId, query, topK = 8) {
|
|
27
|
-
const memories = this.memory.list(projectId);
|
|
28
|
-
const byId = new Map(memories.map((memory) => [
|
|
29
|
-
memory.id,
|
|
30
|
-
memory,
|
|
31
|
-
]));
|
|
32
|
-
const lexicalResults = this.lexical.search(query, memories, {
|
|
33
|
-
topK: Math.max(topK * 3, 20),
|
|
34
|
-
});
|
|
35
|
-
const vectorResults = await this.vectorSearch.search(projectId, query, Math.max(topK * 3, 20));
|
|
36
|
-
const merged = new Map();
|
|
37
|
-
for (const result of lexicalResults) {
|
|
38
|
-
merged.set(result.memory.id, {
|
|
39
|
-
lexicalScore: result.score,
|
|
40
|
-
vectorScore: 0,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
for (const result of vectorResults) {
|
|
44
|
-
const current = merged.get(result.id) ?? {
|
|
45
|
-
lexicalScore: 0,
|
|
46
|
-
vectorScore: 0,
|
|
47
|
-
};
|
|
48
|
-
current.vectorScore =
|
|
49
|
-
Math.max(0, result.score);
|
|
50
|
-
merged.set(result.id, current);
|
|
51
|
-
}
|
|
52
|
-
const results = [];
|
|
53
|
-
for (const [id, scores] of merged) {
|
|
54
|
-
const memory = byId.get(id);
|
|
55
|
-
if (!memory) {
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
/*
|
|
59
|
-
* Hybrid:
|
|
60
|
-
* lexical/relevance 55%
|
|
61
|
-
* vector semantic 45%
|
|
62
|
-
*/
|
|
63
|
-
const score = scores.lexicalScore *
|
|
64
|
-
0.55 +
|
|
65
|
-
scores.vectorScore *
|
|
66
|
-
0.45;
|
|
67
|
-
results.push({
|
|
68
|
-
memory,
|
|
69
|
-
score,
|
|
70
|
-
lexicalScore: scores.lexicalScore,
|
|
71
|
-
vectorScore: scores.vectorScore,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
return results
|
|
75
|
-
.sort((a, b) => b.score - a.score)
|
|
76
|
-
.slice(0, topK);
|
|
77
|
-
}
|
|
78
|
-
async context(projectId, query, topK = 5) {
|
|
79
|
-
const results = await this.search(projectId, query, topK);
|
|
80
|
-
return this.contextBuilder.build(results.map((result) => ({
|
|
81
|
-
memory: result.memory,
|
|
82
|
-
score: result.score,
|
|
83
|
-
scores: {
|
|
84
|
-
keyword: result.lexicalScore,
|
|
85
|
-
recency: 0,
|
|
86
|
-
importance: 0,
|
|
87
|
-
type: result.vectorScore,
|
|
88
|
-
},
|
|
89
|
-
})));
|
|
90
|
-
}
|
|
91
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import "dotenv/config";
|
|
2
|
-
import { loadConfig, ProjectManager, } from "../core/index.js";
|
|
3
|
-
import { createStorageProvider, withStorageRetry, ProjectScopedStorageProvider, } from "../storage/index.js";
|
|
4
|
-
import { ToolNetMemoryRuntime, } from "./toolnet-memory-runtime.js";
|
|
5
|
-
export function createToolNetMemoryRuntime(rootPath = process.cwd()) {
|
|
6
|
-
const config = loadConfig();
|
|
7
|
-
const project = new ProjectManager()
|
|
8
|
-
.detect(rootPath);
|
|
9
|
-
const rawStorage = createStorageProvider({
|
|
10
|
-
provider: config.storage.provider,
|
|
11
|
-
huggingface: config.storage.huggingface,
|
|
12
|
-
localRoot: config.storage.localRoot,
|
|
13
|
-
});
|
|
14
|
-
const retryStorage = withStorageRetry(rawStorage, {
|
|
15
|
-
attempts: Number(process.env
|
|
16
|
-
.TOOLNET_STORAGE_RETRIES ??
|
|
17
|
-
3),
|
|
18
|
-
});
|
|
19
|
-
const storage = new ProjectScopedStorageProvider(retryStorage, project.id, project.name, project.remote ?? project.name);
|
|
20
|
-
const embeddingModel = process.env
|
|
21
|
-
.HF_EMBEDDING_MODEL ??
|
|
22
|
-
"sentence-transformers/all-MiniLM-L6-v2";
|
|
23
|
-
return new ToolNetMemoryRuntime({
|
|
24
|
-
project,
|
|
25
|
-
storage,
|
|
26
|
-
embeddingModel,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export function registerGracefulShutdown(runtime) {
|
|
2
|
-
let stopping = false;
|
|
3
|
-
const stop = async () => {
|
|
4
|
-
if (stopping) {
|
|
5
|
-
return;
|
|
6
|
-
}
|
|
7
|
-
stopping = true;
|
|
8
|
-
try {
|
|
9
|
-
await runtime.stop();
|
|
10
|
-
}
|
|
11
|
-
finally {
|
|
12
|
-
process.exit(0);
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
process.once("SIGINT", stop);
|
|
16
|
-
process.once("SIGTERM", stop);
|
|
17
|
-
}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { MemoryEngine, } from "../core/memory-engine.js";
|
|
2
|
-
import { MemoryMaintenance, } from "../memory/maintenance.js";
|
|
3
|
-
import { MemoryConsolidator, } from "../memory/consolidator.js";
|
|
4
|
-
import { RetrievalEngine, } from "../retrieval/retrieval-engine.js";
|
|
5
|
-
import { createEmbeddingProvider, } from "../embeddings/index.js";
|
|
6
|
-
import { CodeGraphStore, ReferenceResolver, } from "../code-intelligence/index.js";
|
|
7
|
-
import { IncrementalRepositoryIndexer, } from "../code-intelligence/incremental/incremental-indexer.js";
|
|
8
|
-
import { ImpactGuard, } from "../code-intelligence/impact/impact-guard.js";
|
|
9
|
-
import { VectorStore, VectorPersistenceManager, } from "../retrieval/vector/index.js";
|
|
10
|
-
import { HookRuntime, AutoContextBuilder, AutoRetrieval, AutoImpactGuard, } from "../hooks/index.js";
|
|
11
|
-
import { MemoryStore, PersistentCodeGraphStore, PersistentVectorStore, } from "../storage/index.js";
|
|
12
|
-
import { reconcileSessionMemoryJournal, } from "../session/learner/index.js";
|
|
13
|
-
import { SnapshotManager, } from "../snapshot/index.js";
|
|
14
|
-
import { ProjectLock, } from "../production/project-lock.js";
|
|
15
|
-
export class ToolNetMemoryRuntime {
|
|
16
|
-
options;
|
|
17
|
-
memory = new MemoryEngine();
|
|
18
|
-
graph = new CodeGraphStore();
|
|
19
|
-
vectors = new VectorStore();
|
|
20
|
-
retrieval;
|
|
21
|
-
references;
|
|
22
|
-
hooks;
|
|
23
|
-
autoRetrieval;
|
|
24
|
-
impactGuard;
|
|
25
|
-
autoImpactGuard;
|
|
26
|
-
memoryStore;
|
|
27
|
-
graphStore;
|
|
28
|
-
vectorStore;
|
|
29
|
-
processLock;
|
|
30
|
-
constructor(options) {
|
|
31
|
-
this.options = options;
|
|
32
|
-
this.memoryStore =
|
|
33
|
-
new MemoryStore(options.storage);
|
|
34
|
-
this.graphStore =
|
|
35
|
-
new PersistentCodeGraphStore(options.storage);
|
|
36
|
-
this.vectorStore =
|
|
37
|
-
new PersistentVectorStore(options.storage);
|
|
38
|
-
this.processLock =
|
|
39
|
-
new ProjectLock(options.project.id);
|
|
40
|
-
this.retrieval =
|
|
41
|
-
new RetrievalEngine(this.memory);
|
|
42
|
-
this.references =
|
|
43
|
-
new ReferenceResolver(this.graph);
|
|
44
|
-
this.hooks =
|
|
45
|
-
new HookRuntime({
|
|
46
|
-
projectId: options.project.id,
|
|
47
|
-
memory: this.memory,
|
|
48
|
-
memoryStore: this.memoryStore,
|
|
49
|
-
maxEventsBeforeFlush: 100,
|
|
50
|
-
});
|
|
51
|
-
const contextBuilder = new AutoContextBuilder(this.memory, this.retrieval, this.graph);
|
|
52
|
-
this.autoRetrieval =
|
|
53
|
-
new AutoRetrieval(this.hooks, contextBuilder, options.project.id);
|
|
54
|
-
this.impactGuard =
|
|
55
|
-
new ImpactGuard(this.graph);
|
|
56
|
-
this.autoImpactGuard =
|
|
57
|
-
new AutoImpactGuard(this.impactGuard, options.project.id);
|
|
58
|
-
}
|
|
59
|
-
async start() {
|
|
60
|
-
const { project, } = this.options;
|
|
61
|
-
await this.processLock
|
|
62
|
-
.acquire();
|
|
63
|
-
/*
|
|
64
|
-
* Session learners write immutable claims only.
|
|
65
|
-
* Reconcile them into current memory before runtime load.
|
|
66
|
-
*/
|
|
67
|
-
await reconcileSessionMemoryJournal(project, this.options.storage);
|
|
68
|
-
// Load persistent memory.
|
|
69
|
-
const memories = await this.memoryStore.load(project.id);
|
|
70
|
-
this.memory.importRecords(memories);
|
|
71
|
-
const maintenance = new MemoryMaintenance(this.memory);
|
|
72
|
-
const maintenanceStats = maintenance.run(project.id);
|
|
73
|
-
if (maintenanceStats.expiredRemoved > 0 ||
|
|
74
|
-
maintenanceStats.supersededRemoved > 0) {
|
|
75
|
-
await this.memoryStore.save(project.id, this.memory.exportProject(project.id));
|
|
76
|
-
}
|
|
77
|
-
// Load code graph.
|
|
78
|
-
const graphSnapshot = await this.graphStore.load(project.id);
|
|
79
|
-
if (graphSnapshot) {
|
|
80
|
-
this.graph.import(graphSnapshot.symbols, graphSnapshot.edges);
|
|
81
|
-
}
|
|
82
|
-
// Load / update vectors.
|
|
83
|
-
const embeddings = createEmbeddingProvider();
|
|
84
|
-
const vectorManager = new VectorPersistenceManager(project.id, this.options.embeddingModel, embeddings, this.vectors, this.vectorStore);
|
|
85
|
-
const vectorStats = await vectorManager.initialize(this.memory.list(project.id));
|
|
86
|
-
await this.hooks
|
|
87
|
-
.sessionStart();
|
|
88
|
-
return {
|
|
89
|
-
memories: memories.length,
|
|
90
|
-
graphSymbols: this.graph
|
|
91
|
-
.allSymbols(project.id)
|
|
92
|
-
.length,
|
|
93
|
-
graphEdges: this.graph
|
|
94
|
-
.allEdges(project.id)
|
|
95
|
-
.length,
|
|
96
|
-
vectors: vectorStats.total,
|
|
97
|
-
vectorsIndexed: vectorStats.indexed,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
async preparePrompt(prompt) {
|
|
101
|
-
return this.autoRetrieval
|
|
102
|
-
.prepare(prompt);
|
|
103
|
-
}
|
|
104
|
-
/*
|
|
105
|
-
* PHẢI gọi trước khi tool thật sự chạy.
|
|
106
|
-
* Edit/write/patch sẽ tự chạy Blast Radius.
|
|
107
|
-
*/
|
|
108
|
-
async beforeTool(tool, input) {
|
|
109
|
-
const impact = await this.autoImpactGuard
|
|
110
|
-
.beforeTool(tool, input);
|
|
111
|
-
await this.hooks
|
|
112
|
-
.beforeTool(tool, input);
|
|
113
|
-
return impact;
|
|
114
|
-
}
|
|
115
|
-
async afterTool(tool, output) {
|
|
116
|
-
return this.hooks
|
|
117
|
-
.afterTool(tool, output);
|
|
118
|
-
}
|
|
119
|
-
async stop() {
|
|
120
|
-
const { project, storage, embeddingModel, } = this.options;
|
|
121
|
-
// Snapshot persistent state before changing it.
|
|
122
|
-
const snapshotManager = new SnapshotManager(storage);
|
|
123
|
-
const snapshot = await snapshotManager.create(project.id, "session-end-auto");
|
|
124
|
-
await snapshotManager.prune(project.id, 10);
|
|
125
|
-
// Flush pending memory events.
|
|
126
|
-
await this.hooks
|
|
127
|
-
.sessionEnd();
|
|
128
|
-
// Consolidate small activity memories.
|
|
129
|
-
const consolidation = new MemoryConsolidator(this.memory).consolidate(project.id);
|
|
130
|
-
if (consolidation.summaryCreated) {
|
|
131
|
-
await this.memoryStore.save(project.id, this.memory.exportProject(project.id));
|
|
132
|
-
}
|
|
133
|
-
// Incrementally update code graph.
|
|
134
|
-
const codeStats = await new IncrementalRepositoryIndexer(storage).index(project.id, project.rootPath);
|
|
135
|
-
// Reload latest graph snapshot.
|
|
136
|
-
const graphSnapshot = await this.graphStore.load(project.id);
|
|
137
|
-
if (graphSnapshot) {
|
|
138
|
-
this.graph.clearProject(project.id);
|
|
139
|
-
this.graph.import(graphSnapshot.symbols, graphSnapshot.edges);
|
|
140
|
-
}
|
|
141
|
-
// Persist only missing/new memory vectors.
|
|
142
|
-
const embeddings = createEmbeddingProvider();
|
|
143
|
-
const vectorManager = new VectorPersistenceManager(project.id, embeddingModel, embeddings, this.vectors, this.vectorStore);
|
|
144
|
-
const vectorStats = await vectorManager.initialize(this.memory.list(project.id));
|
|
145
|
-
const result = {
|
|
146
|
-
code: codeStats,
|
|
147
|
-
vectors: vectorStats,
|
|
148
|
-
consolidation,
|
|
149
|
-
snapshot: snapshot?.id,
|
|
150
|
-
memories: this.memory.list(project.id).length,
|
|
151
|
-
};
|
|
152
|
-
await this.processLock
|
|
153
|
-
.release();
|
|
154
|
-
return result;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|