@kenkaiiii/ggcoder 5.20.0 → 5.20.2
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/app-sidecar-sessions.d.ts +8 -0
- package/dist/app-sidecar-sessions.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.js +31 -0
- package/dist/app-sidecar-sessions.js.map +1 -0
- package/dist/app-sidecar-sessions.test.d.ts +2 -0
- package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.test.js +83 -0
- package/dist/app-sidecar-sessions.test.js.map +1 -0
- package/dist/app-sidecar.js +6 -34
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -20
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +43 -5
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/project-discovery.d.ts +1 -1
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +105 -53
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +29 -0
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/session-manager.d.ts +27 -7
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +257 -124
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts +57 -0
- package/dist/core/session-storage.d.ts.map +1 -0
- package/dist/core/session-storage.js +568 -0
- package/dist/core/session-storage.js.map +1 -0
- package/dist/core/session-storage.test.d.ts +2 -0
- package/dist/core/session-storage.test.d.ts.map +1 -0
- package/dist/core/session-storage.test.js +269 -0
- package/dist/core/session-storage.test.js.map +1 -0
- package/dist/session.d.ts +4 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +38 -101
- package/dist/session.js.map +1 -1
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +35 -0
- package/dist/session.test.js.map +1 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +0 -2
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
- package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.js +2 -30
- package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { mkdtemp, readFile, readdir, rm, stat, unlink, utimes, writeFile } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { gunzipSync } from "node:zlib";
|
|
7
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
8
|
+
import { encodeCwd } from "./encode-cwd.js";
|
|
9
|
+
import { SessionManager } from "./session-manager.js";
|
|
10
|
+
import { archiveColdSession, archiveSessionPath, MAX_PERSISTED_TOOL_TEXT_CHARS, openSessionReadStream, plainSessionPath, resolveSessionPath, sessionAssetDir, SESSION_TEMP_MARKER, } from "./session-storage.js";
|
|
11
|
+
const tempDirs = [];
|
|
12
|
+
async function makeTempDir() {
|
|
13
|
+
const dir = await mkdtemp(path.join(tmpdir(), "gg-session-storage-"));
|
|
14
|
+
tempDirs.push(dir);
|
|
15
|
+
return dir;
|
|
16
|
+
}
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })));
|
|
19
|
+
});
|
|
20
|
+
function messageEntry(message, id = crypto.randomUUID()) {
|
|
21
|
+
return {
|
|
22
|
+
type: "message",
|
|
23
|
+
id,
|
|
24
|
+
parentId: null,
|
|
25
|
+
timestamp: new Date().toISOString(),
|
|
26
|
+
message,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async function streamText(filePath) {
|
|
30
|
+
const { stream } = await openSessionReadStream(filePath);
|
|
31
|
+
let text = "";
|
|
32
|
+
for await (const chunk of stream)
|
|
33
|
+
text += chunk.toString();
|
|
34
|
+
return text;
|
|
35
|
+
}
|
|
36
|
+
describe("session entry storage normalization", () => {
|
|
37
|
+
it("bounds persisted tool text to 40KB while leaving the live message unchanged", async () => {
|
|
38
|
+
const root = await makeTempDir();
|
|
39
|
+
const manager = new SessionManager(root);
|
|
40
|
+
const created = await manager.create("/project/tool-text", "anthropic", "test-model");
|
|
41
|
+
const fullText = `${"head".repeat(8_000)}${"tail".repeat(8_000)}`;
|
|
42
|
+
const entry = messageEntry({
|
|
43
|
+
role: "tool",
|
|
44
|
+
content: [{ type: "tool_result", toolCallId: "tool-1", content: fullText }],
|
|
45
|
+
});
|
|
46
|
+
await manager.appendEntry(created.path, entry);
|
|
47
|
+
expect(entry.message.content[0].content).toBe(fullText);
|
|
48
|
+
const persisted = JSON.parse((await readFile(created.path, "utf8")).trim().split("\n")[1]);
|
|
49
|
+
const storedText = persisted.message.content[0].content;
|
|
50
|
+
expect(storedText).toHaveLength(MAX_PERSISTED_TOOL_TEXT_CHARS);
|
|
51
|
+
expect(storedText).toContain("Session storage truncated this tool result");
|
|
52
|
+
expect(storedText.startsWith(fullText.slice(0, 100))).toBe(true);
|
|
53
|
+
expect(storedText.endsWith(fullText.slice(-100))).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
it("omits path-backed tool media without duplicating its base64", async () => {
|
|
56
|
+
const root = await makeTempDir();
|
|
57
|
+
const sourcePath = path.join(root, "source.png");
|
|
58
|
+
await writeFile(sourcePath, Buffer.from("durable-image"));
|
|
59
|
+
const manager = new SessionManager(root);
|
|
60
|
+
const created = await manager.create("/project/path-media", "anthropic", "test-model");
|
|
61
|
+
const base64 = Buffer.from("duplicated-image").toString("base64");
|
|
62
|
+
await manager.appendEntry(created.path, messageEntry({
|
|
63
|
+
role: "tool",
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: "tool_result",
|
|
67
|
+
toolCallId: "read-1",
|
|
68
|
+
content: [
|
|
69
|
+
{ type: "text", text: `Read image file ${sourcePath} [image/png]` },
|
|
70
|
+
{ type: "image", mediaType: "image/png", data: base64 },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
}));
|
|
75
|
+
const raw = await readFile(created.path, "utf8");
|
|
76
|
+
expect(raw).not.toContain(base64);
|
|
77
|
+
expect(raw).toContain(sourcePath);
|
|
78
|
+
expect(existsSync(sessionAssetDir(created.path))).toBe(false);
|
|
79
|
+
const loaded = await manager.load(created.path);
|
|
80
|
+
const toolMessage = manager.getMessages(loaded.entries)[0];
|
|
81
|
+
expect(toolMessage.content[0].content.some((block) => block.type === "image")).toBe(false);
|
|
82
|
+
expect(toolMessage.content[0].content.at(-1)?.text).toContain("read the source again");
|
|
83
|
+
});
|
|
84
|
+
it("externalizes reusable media assets, hydrates exact bytes, and degrades missing assets", async () => {
|
|
85
|
+
const root = await makeTempDir();
|
|
86
|
+
const manager = new SessionManager(root);
|
|
87
|
+
const created = await manager.create("/project/assets", "gemini", "test-model");
|
|
88
|
+
const mediaBytes = Buffer.from("same-media-content");
|
|
89
|
+
const base64 = mediaBytes.toString("base64");
|
|
90
|
+
await manager.appendEntry(created.path, messageEntry({
|
|
91
|
+
role: "user",
|
|
92
|
+
content: [{ type: "image", mediaType: "image/png", data: base64 }],
|
|
93
|
+
}));
|
|
94
|
+
await manager.appendEntry(created.path, messageEntry({
|
|
95
|
+
role: "tool",
|
|
96
|
+
content: [
|
|
97
|
+
{
|
|
98
|
+
type: "tool_result",
|
|
99
|
+
toolCallId: "pathless",
|
|
100
|
+
content: [{ type: "image", mediaType: "image/png", data: base64 }],
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
}));
|
|
104
|
+
const assets = await readdir(sessionAssetDir(created.path));
|
|
105
|
+
expect(assets).toEqual([crypto.createHash("sha256").update(mediaBytes).digest("hex")]);
|
|
106
|
+
const raw = await readFile(created.path, "utf8");
|
|
107
|
+
expect(raw).not.toContain(base64);
|
|
108
|
+
expect(raw).toContain("gg-session-asset:v1:");
|
|
109
|
+
const loaded = await manager.load(created.path);
|
|
110
|
+
const messages = manager.getMessages(loaded.entries);
|
|
111
|
+
expect(messages[0].content[0].data).toBe(base64);
|
|
112
|
+
expect(messages[1].content[0].content[0].data).toBe(base64);
|
|
113
|
+
await unlink(path.join(sessionAssetDir(created.path), assets[0]));
|
|
114
|
+
const missing = await manager.load(created.path);
|
|
115
|
+
const missingUser = manager.getMessages(missing.entries)[0];
|
|
116
|
+
expect(missingUser.content).toEqual([
|
|
117
|
+
expect.objectContaining({ type: "text", text: expect.stringContaining("unavailable") }),
|
|
118
|
+
]);
|
|
119
|
+
});
|
|
120
|
+
it("suppresses newly appended legacy display projections", async () => {
|
|
121
|
+
const root = await makeTempDir();
|
|
122
|
+
const manager = new SessionManager(root);
|
|
123
|
+
const created = await manager.create("/project/display", "anthropic", "test-model");
|
|
124
|
+
const display = {
|
|
125
|
+
type: "custom",
|
|
126
|
+
kind: "display_item",
|
|
127
|
+
data: { version: 1, item: { id: "row", kind: "assistant", text: "duplicate" } },
|
|
128
|
+
id: "display-row",
|
|
129
|
+
parentId: null,
|
|
130
|
+
timestamp: new Date().toISOString(),
|
|
131
|
+
};
|
|
132
|
+
await manager.appendEntry(created.path, display);
|
|
133
|
+
expect((await readFile(created.path, "utf8")).trim().split("\n")).toHaveLength(1);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe("cold session archive safety", () => {
|
|
137
|
+
it("normalizes and compresses cold JSONL, preserves mtime, dedupes listing, and resumes through both paths", async () => {
|
|
138
|
+
const root = await makeTempDir();
|
|
139
|
+
const manager = new SessionManager(root);
|
|
140
|
+
const cwd = "/project/archive";
|
|
141
|
+
const created = await manager.create(cwd, "anthropic", "test-model");
|
|
142
|
+
await manager.appendEntry(created.path, messageEntry({ role: "user", content: "hello archive" }));
|
|
143
|
+
const display = {
|
|
144
|
+
type: "custom",
|
|
145
|
+
kind: "display_item",
|
|
146
|
+
data: { version: 1, item: { id: "legacy", kind: "assistant" } },
|
|
147
|
+
id: "legacy-display",
|
|
148
|
+
parentId: null,
|
|
149
|
+
timestamp: new Date().toISOString(),
|
|
150
|
+
};
|
|
151
|
+
await writeFile(created.path, `${JSON.stringify(display)}\nmalformed legacy line\n`, {
|
|
152
|
+
flag: "a",
|
|
153
|
+
});
|
|
154
|
+
const oldTime = new Date(Date.now() - 10 * 86_400_000);
|
|
155
|
+
await utimes(created.path, oldTime, oldTime);
|
|
156
|
+
const archived = await archiveColdSession(created.path);
|
|
157
|
+
const archivePath = archiveSessionPath(created.path);
|
|
158
|
+
expect(archived.archived).toBe(true);
|
|
159
|
+
expect(archived.removedDisplayItems).toBe(1);
|
|
160
|
+
expect(await resolveSessionPath(created.path)).toBe(archivePath);
|
|
161
|
+
expect(Math.abs((await stat(archivePath)).mtimeMs - oldTime.getTime())).toBeLessThan(2_000);
|
|
162
|
+
const compressedText = gunzipSync(await readFile(archivePath)).toString("utf8");
|
|
163
|
+
expect(compressedText).not.toContain("display_item");
|
|
164
|
+
expect(compressedText).toContain("malformed legacy line");
|
|
165
|
+
const listed = await manager.list(cwd);
|
|
166
|
+
expect(listed).toHaveLength(1);
|
|
167
|
+
expect(listed[0].path).toBe(archivePath);
|
|
168
|
+
const fromStalePlainPath = await manager.load(created.path);
|
|
169
|
+
expect(fromStalePlainPath.path).toBe(created.path);
|
|
170
|
+
expect(manager.getMessages(fromStalePlainPath.entries)[0]).toMatchObject({
|
|
171
|
+
content: "hello archive",
|
|
172
|
+
});
|
|
173
|
+
expect(plainSessionPath(await resolveSessionPath(archivePath))).toBe(created.path);
|
|
174
|
+
const fromStaleArchivePath = await manager.load(archivePath);
|
|
175
|
+
expect(fromStaleArchivePath.path).toBe(created.path);
|
|
176
|
+
expect(fromStaleArchivePath.header.id).toBe(created.id);
|
|
177
|
+
});
|
|
178
|
+
it("never swaps an archive over a source that changes during compression and cleans partial temps", async () => {
|
|
179
|
+
const root = await makeTempDir();
|
|
180
|
+
const manager = new SessionManager(root);
|
|
181
|
+
const created = await manager.create("/project/race", "anthropic", "test-model");
|
|
182
|
+
const incompressible = crypto.randomBytes(12 * 1024 * 1024).toString("base64");
|
|
183
|
+
await writeFile(created.path, `${incompressible}\n`, { flag: "a" });
|
|
184
|
+
const archiving = archiveColdSession(created.path);
|
|
185
|
+
const directory = path.dirname(created.path);
|
|
186
|
+
let sawTemp = false;
|
|
187
|
+
for (let attempt = 0; attempt < 2_000; attempt++) {
|
|
188
|
+
if ((await readdir(directory)).some((name) => name.includes(SESSION_TEMP_MARKER))) {
|
|
189
|
+
sawTemp = true;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
193
|
+
}
|
|
194
|
+
expect(sawTemp).toBe(true);
|
|
195
|
+
await writeFile(created.path, "changed-during-archive\n", { flag: "a" });
|
|
196
|
+
await expect(archiving).rejects.toThrow("changed while archiving");
|
|
197
|
+
expect(await resolveSessionPath(created.path)).toBe(created.path);
|
|
198
|
+
expect(await readFile(created.path, "utf8")).toContain("changed-during-archive");
|
|
199
|
+
expect(existsSync(archiveSessionPath(created.path))).toBe(false);
|
|
200
|
+
expect((await readdir(directory)).some((name) => name.includes(SESSION_TEMP_MARKER))).toBe(false);
|
|
201
|
+
});
|
|
202
|
+
it("ignores partial maintenance files in listing and removes old ones during maintenance", async () => {
|
|
203
|
+
const root = await makeTempDir();
|
|
204
|
+
const manager = new SessionManager(root);
|
|
205
|
+
const cwd = "/project/partial";
|
|
206
|
+
const created = await manager.create(cwd, "anthropic", "test-model");
|
|
207
|
+
await manager.appendEntry(created.path, messageEntry({ role: "user", content: "kept" }));
|
|
208
|
+
const partial = path.join(root, encodeCwd(cwd), `orphan.jsonl${SESSION_TEMP_MARKER}123`);
|
|
209
|
+
await writeFile(partial, "partial gzip bytes");
|
|
210
|
+
const oldTime = new Date(Date.now() - 2 * 86_400_000);
|
|
211
|
+
await utimes(partial, oldTime, oldTime);
|
|
212
|
+
expect(await manager.list(cwd)).toHaveLength(1);
|
|
213
|
+
const metrics = await manager.runMaintenance({ retentionDays: 30 });
|
|
214
|
+
expect(metrics.deletedFiles).toBe(1);
|
|
215
|
+
expect(existsSync(partial)).toBe(false);
|
|
216
|
+
});
|
|
217
|
+
it("reads a retained gzip stream without thawing when only discovery is needed", async () => {
|
|
218
|
+
const root = await makeTempDir();
|
|
219
|
+
const manager = new SessionManager(root);
|
|
220
|
+
const created = await manager.create("/project/read", "anthropic", "test-model");
|
|
221
|
+
await manager.appendEntry(created.path, messageEntry({ role: "user", content: "stream me" }));
|
|
222
|
+
await archiveColdSession(created.path);
|
|
223
|
+
expect(await streamText(created.path)).toContain("stream me");
|
|
224
|
+
expect(await resolveSessionPath(created.path)).toBe(archiveSessionPath(created.path));
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe("logical retention", () => {
|
|
228
|
+
it("deletes plain/archive redirects and adjacent assets as one logical session", async () => {
|
|
229
|
+
const root = await makeTempDir();
|
|
230
|
+
const manager = new SessionManager(root);
|
|
231
|
+
const created = await manager.create("/project/retention", "gemini", "test-model");
|
|
232
|
+
await manager.appendEntry(created.path, messageEntry({
|
|
233
|
+
role: "user",
|
|
234
|
+
content: [
|
|
235
|
+
{
|
|
236
|
+
type: "image",
|
|
237
|
+
mediaType: "image/png",
|
|
238
|
+
data: Buffer.from("retained-asset").toString("base64"),
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
}));
|
|
242
|
+
const oldTime = new Date(Date.now() - 45 * 86_400_000);
|
|
243
|
+
await utimes(created.path, oldTime, oldTime);
|
|
244
|
+
await archiveColdSession(created.path);
|
|
245
|
+
const result = await manager.pruneOldSessions({ maxAgeDays: 30 });
|
|
246
|
+
expect(result.deletedFiles).toBeGreaterThanOrEqual(3);
|
|
247
|
+
expect(existsSync(created.path)).toBe(false);
|
|
248
|
+
expect(existsSync(archiveSessionPath(created.path))).toBe(false);
|
|
249
|
+
expect(existsSync(sessionAssetDir(created.path))).toBe(false);
|
|
250
|
+
});
|
|
251
|
+
it("protects registered active sessions and explicit keep paths", async () => {
|
|
252
|
+
const root = await makeTempDir();
|
|
253
|
+
const manager = new SessionManager(root);
|
|
254
|
+
const active = await manager.create("/project/protected", "anthropic", "test-model");
|
|
255
|
+
const explicit = await manager.create("/project/protected", "anthropic", "test-model");
|
|
256
|
+
const oldTime = new Date(Date.now() - 90 * 86_400_000);
|
|
257
|
+
await Promise.all([
|
|
258
|
+
utimes(active.path, oldTime, oldTime),
|
|
259
|
+
utimes(explicit.path, oldTime, oldTime),
|
|
260
|
+
]);
|
|
261
|
+
manager.registerActivePath(active.path);
|
|
262
|
+
const result = await manager.pruneOldSessions({ maxAgeDays: 30, keepPaths: [explicit.path] });
|
|
263
|
+
expect(result.deletedFiles).toBe(0);
|
|
264
|
+
expect(existsSync(active.path)).toBe(true);
|
|
265
|
+
expect(existsSync(explicit.path)).toBe(true);
|
|
266
|
+
manager.unregisterActivePath(active.path);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=session-storage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-storage.test.js","sourceRoot":"","sources":["../../src/core/session-storage.test.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -5,12 +5,12 @@ export interface Session {
|
|
|
5
5
|
path: string;
|
|
6
6
|
append(entry: SessionEntry): Promise<void>;
|
|
7
7
|
}
|
|
8
|
-
export declare function createSession(cwd: string, provider: string, model: string): Promise<Session>;
|
|
9
|
-
export declare function loadSession(sessionPath: string): Promise<{
|
|
8
|
+
export declare function createSession(cwd: string, provider: string, model: string, sessionsDir?: string): Promise<Session>;
|
|
9
|
+
export declare function loadSession(sessionPath: string, sessionsDir?: string): Promise<{
|
|
10
10
|
header: SessionHeader;
|
|
11
11
|
messages: Message[];
|
|
12
12
|
}>;
|
|
13
|
-
export declare function listSessions(cwd: string): Promise<SessionInfo[]>;
|
|
14
|
-
export declare function getMostRecentSession(cwd: string): Promise<string | null>;
|
|
13
|
+
export declare function listSessions(cwd: string, sessionsDir?: string): Promise<SessionInfo[]>;
|
|
14
|
+
export declare function getMostRecentSession(cwd: string, sessionsDir?: string): Promise<string | null>;
|
|
15
15
|
export declare function persistMessage(session: Session, message: Message): Promise<void>;
|
|
16
16
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAuB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAWhG,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,WAAW,SAAc,GACxB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAID,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,SAAc,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAgBzD;AAID,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGjG;AAID,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,WAAW,SAAc,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGxB;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF"}
|
package/dist/session.js
CHANGED
|
@@ -1,119 +1,56 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
import os from "node:os";
|
|
4
3
|
import crypto from "node:crypto";
|
|
5
|
-
import {
|
|
4
|
+
import { SessionManager, } from "./core/session-manager.js";
|
|
6
5
|
const SESSION_DIR = path.join(os.homedir(), ".gg", "sessions");
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const sessionManager = new SessionManager(SESSION_DIR);
|
|
7
|
+
export async function createSession(cwd, provider, model, sessionsDir = SESSION_DIR) {
|
|
8
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
9
|
+
const created = await manager.create(cwd, provider, model);
|
|
10
|
+
return {
|
|
11
|
+
id: created.id,
|
|
12
|
+
path: created.path,
|
|
13
|
+
async append(entry) {
|
|
14
|
+
if (entry.type !== "message")
|
|
15
|
+
return;
|
|
16
|
+
const managedEntry = {
|
|
17
|
+
type: "message",
|
|
18
|
+
id: crypto.randomUUID(),
|
|
19
|
+
parentId: null,
|
|
20
|
+
timestamp: entry.timestamp,
|
|
21
|
+
message: entry.message,
|
|
22
|
+
};
|
|
23
|
+
await manager.appendEntry(created.path, managedEntry);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
9
26
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
await fs.mkdir(dir, { recursive: true });
|
|
15
|
-
const fileName = `${timestamp.replace(/[:.]/g, "-")}_${id.slice(0, 8)}.jsonl`;
|
|
16
|
-
const filePath = path.join(dir, fileName);
|
|
27
|
+
// ── Load Session ────────────────────────────────────────────
|
|
28
|
+
export async function loadSession(sessionPath, sessionsDir = SESSION_DIR) {
|
|
29
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
30
|
+
const loaded = await manager.load(sessionPath);
|
|
17
31
|
const header = {
|
|
18
32
|
type: "session",
|
|
19
33
|
version: 1,
|
|
20
|
-
id,
|
|
21
|
-
timestamp,
|
|
22
|
-
cwd,
|
|
23
|
-
provider: provider,
|
|
24
|
-
model,
|
|
34
|
+
id: loaded.header.id,
|
|
35
|
+
timestamp: loaded.header.timestamp,
|
|
36
|
+
cwd: loaded.header.cwd,
|
|
37
|
+
provider: loaded.header.provider,
|
|
38
|
+
model: loaded.header.model,
|
|
25
39
|
};
|
|
26
|
-
await fs.appendFile(filePath, JSON.stringify(header) + "\n", "utf-8");
|
|
27
40
|
return {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
async append(entry) {
|
|
31
|
-
await fs.appendFile(filePath, JSON.stringify(entry) + "\n", "utf-8");
|
|
32
|
-
},
|
|
41
|
+
header,
|
|
42
|
+
messages: manager.getMessages(loaded.entries, loaded.header.leafId),
|
|
33
43
|
};
|
|
34
44
|
}
|
|
35
|
-
// ── Load Session ────────────────────────────────────────────
|
|
36
|
-
export async function loadSession(sessionPath) {
|
|
37
|
-
const content = await fs.readFile(sessionPath, "utf-8");
|
|
38
|
-
const lines = content.trim().split("\n").filter(Boolean);
|
|
39
|
-
let header = null;
|
|
40
|
-
const messages = [];
|
|
41
|
-
for (const line of lines) {
|
|
42
|
-
const entry = JSON.parse(line);
|
|
43
|
-
if (entry.type === "session") {
|
|
44
|
-
header = entry;
|
|
45
|
-
}
|
|
46
|
-
else if (entry.type === "message") {
|
|
47
|
-
// Skip system messages — they'll be rebuilt fresh
|
|
48
|
-
if (entry.message.role !== "system") {
|
|
49
|
-
messages.push(entry.message);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (!header) {
|
|
54
|
-
throw new Error(`Invalid session file: no header found in ${sessionPath}`);
|
|
55
|
-
}
|
|
56
|
-
return { header, messages };
|
|
57
|
-
}
|
|
58
45
|
// ── List Sessions ───────────────────────────────────────────
|
|
59
|
-
export async function listSessions(cwd) {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
files = await fs.readdir(dir);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return [];
|
|
67
|
-
}
|
|
68
|
-
const sessions = [];
|
|
69
|
-
for (const file of files) {
|
|
70
|
-
if (!file.endsWith(".jsonl"))
|
|
71
|
-
continue;
|
|
72
|
-
const filePath = path.join(dir, file);
|
|
73
|
-
try {
|
|
74
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
75
|
-
const lines = content.trim().split("\n").filter(Boolean);
|
|
76
|
-
if (lines.length === 0)
|
|
77
|
-
continue;
|
|
78
|
-
const header = JSON.parse(lines[0]);
|
|
79
|
-
if (header.type !== "session")
|
|
80
|
-
continue;
|
|
81
|
-
let messageCount = 0;
|
|
82
|
-
let lastActivity = header.timestamp;
|
|
83
|
-
for (const line of lines) {
|
|
84
|
-
try {
|
|
85
|
-
const entry = JSON.parse(line);
|
|
86
|
-
if (entry.type === "message") {
|
|
87
|
-
messageCount++;
|
|
88
|
-
if (entry.timestamp)
|
|
89
|
-
lastActivity = entry.timestamp;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// Skip corrupt lines
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
sessions.push({
|
|
97
|
-
id: header.id,
|
|
98
|
-
path: filePath,
|
|
99
|
-
timestamp: header.timestamp,
|
|
100
|
-
lastActivity,
|
|
101
|
-
cwd: header.cwd,
|
|
102
|
-
messageCount,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
// Skip corrupt files
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Sort by last activity descending (the session most recently spoken in first)
|
|
110
|
-
sessions.sort((a, b) => b.lastActivity.localeCompare(a.lastActivity));
|
|
111
|
-
return sessions;
|
|
46
|
+
export async function listSessions(cwd, sessionsDir = SESSION_DIR) {
|
|
47
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
48
|
+
return manager.list(cwd);
|
|
112
49
|
}
|
|
113
50
|
// ── Get Most Recent Session ─────────────────────────────────
|
|
114
|
-
export async function getMostRecentSession(cwd) {
|
|
115
|
-
const
|
|
116
|
-
return
|
|
51
|
+
export async function getMostRecentSession(cwd, sessionsDir = SESSION_DIR) {
|
|
52
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
53
|
+
return manager.getMostRecent(cwd);
|
|
117
54
|
}
|
|
118
55
|
// ── Persist Messages ────────────────────────────────────────
|
|
119
56
|
export function persistMessage(session, message) {
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../src/session.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { createSession, getMostRecentSession, listSessions, loadSession, persistMessage, } from "./session.js";
|
|
6
|
+
import { archiveColdSession, archiveSessionPath } from "./core/session-storage.js";
|
|
7
|
+
const tempDirs = [];
|
|
8
|
+
afterEach(async () => {
|
|
9
|
+
await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })));
|
|
10
|
+
});
|
|
11
|
+
describe("legacy session API storage delegation", () => {
|
|
12
|
+
it("lists and resumes compressed v2 storage through stale plain and archive paths", async () => {
|
|
13
|
+
const sessionsDir = await mkdtemp(path.join(tmpdir(), "gg-legacy-session-"));
|
|
14
|
+
tempDirs.push(sessionsDir);
|
|
15
|
+
const cwd = "/project/legacy-api";
|
|
16
|
+
const session = await createSession(cwd, "anthropic", "test-model", sessionsDir);
|
|
17
|
+
await persistMessage(session, { role: "user", content: "legacy request" });
|
|
18
|
+
await persistMessage(session, { role: "assistant", content: "legacy response" });
|
|
19
|
+
await archiveColdSession(session.path);
|
|
20
|
+
const listed = await listSessions(cwd, sessionsDir);
|
|
21
|
+
expect(listed).toHaveLength(1);
|
|
22
|
+
expect(listed[0]?.path).toBe(archiveSessionPath(session.path));
|
|
23
|
+
expect(await getMostRecentSession(cwd, sessionsDir)).toBe(archiveSessionPath(session.path));
|
|
24
|
+
const stalePlain = await loadSession(session.path, sessionsDir);
|
|
25
|
+
expect(stalePlain.header).toMatchObject({ version: 1, id: session.id, cwd });
|
|
26
|
+
expect(stalePlain.messages).toEqual([
|
|
27
|
+
{ role: "user", content: "legacy request" },
|
|
28
|
+
{ role: "assistant", content: "legacy response" },
|
|
29
|
+
]);
|
|
30
|
+
const staleArchive = await loadSession(archiveSessionPath(session.path), sessionsDir);
|
|
31
|
+
expect(staleArchive.header.id).toBe(session.id);
|
|
32
|
+
expect(staleArchive.messages).toHaveLength(2);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=session.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.test.js","sourceRoot":"","sources":["../src/session.test.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAoBA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,6BAA6B,CAAC;AAarC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAkBpF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAkB,eAAe,EAAe,MAAM,6BAA6B,CAAC;AAEhG,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAa3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAIpE,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIzD,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAY9B,OAAO,KAAK,EACV,aAAa,EAYd,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAWnE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,+BAA+B,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,mBAAmB,EACnB,gCAAgC,EAChC,qBAAqB,EACrB,+BAA+B,EAC/B,mCAAmC,EACnC,kCAAkC,EAClC,uCAAuC,EACvC,wCAAwC,EACxC,gCAAgC,GACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,kCAAkC,GACnC,MAAM,mBAAmB,CAAC;AAiB3B,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAC5B,MAAM,EACN;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAClF,CAAC;IACF,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,qEAAqE;IACrE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;+EAC2E;IAC3E,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC/C,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,EAAE;QACd,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;KACpD,CAAC;IACF,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE;YACd,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE;gBAAE,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/E,CAAC;KACH,KAAK,IAAI,CAAC;IACX;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;KAC1B,KAAK,IAAI,CAAC;IACX;;;;;OAKG;IACH,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,aAAa,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;QAClC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;QAC5B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;QAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;QACvD,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE;YACd,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE;gBAAE,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/E,CAAC;QACF,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;CACH;AAuBD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,2CA22FlC"}
|