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,70 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, } from "node:fs";
|
|
2
|
-
import { homedir, } from "node:os";
|
|
3
|
-
import { join, } from "node:path";
|
|
4
|
-
function decodeValue(input) {
|
|
5
|
-
let value = input.trim();
|
|
6
|
-
if (value.length >= 2 &&
|
|
7
|
-
value.startsWith('"') &&
|
|
8
|
-
value.endsWith('"')) {
|
|
9
|
-
value =
|
|
10
|
-
value.slice(1, -1);
|
|
11
|
-
return value
|
|
12
|
-
.replace(/\\n/g, "\n")
|
|
13
|
-
.replace(/\\r/g, "\r")
|
|
14
|
-
.replace(/\\t/g, "\t")
|
|
15
|
-
.replace(/\\"/g, '"')
|
|
16
|
-
.replace(/\\\\/g, "\\");
|
|
17
|
-
}
|
|
18
|
-
if (value.length >= 2 &&
|
|
19
|
-
value.startsWith("'") &&
|
|
20
|
-
value.endsWith("'")) {
|
|
21
|
-
return value.slice(1, -1);
|
|
22
|
-
}
|
|
23
|
-
return value;
|
|
24
|
-
}
|
|
25
|
-
export function loadGlobalToolNetEnv() {
|
|
26
|
-
const filePath = process.env
|
|
27
|
-
.TOOLNET_GLOBAL_ENV ??
|
|
28
|
-
join(homedir(), ".config", "toolnet-memory", ".env");
|
|
29
|
-
if (!existsSync(filePath)) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const content = readFileSync(filePath, "utf8");
|
|
33
|
-
for (const rawLine of content.split(/\r?\n/)) {
|
|
34
|
-
let line = rawLine.trim();
|
|
35
|
-
if (!line ||
|
|
36
|
-
line.startsWith("#")) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
if (line.startsWith("export ")) {
|
|
40
|
-
line =
|
|
41
|
-
line.slice("export ".length);
|
|
42
|
-
}
|
|
43
|
-
const index = line.indexOf("=");
|
|
44
|
-
if (index <= 0) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const key = line
|
|
48
|
-
.slice(0, index)
|
|
49
|
-
.trim();
|
|
50
|
-
if (!/^[A-Za-z_][A-Za-z0-9_]*$/
|
|
51
|
-
.test(key)) {
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
/*
|
|
55
|
-
* Shell ENV / project-specific config wins.
|
|
56
|
-
*
|
|
57
|
-
* Global config only fills missing values.
|
|
58
|
-
*/
|
|
59
|
-
if (process.env[key] !==
|
|
60
|
-
undefined) {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
process.env[key] =
|
|
64
|
-
decodeValue(line.slice(index + 1));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/*
|
|
68
|
-
* Load immediately when imported by config.ts.
|
|
69
|
-
*/
|
|
70
|
-
loadGlobalToolNetEnv();
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
const BASE_SCORES = {
|
|
2
|
-
critical: 100,
|
|
3
|
-
high: 75,
|
|
4
|
-
normal: 50,
|
|
5
|
-
temporary: 20,
|
|
6
|
-
};
|
|
7
|
-
export function getImportanceScore(level) {
|
|
8
|
-
return BASE_SCORES[level];
|
|
9
|
-
}
|
|
10
|
-
export function inferImportance(type, content) {
|
|
11
|
-
const text = content.toLowerCase();
|
|
12
|
-
if (text.includes("không được") ||
|
|
13
|
-
text.includes("bắt buộc") ||
|
|
14
|
-
text.includes("must not") ||
|
|
15
|
-
text.includes("critical")) {
|
|
16
|
-
return "critical";
|
|
17
|
-
}
|
|
18
|
-
if (type === "rule" ||
|
|
19
|
-
type === "decision") {
|
|
20
|
-
return "high";
|
|
21
|
-
}
|
|
22
|
-
if (type === "todo") {
|
|
23
|
-
return "normal";
|
|
24
|
-
}
|
|
25
|
-
if (type === "activity" ||
|
|
26
|
-
type === "summary") {
|
|
27
|
-
return "temporary";
|
|
28
|
-
}
|
|
29
|
-
return "normal";
|
|
30
|
-
}
|
package/dist/src/core/index.js
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { randomUUID, } from "node:crypto";
|
|
2
|
-
import { getImportanceScore, inferImportance, } from "./importance.js";
|
|
3
|
-
import { Sanitizer, } from "../security/sanitizer.js";
|
|
4
|
-
import { ConflictDetector, } from "../memory/conflict-detector.js";
|
|
5
|
-
import { defaultExpiry, effectiveImportanceScore, isExpired, isMemoryActive, } from "../memory/decay.js";
|
|
6
|
-
export class MemoryEngine {
|
|
7
|
-
memories = new Map();
|
|
8
|
-
sanitizer = new Sanitizer();
|
|
9
|
-
conflicts = new ConflictDetector();
|
|
10
|
-
remember(input) {
|
|
11
|
-
const now = new Date().toISOString();
|
|
12
|
-
const content = this.sanitizer
|
|
13
|
-
.sanitize(input.content.trim()).text;
|
|
14
|
-
const importance = input.importance ??
|
|
15
|
-
inferImportance(input.type, content);
|
|
16
|
-
const memory = {
|
|
17
|
-
id: randomUUID(),
|
|
18
|
-
projectId: input.projectId,
|
|
19
|
-
type: input.type,
|
|
20
|
-
content,
|
|
21
|
-
importance,
|
|
22
|
-
importanceScore: getImportanceScore(importance),
|
|
23
|
-
tags: input.tags ?? [],
|
|
24
|
-
source: input.source ?? "agent",
|
|
25
|
-
createdAt: now,
|
|
26
|
-
updatedAt: now,
|
|
27
|
-
expiresAt: input.expiresAt ??
|
|
28
|
-
defaultExpiry(input.type, importance, new Date(now)),
|
|
29
|
-
metadata: this.sanitizer
|
|
30
|
-
.sanitizeValue(input.metadata),
|
|
31
|
-
};
|
|
32
|
-
const superseded = this.conflicts.findSuperseded(memory, this.list(input.projectId));
|
|
33
|
-
if (superseded.length) {
|
|
34
|
-
memory.metadata = {
|
|
35
|
-
...(memory.metadata ?? {}),
|
|
36
|
-
supersedes: superseded.map((item) => item.id),
|
|
37
|
-
};
|
|
38
|
-
for (const old of superseded) {
|
|
39
|
-
old.updatedAt = now;
|
|
40
|
-
old.metadata = {
|
|
41
|
-
...(old.metadata ?? {}),
|
|
42
|
-
supersededBy: memory.id,
|
|
43
|
-
supersededAt: now,
|
|
44
|
-
};
|
|
45
|
-
this.memories.set(old.id, old);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
this.memories.set(memory.id, memory);
|
|
49
|
-
return memory;
|
|
50
|
-
}
|
|
51
|
-
importRecords(records) {
|
|
52
|
-
let imported = 0;
|
|
53
|
-
for (const memory of records) {
|
|
54
|
-
if (!memory?.id) {
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
this.memories.set(memory.id, memory);
|
|
58
|
-
imported++;
|
|
59
|
-
}
|
|
60
|
-
return imported;
|
|
61
|
-
}
|
|
62
|
-
exportProject(projectId) {
|
|
63
|
-
return this.listAll(projectId);
|
|
64
|
-
}
|
|
65
|
-
get(id) {
|
|
66
|
-
return this.memories.get(id);
|
|
67
|
-
}
|
|
68
|
-
delete(id) {
|
|
69
|
-
return this.memories.delete(id);
|
|
70
|
-
}
|
|
71
|
-
listAll(projectId) {
|
|
72
|
-
return [...this.memories.values()]
|
|
73
|
-
.filter((memory) => memory.projectId ===
|
|
74
|
-
projectId)
|
|
75
|
-
.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
76
|
-
}
|
|
77
|
-
list(projectId) {
|
|
78
|
-
return this.listAll(projectId).filter((memory) => isMemoryActive(memory));
|
|
79
|
-
}
|
|
80
|
-
recent(projectId, limit = 10) {
|
|
81
|
-
return this.list(projectId)
|
|
82
|
-
.slice(0, limit);
|
|
83
|
-
}
|
|
84
|
-
byType(projectId, type) {
|
|
85
|
-
return this.list(projectId)
|
|
86
|
-
.filter((memory) => memory.type === type);
|
|
87
|
-
}
|
|
88
|
-
search(query) {
|
|
89
|
-
const q = query.query
|
|
90
|
-
.trim()
|
|
91
|
-
.toLowerCase();
|
|
92
|
-
const limit = query.limit ?? 10;
|
|
93
|
-
const tokens = q.split(/\s+/)
|
|
94
|
-
.filter(Boolean);
|
|
95
|
-
return this.list(query.projectId)
|
|
96
|
-
.filter((memory) => {
|
|
97
|
-
if (query.types &&
|
|
98
|
-
!query.types.includes(memory.type)) {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
const effective = effectiveImportanceScore(memory);
|
|
102
|
-
if (query.minImportanceScore &&
|
|
103
|
-
effective <
|
|
104
|
-
query.minImportanceScore) {
|
|
105
|
-
return false;
|
|
106
|
-
}
|
|
107
|
-
if (query.tags?.length) {
|
|
108
|
-
const hasTag = query.tags.some((tag) => memory.tags.includes(tag));
|
|
109
|
-
if (!hasTag) {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return true;
|
|
114
|
-
})
|
|
115
|
-
.map((memory) => {
|
|
116
|
-
const content = memory.content
|
|
117
|
-
.toLowerCase();
|
|
118
|
-
const matches = tokens.filter((token) => content.includes(token)).length;
|
|
119
|
-
const textScore = tokens.length === 0
|
|
120
|
-
? 0
|
|
121
|
-
: matches /
|
|
122
|
-
tokens.length;
|
|
123
|
-
const importanceBoost = effectiveImportanceScore(memory) / 500;
|
|
124
|
-
return {
|
|
125
|
-
memory,
|
|
126
|
-
score: textScore +
|
|
127
|
-
importanceBoost,
|
|
128
|
-
source: "memory",
|
|
129
|
-
};
|
|
130
|
-
})
|
|
131
|
-
.filter((result) => q.length === 0 ||
|
|
132
|
-
result.score > 0)
|
|
133
|
-
.sort((a, b) => b.score - a.score)
|
|
134
|
-
.slice(0, limit);
|
|
135
|
-
}
|
|
136
|
-
pruneExpired(projectId, now = Date.now()) {
|
|
137
|
-
let removed = 0;
|
|
138
|
-
for (const [id, memory] of this.memories) {
|
|
139
|
-
if (memory.projectId ===
|
|
140
|
-
projectId &&
|
|
141
|
-
isExpired(memory, now)) {
|
|
142
|
-
this.memories.delete(id);
|
|
143
|
-
removed++;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return removed;
|
|
147
|
-
}
|
|
148
|
-
pruneSuperseded(projectId, retentionDays = 30, now = Date.now()) {
|
|
149
|
-
let removed = 0;
|
|
150
|
-
const retentionMs = retentionDays *
|
|
151
|
-
86_400_000;
|
|
152
|
-
for (const [id, memory] of this.memories) {
|
|
153
|
-
if (memory.projectId !==
|
|
154
|
-
projectId) {
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
const supersededAt = memory.metadata
|
|
158
|
-
?.supersededAt;
|
|
159
|
-
if (typeof supersededAt !==
|
|
160
|
-
"string") {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
const age = now -
|
|
164
|
-
new Date(supersededAt).getTime();
|
|
165
|
-
if (age >= retentionMs) {
|
|
166
|
-
this.memories.delete(id);
|
|
167
|
-
removed++;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return removed;
|
|
171
|
-
}
|
|
172
|
-
clearProject(projectId) {
|
|
173
|
-
let deleted = 0;
|
|
174
|
-
for (const [id, memory] of this.memories) {
|
|
175
|
-
if (memory.projectId ===
|
|
176
|
-
projectId) {
|
|
177
|
-
this.memories.delete(id);
|
|
178
|
-
deleted++;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return deleted;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import { createHash, } from "node:crypto";
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
|
|
3
|
-
import { basename, dirname, join, parse, resolve, } from "node:path";
|
|
4
|
-
const TOOLNET_DIRECTORY = ".toolnet";
|
|
5
|
-
const PROJECT_FILE = "project.json";
|
|
6
|
-
/**
|
|
7
|
-
* Legacy ID algorithm.
|
|
8
|
-
*
|
|
9
|
-
* IMPORTANT:
|
|
10
|
-
* Existing ToolNet projects already use this ID internally.
|
|
11
|
-
* We keep it for the first local manifest creation so no
|
|
12
|
-
* graph/memory/snapshot projectId is invalidated.
|
|
13
|
-
*
|
|
14
|
-
* Once stored in .toolnet/project.json, the ID no longer
|
|
15
|
-
* depends on the path.
|
|
16
|
-
*/
|
|
17
|
-
function legacyProjectIdFromPath(rootPath) {
|
|
18
|
-
return createHash("sha256")
|
|
19
|
-
.update(rootPath)
|
|
20
|
-
.digest("hex")
|
|
21
|
-
.slice(0, 16);
|
|
22
|
-
}
|
|
23
|
-
function manifestPath(rootPath) {
|
|
24
|
-
return join(rootPath, TOOLNET_DIRECTORY, PROJECT_FILE);
|
|
25
|
-
}
|
|
26
|
-
function hasProjectManifest(rootPath) {
|
|
27
|
-
return existsSync(manifestPath(rootPath));
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Search upwards for an existing ToolNet project identity.
|
|
31
|
-
*
|
|
32
|
-
* This means running ToolNet from:
|
|
33
|
-
*
|
|
34
|
-
* ~/mercedes/src/foo/
|
|
35
|
-
*
|
|
36
|
-
* still resolves:
|
|
37
|
-
*
|
|
38
|
-
* ~/mercedes/.toolnet/project.json
|
|
39
|
-
*/
|
|
40
|
-
function findExistingProjectRoot(startPath) {
|
|
41
|
-
let current = resolve(startPath);
|
|
42
|
-
const filesystemRoot = parse(current).root;
|
|
43
|
-
while (true) {
|
|
44
|
-
if (hasProjectManifest(current)) {
|
|
45
|
-
return current;
|
|
46
|
-
}
|
|
47
|
-
if (current ===
|
|
48
|
-
filesystemRoot) {
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
const parent = dirname(current);
|
|
52
|
-
if (parent ===
|
|
53
|
-
current) {
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
current =
|
|
57
|
-
parent;
|
|
58
|
-
}
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* When a project has not been initialized yet, try to identify
|
|
63
|
-
* its repository root instead of accidentally creating
|
|
64
|
-
* .toolnet inside src/foo/.
|
|
65
|
-
*/
|
|
66
|
-
function findRepositoryRoot(startPath) {
|
|
67
|
-
let current = resolve(startPath);
|
|
68
|
-
const filesystemRoot = parse(current).root;
|
|
69
|
-
const markers = [
|
|
70
|
-
".git",
|
|
71
|
-
"package.json",
|
|
72
|
-
"pyproject.toml",
|
|
73
|
-
"Cargo.toml",
|
|
74
|
-
"go.mod",
|
|
75
|
-
"composer.json",
|
|
76
|
-
];
|
|
77
|
-
while (true) {
|
|
78
|
-
if (markers.some((marker) => existsSync(join(current, marker)))) {
|
|
79
|
-
return current;
|
|
80
|
-
}
|
|
81
|
-
if (current ===
|
|
82
|
-
filesystemRoot) {
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
const parent = dirname(current);
|
|
86
|
-
if (parent ===
|
|
87
|
-
current) {
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
current =
|
|
91
|
-
parent;
|
|
92
|
-
}
|
|
93
|
-
return resolve(startPath);
|
|
94
|
-
}
|
|
95
|
-
function parseManifest(filePath) {
|
|
96
|
-
let value;
|
|
97
|
-
try {
|
|
98
|
-
value =
|
|
99
|
-
JSON.parse(readFileSync(filePath, "utf8"));
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
throw new Error(`Invalid ToolNet project manifest: ${filePath}: ${error instanceof Error
|
|
103
|
-
? error.message
|
|
104
|
-
: String(error)}`);
|
|
105
|
-
}
|
|
106
|
-
if (!value ||
|
|
107
|
-
typeof value !==
|
|
108
|
-
"object") {
|
|
109
|
-
throw new Error(`Invalid ToolNet project manifest: ${filePath}`);
|
|
110
|
-
}
|
|
111
|
-
const data = value;
|
|
112
|
-
if (typeof data.id !==
|
|
113
|
-
"string" ||
|
|
114
|
-
!data.id.trim()) {
|
|
115
|
-
throw new Error(`ToolNet project manifest is missing id: ${filePath}`);
|
|
116
|
-
}
|
|
117
|
-
if (typeof data.name !==
|
|
118
|
-
"string" ||
|
|
119
|
-
!data.name.trim()) {
|
|
120
|
-
throw new Error(`ToolNet project manifest is missing name: ${filePath}`);
|
|
121
|
-
}
|
|
122
|
-
const now = new Date()
|
|
123
|
-
.toISOString();
|
|
124
|
-
return {
|
|
125
|
-
version: 1,
|
|
126
|
-
id: data.id,
|
|
127
|
-
name: data.name,
|
|
128
|
-
remote: typeof data.remote ===
|
|
129
|
-
"string" &&
|
|
130
|
-
data.remote.trim()
|
|
131
|
-
? data.remote
|
|
132
|
-
: data.name,
|
|
133
|
-
rootPath: typeof data.rootPath ===
|
|
134
|
-
"string"
|
|
135
|
-
? data.rootPath
|
|
136
|
-
: dirname(dirname(filePath)),
|
|
137
|
-
createdAt: typeof data.createdAt ===
|
|
138
|
-
"string"
|
|
139
|
-
? data.createdAt
|
|
140
|
-
: now,
|
|
141
|
-
updatedAt: typeof data.updatedAt ===
|
|
142
|
-
"string"
|
|
143
|
-
? data.updatedAt
|
|
144
|
-
: now,
|
|
145
|
-
graphVersion: typeof data.graphVersion ===
|
|
146
|
-
"number"
|
|
147
|
-
? data.graphVersion
|
|
148
|
-
: 0,
|
|
149
|
-
memoryVersion: typeof data.memoryVersion ===
|
|
150
|
-
"number"
|
|
151
|
-
? data.memoryVersion
|
|
152
|
-
: 0,
|
|
153
|
-
metadata: data.metadata &&
|
|
154
|
-
typeof data.metadata ===
|
|
155
|
-
"object"
|
|
156
|
-
? data.metadata
|
|
157
|
-
: undefined,
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
function writeManifest(rootPath, manifest) {
|
|
161
|
-
const directory = join(rootPath, TOOLNET_DIRECTORY);
|
|
162
|
-
mkdirSync(directory, {
|
|
163
|
-
recursive: true,
|
|
164
|
-
});
|
|
165
|
-
const target = manifestPath(rootPath);
|
|
166
|
-
const temporary = `${target}.tmp-${process.pid}`;
|
|
167
|
-
writeFileSync(temporary, JSON.stringify(manifest, null, 2) + "\n", {
|
|
168
|
-
encoding: "utf8",
|
|
169
|
-
mode: 0o600,
|
|
170
|
-
});
|
|
171
|
-
renameSync(temporary, target);
|
|
172
|
-
}
|
|
173
|
-
function toProjectManifest(local, rootPath) {
|
|
174
|
-
return {
|
|
175
|
-
id: local.id,
|
|
176
|
-
name: local.name,
|
|
177
|
-
remote: local.remote,
|
|
178
|
-
rootPath,
|
|
179
|
-
createdAt: local.createdAt,
|
|
180
|
-
updatedAt: local.updatedAt,
|
|
181
|
-
graphVersion: local.graphVersion,
|
|
182
|
-
memoryVersion: local.memoryVersion,
|
|
183
|
-
metadata: local.metadata,
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
export class ProjectManager {
|
|
187
|
-
detect(rootPath = process.cwd()) {
|
|
188
|
-
const requestedPath = resolve(rootPath);
|
|
189
|
-
/*
|
|
190
|
-
* Existing project identity always wins.
|
|
191
|
-
*/
|
|
192
|
-
const existingRoot = findExistingProjectRoot(requestedPath);
|
|
193
|
-
if (existingRoot) {
|
|
194
|
-
const filePath = manifestPath(existingRoot);
|
|
195
|
-
const local = parseManifest(filePath);
|
|
196
|
-
/*
|
|
197
|
-
* Project may have been moved or its folder renamed.
|
|
198
|
-
*
|
|
199
|
-
* Update only rootPath.
|
|
200
|
-
* DO NOT change:
|
|
201
|
-
* id
|
|
202
|
-
* name
|
|
203
|
-
* remote
|
|
204
|
-
*/
|
|
205
|
-
if (local.rootPath !==
|
|
206
|
-
existingRoot) {
|
|
207
|
-
local.rootPath =
|
|
208
|
-
existingRoot;
|
|
209
|
-
local.updatedAt =
|
|
210
|
-
new Date()
|
|
211
|
-
.toISOString();
|
|
212
|
-
writeManifest(existingRoot, local);
|
|
213
|
-
}
|
|
214
|
-
return toProjectManifest(local, existingRoot);
|
|
215
|
-
}
|
|
216
|
-
/*
|
|
217
|
-
* First ToolNet initialization.
|
|
218
|
-
*/
|
|
219
|
-
const projectRoot = findRepositoryRoot(requestedPath);
|
|
220
|
-
const now = new Date()
|
|
221
|
-
.toISOString();
|
|
222
|
-
const name = basename(projectRoot);
|
|
223
|
-
const local = {
|
|
224
|
-
version: 1,
|
|
225
|
-
/*
|
|
226
|
-
* Preserve the legacy ID on first initialization.
|
|
227
|
-
*
|
|
228
|
-
* From now on this value lives in the manifest
|
|
229
|
-
* and becomes path-independent.
|
|
230
|
-
*/
|
|
231
|
-
id: legacyProjectIdFromPath(projectRoot),
|
|
232
|
-
name,
|
|
233
|
-
remote: name,
|
|
234
|
-
rootPath: projectRoot,
|
|
235
|
-
createdAt: now,
|
|
236
|
-
updatedAt: now,
|
|
237
|
-
graphVersion: 0,
|
|
238
|
-
memoryVersion: 0,
|
|
239
|
-
};
|
|
240
|
-
writeManifest(projectRoot, local);
|
|
241
|
-
return toProjectManifest(local, projectRoot);
|
|
242
|
-
}
|
|
243
|
-
}
|
package/dist/src/core/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { HuggingFaceEmbeddingProvider, } from "./remote.js";
|
|
2
|
-
import { HashEmbeddingProvider, } from "./local.js";
|
|
3
|
-
export class ResilientEmbeddingProvider {
|
|
4
|
-
primary;
|
|
5
|
-
fallback;
|
|
6
|
-
name = "resilient";
|
|
7
|
-
constructor(primary, fallback = new HashEmbeddingProvider()) {
|
|
8
|
-
this.primary = primary;
|
|
9
|
-
this.fallback = fallback;
|
|
10
|
-
}
|
|
11
|
-
async embed(text) {
|
|
12
|
-
if (this.primary) {
|
|
13
|
-
try {
|
|
14
|
-
return await this.primary.embed(text);
|
|
15
|
-
}
|
|
16
|
-
catch (error) {
|
|
17
|
-
console.warn("[embedding] primary failed, fallback enabled:", error instanceof Error
|
|
18
|
-
? error.message
|
|
19
|
-
: error);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return this.fallback.embed(text);
|
|
23
|
-
}
|
|
24
|
-
async embedMany(texts) {
|
|
25
|
-
if (this.primary) {
|
|
26
|
-
try {
|
|
27
|
-
return await this.primary
|
|
28
|
-
.embedMany(texts);
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
console.warn("[embedding] primary failed, fallback enabled:", error instanceof Error
|
|
32
|
-
? error.message
|
|
33
|
-
: error);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return this.fallback
|
|
37
|
-
.embedMany(texts);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export function createEmbeddingProvider() {
|
|
41
|
-
const token = process.env.HF_TOKEN;
|
|
42
|
-
const model = process.env.HF_EMBEDDING_MODEL ??
|
|
43
|
-
"sentence-transformers/all-MiniLM-L6-v2";
|
|
44
|
-
const primary = token
|
|
45
|
-
? new HuggingFaceEmbeddingProvider({
|
|
46
|
-
token,
|
|
47
|
-
model,
|
|
48
|
-
})
|
|
49
|
-
: null;
|
|
50
|
-
return new ResilientEmbeddingProvider(primary);
|
|
51
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { createHash, } from "node:crypto";
|
|
2
|
-
/*
|
|
3
|
-
* Fallback nhẹ để hệ thống không chết
|
|
4
|
-
* khi HF API lỗi/quota.
|
|
5
|
-
*
|
|
6
|
-
* Không thay thế semantic embedding thật.
|
|
7
|
-
*/
|
|
8
|
-
export class HashEmbeddingProvider {
|
|
9
|
-
name = "hash-fallback";
|
|
10
|
-
dimensions = 128;
|
|
11
|
-
async embed(text) {
|
|
12
|
-
const vector = new Array(this.dimensions).fill(0);
|
|
13
|
-
const words = text
|
|
14
|
-
.toLowerCase()
|
|
15
|
-
.split(/\s+/)
|
|
16
|
-
.filter(Boolean);
|
|
17
|
-
for (const word of words) {
|
|
18
|
-
const hash = createHash("sha256")
|
|
19
|
-
.update(word)
|
|
20
|
-
.digest();
|
|
21
|
-
const index = hash.readUInt32BE(0) %
|
|
22
|
-
this.dimensions;
|
|
23
|
-
vector[index] += 1;
|
|
24
|
-
}
|
|
25
|
-
return normalize(vector);
|
|
26
|
-
}
|
|
27
|
-
async embedMany(texts) {
|
|
28
|
-
return Promise.all(texts.map((text) => this.embed(text)));
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function normalize(vector) {
|
|
32
|
-
const norm = Math.sqrt(vector.reduce((sum, value) => sum + value * value, 0));
|
|
33
|
-
if (norm === 0) {
|
|
34
|
-
return vector;
|
|
35
|
-
}
|
|
36
|
-
return vector.map((value) => value / norm);
|
|
37
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|