sandstream-kit 1.1.0 → 1.2.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/dist/check-web-search.js +37 -6
- package/dist/check-web-search.js.map +1 -1
- package/dist/cli.js +69 -7
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/memory/codex.d.ts +5 -0
- package/dist/memory/codex.js +150 -0
- package/dist/memory/codex.js.map +1 -0
- package/dist/memory/continue.d.ts +5 -0
- package/dist/memory/continue.js +116 -0
- package/dist/memory/continue.js.map +1 -0
- package/dist/memory/db.d.ts +12 -1
- package/dist/memory/db.js +43 -1
- package/dist/memory/db.js.map +1 -1
- package/dist/memory/gemini.d.ts +5 -0
- package/dist/memory/gemini.js +176 -0
- package/dist/memory/gemini.js.map +1 -0
- package/dist/memory/hook.d.ts +9 -0
- package/dist/memory/hook.js +34 -1
- package/dist/memory/hook.js.map +1 -1
- package/dist/memory/install.js +1 -0
- package/dist/memory/install.js.map +1 -1
- package/dist/memory/merge.d.ts +18 -0
- package/dist/memory/merge.js +109 -0
- package/dist/memory/merge.js.map +1 -0
- package/dist/memory/parser.d.ts +9 -0
- package/dist/memory/parser.js +34 -3
- package/dist/memory/parser.js.map +1 -1
- package/dist/status.d.ts +9 -0
- package/dist/status.js +119 -0
- package/dist/status.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit memory — Gemini CLI transcript parser (multi-harness).
|
|
3
|
+
*
|
|
4
|
+
* Gemini CLI persists conversation state under ~/.gemini/tmp/<projectHash>/ via a
|
|
5
|
+
* few mechanisms. Formats verified against the google-gemini/gemini-cli source:
|
|
6
|
+
* - logs.json — a JSON array of LogEntry records
|
|
7
|
+
* { sessionId, messageId, timestamp, type, message }
|
|
8
|
+
* - checkpoint files — either { history: Content[] } (modern) or a bare
|
|
9
|
+
* Content[] (legacy), where Content = { role: 'user'|'model', parts:[{text}] }
|
|
10
|
+
*
|
|
11
|
+
* We index user + model turns from whichever are present, tag harness="gemini",
|
|
12
|
+
* synthesize stable uuids (idempotent), and STRUCTURALLY skip non-conversation
|
|
13
|
+
* JSON (e.g. file-snapshot checkpoints whose shape isn't Content[]). RAW +
|
|
14
|
+
* deterministic; no model calls.
|
|
15
|
+
*
|
|
16
|
+
* Limitation: Gemini keys directories by a one-way projectHash, so the real repo
|
|
17
|
+
* path isn't recoverable — Gemini messages carry no cwd and surface in `--global`
|
|
18
|
+
* recall rather than project-scoped search.
|
|
19
|
+
*/
|
|
20
|
+
import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
|
|
21
|
+
import { homedir } from "node:os";
|
|
22
|
+
import { join, basename } from "node:path";
|
|
23
|
+
import { insertMessage, upsertSession, isFileIndexed, markFileIndexed } from "./db.js";
|
|
24
|
+
export function getGeminiTmpDir() {
|
|
25
|
+
const base = process.env.KIT_GEMINI_DIR ?? join(homedir(), ".gemini");
|
|
26
|
+
return join(base, "tmp");
|
|
27
|
+
}
|
|
28
|
+
function partsText(parts) {
|
|
29
|
+
if (!Array.isArray(parts))
|
|
30
|
+
return "";
|
|
31
|
+
return parts
|
|
32
|
+
.map((p) => p?.text ?? "")
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.join("\n");
|
|
35
|
+
}
|
|
36
|
+
/** Coerce a parsed checkpoint to Content[], or null if it isn't a conversation. */
|
|
37
|
+
function asHistory(parsed) {
|
|
38
|
+
if (Array.isArray(parsed)) {
|
|
39
|
+
const looksLikeContent = parsed.every((x) => x !== null && typeof x === "object" && ("role" in x || "parts" in x));
|
|
40
|
+
return looksLikeContent ? parsed : null;
|
|
41
|
+
}
|
|
42
|
+
if (parsed !== null && typeof parsed === "object") {
|
|
43
|
+
const h = parsed.history;
|
|
44
|
+
if (Array.isArray(h))
|
|
45
|
+
return h;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/** Map a Gemini role/sender to the store's user|assistant. */
|
|
50
|
+
function roleOf(raw) {
|
|
51
|
+
return raw === "user" ? "user" : "assistant"; // 'model'/'gemini'/etc → assistant
|
|
52
|
+
}
|
|
53
|
+
function indexLogs(db, filepath) {
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = JSON.parse(readFileSync(filepath, "utf8"));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { messages: 0 };
|
|
60
|
+
}
|
|
61
|
+
if (!Array.isArray(parsed))
|
|
62
|
+
return { messages: 0 };
|
|
63
|
+
let messages = 0;
|
|
64
|
+
let idx = 0;
|
|
65
|
+
for (const entry of parsed) {
|
|
66
|
+
const text = typeof entry?.message === "string" ? entry.message : "";
|
|
67
|
+
if (!text)
|
|
68
|
+
continue;
|
|
69
|
+
const sessionId = `gemini:${entry.sessionId ?? basename(filepath)}`;
|
|
70
|
+
upsertSession(db, { sessionId, harness: "gemini" });
|
|
71
|
+
const added = insertMessage(db, {
|
|
72
|
+
uuid: `gemini:log:${entry.sessionId ?? basename(filepath)}:${entry.messageId ?? idx}`,
|
|
73
|
+
sessionId,
|
|
74
|
+
type: roleOf(entry.type),
|
|
75
|
+
role: roleOf(entry.type),
|
|
76
|
+
content: text,
|
|
77
|
+
timestamp: entry.timestamp,
|
|
78
|
+
});
|
|
79
|
+
idx++;
|
|
80
|
+
if (added)
|
|
81
|
+
messages++;
|
|
82
|
+
}
|
|
83
|
+
return { messages };
|
|
84
|
+
}
|
|
85
|
+
function indexCheckpoint(db, filepath) {
|
|
86
|
+
let parsed;
|
|
87
|
+
try {
|
|
88
|
+
parsed = JSON.parse(readFileSync(filepath, "utf8"));
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return { messages: 0 };
|
|
92
|
+
}
|
|
93
|
+
const history = asHistory(parsed);
|
|
94
|
+
if (!history)
|
|
95
|
+
return { messages: 0 }; // not a conversation checkpoint — skip
|
|
96
|
+
const sessionId = `gemini-ckpt:${basename(filepath, ".json")}`;
|
|
97
|
+
upsertSession(db, { sessionId, harness: "gemini" });
|
|
98
|
+
let messages = 0;
|
|
99
|
+
history.forEach((c, idx) => {
|
|
100
|
+
if (c?.role !== "user" && c?.role !== "model")
|
|
101
|
+
return; // skip non-turn entries
|
|
102
|
+
const text = partsText(c.parts);
|
|
103
|
+
if (!text)
|
|
104
|
+
return;
|
|
105
|
+
const added = insertMessage(db, {
|
|
106
|
+
uuid: `gemini:ckpt:${basename(filepath)}:${idx}`,
|
|
107
|
+
sessionId,
|
|
108
|
+
type: roleOf(c.role),
|
|
109
|
+
role: roleOf(c.role),
|
|
110
|
+
content: text,
|
|
111
|
+
});
|
|
112
|
+
if (added)
|
|
113
|
+
messages++;
|
|
114
|
+
});
|
|
115
|
+
return { messages };
|
|
116
|
+
}
|
|
117
|
+
function* walkGeminiFiles(tmpDir) {
|
|
118
|
+
let hashes;
|
|
119
|
+
try {
|
|
120
|
+
hashes = readdirSync(tmpDir, { withFileTypes: true });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
for (const h of hashes) {
|
|
126
|
+
if (!h.isDirectory())
|
|
127
|
+
continue;
|
|
128
|
+
const projDir = join(tmpDir, h.name);
|
|
129
|
+
const logs = join(projDir, "logs.json");
|
|
130
|
+
if (existsSync(logs))
|
|
131
|
+
yield { path: logs, kind: "logs" };
|
|
132
|
+
// checkpoint JSON lives at the project root and/or in a checkpoints/ subdir
|
|
133
|
+
for (const dir of [projDir, join(projDir, "checkpoints")]) {
|
|
134
|
+
let entries;
|
|
135
|
+
try {
|
|
136
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
for (const e of entries) {
|
|
142
|
+
if (e.isFile() && e.name.endsWith(".json") && e.name !== "logs.json") {
|
|
143
|
+
yield { path: join(dir, e.name), kind: "checkpoint" };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Walk ~/.gemini/tmp and index every conversation log/checkpoint. Idempotent + incremental. */
|
|
150
|
+
export function indexGeminiSessions(db) {
|
|
151
|
+
const tmpDir = getGeminiTmpDir();
|
|
152
|
+
const result = { files: 0, sessions: 0, messages: 0, toolUses: 0, filesSkipped: 0 };
|
|
153
|
+
if (!existsSync(tmpDir))
|
|
154
|
+
return result;
|
|
155
|
+
for (const f of walkGeminiFiles(tmpDir)) {
|
|
156
|
+
let st;
|
|
157
|
+
try {
|
|
158
|
+
st = statSync(f.path);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const mtimeMs = Math.floor(st.mtimeMs);
|
|
164
|
+
if (isFileIndexed(db, f.path, mtimeMs, st.size)) {
|
|
165
|
+
result.filesSkipped++;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const counts = f.kind === "logs" ? indexLogs(db, f.path) : indexCheckpoint(db, f.path);
|
|
169
|
+
markFileIndexed(db, f.path, mtimeMs, st.size);
|
|
170
|
+
result.files++;
|
|
171
|
+
result.sessions++;
|
|
172
|
+
result.messages += counts.messages;
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/memory/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGvF,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAcD,SAAS,SAAS,CAAC,KAAsC;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;SACzB,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,mFAAmF;AACnF,SAAS,SAAS,CAAC,MAAe;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAC5E,CAAC;QACF,OAAO,gBAAgB,CAAC,CAAC,CAAE,MAA0B,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,GAAI,MAAkC,CAAC,OAAO,CAAC;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAoB,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8DAA8D;AAC9D,SAAS,MAAM,CAAC,GAAuB;IACrC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,mCAAmC;AACnF,CAAC;AAED,SAAS,SAAS,CAAC,EAAgB,EAAE,QAAgB;IACnD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAEnD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,MAAoB,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,SAAS,GAAG,UAAU,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpE,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE;YAC9B,IAAI,EAAE,cAAc,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE;YACrF,SAAS;YACT,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;QACN,IAAI,KAAK;YAAE,QAAQ,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,eAAe,CAAC,EAAgB,EAAE,QAAgB;IACzD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,uCAAuC;IAE7E,MAAM,SAAS,GAAG,eAAe,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;IAC/D,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,CAAC,wBAAwB;QAC/E,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE;YAC9B,IAAI,EAAE,eAAe,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE;YAChD,SAAS;YACT,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,QAAQ,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAOD,QAAQ,CAAC,CAAC,eAAe,CAAC,MAAc;IACtC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,SAAS;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzD,4EAA4E;QAC5E,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACrE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,mBAAmB,CAAC,EAAgB;IAClD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,MAAM,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACjG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,YAAY,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvF,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/memory/hook.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
/** Reminder injected before every prompt. Empty string on any error (fail-open). */
|
|
2
2
|
export declare function userPromptSubmitReminder(): string;
|
|
3
|
+
/**
|
|
4
|
+
* SessionStart recovery — re-inject "where you left off" for THIS project after a
|
|
5
|
+
* resume/compact, so the agent regains continuity instead of starting blank. Pulls
|
|
6
|
+
* the most recent messages + open action items from the store. FAIL-OPEN and
|
|
7
|
+
* deterministic: empty string on any error or when there's nothing to recover.
|
|
8
|
+
*/
|
|
9
|
+
export declare function sessionStartRecovery(opts?: {
|
|
10
|
+
limit?: number;
|
|
11
|
+
}): string;
|
|
3
12
|
/** Index the just-ended session. Returns count of newly indexed messages (fail-open). */
|
|
4
13
|
export declare function runSessionEndIndex(): {
|
|
5
14
|
messages: number;
|
package/dist/memory/hook.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* block a prompt or break a session. Deterministic, zero model calls.
|
|
10
10
|
*/
|
|
11
11
|
import { basename } from "node:path";
|
|
12
|
-
import { openMemoryDb, getStats } from "./db.js";
|
|
12
|
+
import { openMemoryDb, getStats, recentMessages } from "./db.js";
|
|
13
13
|
import { indexClaudeTranscripts } from "./parser.js";
|
|
14
14
|
import { palList } from "./pal.js";
|
|
15
15
|
import { getCurrentProjectRoot } from "./project.js";
|
|
@@ -36,6 +36,39 @@ export function userPromptSubmitReminder() {
|
|
|
36
36
|
return ""; // fail-open: never block a prompt
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* SessionStart recovery — re-inject "where you left off" for THIS project after a
|
|
41
|
+
* resume/compact, so the agent regains continuity instead of starting blank. Pulls
|
|
42
|
+
* the most recent messages + open action items from the store. FAIL-OPEN and
|
|
43
|
+
* deterministic: empty string on any error or when there's nothing to recover.
|
|
44
|
+
*/
|
|
45
|
+
export function sessionStartRecovery(opts = {}) {
|
|
46
|
+
try {
|
|
47
|
+
const db = openMemoryDb();
|
|
48
|
+
const root = getCurrentProjectRoot();
|
|
49
|
+
const recent = recentMessages(db, { projectPath: root, limit: opts.limit ?? 6 });
|
|
50
|
+
const openItems = palList(db, { scope: basename(root) });
|
|
51
|
+
db.close();
|
|
52
|
+
if (recent.length === 0 && openItems.length === 0)
|
|
53
|
+
return "";
|
|
54
|
+
const lines = [`Picking up in ${basename(root)} — recent memory (newest first):`];
|
|
55
|
+
for (const m of recent) {
|
|
56
|
+
const who = m.role === "assistant" ? "assistant" : "you";
|
|
57
|
+
const text = (m.content ?? "").replace(/\s+/g, " ").trim().slice(0, 200);
|
|
58
|
+
if (text)
|
|
59
|
+
lines.push(` · ${who}: ${text}`);
|
|
60
|
+
}
|
|
61
|
+
if (openItems.length > 0) {
|
|
62
|
+
const titles = openItems.slice(0, 3).map((p) => `${p.id} ${p.title}`).join("; ");
|
|
63
|
+
lines.push(`Open action items blocked on you: ${titles}${openItems.length > 3 ? " …" : ""}.`);
|
|
64
|
+
}
|
|
65
|
+
lines.push("Run `kit memory search <terms>` to pull more of what was actually said.");
|
|
66
|
+
return lines.join("\n");
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return ""; // fail-open: never block a session start
|
|
70
|
+
}
|
|
71
|
+
}
|
|
39
72
|
/** Index the just-ended session. Returns count of newly indexed messages (fail-open). */
|
|
40
73
|
export function runSessionEndIndex() {
|
|
41
74
|
try {
|
package/dist/memory/hook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/memory/hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/memory/hook.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/install.js
CHANGED
|
@@ -11,6 +11,7 @@ import { join, dirname } from "node:path";
|
|
|
11
11
|
const MEMORY_HOOKS = [
|
|
12
12
|
{ event: "UserPromptSubmit", command: "kit memory hook user-prompt-submit" },
|
|
13
13
|
{ event: "SessionEnd", command: "kit memory hook session-end" },
|
|
14
|
+
{ event: "SessionStart", command: "kit memory hook session-start" },
|
|
14
15
|
];
|
|
15
16
|
export function getClaudeSettingsPath() {
|
|
16
17
|
return process.env.KIT_CLAUDE_SETTINGS ?? join(homedir(), ".claude", "settings.json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/memory/install.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,YAAY,GAAyC;IACzD,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,oCAAoC,EAAE;IAC5E,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,6BAA6B,EAAE;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/memory/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit memory — merge another store into this one.
|
|
3
|
+
*
|
|
4
|
+
* Consolidate memory across machines (a server, an old laptop) into one brain.
|
|
5
|
+
* Idempotent: messages dedupe by uuid, sessions/pending/threads by their keys, and
|
|
6
|
+
* a message's tool_uses are copied only when the message itself is newly added, so
|
|
7
|
+
* re-merging the same source adds nothing. `file_index` is NOT merged (it tracks
|
|
8
|
+
* machine-local file paths). Deterministic; no model calls.
|
|
9
|
+
*/
|
|
10
|
+
import { DatabaseSync } from "node:sqlite";
|
|
11
|
+
export interface MergeResult {
|
|
12
|
+
sessions: number;
|
|
13
|
+
messages: number;
|
|
14
|
+
toolUses: number;
|
|
15
|
+
pending: number;
|
|
16
|
+
threads: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function mergeDb(target: DatabaseSync, sourcePath: string): MergeResult;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kit memory — merge another store into this one.
|
|
3
|
+
*
|
|
4
|
+
* Consolidate memory across machines (a server, an old laptop) into one brain.
|
|
5
|
+
* Idempotent: messages dedupe by uuid, sessions/pending/threads by their keys, and
|
|
6
|
+
* a message's tool_uses are copied only when the message itself is newly added, so
|
|
7
|
+
* re-merging the same source adds nothing. `file_index` is NOT merged (it tracks
|
|
8
|
+
* machine-local file paths). Deterministic; no model calls.
|
|
9
|
+
*/
|
|
10
|
+
import { DatabaseSync } from "node:sqlite";
|
|
11
|
+
import { existsSync } from "node:fs";
|
|
12
|
+
import { insertMessage, insertToolUse, upsertSession } from "./db.js";
|
|
13
|
+
const str = (v) => (typeof v === "string" && v ? v : undefined);
|
|
14
|
+
const num = (v) => (typeof v === "number" ? v : undefined);
|
|
15
|
+
export function mergeDb(target, sourcePath) {
|
|
16
|
+
if (!existsSync(sourcePath))
|
|
17
|
+
throw new Error(`source memory db not found: ${sourcePath}`);
|
|
18
|
+
const src = new DatabaseSync(sourcePath, { readOnly: true });
|
|
19
|
+
const out = { sessions: 0, messages: 0, toolUses: 0, pending: 0, threads: 0 };
|
|
20
|
+
try {
|
|
21
|
+
// Sessions
|
|
22
|
+
for (const s of src.prepare("SELECT * FROM sessions").all()) {
|
|
23
|
+
const sessionId = str(s.session_id);
|
|
24
|
+
if (!sessionId)
|
|
25
|
+
continue;
|
|
26
|
+
upsertSession(target, {
|
|
27
|
+
sessionId,
|
|
28
|
+
harness: str(s.harness) ?? "claude-code",
|
|
29
|
+
project: str(s.project),
|
|
30
|
+
firstMessageAt: str(s.first_message_at),
|
|
31
|
+
lastMessageAt: str(s.last_message_at),
|
|
32
|
+
isAgentSidechain: !!s.is_agent_sidechain,
|
|
33
|
+
});
|
|
34
|
+
out.sessions++;
|
|
35
|
+
}
|
|
36
|
+
// tool_uses grouped by message uuid (copied only for newly-added messages)
|
|
37
|
+
const toolsByUuid = new Map();
|
|
38
|
+
for (const t of src.prepare("SELECT * FROM tool_uses").all()) {
|
|
39
|
+
const uuid = str(t.message_uuid);
|
|
40
|
+
if (!uuid)
|
|
41
|
+
continue;
|
|
42
|
+
(toolsByUuid.get(uuid) ?? toolsByUuid.set(uuid, []).get(uuid)).push(t);
|
|
43
|
+
}
|
|
44
|
+
// Messages (dedupe by uuid) + their tool_uses
|
|
45
|
+
for (const m of src.prepare("SELECT * FROM messages").all()) {
|
|
46
|
+
const uuid = str(m.uuid);
|
|
47
|
+
const sessionId = str(m.session_id);
|
|
48
|
+
const type = str(m.type);
|
|
49
|
+
if (!uuid || !sessionId || !type)
|
|
50
|
+
continue; // need a stable id to dedupe
|
|
51
|
+
const added = insertMessage(target, {
|
|
52
|
+
uuid,
|
|
53
|
+
sessionId,
|
|
54
|
+
parentUuid: str(m.parent_uuid),
|
|
55
|
+
type,
|
|
56
|
+
role: str(m.role),
|
|
57
|
+
content: str(m.content),
|
|
58
|
+
model: str(m.model),
|
|
59
|
+
inputTokens: num(m.input_tokens),
|
|
60
|
+
outputTokens: num(m.output_tokens),
|
|
61
|
+
timestamp: str(m.timestamp),
|
|
62
|
+
cwd: str(m.cwd),
|
|
63
|
+
gitBranch: str(m.git_branch),
|
|
64
|
+
version: str(m.version),
|
|
65
|
+
});
|
|
66
|
+
if (!added)
|
|
67
|
+
continue;
|
|
68
|
+
out.messages++;
|
|
69
|
+
for (const t of toolsByUuid.get(uuid) ?? []) {
|
|
70
|
+
insertToolUse(target, {
|
|
71
|
+
messageUuid: uuid,
|
|
72
|
+
sessionId: str(t.session_id),
|
|
73
|
+
toolName: str(t.tool_name) ?? "unknown",
|
|
74
|
+
toolInput: str(t.tool_input),
|
|
75
|
+
timestamp: str(t.timestamp),
|
|
76
|
+
});
|
|
77
|
+
out.toolUses++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Pending actions (dedupe by id)
|
|
81
|
+
const insPending = target.prepare(`INSERT OR IGNORE INTO pending_actions
|
|
82
|
+
(id, status, title, detail, scope, kind, verify_cmd, created_at, next_check, snooze_until, closed_at, verify_passes)
|
|
83
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
84
|
+
for (const p of src.prepare("SELECT * FROM pending_actions").all()) {
|
|
85
|
+
if (!str(p.id) || !str(p.title))
|
|
86
|
+
continue;
|
|
87
|
+
const r = insPending.run(p.id, str(p.status) ?? "open", p.title, (str(p.detail) ?? null), (str(p.scope) ?? null), str(p.kind) ?? "manual", (str(p.verify_cmd) ?? null), (str(p.created_at) ?? null), (str(p.next_check) ?? null), (str(p.snooze_until) ?? null), (str(p.closed_at) ?? null), num(p.verify_passes) ?? 0);
|
|
88
|
+
if (Number(r.changes) > 0)
|
|
89
|
+
out.pending++;
|
|
90
|
+
}
|
|
91
|
+
// Saved threads (dedupe by name)
|
|
92
|
+
const insThread = target.prepare(`INSERT OR IGNORE INTO saved_threads (name, session_id, summary, project_path, saved_at)
|
|
93
|
+
VALUES (?, ?, ?, ?, ?)`);
|
|
94
|
+
for (const t of src.prepare("SELECT * FROM saved_threads").all()) {
|
|
95
|
+
const name = str(t.name);
|
|
96
|
+
const sid = str(t.session_id);
|
|
97
|
+
if (!name || !sid)
|
|
98
|
+
continue;
|
|
99
|
+
const r = insThread.run(name, sid, (str(t.summary) ?? null), (str(t.project_path) ?? null), (str(t.saved_at) ?? null));
|
|
100
|
+
if (Number(r.changes) > 0)
|
|
101
|
+
out.threads++;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
src.close();
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/memory/merge.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/parser.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface IndexResult {
|
|
|
4
4
|
sessions: number;
|
|
5
5
|
messages: number;
|
|
6
6
|
toolUses: number;
|
|
7
|
+
/** Files skipped because they were unchanged since the last index (incremental). */
|
|
8
|
+
filesSkipped: number;
|
|
7
9
|
}
|
|
8
10
|
export declare function getClaudeProjectsDir(): string;
|
|
9
11
|
interface ContentBlock {
|
|
@@ -22,4 +24,11 @@ export declare function extractToolUses(content: Content): {
|
|
|
22
24
|
}[];
|
|
23
25
|
/** Walk ~/.claude/projects and index every transcript. Idempotent. */
|
|
24
26
|
export declare function indexClaudeTranscripts(db: DatabaseSync): IndexResult;
|
|
27
|
+
/** Per-harness index results, keyed by harness name. */
|
|
28
|
+
export type HarnessResults = Record<string, IndexResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Index every supported harness's transcripts into the store. Returns per-harness
|
|
31
|
+
* counts. Adding a harness = one more parser here (Copilot, Gemini, Aider, Cursor…).
|
|
32
|
+
*/
|
|
33
|
+
export declare function indexAllHarnesses(db: DatabaseSync): HarnessResults;
|
|
25
34
|
export {};
|
package/dist/memory/parser.js
CHANGED
|
@@ -11,7 +11,10 @@
|
|
|
11
11
|
import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
|
|
12
12
|
import { homedir } from "node:os";
|
|
13
13
|
import { join, basename } from "node:path";
|
|
14
|
-
import { insertMessage, insertToolUse, upsertSession } from "./db.js";
|
|
14
|
+
import { insertMessage, insertToolUse, upsertSession, isFileIndexed, markFileIndexed, } from "./db.js";
|
|
15
|
+
import { indexCodexSessions } from "./codex.js";
|
|
16
|
+
import { indexGeminiSessions } from "./gemini.js";
|
|
17
|
+
import { indexContinueSessions } from "./continue.js";
|
|
15
18
|
export function getClaudeProjectsDir() {
|
|
16
19
|
const base = process.env.KIT_CLAUDE_DIR ?? join(homedir(), ".claude");
|
|
17
20
|
return join(base, "projects");
|
|
@@ -135,7 +138,7 @@ function indexFile(db, filepath, project) {
|
|
|
135
138
|
/** Walk ~/.claude/projects and index every transcript. Idempotent. */
|
|
136
139
|
export function indexClaudeTranscripts(db) {
|
|
137
140
|
const projectsDir = getClaudeProjectsDir();
|
|
138
|
-
const result = { files: 0, sessions: 0, messages: 0, toolUses: 0 };
|
|
141
|
+
const result = { files: 0, sessions: 0, messages: 0, toolUses: 0, filesSkipped: 0 };
|
|
139
142
|
if (!existsSync(projectsDir))
|
|
140
143
|
return result;
|
|
141
144
|
for (const projectName of readdirSync(projectsDir).sort()) {
|
|
@@ -152,7 +155,23 @@ export function indexClaudeTranscripts(db) {
|
|
|
152
155
|
for (const entry of readdirSync(projectPath).sort()) {
|
|
153
156
|
if (!entry.endsWith(".jsonl"))
|
|
154
157
|
continue;
|
|
155
|
-
const
|
|
158
|
+
const filePath = join(projectPath, entry);
|
|
159
|
+
let st;
|
|
160
|
+
try {
|
|
161
|
+
st = statSync(filePath);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
// Skip files unchanged since the last index (incremental — avoids re-reading
|
|
167
|
+
// every transcript each run; the per-message uuid dedup still backstops it).
|
|
168
|
+
const mtimeMs = Math.floor(st.mtimeMs);
|
|
169
|
+
if (isFileIndexed(db, filePath, mtimeMs, st.size)) {
|
|
170
|
+
result.filesSkipped++;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const counts = indexFile(db, filePath, projectName);
|
|
174
|
+
markFileIndexed(db, filePath, mtimeMs, st.size);
|
|
156
175
|
result.files++;
|
|
157
176
|
result.sessions++;
|
|
158
177
|
result.messages += counts.messages;
|
|
@@ -161,4 +180,16 @@ export function indexClaudeTranscripts(db) {
|
|
|
161
180
|
}
|
|
162
181
|
return result;
|
|
163
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Index every supported harness's transcripts into the store. Returns per-harness
|
|
185
|
+
* counts. Adding a harness = one more parser here (Copilot, Gemini, Aider, Cursor…).
|
|
186
|
+
*/
|
|
187
|
+
export function indexAllHarnesses(db) {
|
|
188
|
+
return {
|
|
189
|
+
"claude-code": indexClaudeTranscripts(db),
|
|
190
|
+
codex: indexCodexSessions(db),
|
|
191
|
+
gemini: indexGeminiSessions(db),
|
|
192
|
+
continue: indexContinueSessions(db),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
164
195
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/memory/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/memory/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/status.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface StatusItem {
|
|
2
|
+
key: string;
|
|
3
|
+
label: string;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
detail: string;
|
|
6
|
+
/** Rule-based next step when not ok (deterministic, no inference). */
|
|
7
|
+
hint?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function gatherStatus(cwd?: string): Promise<StatusItem[]>;
|