code-session-memory 0.4.4 → 0.7.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 +78 -58
- package/dist/mcp/index.js +23 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +4 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +11 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/src/cli-sessions.d.ts +6 -7
- package/dist/src/cli-sessions.d.ts.map +1 -1
- package/dist/src/cli-sessions.js +238 -178
- package/dist/src/cli-sessions.js.map +1 -1
- package/dist/src/cli.js +272 -12
- package/dist/src/cli.js.map +1 -1
- package/dist/src/cursor-to-messages.d.ts +64 -0
- package/dist/src/cursor-to-messages.d.ts.map +1 -0
- package/dist/src/cursor-to-messages.js +243 -0
- package/dist/src/cursor-to-messages.js.map +1 -0
- package/dist/src/cursor-transcript-to-messages.d.ts +22 -0
- package/dist/src/cursor-transcript-to-messages.d.ts.map +1 -0
- package/dist/src/cursor-transcript-to-messages.js +79 -0
- package/dist/src/cursor-transcript-to-messages.js.map +1 -0
- package/dist/src/database.d.ts +13 -2
- package/dist/src/database.d.ts.map +1 -1
- package/dist/src/database.js +42 -8
- package/dist/src/database.js.map +1 -1
- package/dist/src/indexer-cli-cursor.d.ts +25 -0
- package/dist/src/indexer-cli-cursor.d.ts.map +1 -0
- package/dist/src/indexer-cli-cursor.js +118 -0
- package/dist/src/indexer-cli-cursor.js.map +1 -0
- package/dist/src/indexer-cli.js +76 -6
- package/dist/src/indexer-cli.js.map +1 -1
- package/dist/src/indexer.d.ts.map +1 -1
- package/dist/src/indexer.js +46 -9
- package/dist/src/indexer.js.map +1 -1
- package/dist/src/opencode-db-to-messages.d.ts +30 -0
- package/dist/src/opencode-db-to-messages.d.ts.map +1 -0
- package/dist/src/opencode-db-to-messages.js +88 -0
- package/dist/src/opencode-db-to-messages.js.map +1 -0
- package/dist/src/types.d.ts +6 -1
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/plugin/memory.ts +9 -1
- package/skill/memory.md +7 -2
package/README.md
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
# code-session-memory
|
|
2
2
|
|
|
3
|
-
Automatic vector memory for [OpenCode](https://opencode.ai)
|
|
3
|
+
Automatic vector memory for [OpenCode](https://opencode.ai), [Claude Code](https://claude.ai/code), and [Cursor](https://www.cursor.com) sessions — shared across all three tools.
|
|
4
4
|
|
|
5
|
-
Every time the AI agent finishes its turn, `code-session-memory` automatically indexes the new messages into a local [sqlite-vec](https://github.com/asg017/sqlite-vec) vector database. Past sessions become semantically searchable — both by the AI agent (via the MCP server) and by you. Sessions from
|
|
5
|
+
Every time the AI agent finishes its turn, `code-session-memory` automatically indexes the new messages into a local [sqlite-vec](https://github.com/asg017/sqlite-vec) vector database. Past sessions become semantically searchable — both by the AI agent (via the MCP server) and by you. Sessions from OpenCode, Claude Code, and Cursor are stored in the **same database**, so memory is shared across tools.
|
|
6
6
|
|
|
7
7
|
## How it works
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
OpenCode (session.idle
|
|
11
|
-
│
|
|
12
|
-
│
|
|
13
|
-
▼
|
|
14
|
-
session-to-md
|
|
15
|
-
│
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
10
|
+
OpenCode (session.idle) Claude Code (Stop hook) Cursor (stop hook)
|
|
11
|
+
│ │ │
|
|
12
|
+
│ REST API messages │ JSONL transcript │ JSONL transcript
|
|
13
|
+
▼ ▼ ▼
|
|
14
|
+
session-to-md transcript-to-messages cursor-transcript-to-messages
|
|
15
|
+
│ │ │
|
|
16
|
+
└───────────────────────────┬────────────────────────┘
|
|
17
|
+
▼
|
|
18
|
+
chunker → heading-aware chunks (≤1000 tokens, 10% overlap)
|
|
19
|
+
│
|
|
20
|
+
▼
|
|
21
|
+
embedder → OpenAI text-embedding-3-large (3072 dims)
|
|
22
|
+
│ (all chunks batched in a single API call per turn)
|
|
23
|
+
▼
|
|
24
|
+
sqlite-vec DB → ~/.local/share/code-session-memory/sessions.db
|
|
25
|
+
│
|
|
26
|
+
▼
|
|
27
|
+
MCP server → query_sessions / get_session_chunks tools
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Only **new messages** are indexed on each turn — previously indexed messages are skipped (tracked via `sessions_meta` table). This makes each indexing pass fast, even in long sessions.
|
|
@@ -35,7 +35,7 @@ Only **new messages** are indexed on each turn — previously indexed messages a
|
|
|
35
35
|
|
|
36
36
|
- Node.js ≥ 18
|
|
37
37
|
- An OpenAI API key (for `text-embedding-3-large`)
|
|
38
|
-
- OpenCode and/or
|
|
38
|
+
- OpenCode, Claude Code, and/or Cursor installed
|
|
39
39
|
|
|
40
40
|
### Install
|
|
41
41
|
|
|
@@ -43,7 +43,7 @@ Only **new messages** are indexed on each turn — previously indexed messages a
|
|
|
43
43
|
npx code-session-memory install
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
The `install` command sets up everything for
|
|
46
|
+
The `install` command sets up everything for all three tools in one shot:
|
|
47
47
|
|
|
48
48
|
**OpenCode:**
|
|
49
49
|
1. Copies the plugin to `~/.config/opencode/plugins/code-session-memory.ts`
|
|
@@ -51,15 +51,20 @@ The `install` command sets up everything for both tools in one shot:
|
|
|
51
51
|
3. Writes the MCP server entry into `~/.config/opencode/opencode.json`
|
|
52
52
|
|
|
53
53
|
**Claude Code:**
|
|
54
|
-
1. Writes a `Stop` hook to `~/.claude.json` (
|
|
54
|
+
1. Writes a `Stop` hook to `~/.claude/settings.json` (fires after each agent turn)
|
|
55
55
|
2. Injects the skill into `~/.claude/CLAUDE.md` (with idempotent markers)
|
|
56
56
|
3. Writes the MCP server entry into `~/.claude.json`
|
|
57
57
|
|
|
58
|
-
**
|
|
58
|
+
**Cursor:**
|
|
59
|
+
1. Writes a `stop` hook to `~/.cursor/hooks.json` (fires after each agent turn; requires Cursor v2.5+)
|
|
60
|
+
2. Writes the MCP server entry into `~/.cursor/mcp.json`
|
|
61
|
+
3. Copies the skill to `~/.cursor/skills/code-session-memory/SKILL.md`
|
|
62
|
+
|
|
63
|
+
**All tools share:**
|
|
59
64
|
- The same database at `~/.local/share/code-session-memory/sessions.db`
|
|
60
65
|
- The same MCP server for querying past sessions
|
|
61
66
|
|
|
62
|
-
Then **restart OpenCode / Claude Code** to activate.
|
|
67
|
+
Then **restart OpenCode / Claude Code / Cursor** to activate.
|
|
63
68
|
|
|
64
69
|
### Set your API key
|
|
65
70
|
|
|
@@ -111,8 +116,10 @@ Semantic search across all indexed sessions.
|
|
|
111
116
|
|---|---|---|---|
|
|
112
117
|
| `queryText` | string | yes | Natural language query |
|
|
113
118
|
| `project` | string | no | Filter by project directory path |
|
|
114
|
-
| `source` | string | no | Filter by tool: `"opencode"
|
|
119
|
+
| `source` | string | no | Filter by tool: `"opencode"`, `"claude-code"`, or `"cursor"` |
|
|
115
120
|
| `limit` | number | no | Max results (default: 5) |
|
|
121
|
+
| `fromDate` | string | no | Return chunks indexed on or after this date (ISO 8601, e.g. `"2026-02-01"`) |
|
|
122
|
+
| `toDate` | string | no | Return chunks indexed on or before this date (ISO 8601, e.g. `"2026-02-20"`) |
|
|
116
123
|
|
|
117
124
|
Example result:
|
|
118
125
|
```
|
|
@@ -142,8 +149,7 @@ Retrieve the full ordered content of a specific session message. Use the `sessio
|
|
|
142
149
|
You can browse, inspect, and delete indexed sessions directly from the CLI:
|
|
143
150
|
|
|
144
151
|
```bash
|
|
145
|
-
npx code-session-memory sessions # interactive browser
|
|
146
|
-
npx code-session-memory sessions --filter # with source/date filter step
|
|
152
|
+
npx code-session-memory sessions # interactive browser (source → date → session)
|
|
147
153
|
```
|
|
148
154
|
|
|
149
155
|
The interactive browser lists all sessions with their title, date, source tool, and chunk count. Select a session to:
|
|
@@ -155,11 +161,9 @@ You can also `print` or `delete` directly. Without an ID, an interactive picker
|
|
|
155
161
|
|
|
156
162
|
```bash
|
|
157
163
|
npx code-session-memory sessions print # pick interactively, then print
|
|
158
|
-
npx code-session-memory sessions print --filter # filter first, then pick and print
|
|
159
164
|
npx code-session-memory sessions print <id> # print directly by session ID
|
|
160
165
|
|
|
161
166
|
npx code-session-memory sessions delete # pick interactively, then delete
|
|
162
|
-
npx code-session-memory sessions delete --filter # filter first, then pick and delete
|
|
163
167
|
npx code-session-memory sessions delete <id> # delete directly by session ID
|
|
164
168
|
```
|
|
165
169
|
|
|
@@ -182,10 +186,6 @@ How can I add JWT authentication to the Express middleware?
|
|
|
182
186
|
...
|
|
183
187
|
```
|
|
184
188
|
|
|
185
|
-
**Filtering options** (with `--filter`):
|
|
186
|
-
- Source: All tools / OpenCode / Claude Code
|
|
187
|
-
- Date range: Last 7 / 30 / 90 days, last N days (custom), or older than N days (custom)
|
|
188
|
-
|
|
189
189
|
> **Note:** Deleting a session only removes it from the database. If the original session files still exist on disk, the session will be re-indexed automatically on the next agent turn.
|
|
190
190
|
|
|
191
191
|
### Asking the agent about past sessions
|
|
@@ -208,6 +208,8 @@ Show me how we solved the TypeScript config issue.
|
|
|
208
208
|
| `OPENAI_API_KEY` | — | **Required.** Used for embedding generation. |
|
|
209
209
|
| `OPENCODE_MEMORY_DB_PATH` | `~/.local/share/code-session-memory/sessions.db` | Override the database path. |
|
|
210
210
|
| `OPENCODE_CONFIG_DIR` | `~/.config/opencode` | Override the OpenCode config directory. |
|
|
211
|
+
| `CLAUDE_CONFIG_DIR` | `~/.claude` | Override the Claude Code config directory. |
|
|
212
|
+
| `CURSOR_CONFIG_DIR` | `~/.cursor` | Override the Cursor config directory. |
|
|
211
213
|
| `OPENAI_MODEL` | `text-embedding-3-large` | Override the embedding model. |
|
|
212
214
|
|
|
213
215
|
### Database path
|
|
@@ -230,19 +232,23 @@ code-session-memory/
|
|
|
230
232
|
│ ├── chunker.ts # Heading-aware markdown chunker
|
|
231
233
|
│ ├── embedder.ts # OpenAI embeddings (batched)
|
|
232
234
|
│ ├── session-to-md.ts # OpenCode SDK messages → markdown
|
|
233
|
-
│ ├── transcript-to-messages.ts
|
|
234
|
-
│ ├──
|
|
235
|
-
│ ├──
|
|
236
|
-
│ ├──
|
|
237
|
-
│ ├──
|
|
238
|
-
│
|
|
235
|
+
│ ├── transcript-to-messages.ts # Claude Code JSONL transcript parser
|
|
236
|
+
│ ├── cursor-to-messages.ts # Cursor state.vscdb reader (metadata + title)
|
|
237
|
+
│ ├── cursor-transcript-to-messages.ts # Cursor JSONL transcript parser → FullMessage[]
|
|
238
|
+
│ ├── opencode-db-to-messages.ts # OpenCode internal DB reader (fallback for -s mode)
|
|
239
|
+
│ ├── indexer.ts # Orchestrator: incremental indexing
|
|
240
|
+
│ ├── indexer-cli.ts # Node.js subprocess (called by OpenCode plugin)
|
|
241
|
+
│ ├── indexer-cli-claude.ts # Node.js subprocess (called by Claude Code hook)
|
|
242
|
+
│ ├── indexer-cli-cursor.ts # Node.js subprocess (called by Cursor stop hook)
|
|
243
|
+
│ ├── cli.ts # install / status / uninstall / reset-db commands
|
|
244
|
+
│ └── cli-sessions.ts # sessions list / print / delete / purge (TUI)
|
|
239
245
|
├── mcp/
|
|
240
246
|
│ ├── server.ts # MCP query handlers (testable, injected deps)
|
|
241
247
|
│ └── index.ts # MCP stdio server entry point
|
|
242
248
|
├── plugin/
|
|
243
249
|
│ └── memory.ts # OpenCode plugin (session.idle hook)
|
|
244
250
|
├── skill/
|
|
245
|
-
│ └── memory.md # Skill instructions (injected into
|
|
251
|
+
│ └── memory.md # Skill instructions (injected into all tools)
|
|
246
252
|
├── scripts/
|
|
247
253
|
│ └── generate-fixtures.ts # Generates committed e2e test fixtures (run manually)
|
|
248
254
|
└── tests/
|
|
@@ -252,9 +258,13 @@ code-session-memory/
|
|
|
252
258
|
├── indexer.test.ts
|
|
253
259
|
├── mcp-server.test.ts
|
|
254
260
|
├── session-to-md.test.ts
|
|
255
|
-
├──
|
|
256
|
-
├──
|
|
257
|
-
|
|
261
|
+
├── cursor-to-messages.test.ts # Unit tests: Cursor SQLite reader
|
|
262
|
+
├── cursor-transcript-to-messages.test.ts # Unit tests: Cursor JSONL parser
|
|
263
|
+
├── opencode-db-to-messages.test.ts # Unit tests: OpenCode internal DB reader
|
|
264
|
+
├── e2e-claude.test.ts # End-to-end: Claude Code pipeline
|
|
265
|
+
├── e2e-opencode.test.ts # End-to-end: OpenCode pipeline
|
|
266
|
+
├── e2e-cursor.test.ts # End-to-end: Cursor pipeline
|
|
267
|
+
└── fixtures/ # Committed session files (generated by generate-fixtures)
|
|
258
268
|
```
|
|
259
269
|
|
|
260
270
|
## Development
|
|
@@ -287,22 +297,26 @@ Tests use [Vitest](https://vitest.dev) and run without any external dependencies
|
|
|
287
297
|
- E2e tests use committed fixture files in `tests/fixtures/` (real transcripts, no CLI calls during `npm test`)
|
|
288
298
|
|
|
289
299
|
```
|
|
290
|
-
✓ tests/chunker.test.ts
|
|
291
|
-
✓ tests/mcp-server.test.ts
|
|
292
|
-
✓ tests/session-to-md.test.ts
|
|
293
|
-
✓ tests/embedder.test.ts
|
|
294
|
-
✓ tests/database.test.ts
|
|
295
|
-
✓ tests/indexer.test.ts
|
|
296
|
-
✓ tests/
|
|
297
|
-
✓ tests/
|
|
298
|
-
|
|
300
|
+
✓ tests/chunker.test.ts (15 tests)
|
|
301
|
+
✓ tests/mcp-server.test.ts (14 tests)
|
|
302
|
+
✓ tests/session-to-md.test.ts (21 tests)
|
|
303
|
+
✓ tests/embedder.test.ts (9 tests)
|
|
304
|
+
✓ tests/database.test.ts (27 tests)
|
|
305
|
+
✓ tests/indexer.test.ts (9 tests)
|
|
306
|
+
✓ tests/cursor-to-messages.test.ts (15 tests)
|
|
307
|
+
✓ tests/cursor-transcript-to-messages.test.ts (7 tests)
|
|
308
|
+
✓ tests/opencode-db-to-messages.test.ts (8 tests)
|
|
309
|
+
✓ tests/e2e-claude.test.ts (18 tests)
|
|
310
|
+
✓ tests/e2e-cursor.test.ts (8 tests)
|
|
311
|
+
✓ tests/e2e-opencode.test.ts (14 tests)
|
|
312
|
+
Tests 165 passed
|
|
299
313
|
```
|
|
300
314
|
|
|
301
315
|
To refresh the e2e fixtures (e.g. after changing the indexer or parsers), run:
|
|
302
316
|
```bash
|
|
303
317
|
npm run generate-fixtures
|
|
304
318
|
```
|
|
305
|
-
This invokes the real `claude` and `opencode` CLIs to generate two-turn sessions with tool use, then commits
|
|
319
|
+
This invokes the real `claude` and `opencode` CLIs to generate two-turn sessions with tool use, reads the most recent Cursor session from the live `state.vscdb`, then commits all results to `tests/fixtures/`.
|
|
306
320
|
|
|
307
321
|
## Uninstall
|
|
308
322
|
|
|
@@ -310,7 +324,7 @@ This invokes the real `claude` and `opencode` CLIs to generate two-turn sessions
|
|
|
310
324
|
npx code-session-memory uninstall
|
|
311
325
|
```
|
|
312
326
|
|
|
313
|
-
This removes the plugin, hooks, skill files, and MCP config entries for
|
|
327
|
+
This removes the plugin, hooks, skill files, and MCP config entries for all tools (OpenCode, Claude Code, and Cursor). The database is **not** removed automatically.
|
|
314
328
|
|
|
315
329
|
To delete individual sessions instead of wiping everything, use the [session browser](#browsing-sessions):
|
|
316
330
|
```bash
|
|
@@ -349,10 +363,10 @@ The plugin/hook fires on every agent turn. To avoid re-processing the entire ses
|
|
|
349
363
|
|
|
350
364
|
1. Reads `last_indexed_message_id` from the `sessions_meta` table
|
|
351
365
|
2. Skips all messages up to and including that ID
|
|
352
|
-
3. Processes only the new messages
|
|
366
|
+
3. Processes only the new messages — renders, chunks, and embeds all of them in a **single batched OpenAI API call**
|
|
353
367
|
4. Updates `last_indexed_message_id` after success
|
|
354
368
|
|
|
355
|
-
This makes each indexing pass O(new messages) rather than O(all messages).
|
|
369
|
+
This makes each indexing pass O(new messages) rather than O(all messages), and limits network round-trips to one embedding call per turn regardless of message count.
|
|
356
370
|
|
|
357
371
|
### Why a Node.js subprocess?
|
|
358
372
|
|
|
@@ -365,6 +379,12 @@ Claude Code writes a JSONL transcript after each session turn. The parser (`tran
|
|
|
365
379
|
- Skipping internal `thinking` blocks, metadata entries, and error messages
|
|
366
380
|
- Converting `tool_use` / `tool_result` entries to readable markdown
|
|
367
381
|
|
|
382
|
+
### Cursor session reading
|
|
383
|
+
|
|
384
|
+
Cursor provides a `transcript_path` field in the stop hook payload — a JSONL file written **synchronously before the hook fires**, so it is always complete and race-condition-free. Each line is `{ "role": "user"|"assistant", "message": { "content": [{ "type": "text", "text": "..." }] } }`. The reader (`cursor-transcript-to-messages.ts`) parses this file directly, strips Cursor's `<user_query>` wrapper tags, and assigns stable `composerId-lineIndex` IDs for incremental indexing.
|
|
385
|
+
|
|
386
|
+
Session metadata (title only) is read best-effort from the SQLite `state.vscdb`. The Cursor `stop` hook fires after each agent turn and requires **Cursor v2.5+**.
|
|
387
|
+
|
|
368
388
|
### Chunking strategy
|
|
369
389
|
|
|
370
390
|
- Heading-aware splitting — headings define semantic boundaries
|
|
@@ -375,7 +395,7 @@ Claude Code writes a JSONL transcript after each session turn. The parser (`tran
|
|
|
375
395
|
|
|
376
396
|
### MCP server
|
|
377
397
|
|
|
378
|
-
The MCP server uses **stdio transport** — the simplest and most reliable transport for local use. It opens and closes the SQLite connection on each query (no persistent connection), making it safe to run alongside the indexer. The `query_sessions` tool
|
|
398
|
+
The MCP server uses **stdio transport** — the simplest and most reliable transport for local use. It opens and closes the SQLite connection on each query (no persistent connection), making it safe to run alongside the indexer. The `query_sessions` tool supports filtering by `source`, `project`, and date range (`fromDate`/`toDate`).
|
|
379
399
|
|
|
380
400
|
## License
|
|
381
401
|
|
package/dist/mcp/index.js
CHANGED
|
@@ -112,8 +112,10 @@ const server = new mcp_js_1.McpServer({
|
|
|
112
112
|
const querySessionsSchema = {
|
|
113
113
|
queryText: zod_1.z.string().min(1).describe("Natural language description of what you are looking for."),
|
|
114
114
|
project: zod_1.z.string().optional().describe("Filter results to a specific project directory path (e.g. '/Users/me/myproject'). Optional."),
|
|
115
|
-
source: zod_1.z.enum(["opencode", "claude-code"]).optional().describe("Filter results by tool source: 'opencode'
|
|
115
|
+
source: zod_1.z.enum(["opencode", "claude-code", "cursor"]).optional().describe("Filter results by tool source: 'opencode', 'claude-code', or 'cursor'. Optional — omit to search across all."),
|
|
116
116
|
limit: zod_1.z.number().int().min(1).optional().describe("Maximum number of results to return. Defaults to 5."),
|
|
117
|
+
fromDate: zod_1.z.string().optional().describe("Return only chunks indexed on or after this date. ISO 8601 format, e.g. '2026-02-01' or '2026-02-20T15:00:00Z'. Optional."),
|
|
118
|
+
toDate: zod_1.z.string().optional().describe("Return only chunks indexed on or before this date. ISO 8601 format, e.g. '2026-02-20'. A date-only value is treated as end-of-day UTC. Optional."),
|
|
117
119
|
};
|
|
118
120
|
const getSessionChunksSchema = {
|
|
119
121
|
sessionUrl: zod_1.z.string().min(1).describe("The session message URL from a query_sessions result (e.g. 'session://ses_xxx#msg_yyy')."),
|
|
@@ -123,7 +125,26 @@ const getSessionChunksSchema = {
|
|
|
123
125
|
// Cast server to any to avoid deep MCP SDK Zod type instantiation (TS2589)
|
|
124
126
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
125
127
|
const serverAny = server;
|
|
126
|
-
serverAny.tool("query_sessions", "Semantically search across all indexed sessions stored in the vector database. Returns the most relevant chunks from past sessions. Sessions from both OpenCode and Claude Code are indexed into the same shared database.", querySessionsSchema, async (args) =>
|
|
128
|
+
serverAny.tool("query_sessions", "Semantically search across all indexed sessions stored in the vector database. Returns the most relevant chunks from past sessions. Sessions from both OpenCode and Claude Code are indexed into the same shared database.", querySessionsSchema, async (args) => {
|
|
129
|
+
// Parse ISO 8601 date strings into unix milliseconds.
|
|
130
|
+
// For toDate, a date-only string (no time component) is treated as end-of-day UTC
|
|
131
|
+
// by adding 86399999ms (23:59:59.999).
|
|
132
|
+
let fromMs;
|
|
133
|
+
let toMs;
|
|
134
|
+
if (args.fromDate) {
|
|
135
|
+
const t = new Date(args.fromDate).getTime();
|
|
136
|
+
if (!Number.isNaN(t))
|
|
137
|
+
fromMs = t;
|
|
138
|
+
}
|
|
139
|
+
if (args.toDate) {
|
|
140
|
+
const t = new Date(args.toDate).getTime();
|
|
141
|
+
if (!Number.isNaN(t)) {
|
|
142
|
+
// If the value is a date-only string (no 'T' separator), bump to end-of-day
|
|
143
|
+
toMs = args.toDate.includes("T") ? t : t + 86399999;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return querySessionsHandler({ ...args, limit: args.limit ?? 5, fromMs, toMs });
|
|
147
|
+
});
|
|
127
148
|
serverAny.tool("get_session_chunks", "Retrieve the ordered content chunks for a specific session message. Use the URL from query_sessions results (e.g. 'session://ses_xxx#msg_yyy') to get the full context around a match.", getSessionChunksSchema, async (args) => getSessionChunksHandler(args));
|
|
128
149
|
// ---------------------------------------------------------------------------
|
|
129
150
|
// Start
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../mcp/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../mcp/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -27,12 +27,12 @@ export declare function createSqliteProvider(deps: {
|
|
|
27
27
|
Database: new (path: string) => SqliteDatabase;
|
|
28
28
|
fs: FsModule;
|
|
29
29
|
}): {
|
|
30
|
-
querySessions: (queryEmbedding: number[], topK?: number, projectFilter?: string, sourceFilter?: string) => Promise<QueryResult[]>;
|
|
30
|
+
querySessions: (queryEmbedding: number[], topK?: number, projectFilter?: string, sourceFilter?: string, fromMs?: number, toMs?: number) => Promise<QueryResult[]>;
|
|
31
31
|
getSessionChunks: (url: string, startIndex?: number, endIndex?: number) => Promise<QueryResult[]>;
|
|
32
32
|
};
|
|
33
33
|
export declare function createToolHandlers(deps: {
|
|
34
34
|
createEmbedding: (text: string) => Promise<number[]>;
|
|
35
|
-
querySessions: (embedding: number[], topK: number, project?: string, source?: string) => Promise<QueryResult[]>;
|
|
35
|
+
querySessions: (embedding: number[], topK: number, project?: string, source?: string, fromMs?: number, toMs?: number) => Promise<QueryResult[]>;
|
|
36
36
|
getSessionChunks: (url: string, startIndex?: number, endIndex?: number) => Promise<QueryResult[]>;
|
|
37
37
|
}): {
|
|
38
38
|
querySessionsHandler: (args: {
|
|
@@ -40,6 +40,8 @@ export declare function createToolHandlers(deps: {
|
|
|
40
40
|
project?: string;
|
|
41
41
|
source?: string;
|
|
42
42
|
limit?: number;
|
|
43
|
+
fromMs?: number;
|
|
44
|
+
toMs?: number;
|
|
43
45
|
}) => Promise<{
|
|
44
46
|
content: {
|
|
45
47
|
type: "text";
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,YAAY,EAAE,WAAW,EAAE,CAAC;AAM5B,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAA;CAAE,CAAC;AAC9D,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AACF,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC;CAC1C,CAAC;AACF,KAAK,QAAQ,GAAG;IAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,CAAC;AAMvD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK,cAAc,CAAC;IAC/C,EAAE,EAAE,QAAQ,CAAC;CACd;oCAsBmB,MAAM,EAAE,iCAER,MAAM,iBACP,MAAM,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,YAAY,EAAE,WAAW,EAAE,CAAC;AAM5B,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAA;CAAE,CAAC;AAC9D,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AACF,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC;CAC1C,CAAC;AACF,KAAK,QAAQ,GAAG;IAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,CAAC;AAMvD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK,cAAc,CAAC;IAC/C,EAAE,EAAE,QAAQ,CAAC;CACd;oCAsBmB,MAAM,EAAE,iCAER,MAAM,iBACP,MAAM,WACZ,MAAM,SACR,MAAM,KACZ,OAAO,CAAC,WAAW,EAAE,CAAC;4BAoDlB,MAAM,eACE,MAAM,aACR,MAAM,KAChB,OAAO,CAAC,WAAW,EAAE,CAAC;EAwB1B;AAMD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,aAAa,EAAE,CACb,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,KACV,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5B,gBAAgB,EAAE,CAChB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC7B;iCAK2C;QACxC,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;;;;;;oCAuD4C;QAC3C,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;;;;EAwDF"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -32,14 +32,14 @@ function createSqliteProvider(deps) {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
// ---- query_sessions -------------------------------------------------------
|
|
35
|
-
async function querySessions(queryEmbedding, topK = 10, projectFilter, sourceFilter) {
|
|
35
|
+
async function querySessions(queryEmbedding, topK = 10, projectFilter, sourceFilter, fromMs, toMs) {
|
|
36
36
|
return withDb((db) => {
|
|
37
37
|
let sql = `
|
|
38
38
|
WITH knn AS (
|
|
39
39
|
SELECT
|
|
40
40
|
chunk_id, content, url, section, heading_hierarchy,
|
|
41
41
|
chunk_index, total_chunks, session_id, session_title, project,
|
|
42
|
-
distance
|
|
42
|
+
distance, created_at
|
|
43
43
|
FROM vec_items
|
|
44
44
|
WHERE embedding MATCH ?
|
|
45
45
|
AND k = ?
|
|
@@ -58,6 +58,14 @@ function createSqliteProvider(deps) {
|
|
|
58
58
|
sql += " AND m.source = ?";
|
|
59
59
|
params.push(sourceFilter);
|
|
60
60
|
}
|
|
61
|
+
if (typeof fromMs === "number") {
|
|
62
|
+
sql += " AND knn.created_at >= ?";
|
|
63
|
+
params.push(BigInt(fromMs));
|
|
64
|
+
}
|
|
65
|
+
if (typeof toMs === "number") {
|
|
66
|
+
sql += " AND knn.created_at <= ?";
|
|
67
|
+
params.push(BigInt(toMs));
|
|
68
|
+
}
|
|
61
69
|
sql += " ORDER BY distance";
|
|
62
70
|
const rows = db.prepare(sql).all(...params);
|
|
63
71
|
rows.forEach((r) => {
|
|
@@ -100,7 +108,7 @@ function createToolHandlers(deps) {
|
|
|
100
108
|
console.error(`[query_sessions] text="${args.queryText}" project="${args.project ?? "any"}" source="${args.source ?? "any"}" limit=${limit}`);
|
|
101
109
|
try {
|
|
102
110
|
const embedding = await createEmbedding(args.queryText);
|
|
103
|
-
const results = await querySessions(embedding, limit, args.project, args.source);
|
|
111
|
+
const results = await querySessions(embedding, limit, args.project, args.source, args.fromMs, args.toMs);
|
|
104
112
|
if (results.length === 0) {
|
|
105
113
|
return {
|
|
106
114
|
content: [
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../mcp/server.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA2BH,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* sessions sub-commands for code-session-memory CLI
|
|
4
4
|
*
|
|
5
|
-
* sessions [list] Browse sessions (
|
|
6
|
-
* sessions list --filter Browse with filter step first
|
|
5
|
+
* sessions [list] Browse sessions (3-level tree: source → date → session)
|
|
7
6
|
* sessions print [id] Print all chunks of a session to stdout
|
|
8
|
-
* sessions print --filter Pick session interactively with filter, then print
|
|
9
7
|
* sessions delete [id] Delete a session from the DB
|
|
10
|
-
* sessions
|
|
8
|
+
* sessions purge [--days <n>] [--yes] Delete all sessions older than N days
|
|
11
9
|
*/
|
|
12
|
-
export declare function cmdSessionsList(
|
|
13
|
-
export declare function cmdSessionsPrint(sessionId?: string
|
|
14
|
-
export declare function cmdSessionsDelete(sessionId?: string
|
|
10
|
+
export declare function cmdSessionsList(): Promise<void>;
|
|
11
|
+
export declare function cmdSessionsPrint(sessionId?: string): Promise<void>;
|
|
12
|
+
export declare function cmdSessionsDelete(sessionId?: string): Promise<void>;
|
|
13
|
+
export declare function cmdSessionsPurge(args: string[]): Promise<void>;
|
|
15
14
|
export declare function cmdSessions(argv: string[]): Promise<void>;
|
|
16
15
|
//# sourceMappingURL=cli-sessions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-sessions.d.ts","sourceRoot":"","sources":["../../src/cli-sessions.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli-sessions.d.ts","sourceRoot":"","sources":["../../src/cli-sessions.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAyRH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBrD;AAqBD,wBAAsB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxE;AAqDD,wBAAsB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDzE;AAMD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFpE;AAoCD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC/D"}
|