mcp-rag-memory 2.3.0

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.
Files changed (41) hide show
  1. package/.env.example +35 -0
  2. package/README.md +475 -0
  3. package/dist/db/database.d.ts +22 -0
  4. package/dist/db/database.d.ts.map +1 -0
  5. package/dist/db/database.js +144 -0
  6. package/dist/db/database.js.map +1 -0
  7. package/dist/env.js +48 -0
  8. package/dist/index.js +12 -0
  9. package/dist/mcp/rag-server.d.ts +3 -0
  10. package/dist/mcp/rag-server.d.ts.map +1 -0
  11. package/dist/mcp/rag-server.js +275 -0
  12. package/dist/mcp/rag-server.js.map +1 -0
  13. package/dist/memory/memory.d.ts +69 -0
  14. package/dist/memory/memory.d.ts.map +1 -0
  15. package/dist/memory/memory.js +221 -0
  16. package/dist/memory/memory.js.map +1 -0
  17. package/dist/rag/chunker.d.ts +16 -0
  18. package/dist/rag/chunker.d.ts.map +1 -0
  19. package/dist/rag/chunker.js +109 -0
  20. package/dist/rag/chunker.js.map +1 -0
  21. package/dist/rag/embedder.d.ts +19 -0
  22. package/dist/rag/embedder.d.ts.map +1 -0
  23. package/dist/rag/embedder.js +96 -0
  24. package/dist/rag/embedder.js.map +1 -0
  25. package/dist/rag/embeddings.d.ts +14 -0
  26. package/dist/rag/embeddings.d.ts.map +1 -0
  27. package/dist/rag/embeddings.js +71 -0
  28. package/dist/rag/embeddings.js.map +1 -0
  29. package/dist/rag/pipeline.d.ts +49 -0
  30. package/dist/rag/pipeline.d.ts.map +1 -0
  31. package/dist/rag/pipeline.js +181 -0
  32. package/dist/rag/pipeline.js.map +1 -0
  33. package/dist/rag/vector-search.d.ts +39 -0
  34. package/dist/rag/vector-search.d.ts.map +1 -0
  35. package/dist/rag/vector-search.js +164 -0
  36. package/dist/rag/vector-search.js.map +1 -0
  37. package/dist/session/transcript.d.ts +75 -0
  38. package/dist/session/transcript.d.ts.map +1 -0
  39. package/dist/session/transcript.js +268 -0
  40. package/dist/session/transcript.js.map +1 -0
  41. package/package.json +56 -0
@@ -0,0 +1,39 @@
1
+ export interface ChunkRow {
2
+ id: string;
3
+ doc_id: string;
4
+ idx: number;
5
+ content: string;
6
+ embedding: Uint8Array | null;
7
+ token_count: number;
8
+ }
9
+ export interface SearchHit {
10
+ id: string;
11
+ docId: string;
12
+ docTitle: string;
13
+ chunkIndex: number;
14
+ content: string;
15
+ score: number;
16
+ tokenCount: number;
17
+ }
18
+ export interface SearchOptions {
19
+ topK?: number;
20
+ minScore?: number;
21
+ collection?: "chunks" | "memories";
22
+ }
23
+ export declare function invalidateVectorCache(): void;
24
+ /** Brute-force vector search over stored vectors (uses the in-memory cache). */
25
+ export declare function vectorSearch(queryVec: Float64Array, options?: SearchOptions): Array<{
26
+ key: string;
27
+ score: number;
28
+ }>;
29
+ export interface SearchChunkOptions {
30
+ queryText?: string;
31
+ topK: number;
32
+ minScore: number;
33
+ }
34
+ /**
35
+ * Hybrid search: FTS5 BM25 keyword + vector, fused with RRF.
36
+ * Controlled by SEARCH_MODE=hybrid|vector|keyword (default hybrid).
37
+ */
38
+ export declare function searchChunks(queryVec: Float64Array, opts: SearchChunkOptions): SearchHit[];
39
+ //# sourceMappingURL=vector-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../../src/rag/vector-search.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACpC;AAeD,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAuCD,gFAAgF;AAChF,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,aAAkB,GAC1B,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAcvC;AA0CD,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,SAAS,EAAE,CA8D1F"}
@@ -0,0 +1,164 @@
1
+ import { getDB, unpackVector, getEmbedDim } from "../db/database.js";
2
+ import { dotProduct } from "./embedder.js";
3
+ const SEARCH_MODE = process.env.SEARCH_MODE === "vector" || process.env.SEARCH_MODE === "keyword"
4
+ ? process.env.SEARCH_MODE
5
+ : "hybrid";
6
+ const RRF_K = 60;
7
+ const LIST_CAP = 60;
8
+ /* In-memory vector cache — invalidated on every write. */
9
+ let cacheChunks = null;
10
+ let cacheMemories = null;
11
+ export function invalidateVectorCache() {
12
+ cacheChunks = null;
13
+ cacheMemories = null;
14
+ }
15
+ function loadVectors(table) {
16
+ const db = getDB();
17
+ if (table === "memories") {
18
+ if (cacheMemories)
19
+ return cacheMemories;
20
+ const rows = db.prepare("SELECT id, embedding FROM memories").all();
21
+ const out = [];
22
+ for (const r of rows) {
23
+ const vec = unpackVector(r.embedding);
24
+ if (vec)
25
+ out.push({ id: r.id, vec });
26
+ }
27
+ cacheMemories = out;
28
+ return out;
29
+ }
30
+ // chunks keep their implicit rowid too, for FTS bookkeeping.
31
+ if (cacheChunks)
32
+ return cacheChunks;
33
+ const rows = db
34
+ .prepare("SELECT id, rowid AS rid, embedding FROM chunks")
35
+ .all();
36
+ const out = [];
37
+ for (const r of rows) {
38
+ const vec = unpackVector(r.embedding);
39
+ if (vec)
40
+ out.push({ id: r.id, id2: String(r.rid), vec });
41
+ }
42
+ cacheChunks = out;
43
+ return out;
44
+ }
45
+ function dimGuard(queryVec) {
46
+ const stored = getEmbedDim();
47
+ if (stored && stored !== queryVec.length) {
48
+ throw new Error(`Query vector dimension ${queryVec.length} does not match stored embedding dimension ${stored}. ` +
49
+ `Set EMBEDDING_PROVIDER consistent with the DB or wipe the store.`);
50
+ }
51
+ }
52
+ /** Brute-force vector search over stored vectors (uses the in-memory cache). */
53
+ export function vectorSearch(queryVec, options = {}) {
54
+ const topK = options.topK ?? 10;
55
+ const minScore = options.minScore ?? 0.08;
56
+ const table = options.collection === "memories" ? "memories" : "chunks";
57
+ dimGuard(queryVec);
58
+ const rows = loadVectors(table);
59
+ const scored = [];
60
+ for (const r of rows) {
61
+ const score = dotProduct(queryVec, r.vec);
62
+ if (score >= minScore)
63
+ scored.push({ key: r.id, score });
64
+ }
65
+ scored.sort((a, b) => b.score - a.score);
66
+ return scored.slice(0, topK);
67
+ }
68
+ /** BM25 keyword hits via FTS5, best-first. Returns empty when the query has no terms. */
69
+ function ftsHits(queryText, limit) {
70
+ const tokens = queryText
71
+ .toLowerCase()
72
+ .replace(/[^\p{L}\p{N}_-]+/gu, " ")
73
+ .trim()
74
+ .split(/\s+/)
75
+ .filter(Boolean)
76
+ .slice(0, 10);
77
+ if (tokens.length === 0)
78
+ return [];
79
+ const db = getDB();
80
+ try {
81
+ const rows = db
82
+ .prepare(`SELECT c.id
83
+ FROM chunks_fts
84
+ JOIN chunks c ON c.rowid = chunks_fts.rowid
85
+ WHERE chunks_fts MATCH ?
86
+ ORDER BY bm25(chunks_fts)
87
+ LIMIT ?`)
88
+ .all(tokens.join(" "), limit);
89
+ return rows.map((r) => ({ key: r.id }));
90
+ }
91
+ catch {
92
+ // FTS5 unavailable or unsupported query syntax — degrade to vector-only.
93
+ return [];
94
+ }
95
+ }
96
+ /** Reciprocal-rank fusion over multiple ranked lists of {key}. */
97
+ function rrfMerge(lists) {
98
+ const scores = new Map();
99
+ for (const list of lists) {
100
+ list.forEach((item, rank) => {
101
+ scores.set(item.key, (scores.get(item.key) ?? 0) + 1 / (RRF_K + rank + 1));
102
+ });
103
+ }
104
+ return scores;
105
+ }
106
+ /**
107
+ * Hybrid search: FTS5 BM25 keyword + vector, fused with RRF.
108
+ * Controlled by SEARCH_MODE=hybrid|vector|keyword (default hybrid).
109
+ */
110
+ export function searchChunks(queryVec, opts) {
111
+ const { queryText = "", topK, minScore } = opts;
112
+ const db = getDB();
113
+ const cap = Math.max(topK * 2, LIST_CAP);
114
+ let vectorHits = [];
115
+ if (SEARCH_MODE !== "keyword") {
116
+ vectorHits = vectorSearch(queryVec, { topK: cap, minScore, collection: "chunks" });
117
+ }
118
+ let kwHits = [];
119
+ if (SEARCH_MODE !== "vector") {
120
+ kwHits = ftsHits(queryText, cap);
121
+ }
122
+ let finalIds;
123
+ if (SEARCH_MODE === "vector") {
124
+ finalIds = vectorHits.slice(0, topK);
125
+ }
126
+ else if (SEARCH_MODE === "keyword") {
127
+ finalIds = kwHits.slice(0, topK).map((h, i) => ({ key: h.key, score: 1 - i * 1e-6 }));
128
+ }
129
+ else {
130
+ const fused = rrfMerge([vectorHits, kwHits]);
131
+ finalIds = [...fused.entries()]
132
+ .map(([key, score]) => ({ key, score }))
133
+ .sort((a, b) => b.score - a.score)
134
+ .slice(0, topK);
135
+ }
136
+ if (finalIds.length === 0)
137
+ return [];
138
+ const ids = finalIds.map((f) => f.key);
139
+ const placeholders = ids.map(() => "?").join(", ");
140
+ const rows = db
141
+ .prepare(`SELECT c.id, c.doc_id, c.idx, c.content, c.token_count, d.title AS doc_title
142
+ FROM chunks c
143
+ JOIN documents d ON d.id = c.doc_id
144
+ WHERE c.id IN (${placeholders})`)
145
+ .all(...ids);
146
+ const byId = new Map(rows.map((r) => [r.id, r]));
147
+ return finalIds.flatMap((f) => {
148
+ const row = byId.get(f.key);
149
+ if (!row)
150
+ return [];
151
+ return [
152
+ {
153
+ id: row.id,
154
+ docId: row.doc_id,
155
+ docTitle: row.doc_title,
156
+ chunkIndex: row.idx,
157
+ content: row.content,
158
+ score: f.score,
159
+ tokenCount: row.token_count,
160
+ },
161
+ ];
162
+ });
163
+ }
164
+ //# sourceMappingURL=vector-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.js","sourceRoot":"","sources":["../../src/rag/vector-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ export interface SessionEntry {
2
+ sessionId: string;
3
+ ts: number;
4
+ content: string;
5
+ }
6
+ export interface SyncResult {
7
+ messages: number;
8
+ newDocs: number;
9
+ deduplicated: number;
10
+ skipped: number;
11
+ }
12
+ export type SessionSource = "opencode-db" | "session-log";
13
+ /** Where opencode keeps its session/message history. Override via OPENCODE_DB. */
14
+ export declare const OPENCODE_DB: string;
15
+ /** Desktop/local-mode db (per-project sessions) used as a fallback source. */
16
+ export declare const OPENCODE_DB_LOCAL: string;
17
+ export declare function opencodeDbs(): string[];
18
+ /** Merge top-level sessions from the global + local opencode DBs, newest first. */
19
+ export declare function listOpenCodeSessions(limit?: number, opts?: {
20
+ directory?: string;
21
+ }): Array<{
22
+ id: string;
23
+ title: string;
24
+ directory: string;
25
+ timeUpdated: number;
26
+ }>;
27
+ /** Newest session, optionally pinned to a workspace directory and recency window. */
28
+ export declare function latestSession(opts?: {
29
+ directory?: string;
30
+ maxAgeMs?: number;
31
+ }): {
32
+ id: string;
33
+ title: string;
34
+ directory: string;
35
+ } | null;
36
+ /** Ingest whatever session is most recently active (what the user is typing in now). */
37
+ export declare function ingestLatest(opts?: {
38
+ limit?: number;
39
+ directory?: string;
40
+ source?: SessionSource;
41
+ }): Promise<{
42
+ found: boolean;
43
+ sessionId?: string;
44
+ entries: number;
45
+ } & SyncResult>;
46
+ /** Extract user-typed text from one session, oldest first. */
47
+ export declare function getSessionTranscript(sessionId: string, limit?: number): SessionEntry[];
48
+ /** Read entries from a plugin-written .jsonl file. */
49
+ export declare function readJsonl(file: string): SessionEntry[];
50
+ /**
51
+ * Keep only the key points of a long input. Short inputs pass through untouched;
52
+ * long ones are reduced to the most information-dense sentences (deterministic,
53
+ * so re-runs stay idempotent). Pure extractive — no LLM involved.
54
+ */
55
+ export declare function condenseInput(text: string): string;
56
+ /** Ingest entries into the RAG store. Dedup (content-hash) makes this idempotent. */
57
+ export declare function ingestEntries(entries: SessionEntry[], source: SessionSource): Promise<SyncResult>;
58
+ export declare function ingestSession(sessionId: string, opts?: {
59
+ limit?: number;
60
+ source?: SessionSource;
61
+ }): Promise<{
62
+ sessionId: string;
63
+ entries: number;
64
+ } & SyncResult>;
65
+ export declare function ingestJsonlFile(file: string, opts?: {
66
+ source?: SessionSource;
67
+ }): Promise<{
68
+ file: string;
69
+ } & SyncResult>;
70
+ export declare function ingestLogDir(dir?: string, opts?: {
71
+ source?: SessionSource;
72
+ }): Promise<{
73
+ files: number;
74
+ } & SyncResult>;
75
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/session/transcript.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AAE1D,kFAAkF;AAClF,eAAO,MAAM,WAAW,EAAE,MACwE,CAAC;AAEnG,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,EAAE,MAC8E,CAAC;AAE/G,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC;AAkCD,mFAAmF;AACnF,wBAAgB,oBAAoB,CAClC,KAAK,SAAK,EACV,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB9E;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAM3I;AAED,wFAAwF;AACxF,wBAAsB,YAAY,CAChC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAO,GACxE,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,CAK/E;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE,CAgCjF;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAsBtD;AA+CD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBlD;AAED,qFAAqF;AACrF,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAoBvG;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAO,GACpD,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,CAI9D;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAO,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,CAIjI;AAED,wBAAsB,YAAY,CAChC,GAAG,SAAkB,EACrB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAO,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,CAsBzC"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Sync opencode session inputs into the RAG store.
3
+ *
4
+ * Two sources feed the same long-term store (dedup makes re-runs idempotent):
5
+ * - "opencode-db" : read user messages straight from opencode's DB (source of truth).
6
+ * - "session-log" : read *.jsonl files written by the session-logger plugin
7
+ * (.session-logs/<session>.jsonl).
8
+ *
9
+ * Every user input becomes one small document (title "<session>-<ts>") so it is
10
+ * searchable via rag_search / rag_retrieve — while curated long-term memories
11
+ * stay separate and clean.
12
+ */
13
+ import * as fs from "fs";
14
+ import * as os from "os";
15
+ import * as path from "path";
16
+ import { DatabaseSync } from "node:sqlite";
17
+ import { ingestText } from "../rag/pipeline.js";
18
+ /** Where opencode keeps its session/message history. Override via OPENCODE_DB. */
19
+ export const OPENCODE_DB = process.env.OPENCODE_DB ?? path.join(os.homedir(), ".local", "share", "opencode", "opencode.db");
20
+ /** Desktop/local-mode db (per-project sessions) used as a fallback source. */
21
+ export const OPENCODE_DB_LOCAL = process.env.OPENCODE_DB_LOCAL ?? path.join(os.homedir(), ".local", "share", "opencode", "opencode-local.db");
22
+ export function opencodeDbs() {
23
+ return [OPENCODE_DB, OPENCODE_DB_LOCAL].filter((p) => fs.existsSync(p));
24
+ }
25
+ function normalizeDir(d) {
26
+ return d.replace(/\\/g, "/").replace(/\/+$/, "");
27
+ }
28
+ function dbMatches(directory) {
29
+ const dir = directory ? normalizeDir(directory) : null;
30
+ return (r) => !dir || (!!r.directory && normalizeDir(r.directory) === dir);
31
+ }
32
+ function querySessions(dbPath, limit) {
33
+ const db = new DatabaseSync(dbPath, { readOnly: true });
34
+ try {
35
+ const rows = db
36
+ .prepare(`SELECT id, title, directory, time_updated FROM session
37
+ WHERE time_archived IS NULL AND parent_id IS NULL
38
+ ORDER BY time_updated DESC LIMIT ?`)
39
+ .all(limit);
40
+ return rows.map((r) => ({ ...r, title: r.title ?? "", directory: r.directory ?? "" }));
41
+ }
42
+ finally {
43
+ db.close();
44
+ }
45
+ }
46
+ /** Merge top-level sessions from the global + local opencode DBs, newest first. */
47
+ export function listOpenCodeSessions(limit = 15, opts = {}) {
48
+ const rows = opencodeDbs().flatMap((p) => querySessions(p, Math.max(limit, 50)));
49
+ const seen = new Set();
50
+ const merged = rows
51
+ .filter((r) => {
52
+ if (seen.has(r.id))
53
+ return false;
54
+ seen.add(r.id);
55
+ return true;
56
+ })
57
+ .sort((a, b) => b.time_updated - a.time_updated);
58
+ const filtered = merged.filter(dbMatches(opts.directory));
59
+ return (opts.directory ? filtered : merged).slice(0, limit).map((r) => ({
60
+ id: r.id,
61
+ title: r.title,
62
+ directory: r.directory,
63
+ timeUpdated: r.time_updated,
64
+ }));
65
+ }
66
+ /** Newest session, optionally pinned to a workspace directory and recency window. */
67
+ export function latestSession(opts = {}) {
68
+ const age = opts.maxAgeMs ?? 30 * 24 * 60 * 60 * 1000;
69
+ const recent = Date.now() - age;
70
+ const all = listOpenCodeSessions(50, { directory: opts.directory });
71
+ const hit = all.find((s) => s.timeUpdated >= recent);
72
+ return hit ? { id: hit.id, title: hit.title, directory: hit.directory } : (all[0] ?? null);
73
+ }
74
+ /** Ingest whatever session is most recently active (what the user is typing in now). */
75
+ export async function ingestLatest(opts = {}) {
76
+ const hit = latestSession({ directory: opts.directory });
77
+ if (!hit)
78
+ return { found: false, sessionId: undefined, entries: 0, messages: 0, newDocs: 0, deduplicated: 0, skipped: 0 };
79
+ const res = await ingestSession(hit.id, { limit: opts.limit, source: opts.source });
80
+ return { found: true, sessionId: hit.id, entries: res.entries, messages: res.messages, newDocs: res.newDocs, deduplicated: res.deduplicated, skipped: res.skipped };
81
+ }
82
+ /** Extract user-typed text from one session, oldest first. */
83
+ export function getSessionTranscript(sessionId, limit = 0) {
84
+ if (!fs.existsSync(OPENCODE_DB))
85
+ throw new Error(`opencode DB not found: ${OPENCODE_DB}`);
86
+ const db = new DatabaseSync(OPENCODE_DB, { readOnly: true });
87
+ const entries = [];
88
+ try {
89
+ const msgs = db
90
+ .prepare(`SELECT id, time_created, data FROM message
91
+ WHERE session_id = ? AND json_extract(data, '$.role') = 'user'
92
+ ORDER BY time_created ASC`)
93
+ .all(sessionId);
94
+ const partsStatement = db.prepare("SELECT data FROM part WHERE message_id = ?");
95
+ for (const m of msgs) {
96
+ if (limit > 0 && entries.length >= limit)
97
+ break;
98
+ const parts = partsStatement.all(m.id);
99
+ const texts = [];
100
+ for (const p of parts) {
101
+ try {
102
+ const d = JSON.parse(p.data);
103
+ if (d.type === "text" && d.text)
104
+ texts.push(String(d.text));
105
+ }
106
+ catch {
107
+ /* unparseable part — skip */
108
+ }
109
+ }
110
+ if (texts.length > 0)
111
+ entries.push({ sessionId, ts: m.time_created, content: texts.join("\n") });
112
+ }
113
+ return entries;
114
+ }
115
+ finally {
116
+ db.close();
117
+ }
118
+ }
119
+ /** Read entries from a plugin-written .jsonl file. */
120
+ export function readJsonl(file) {
121
+ if (!fs.existsSync(file))
122
+ throw new Error(`Not found: ${file}`);
123
+ const raw = fs.readFileSync(file, "utf8");
124
+ const base = path.basename(file).replace(/\.jsonl$/, "");
125
+ const entries = [];
126
+ for (const line of raw.split("\n")) {
127
+ const t = line.trim();
128
+ if (!t)
129
+ continue;
130
+ try {
131
+ const o = JSON.parse(t);
132
+ const content = String(o.content ?? o.text ?? "").trim();
133
+ if (!content)
134
+ continue;
135
+ entries.push({
136
+ sessionId: o.session ?? o.sessionId ?? base,
137
+ ts: o.ts ?? o.time ?? Date.now(),
138
+ content,
139
+ });
140
+ }
141
+ catch {
142
+ /* malformed line — skip */
143
+ }
144
+ }
145
+ return entries;
146
+ }
147
+ /* ------------------------------------------------------------------ */
148
+ /* Key-point condensing (extractive, deterministic, zero-LLM) */
149
+ /* ------------------------------------------------------------------ */
150
+ const CONDENSE_DEFAULT_MIN_CHARS = 120;
151
+ const CONDENSE_DEFAULT_RATIO = 0.35;
152
+ function condenseEnabled() {
153
+ return process.env.RAG_SESSION_CONDENSE !== "0";
154
+ }
155
+ function condenseMinChars() {
156
+ const n = Number(process.env.RAG_SESSION_CONDENSE_MIN_CHARS);
157
+ return Number.isFinite(n) && n >= 50 ? n : CONDENSE_DEFAULT_MIN_CHARS;
158
+ }
159
+ function condenseRatio() {
160
+ const r = Number(process.env.RAG_SESSION_CONDENSE_RATIO);
161
+ return Number.isFinite(r) && r > 0 && r <= 1 ? r : CONDENSE_DEFAULT_RATIO;
162
+ }
163
+ const STOPWORDS = new Set(("a an and are as at be but by for from has have he her his i if in is it its " +
164
+ "not of on or our she so that the their them they this to was we were will with " +
165
+ "dan atau yang dari ke di dan untuk pada dengan tidak apakah saya kamu kita ini itu yang " +
166
+ "sudah akan bisa mau apa siapa kapan mana lebih").split(/\s+/));
167
+ /** Split text into sentences, keeping their original order. */
168
+ function splitSentences(text) {
169
+ return text
170
+ .split(/(?<=[.!?…:])\s+|\n+/)
171
+ .map((s) => s.trim())
172
+ .filter((s) => s.length > 0);
173
+ }
174
+ /** Score a sentence by how many meaningful tokens it carries (plus position bias). */
175
+ function scoreSentence(s) {
176
+ const tokens = s.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
177
+ const significant = tokens.filter((t) => t.length >= 4 && !STOPWORDS.has(t) && !/^\d+$/.test(t));
178
+ return significant.length + Math.min(tokens.length, 8) / 10;
179
+ }
180
+ /**
181
+ * Keep only the key points of a long input. Short inputs pass through untouched;
182
+ * long ones are reduced to the most information-dense sentences (deterministic,
183
+ * so re-runs stay idempotent). Pure extractive — no LLM involved.
184
+ */
185
+ export function condenseInput(text) {
186
+ const trimmed = text.trim();
187
+ if (!condenseEnabled() || trimmed.length <= condenseMinChars())
188
+ return trimmed;
189
+ const sentences = splitSentences(trimmed);
190
+ if (sentences.length <= 1)
191
+ return trimmed;
192
+ const keepTargetChars = Math.max(Math.round(trimmed.length * condenseRatio()), Math.min(condenseMinChars(), trimmed.length));
193
+ const scored = sentences.map((s, i) => ({ s, i, score: scoreSentence(s) + (i === 0 ? 1 : 0) }));
194
+ scored.sort((a, b) => b.score - a.score);
195
+ const chosen = new Set();
196
+ let kept = 0;
197
+ for (const { i, s } of scored) {
198
+ if (kept >= keepTargetChars)
199
+ break;
200
+ chosen.add(i);
201
+ kept += s.length;
202
+ }
203
+ if (chosen.size === 0)
204
+ chosen.add(0);
205
+ return Array.from(chosen)
206
+ .sort((a, b) => a - b)
207
+ .map((i) => sentences[i])
208
+ .join(" ")
209
+ .trim();
210
+ }
211
+ /** Ingest entries into the RAG store. Dedup (content-hash) makes this idempotent. */
212
+ export async function ingestEntries(entries, source) {
213
+ let newDocs = 0;
214
+ let deduplicated = 0;
215
+ let skipped = 0;
216
+ for (const e of entries) {
217
+ const original = e.content.trim();
218
+ if (!original) {
219
+ skipped++;
220
+ continue;
221
+ }
222
+ const content = condenseInput(original);
223
+ const res = await ingestText(content, `${e.sessionId.slice(-12)}-${e.ts}`, {
224
+ source,
225
+ contentType: "text",
226
+ metadata: { source, session_id: e.sessionId, ts: e.ts, condensed: content !== original },
227
+ });
228
+ if (res.deduplicated)
229
+ deduplicated++;
230
+ else
231
+ newDocs++;
232
+ }
233
+ return { messages: entries.length, newDocs, deduplicated, skipped };
234
+ }
235
+ export async function ingestSession(sessionId, opts = {}) {
236
+ const entries = getSessionTranscript(sessionId, opts.limit ?? 0);
237
+ const res = await ingestEntries(entries, opts.source ?? "opencode-db");
238
+ return { sessionId, entries: entries.length, ...res };
239
+ }
240
+ export async function ingestJsonlFile(file, opts = {}) {
241
+ const entries = readJsonl(file);
242
+ const res = await ingestEntries(entries, opts.source ?? "session-log");
243
+ return { file, ...res };
244
+ }
245
+ export async function ingestLogDir(dir = ".session-logs", opts = {}) {
246
+ const abs = path.resolve(dir);
247
+ if (!fs.existsSync(abs) || !fs.statSync(abs).isDirectory()) {
248
+ return { files: 0, messages: 0, newDocs: 0, deduplicated: 0, skipped: 0 };
249
+ }
250
+ const files = fs
251
+ .readdirSync(abs)
252
+ .filter((f) => f.endsWith(".jsonl"))
253
+ .map((f) => path.join(abs, f))
254
+ .sort();
255
+ let messages = 0;
256
+ let newDocs = 0;
257
+ let deduplicated = 0;
258
+ let skipped = 0;
259
+ for (const f of files) {
260
+ const r = await ingestJsonlFile(f, opts);
261
+ messages += r.messages;
262
+ newDocs += r.newDocs;
263
+ deduplicated += r.deduplicated;
264
+ skipped += r.skipped;
265
+ }
266
+ return { files: files.length, messages, newDocs, deduplicated, skipped };
267
+ }
268
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/session/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAiBhD,kFAAkF;AAClF,MAAM,CAAC,MAAM,WAAW,GACtB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AAEnG,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;AAE/G,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,SAAkB;IACnC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;AAC7E,CAAC;AASD,SAAS,aAAa,CAAC,MAAc,EAAE,KAAa;IAClD,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;6CAEqC,CACtC;aACA,GAAG,CAAC,KAAK,CAA4B,CAAC;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,oBAAoB,CAClC,KAAK,GAAG,EAAE,EACV,OAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,WAAW,EAAE,CAAC,CAAC,YAAY;KAC5B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,OAAkD,EAAE;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;IAChC,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAC7F,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuE,EAAE;IAEzE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC1H,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AACtK,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,KAAK,GAAG,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAC1F,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;oCAE4B,CAC7B;aACA,GAAG,CAAC,SAAS,CAA8D,CAAC;QAC/E,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;QAEhF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;gBAAE,MAAM;YAChD,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;YAClE,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAqC,CAAC;oBACjE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI;wBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9D,CAAC;gBAAC,MAAM,CAAC;oBACP,6BAA6B;gBAC/B,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0G,CAAC;YACjI,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI;gBAC3C,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;gBAChC,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC;AACxE,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC;AAC5E,CAAC;AAED,MAAM,SAAS,GAAwB,IAAI,GAAG,CAC5C,CACE,8EAA8E;IAC9E,iFAAiF;IACjF,0FAA0F;IAC1F,gDAAgD,CACjD,CAAC,KAAK,CAAC,KAAK,CAAC,CACf,CAAC;AAEF,+DAA+D;AAC/D,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,sFAAsF;AACtF,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,eAAe,EAAE,IAAI,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE;QAAE,OAAO,OAAO,CAAC;IAE/E,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAE1C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7H,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;QAC9B,IAAI,IAAI,IAAI,eAAe;YAAE,MAAM;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAErC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACxB,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB,EAAE,MAAqB;IAChF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YACzE,MAAM;YACN,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,KAAK,QAAQ,EAAE;SACzF,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,YAAY;YAAE,YAAY,EAAE,CAAC;;YAChC,OAAO,EAAE,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,OAAmD,EAAE;IAErD,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IACvE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,OAAmC,EAAE;IACvF,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IACvE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAG,GAAG,eAAe,EACrB,OAAmC,EAAE;IAErC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,EAAE;SACb,WAAW,CAAC,GAAG,CAAC;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;SAC7B,IAAI,EAAE,CAAC;IACV,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC;QACvB,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;QACrB,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC;QAC/B,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAC3E,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "mcp-rag-memory",
3
+ "version": "2.3.0",
4
+ "description": "RAG + Context Management MCP server: long-term memory, vector storage, knowledge retrieval. Run with npx, zero external APIs.",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=22.5.0"
8
+ },
9
+ "bin": {
10
+ "mcp-rag-memory": "dist/index.js"
11
+ },
12
+ "files": [
13
+ "dist/index.js",
14
+ "dist/env.js",
15
+ "dist/mcp",
16
+ "dist/db",
17
+ "dist/rag",
18
+ "dist/memory",
19
+ "dist/session",
20
+ "README.md",
21
+ ".env.example"
22
+ ],
23
+ "scripts": {
24
+ "prebuild": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\"",
25
+ "build": "tsc",
26
+ "lint": "oxlint src scripts --deny-warnings",
27
+ "clean-db": "tsx scripts/clean-all.ts",
28
+ "start": "node dist/index.js",
29
+ "dev": "tsx src/index.ts",
30
+ "cli": "tsx src/cli.ts",
31
+ "sync-logs": "tsx src/cli.ts sync-logs",
32
+ "sync-session": "tsx src/cli.ts sync-session",
33
+ "sync-latest": "tsx src/cli.ts sync-latest",
34
+ "test": "tsx src/test/test-all.ts",
35
+ "prepublishOnly": "npm run build"
36
+ },
37
+ "keywords": [
38
+ "mcp",
39
+ "rag",
40
+ "memory",
41
+ "vector-search",
42
+ "context-management",
43
+ "node"
44
+ ],
45
+ "license": "MIT",
46
+ "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.0.0",
48
+ "zod": "^3.22.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^24.13.5",
52
+ "oxlint": "^1.83.0",
53
+ "tsx": "^4.23.0",
54
+ "typescript": "^5.7.0"
55
+ }
56
+ }