code-session-memory 0.11.0 → 0.12.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.
- package/README.md +39 -17
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/src/cli-query.d.ts +1 -0
- package/dist/src/cli-query.d.ts.map +1 -1
- package/dist/src/cli-query.js +5 -3
- package/dist/src/cli-query.js.map +1 -1
- package/dist/src/cli-sessions.d.ts.map +1 -1
- package/dist/src/cli-sessions.js +4 -0
- package/dist/src/cli-sessions.js.map +1 -1
- package/dist/src/cli.js +288 -5
- package/dist/src/cli.js.map +1 -1
- package/dist/src/gemini-session-to-messages.d.ts +25 -0
- package/dist/src/gemini-session-to-messages.d.ts.map +1 -0
- package/dist/src/gemini-session-to-messages.js +205 -0
- package/dist/src/gemini-session-to-messages.js.map +1 -0
- package/dist/src/indexer-cli-gemini.d.ts +12 -0
- package/dist/src/indexer-cli-gemini.d.ts.map +1 -0
- package/dist/src/indexer-cli-gemini.js +148 -0
- package/dist/src/indexer-cli-gemini.js.map +1 -0
- package/dist/src/indexer.d.ts +1 -1
- package/dist/src/indexer.js +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/skill/memory.md +7 -4
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Entry point for Gemini CLI session indexing.
|
|
5
|
+
*
|
|
6
|
+
* Called by the Gemini CLI AfterAgent hook. Receives JSON on stdin:
|
|
7
|
+
* { session_id, transcript_path, cwd, hook_event_name, ... }
|
|
8
|
+
*
|
|
9
|
+
* Reads the session JSON transcript, converts to FullMessage[], and indexes
|
|
10
|
+
* new messages into the shared sqlite-vec DB.
|
|
11
|
+
*/
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
const database_1 = require("./database");
|
|
17
|
+
const indexer_1 = require("./indexer");
|
|
18
|
+
const gemini_session_to_messages_1 = require("./gemini-session-to-messages");
|
|
19
|
+
const fs_1 = __importDefault(require("fs"));
|
|
20
|
+
const os_1 = __importDefault(require("os"));
|
|
21
|
+
const path_1 = __importDefault(require("path"));
|
|
22
|
+
function getGeminiConfigDir() {
|
|
23
|
+
return process.env.GEMINI_CONFIG_DIR ?? path_1.default.join(os_1.default.homedir(), ".gemini");
|
|
24
|
+
}
|
|
25
|
+
function getString(value) {
|
|
26
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
27
|
+
}
|
|
28
|
+
function findTranscriptBySessionId(sessionId, cwd) {
|
|
29
|
+
const tmpRoot = path_1.default.join(getGeminiConfigDir(), "tmp");
|
|
30
|
+
const projectName = cwd ? path_1.default.basename(cwd) : undefined;
|
|
31
|
+
const candidateDirs = [
|
|
32
|
+
projectName ? path_1.default.join(tmpRoot, projectName, "chats") : undefined,
|
|
33
|
+
path_1.default.join(tmpRoot),
|
|
34
|
+
].filter((d) => Boolean(d && fs_1.default.existsSync(d)));
|
|
35
|
+
const files = [];
|
|
36
|
+
function walk(dir) {
|
|
37
|
+
let entries;
|
|
38
|
+
try {
|
|
39
|
+
entries = fs_1.default.readdirSync(dir, { withFileTypes: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
const fullPath = path_1.default.join(dir, entry.name);
|
|
46
|
+
if (entry.isDirectory()) {
|
|
47
|
+
walk(fullPath);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (entry.isFile() &&
|
|
51
|
+
entry.name.startsWith("session-") &&
|
|
52
|
+
entry.name.endsWith(".json")) {
|
|
53
|
+
let mtimeMs = 0;
|
|
54
|
+
try {
|
|
55
|
+
mtimeMs = fs_1.default.statSync(fullPath).mtimeMs;
|
|
56
|
+
}
|
|
57
|
+
catch { /* ignore */ }
|
|
58
|
+
files.push({ filePath: fullPath, mtimeMs });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const dir of candidateDirs)
|
|
63
|
+
walk(dir);
|
|
64
|
+
// Newest first, and keep the search bounded.
|
|
65
|
+
files.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
66
|
+
const MAX_FILES_TO_CHECK = 200;
|
|
67
|
+
for (const { filePath } of files.slice(0, MAX_FILES_TO_CHECK)) {
|
|
68
|
+
try {
|
|
69
|
+
const parsed = JSON.parse(fs_1.default.readFileSync(filePath, "utf8"));
|
|
70
|
+
const candidateId = parsed.sessionId ?? parsed.session_id;
|
|
71
|
+
if (candidateId === sessionId)
|
|
72
|
+
return filePath;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Ignore malformed files.
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
async function main() {
|
|
81
|
+
const chunks = [];
|
|
82
|
+
for await (const chunk of process.stdin) {
|
|
83
|
+
chunks.push(chunk);
|
|
84
|
+
}
|
|
85
|
+
let payload;
|
|
86
|
+
try {
|
|
87
|
+
payload = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
process.stderr.write(`[code-session-memory] Failed to parse stdin: ${err}\n`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const { sessionId: sessionIdCamel, session_id: sessionIdSnake, transcriptPath: transcriptPathCamel, transcript_path: transcriptPathSnake, cwd, workspaceRoot, workspace_root: workspaceRootSnake, hookEventName, hook_event_name: hookEventNameSnake, eventName, } = payload;
|
|
95
|
+
const sessionId = sessionIdSnake ?? sessionIdCamel;
|
|
96
|
+
const projectDir = getString(cwd) ??
|
|
97
|
+
getString(workspaceRoot) ??
|
|
98
|
+
getString(workspaceRootSnake) ??
|
|
99
|
+
"";
|
|
100
|
+
const hookEvent = hookEventNameSnake ??
|
|
101
|
+
hookEventName ??
|
|
102
|
+
eventName;
|
|
103
|
+
const transcriptPath = transcriptPathSnake ??
|
|
104
|
+
transcriptPathCamel ??
|
|
105
|
+
(sessionId ? findTranscriptBySessionId(sessionId, projectDir) : undefined);
|
|
106
|
+
if (!sessionId) {
|
|
107
|
+
process.stderr.write("[code-session-memory] Missing session id in hook payload (session_id/sessionId)\n");
|
|
108
|
+
process.exit(1);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Index only completed turns if an event name is provided.
|
|
112
|
+
if (hookEvent && hookEvent !== "AfterAgent") {
|
|
113
|
+
process.exit(0);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!transcriptPath) {
|
|
117
|
+
process.stderr.write("[code-session-memory] Missing transcript path in hook payload and could not auto-discover session file\n");
|
|
118
|
+
process.exit(1);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const dbPath = (0, database_1.resolveDbPath)();
|
|
122
|
+
const db = (0, database_1.openDatabase)({ dbPath });
|
|
123
|
+
try {
|
|
124
|
+
const messages = (0, gemini_session_to_messages_1.geminiSessionToMessages)(transcriptPath);
|
|
125
|
+
if (messages.length === 0)
|
|
126
|
+
return;
|
|
127
|
+
const existingMeta = (0, database_1.getSessionMeta)(db, sessionId);
|
|
128
|
+
const title = existingMeta?.session_title || (0, gemini_session_to_messages_1.deriveGeminiSessionTitle)(messages, sessionId);
|
|
129
|
+
const session = {
|
|
130
|
+
id: sessionId,
|
|
131
|
+
title,
|
|
132
|
+
directory: projectDir,
|
|
133
|
+
};
|
|
134
|
+
await (0, indexer_1.indexNewMessages)(db, session, messages, "gemini-cli");
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
138
|
+
process.stderr.write(`[code-session-memory] Indexing error: ${msg}\n`);
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
db.close();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
main().catch((err) => {
|
|
145
|
+
process.stderr.write(`[code-session-memory] Fatal: ${err}\n`);
|
|
146
|
+
process.exit(1);
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=indexer-cli-gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer-cli-gemini.js","sourceRoot":"","sources":["../../src/indexer-cli-gemini.ts"],"names":[],"mappings":"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"}
|
package/dist/src/indexer.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface IndexerOptions {
|
|
|
19
19
|
* @param db Already-open database connection (caller manages lifecycle)
|
|
20
20
|
* @param session Session metadata (id, title, directory)
|
|
21
21
|
* @param messages All messages in the session
|
|
22
|
-
* @param source Which tool produced the session ("opencode" | "claude-code" | "cursor" | "vscode" | "codex")
|
|
22
|
+
* @param source Which tool produced the session ("opencode" | "claude-code" | "cursor" | "vscode" | "codex" | "gemini-cli")
|
|
23
23
|
* @param options Optional overrides for API key / model
|
|
24
24
|
*/
|
|
25
25
|
export declare function indexNewMessages(db: Database, session: SessionInfo, messages: FullMessage[], source?: SessionSource, options?: Pick<IndexerOptions, "openAiApiKey" | "embeddingModel">): Promise<{
|
package/dist/src/indexer.js
CHANGED
|
@@ -21,7 +21,7 @@ const session_to_md_1 = require("./session-to-md");
|
|
|
21
21
|
* @param db Already-open database connection (caller manages lifecycle)
|
|
22
22
|
* @param session Session metadata (id, title, directory)
|
|
23
23
|
* @param messages All messages in the session
|
|
24
|
-
* @param source Which tool produced the session ("opencode" | "claude-code" | "cursor" | "vscode" | "codex")
|
|
24
|
+
* @param source Which tool produced the session ("opencode" | "claude-code" | "cursor" | "vscode" | "codex" | "gemini-cli")
|
|
25
25
|
* @param options Optional overrides for API key / model
|
|
26
26
|
*/
|
|
27
27
|
async function indexNewMessages(db, session, messages, source = "opencode", options = {}) {
|
package/dist/src/types.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export interface DocumentChunk {
|
|
|
23
23
|
/**
|
|
24
24
|
* Which tool produced a session.
|
|
25
25
|
*/
|
|
26
|
-
export type SessionSource = "opencode" | "claude-code" | "cursor" | "vscode" | "codex";
|
|
26
|
+
export type SessionSource = "opencode" | "claude-code" | "cursor" | "vscode" | "codex" | "gemini-cli";
|
|
27
27
|
/**
|
|
28
28
|
* A row in the sessions_meta table — tracks per-session indexing progress.
|
|
29
29
|
*/
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,gHAAgH;QAChH,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kFAAkF;QAClF,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "code-session-memory",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Automatically index OpenCode, Claude Code, Cursor, VS Code, and
|
|
3
|
+
"version": "0.12.0",
|
|
4
|
+
"description": "Automatically index OpenCode, Claude Code, Cursor, VS Code, Codex, and Gemini CLI sessions into a shared sqlite-vec vector database for semantic search across your AI coding history",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/src/indexer.js",
|
|
7
7
|
"types": "dist/src/indexer.d.ts",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"skill/"
|
|
15
15
|
],
|
|
16
16
|
"scripts": {
|
|
17
|
-
"build": "tsc && chmod 755 dist/src/cli.js dist/mcp/index.js dist/src/indexer-cli-vscode.js dist/src/indexer-cli-codex.js",
|
|
17
|
+
"build": "tsc && chmod 755 dist/src/cli.js dist/mcp/index.js dist/src/indexer-cli-vscode.js dist/src/indexer-cli-codex.js dist/src/indexer-cli-gemini.js",
|
|
18
18
|
"build:watch": "tsc --watch",
|
|
19
19
|
"start:mcp": "node dist/mcp/index.js",
|
|
20
20
|
"test": "vitest run",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"cursor",
|
|
30
30
|
"vscode",
|
|
31
31
|
"codex",
|
|
32
|
+
"gemini-cli",
|
|
32
33
|
"mcp",
|
|
33
34
|
"sqlite-vec",
|
|
34
35
|
"vector",
|
package/skill/memory.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Search past OpenCode, Claude Code, Cursor, VS Code, and
|
|
2
|
+
description: Search past OpenCode, Claude Code, Cursor, VS Code, Codex, and Gemini CLI sessions stored in the shared vector memory database
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# code-session-memory
|
|
6
6
|
|
|
7
|
-
You have access to an MCP server called `code-session-memory` that automatically indexes all your past coding sessions — from **OpenCode**, **Claude Code**, **Cursor**, **VS Code**, and **
|
|
7
|
+
You have access to an MCP server called `code-session-memory` that automatically indexes all your past coding sessions — from **OpenCode**, **Claude Code**, **Cursor**, **VS Code**, **Codex**, and **Gemini CLI** — into a single shared local vector database. Every time a session completes a turn, the new messages are embedded and stored, giving you a searchable memory of your entire AI coding history across all tools.
|
|
8
8
|
|
|
9
9
|
## Available tools
|
|
10
10
|
|
|
@@ -15,7 +15,7 @@ Semantically search across all indexed sessions to find past conversations, deci
|
|
|
15
15
|
**Parameters:**
|
|
16
16
|
- `queryText` *(required)*: A natural language description of what you are looking for.
|
|
17
17
|
- `project` *(optional)*: Filter results to a specific project directory path (e.g. `"/Users/me/myproject"`).
|
|
18
|
-
- `source` *(optional)*: Filter by tool — `"opencode"`, `"claude-code"`, `"cursor"`, `"vscode"`, or `"
|
|
18
|
+
- `source` *(optional)*: Filter by tool — `"opencode"`, `"claude-code"`, `"cursor"`, `"vscode"`, `"codex"`, or `"gemini-cli"`. Omit to search across all.
|
|
19
19
|
- `limit` *(optional, default 5)*: Number of results to return (1–20).
|
|
20
20
|
- `fromDate` *(optional)*: Return only chunks indexed on or after this date. ISO 8601, e.g. `"2026-02-01"` or `"2026-02-20T15:00:00Z"`.
|
|
21
21
|
- `toDate` *(optional)*: Return only chunks indexed on or before this date. ISO 8601, e.g. `"2026-02-20"`. Date-only values are treated as end-of-day UTC.
|
|
@@ -57,6 +57,9 @@ query_sessions("refactoring utils", source="vscode")
|
|
|
57
57
|
# Search only Codex sessions
|
|
58
58
|
query_sessions("openapi mock server", source="codex")
|
|
59
59
|
|
|
60
|
+
# Search only Gemini CLI sessions
|
|
61
|
+
query_sessions("hook payload format", source="gemini-cli")
|
|
62
|
+
|
|
60
63
|
# Search sessions from a specific date range
|
|
61
64
|
query_sessions("authentication middleware", fromDate="2026-02-01", toDate="2026-02-20")
|
|
62
65
|
|
|
@@ -66,7 +69,7 @@ get_session_chunks("session://ses_abc123#msg_def456")
|
|
|
66
69
|
|
|
67
70
|
## Notes
|
|
68
71
|
|
|
69
|
-
- Sessions from OpenCode, Claude Code, Cursor, VS Code, and
|
|
72
|
+
- Sessions from OpenCode, Claude Code, Cursor, VS Code, Codex, and Gemini CLI are indexed into the **same** database.
|
|
70
73
|
- Indexing is automatic — no manual action needed.
|
|
71
74
|
- The database lives at `~/.local/share/code-session-memory/sessions.db`.
|
|
72
75
|
- Embeddings use OpenAI `text-embedding-3-large` (3072 dimensions).
|