@hyperlynq/synaptic 0.8.0 → 0.9.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 (75) hide show
  1. package/.claude-plugin/plugin.json +21 -0
  2. package/.mcp.json +8 -0
  3. package/README.md +37 -13
  4. package/build/src/cli/commit-msg.js +8 -1
  5. package/build/src/cli/commit-msg.js.map +1 -1
  6. package/build/src/cli/init.js +2 -2
  7. package/build/src/cli/init.js.map +1 -1
  8. package/build/src/cli/pre-commit.js +4 -3
  9. package/build/src/cli/pre-commit.js.map +1 -1
  10. package/build/src/cli/sync.d.ts +10 -0
  11. package/build/src/cli/sync.js +170 -0
  12. package/build/src/cli/sync.js.map +1 -0
  13. package/build/src/cli.js +5 -0
  14. package/build/src/cli.js.map +1 -1
  15. package/build/src/hooks/session-start.js +17 -1
  16. package/build/src/hooks/session-start.js.map +1 -1
  17. package/build/src/hooks/stop.js +130 -30
  18. package/build/src/hooks/stop.js.map +1 -1
  19. package/build/src/server.js +4 -0
  20. package/build/src/server.js.map +1 -1
  21. package/build/src/storage/embedder.d.ts +11 -0
  22. package/build/src/storage/embedder.js +41 -0
  23. package/build/src/storage/embedder.js.map +1 -1
  24. package/build/src/storage/git.js +11 -6
  25. package/build/src/storage/git.js.map +1 -1
  26. package/build/src/storage/markdown.js +2 -1
  27. package/build/src/storage/markdown.js.map +1 -1
  28. package/build/src/storage/paths.d.ts +2 -0
  29. package/build/src/storage/paths.js +9 -3
  30. package/build/src/storage/paths.js.map +1 -1
  31. package/build/src/storage/project.js +2 -2
  32. package/build/src/storage/project.js.map +1 -1
  33. package/build/src/storage/session.js +3 -4
  34. package/build/src/storage/session.js.map +1 -1
  35. package/build/src/storage/signals.d.ts +13 -0
  36. package/build/src/storage/signals.js +73 -0
  37. package/build/src/storage/signals.js.map +1 -0
  38. package/build/src/storage/sqlite.d.ts +7 -1
  39. package/build/src/storage/sqlite.js +86 -25
  40. package/build/src/storage/sqlite.js.map +1 -1
  41. package/build/src/storage/sync-background.d.ts +16 -0
  42. package/build/src/storage/sync-background.js +48 -0
  43. package/build/src/storage/sync-background.js.map +1 -0
  44. package/build/src/storage/sync.d.ts +40 -0
  45. package/build/src/storage/sync.js +339 -0
  46. package/build/src/storage/sync.js.map +1 -0
  47. package/build/src/storage/transcript.js +37 -13
  48. package/build/src/storage/transcript.js.map +1 -1
  49. package/build/src/tools/context-archive.js +2 -1
  50. package/build/src/tools/context-archive.js.map +1 -1
  51. package/build/src/tools/context-chain.js +1 -0
  52. package/build/src/tools/context-chain.js.map +1 -1
  53. package/build/src/tools/context-cochanges.js +1 -1
  54. package/build/src/tools/context-cochanges.js.map +1 -1
  55. package/build/src/tools/context-delete-rule.js +1 -1
  56. package/build/src/tools/context-delete-rule.js.map +1 -1
  57. package/build/src/tools/context-dna.js +19 -2
  58. package/build/src/tools/context-dna.js.map +1 -1
  59. package/build/src/tools/context-git-index.js +22 -2
  60. package/build/src/tools/context-git-index.js.map +1 -1
  61. package/build/src/tools/context-resolve-pattern.js +1 -1
  62. package/build/src/tools/context-resolve-pattern.js.map +1 -1
  63. package/build/src/tools/context-save-rule.js +2 -2
  64. package/build/src/tools/context-save-rule.js.map +1 -1
  65. package/build/src/tools/context-save.js +5 -2
  66. package/build/src/tools/context-save.js.map +1 -1
  67. package/build/src/tools/context-search.js +3 -2
  68. package/build/src/tools/context-search.js.map +1 -1
  69. package/build/src/tools/context-session.js +1 -0
  70. package/build/src/tools/context-session.js.map +1 -1
  71. package/build/src/tools/context-status.d.ts +9 -0
  72. package/build/src/tools/context-status.js +12 -1
  73. package/build/src/tools/context-status.js.map +1 -1
  74. package/hooks/hooks.json +38 -0
  75. package/package.json +4 -1
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Background sync scheduler.
3
+ * Runs push/pull every 2 minutes while the MCP server is active.
4
+ */
5
+ import { syncCycle, isSyncEnabled } from "./sync.js";
6
+ const SYNC_INTERVAL_MS = 2 * 60 * 1000; // 2 minutes
7
+ export class SyncScheduler {
8
+ index;
9
+ embedder;
10
+ timer = null;
11
+ running = false;
12
+ constructor(index, embedder) {
13
+ this.index = index;
14
+ this.embedder = embedder;
15
+ }
16
+ start() {
17
+ if (this.timer)
18
+ return;
19
+ if (!isSyncEnabled())
20
+ return;
21
+ this.timer = setInterval(() => this.tick(), SYNC_INTERVAL_MS);
22
+ this.timer.unref(); // don't keep process alive
23
+ }
24
+ stop() {
25
+ if (this.timer) {
26
+ clearInterval(this.timer);
27
+ this.timer = null;
28
+ }
29
+ }
30
+ async tick() {
31
+ if (this.running)
32
+ return; // skip if previous tick is still in progress
33
+ this.running = true;
34
+ try {
35
+ const result = await syncCycle(this.index, this.embedder);
36
+ if (result.error) {
37
+ process.stderr.write(`[synaptic-sync] ${result.error}\n`);
38
+ }
39
+ }
40
+ catch (err) {
41
+ process.stderr.write(`[synaptic-sync] tick error: ${err}\n`);
42
+ }
43
+ finally {
44
+ this.running = false;
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=sync-background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-background.js","sourceRoot":"","sources":["../../../src/storage/sync-background.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAIrD,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEpD,MAAM,OAAO,aAAa;IAKd;IACA;IALF,KAAK,GAA0C,IAAI,CAAC;IACpD,OAAO,GAAG,KAAK,CAAC;IAExB,YACU,KAAmB,EACnB,QAAkB;QADlB,UAAK,GAAL,KAAK,CAAc;QACnB,aAAQ,GAAR,QAAQ,CAAU;IACzB,CAAC;IAEJ,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,aAAa,EAAE;YAAE,OAAO;QAE7B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,2BAA2B;IACjD,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,6CAA6C;QACvE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * GitHub-based context sync engine.
3
+ *
4
+ * Each machine writes to its own JSONL file (entries/{machineId}.jsonl).
5
+ * Entry IDs are globally unique → dedup is a simple ID check.
6
+ * Embeddings are NOT synced — regenerated locally on pull.
7
+ */
8
+ import type { ContextIndex } from "./sqlite.js";
9
+ import type { Embedder } from "./embedder.js";
10
+ export interface SyncConfig {
11
+ machineId: string;
12
+ machineName: string;
13
+ repoName: string;
14
+ repoOwner: string;
15
+ enabled: boolean;
16
+ }
17
+ export interface SyncState {
18
+ config: SyncConfig;
19
+ lastPushAt: string | null;
20
+ lastPullAt: string | null;
21
+ remoteCursors: Record<string, number>;
22
+ }
23
+ export declare function readSyncState(): SyncState | null;
24
+ export declare function writeSyncState(state: SyncState): void;
25
+ export declare function isSyncEnabled(): boolean;
26
+ export declare function pushEntries(index: ContextIndex, state: SyncState): Promise<{
27
+ pushed: number;
28
+ }>;
29
+ export declare function pullEntries(index: ContextIndex, embedder: Embedder, state: SyncState): Promise<{
30
+ pulled: number;
31
+ machines: string[];
32
+ }>;
33
+ export declare function syncCycle(index: ContextIndex, embedder: Embedder): Promise<{
34
+ pushed: number;
35
+ pulled: number;
36
+ error?: string;
37
+ }>;
38
+ export declare function ensureSyncRepo(owner: string, repoName: string): Promise<void>;
39
+ export declare function registerMachine(owner: string, repoName: string, machineId: string, machineName: string): Promise<void>;
40
+ export declare function getGhUsername(): Promise<string>;
@@ -0,0 +1,339 @@
1
+ /**
2
+ * GitHub-based context sync engine.
3
+ *
4
+ * Each machine writes to its own JSONL file (entries/{machineId}.jsonl).
5
+ * Entry IDs are globally unique → dedup is a simple ID check.
6
+ * Embeddings are NOT synced — regenerated locally on pull.
7
+ */
8
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
9
+ import { execFile } from "node:child_process";
10
+ import { promisify } from "node:util";
11
+ import { SYNC_STATE_PATH, SYNC_DIR } from "./paths.js";
12
+ import { join } from "node:path";
13
+ const execFileAsync = promisify(execFile);
14
+ const GH_TIMEOUT = 15_000; // 15s for each gh call
15
+ // --- State management ---
16
+ export function readSyncState() {
17
+ try {
18
+ if (!existsSync(SYNC_STATE_PATH))
19
+ return null;
20
+ const raw = readFileSync(SYNC_STATE_PATH, "utf-8");
21
+ return JSON.parse(raw);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ export function writeSyncState(state) {
28
+ writeFileSync(SYNC_STATE_PATH, JSON.stringify(state, null, 2), "utf-8");
29
+ }
30
+ export function isSyncEnabled() {
31
+ const state = readSyncState();
32
+ if (!state?.config.enabled)
33
+ return false;
34
+ // Check gh is available
35
+ try {
36
+ const { execFileSync } = require("node:child_process");
37
+ execFileSync("gh", ["auth", "status"], { timeout: 5000, stdio: "pipe" });
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ // --- GitHub helpers ---
45
+ async function execGh(args) {
46
+ const { stdout } = await execFileAsync("gh", args, {
47
+ timeout: GH_TIMEOUT,
48
+ maxBuffer: 10 * 1024 * 1024, // 10MB for large JSONL files
49
+ });
50
+ return stdout;
51
+ }
52
+ function repoSlug(state) {
53
+ return `${state.config.repoOwner}/${state.config.repoName}`;
54
+ }
55
+ // --- Push ---
56
+ export async function pushEntries(index, state) {
57
+ const { machineId } = state.config;
58
+ const remotePath = `entries/${machineId}.jsonl`;
59
+ const localCache = join(SYNC_DIR, `${machineId}.jsonl`);
60
+ // Query entries newer than lastPushAt
61
+ const allEntries = state.lastPushAt
62
+ ? index.list({ includeArchived: false }).filter(e => {
63
+ const entryTs = new Date(`${e.date}T${e.time}:00`).toISOString();
64
+ return entryTs > state.lastPushAt;
65
+ })
66
+ : index.list({ includeArchived: false });
67
+ if (allEntries.length === 0) {
68
+ return { pushed: 0 };
69
+ }
70
+ // Convert to syncable format
71
+ const newLines = allEntries.map(e => JSON.stringify(toSyncable(e)));
72
+ // Read existing local cache (to append)
73
+ let existingContent = "";
74
+ if (existsSync(localCache)) {
75
+ existingContent = readFileSync(localCache, "utf-8");
76
+ }
77
+ // Deduplicate: parse existing IDs from cache
78
+ const existingIds = new Set();
79
+ if (existingContent) {
80
+ for (const line of existingContent.split("\n")) {
81
+ if (!line.trim())
82
+ continue;
83
+ try {
84
+ const parsed = JSON.parse(line);
85
+ existingIds.add(parsed.id);
86
+ }
87
+ catch { /* skip corrupt lines */ }
88
+ }
89
+ }
90
+ // Only append truly new entries
91
+ const deduped = newLines.filter(line => {
92
+ try {
93
+ const parsed = JSON.parse(line);
94
+ return !existingIds.has(parsed.id);
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ });
100
+ if (deduped.length === 0) {
101
+ return { pushed: 0 };
102
+ }
103
+ const updatedContent = existingContent + deduped.join("\n") + "\n";
104
+ // Write local cache
105
+ writeFileSync(localCache, updatedContent, "utf-8");
106
+ // Upload to GitHub
107
+ const contentB64 = Buffer.from(updatedContent).toString("base64");
108
+ // Get current file SHA (if exists) for update
109
+ let sha;
110
+ try {
111
+ const fileInfo = await execGh([
112
+ "api", `repos/${repoSlug(state)}/contents/${remotePath}`,
113
+ "--jq", ".sha",
114
+ ]);
115
+ sha = fileInfo.trim();
116
+ }
117
+ catch {
118
+ // File doesn't exist yet — will create
119
+ }
120
+ const body = {
121
+ message: `sync: ${machineId} +${deduped.length} entries`,
122
+ content: contentB64,
123
+ };
124
+ if (sha)
125
+ body.sha = sha;
126
+ await execGh([
127
+ "api", `repos/${repoSlug(state)}/contents/${remotePath}`,
128
+ "-X", "PUT",
129
+ "-f", `message=${body.message}`,
130
+ "-f", `content=${body.content}`,
131
+ ...(sha ? ["-f", `sha=${sha}`] : []),
132
+ ]);
133
+ // Update state
134
+ state.lastPushAt = new Date().toISOString();
135
+ writeSyncState(state);
136
+ return { pushed: deduped.length };
137
+ }
138
+ // --- Pull ---
139
+ export async function pullEntries(index, embedder, state) {
140
+ const { machineId } = state.config;
141
+ let totalPulled = 0;
142
+ const machinesSeen = [];
143
+ // List remote entry files
144
+ let remoteFiles;
145
+ try {
146
+ const raw = await execGh([
147
+ "api", `repos/${repoSlug(state)}/contents/entries`,
148
+ "--jq", "[.[] | {name: .name}]",
149
+ ]);
150
+ remoteFiles = JSON.parse(raw);
151
+ }
152
+ catch {
153
+ // entries/ dir doesn't exist yet
154
+ return { pulled: 0, machines: [] };
155
+ }
156
+ for (const file of remoteFiles) {
157
+ // Skip our own file
158
+ const remoteMachineId = file.name.replace(".jsonl", "");
159
+ if (remoteMachineId === machineId)
160
+ continue;
161
+ machinesSeen.push(remoteMachineId);
162
+ // Download file content
163
+ let content;
164
+ try {
165
+ const raw = await execGh([
166
+ "api", `repos/${repoSlug(state)}/contents/entries/${file.name}`,
167
+ "--jq", ".content",
168
+ ]);
169
+ content = Buffer.from(raw.trim(), "base64").toString("utf-8");
170
+ }
171
+ catch {
172
+ continue; // skip this machine's file
173
+ }
174
+ const lines = content.split("\n").filter(l => l.trim());
175
+ const cursor = state.remoteCursors[remoteMachineId] ?? 0;
176
+ // Skip already-processed lines
177
+ const newLines = lines.slice(cursor);
178
+ if (newLines.length === 0)
179
+ continue;
180
+ for (const line of newLines) {
181
+ let entry;
182
+ try {
183
+ entry = JSON.parse(line);
184
+ }
185
+ catch {
186
+ continue; // skip corrupt line
187
+ }
188
+ // Dedup check
189
+ if (index.hasEntry(entry.id))
190
+ continue;
191
+ // Insert entry
192
+ const contextEntry = fromSyncable(entry);
193
+ const rowid = index.insert(contextEntry);
194
+ // Generate embedding locally
195
+ try {
196
+ const embedding = await embedder.embed(contextEntry.content);
197
+ index.insertVec(rowid, embedding);
198
+ }
199
+ catch {
200
+ // Embedding failure is non-fatal
201
+ }
202
+ totalPulled++;
203
+ }
204
+ // Update cursor
205
+ state.remoteCursors[remoteMachineId] = lines.length;
206
+ }
207
+ // Update state
208
+ state.lastPullAt = new Date().toISOString();
209
+ writeSyncState(state);
210
+ return { pulled: totalPulled, machines: machinesSeen };
211
+ }
212
+ // --- Full sync cycle ---
213
+ export async function syncCycle(index, embedder) {
214
+ const state = readSyncState();
215
+ if (!state?.config.enabled) {
216
+ return { pushed: 0, pulled: 0, error: "sync not enabled" };
217
+ }
218
+ let pushed = 0;
219
+ let pulled = 0;
220
+ try {
221
+ const pushResult = await pushEntries(index, state);
222
+ pushed = pushResult.pushed;
223
+ }
224
+ catch (err) {
225
+ return { pushed: 0, pulled: 0, error: `push failed: ${err}` };
226
+ }
227
+ // Re-read state after push (it was updated)
228
+ const freshState = readSyncState();
229
+ if (!freshState) {
230
+ return { pushed, pulled: 0, error: "state lost after push" };
231
+ }
232
+ try {
233
+ const pullResult = await pullEntries(index, embedder, freshState);
234
+ pulled = pullResult.pulled;
235
+ }
236
+ catch (err) {
237
+ return { pushed, pulled: 0, error: `pull failed: ${err}` };
238
+ }
239
+ return { pushed, pulled };
240
+ }
241
+ // --- Init helpers ---
242
+ export async function ensureSyncRepo(owner, repoName) {
243
+ // Check if repo exists
244
+ try {
245
+ await execGh(["repo", "view", `${owner}/${repoName}`, "--json", "name"]);
246
+ return; // already exists
247
+ }
248
+ catch {
249
+ // Doesn't exist — create it
250
+ }
251
+ await execGh([
252
+ "repo", "create", `${owner}/${repoName}`,
253
+ "--private",
254
+ "--description", "Synaptic context sync (auto-managed)",
255
+ ]);
256
+ // Create manifest.json
257
+ const manifest = JSON.stringify({ version: 1, machines: {} }, null, 2);
258
+ const manifestB64 = Buffer.from(manifest).toString("base64");
259
+ await execGh([
260
+ "api", `repos/${owner}/${repoName}/contents/manifest.json`,
261
+ "-X", "PUT",
262
+ "-f", "message=init: create manifest",
263
+ "-f", `content=${manifestB64}`,
264
+ ]);
265
+ // Create entries/ directory with .gitkeep
266
+ const gitkeepB64 = Buffer.from("").toString("base64");
267
+ await execGh([
268
+ "api", `repos/${owner}/${repoName}/contents/entries/.gitkeep`,
269
+ "-X", "PUT",
270
+ "-f", "message=init: create entries directory",
271
+ "-f", `content=${gitkeepB64}`,
272
+ ]);
273
+ }
274
+ export async function registerMachine(owner, repoName, machineId, machineName) {
275
+ // Get current manifest
276
+ let manifest;
277
+ let sha;
278
+ try {
279
+ const raw = await execGh([
280
+ "api", `repos/${owner}/${repoName}/contents/manifest.json`,
281
+ "--jq", "{content: .content, sha: .sha}",
282
+ ]);
283
+ const parsed = JSON.parse(raw);
284
+ sha = parsed.sha;
285
+ manifest = JSON.parse(Buffer.from(parsed.content, "base64").toString("utf-8"));
286
+ }
287
+ catch {
288
+ manifest = { version: 1, machines: {} };
289
+ sha = "";
290
+ }
291
+ manifest.machines[machineId] = { name: machineName };
292
+ const contentB64 = Buffer.from(JSON.stringify(manifest, null, 2)).toString("base64");
293
+ const args = [
294
+ "api", `repos/${owner}/${repoName}/contents/manifest.json`,
295
+ "-X", "PUT",
296
+ "-f", "message=sync: register machine " + machineName,
297
+ "-f", `content=${contentB64}`,
298
+ ];
299
+ if (sha)
300
+ args.push("-f", `sha=${sha}`);
301
+ await execGh(args);
302
+ }
303
+ export async function getGhUsername() {
304
+ const raw = await execGh(["api", "user", "--jq", ".login"]);
305
+ return raw.trim();
306
+ }
307
+ // --- Conversion helpers ---
308
+ function toSyncable(entry) {
309
+ return {
310
+ id: entry.id,
311
+ date: entry.date,
312
+ time: entry.time,
313
+ type: entry.type,
314
+ tags: entry.tags,
315
+ content: entry.content,
316
+ tier: entry.tier ?? "working",
317
+ pinned: entry.pinned ?? false,
318
+ project: entry.project ?? null,
319
+ sessionId: entry.sessionId ?? null,
320
+ agentId: entry.agentId ?? null,
321
+ };
322
+ }
323
+ function fromSyncable(s) {
324
+ return {
325
+ id: s.id,
326
+ date: s.date,
327
+ time: s.time,
328
+ type: s.type,
329
+ tags: s.tags,
330
+ content: s.content,
331
+ sourceFile: "sync",
332
+ tier: s.tier,
333
+ pinned: s.pinned,
334
+ project: s.project,
335
+ sessionId: s.sessionId,
336
+ agentId: s.agentId,
337
+ };
338
+ }
339
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/storage/sync.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,12 @@
3
3
  * Reads Claude Code JSONL transcript files incrementally.
4
4
  * No embedder/database dependencies — pure file I/O.
5
5
  */
6
- import { existsSync, readFileSync, writeFileSync, readdirSync, statSync } from "node:fs";
6
+ import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, openSync, readSync, fstatSync, closeSync } from "node:fs";
7
7
  import { join, sep } from "node:path";
8
8
  import { homedir } from "node:os";
9
9
  import { DB_DIR } from "./paths.js";
10
+ /** Max transcript bytes to read at once (10 MB). Prevents OOM on huge sessions. */
11
+ const MAX_TRANSCRIPT_BYTES = 10 * 1024 * 1024;
10
12
  const CURSOR_FILE = join(DB_DIR, ".transcript-cursor");
11
13
  /**
12
14
  * Convert a cwd path to a Claude project directory path.
@@ -101,16 +103,27 @@ export function extractTextContent(content) {
101
103
  export function readToolUseActions(filePath, byteOffset) {
102
104
  const actions = [];
103
105
  let buf;
106
+ let fileSize;
104
107
  try {
105
- buf = readFileSync(filePath);
108
+ const fd = openSync(filePath, "r");
109
+ try {
110
+ fileSize = fstatSync(fd).size;
111
+ if (byteOffset >= fileSize) {
112
+ return { actions, newOffset: fileSize };
113
+ }
114
+ const readLength = Math.min(fileSize - byteOffset, MAX_TRANSCRIPT_BYTES);
115
+ buf = Buffer.alloc(readLength);
116
+ readSync(fd, buf, 0, readLength, byteOffset);
117
+ }
118
+ finally {
119
+ closeSync(fd);
120
+ }
106
121
  }
107
122
  catch {
108
123
  return { actions, newOffset: byteOffset };
109
124
  }
110
- if (byteOffset >= buf.length) {
111
- return { actions, newOffset: buf.length };
112
- }
113
- const chunk = buf.subarray(byteOffset).toString("utf-8");
125
+ const chunk = buf.toString("utf-8");
126
+ const newOffset = Math.min(byteOffset + buf.length, fileSize);
114
127
  const lines = chunk.split("\n");
115
128
  for (const line of lines) {
116
129
  const trimmed = line.trim();
@@ -143,7 +156,7 @@ export function readToolUseActions(filePath, byteOffset) {
143
156
  }
144
157
  }
145
158
  }
146
- return { actions, newOffset: buf.length };
159
+ return { actions, newOffset };
147
160
  }
148
161
  /**
149
162
  * Read new messages from a JSONL transcript file starting at a byte offset.
@@ -153,16 +166,27 @@ export function readToolUseActions(filePath, byteOffset) {
153
166
  export function readNewMessages(filePath, byteOffset) {
154
167
  const messages = [];
155
168
  let buf;
169
+ let fileSize;
156
170
  try {
157
- buf = readFileSync(filePath);
171
+ const fd = openSync(filePath, "r");
172
+ try {
173
+ fileSize = fstatSync(fd).size;
174
+ if (byteOffset >= fileSize) {
175
+ return { messages, newOffset: fileSize };
176
+ }
177
+ const readLength = Math.min(fileSize - byteOffset, MAX_TRANSCRIPT_BYTES);
178
+ buf = Buffer.alloc(readLength);
179
+ readSync(fd, buf, 0, readLength, byteOffset);
180
+ }
181
+ finally {
182
+ closeSync(fd);
183
+ }
158
184
  }
159
185
  catch {
160
186
  return { messages, newOffset: byteOffset };
161
187
  }
162
- if (byteOffset >= buf.length) {
163
- return { messages, newOffset: buf.length };
164
- }
165
- const chunk = buf.subarray(byteOffset).toString("utf-8");
188
+ const chunk = buf.toString("utf-8");
189
+ const newOffset = Math.min(byteOffset + buf.length, fileSize);
166
190
  const lines = chunk.split("\n");
167
191
  for (const line of lines) {
168
192
  const trimmed = line.trim();
@@ -201,6 +225,6 @@ export function readNewMessages(filePath, byteOffset) {
201
225
  messages.push({ role: "assistant", text });
202
226
  }
203
227
  }
204
- return { messages, newOffset: buf.length };
228
+ return { messages, newOffset };
205
229
  }
206
230
  //# sourceMappingURL=transcript.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/storage/transcript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/storage/transcript.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { z } from "zod";
2
2
  export const contextArchiveSchema = {
3
3
  ids: z
4
- .array(z.string())
4
+ .array(z.string().max(200))
5
5
  .min(1)
6
+ .max(500)
6
7
  .describe("Entry IDs to archive"),
7
8
  };
8
9
  export function contextArchive(args, index) {
@@ -1 +1 @@
1
- {"version":3,"file":"context-archive.js","sourceRoot":"","sources":["../../../src/tools/context-archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC;SACH,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,sBAAsB,CAAC;CACpC,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,KAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,GAAG,QAAQ,EAAE,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"context-archive.js","sourceRoot":"","sources":["../../../src/tools/context-archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC;SACH,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,sBAAsB,CAAC;CACpC,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,KAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,GAAG,QAAQ,EAAE,CAAC;AACxD,CAAC"}
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  export const contextChainSchema = {
3
3
  chain_id: z
4
4
  .string()
5
+ .max(200)
5
6
  .describe("The chain ID to retrieve (e.g., 'a1b2c3d4' — without the 'chain:' prefix)"),
6
7
  };
7
8
  export function contextChain(args, index) {
@@ -1 +1 @@
1
- {"version":3,"file":"context-chain.js","sourceRoot":"","sources":["../../../src/tools/context-chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,2EAA2E,CAAC;CACzF,CAAC;AAEF,MAAM,UAAU,YAAY,CAC1B,IAA0B,EAC1B,KAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,QAAQ;QACf,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;IAE7B,+EAA+E;IAC/E,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;QACH,KAAK,EAAE,YAAY,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context-chain.js","sourceRoot":"","sources":["../../../src/tools/context-chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,2EAA2E,CAAC;CACzF,CAAC;AAEF,MAAM,UAAU,YAAY,CAC1B,IAA0B,EAC1B,KAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,QAAQ;QACf,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;IAE7B,+EAA+E;IAC/E,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;QACH,KAAK,EAAE,YAAY,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { getCurrentProject } from "../server.js";
3
3
  export const contextCochangesSchema = {
4
- file: z.string().describe("File path to look up co-changes for"),
4
+ file: z.string().max(500).describe("File path to look up co-changes for"),
5
5
  project: z
6
6
  .string()
7
7
  .optional()
@@ -1 +1 @@
1
- {"version":3,"file":"context-cochanges.js","sourceRoot":"","sources":["../../../src/tools/context-cochanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAChE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,2BAA2B,CAAC;CACzC,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,IAAwD,EACxD,KAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"context-cochanges.js","sourceRoot":"","sources":["../../../src/tools/context-cochanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACzE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,2BAA2B,CAAC;CACzC,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,IAAwD,EACxD,KAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACjD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  export const contextDeleteRuleSchema = {
3
- label: z.string().describe("Label of the rule to delete"),
3
+ label: z.string().max(200).describe("Label of the rule to delete"),
4
4
  };
5
5
  export function contextDeleteRule(args, index) {
6
6
  const deleted = index.deleteRule(args.label);
@@ -1 +1 @@
1
- {"version":3,"file":"context-delete-rule.js","sourceRoot":"","sources":["../../../src/tools/context-delete-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAC1D,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,IAAuB,EACvB,KAAmB;IAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context-delete-rule.js","sourceRoot":"","sources":["../../../src/tools/context-delete-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CACnE,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,IAAuB,EACvB,KAAmB;IAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC"}