@fleetagent/pi-coding-agent 0.0.1 → 0.0.4
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/CHANGELOG.md +32 -0
- package/dist/core/agent-session.d.ts +32 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +225 -12
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +5 -5
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +15 -8
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/messages.d.ts +1 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +4 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/pi-agent.d.ts +5 -3
- package/dist/core/pi-agent.d.ts.map +1 -1
- package/dist/core/pi-agent.js +64 -18
- package/dist/core/pi-agent.js.map +1 -1
- package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
- package/dist/core/session/in-memory-session-manager.js +5 -7
- package/dist/core/session/in-memory-session-manager.js.map +1 -1
- package/dist/core/session/in-memory-session.d.ts +3 -1
- package/dist/core/session/in-memory-session.d.ts.map +1 -1
- package/dist/core/session/in-memory-session.js +5 -2
- package/dist/core/session/in-memory-session.js.map +1 -1
- package/dist/core/session/index.d.ts +2 -2
- package/dist/core/session/index.d.ts.map +1 -1
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
- package/dist/core/session/jsonl-helpers.js +4 -4
- package/dist/core/session/jsonl-helpers.js.map +1 -1
- package/dist/core/session/local-session-manager.d.ts.map +1 -1
- package/dist/core/session/local-session-manager.js +12 -11
- package/dist/core/session/local-session-manager.js.map +1 -1
- package/dist/core/session/local-session.d.ts +3 -1
- package/dist/core/session/local-session.d.ts.map +1 -1
- package/dist/core/session/local-session.js +7 -2
- package/dist/core/session/local-session.js.map +1 -1
- package/dist/core/session/remote-session-client.d.ts +6 -1
- package/dist/core/session/remote-session-client.d.ts.map +1 -1
- package/dist/core/session/remote-session-client.js.map +1 -1
- package/dist/core/session/remote-session-manager.d.ts.map +1 -1
- package/dist/core/session/remote-session-manager.js +28 -7
- package/dist/core/session/remote-session-manager.js.map +1 -1
- package/dist/core/session/remote-session.d.ts +3 -0
- package/dist/core/session/remote-session.d.ts.map +1 -1
- package/dist/core/session/remote-session.js +4 -1
- package/dist/core/session/remote-session.js.map +1 -1
- package/dist/core/session/session.d.ts +9 -3
- package/dist/core/session/session.d.ts.map +1 -1
- package/dist/core/session/session.js +64 -10
- package/dist/core/session/session.js.map +1 -1
- package/dist/core/session/stores/in-memory-session-store.d.ts +6 -14
- package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/in-memory-session-store.js +8 -34
- package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
- package/dist/core/session/stores/jsonl-session-store.d.ts +14 -14
- package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/jsonl-session-store.js +153 -162
- package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
- package/dist/core/session/stores/remote-session-store.d.ts +4 -6
- package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
- package/dist/core/session/stores/remote-session-store.js +18 -30
- package/dist/core/session/stores/remote-session-store.js.map +1 -1
- package/dist/core/session/stores/session-store.d.ts +1 -15
- package/dist/core/session/stores/session-store.d.ts.map +1 -1
- package/dist/core/session/stores/session-store.js.map +1 -1
- package/dist/core/session-cwd.d.ts +2 -2
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +5 -5
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +39 -37
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/extensions.md +35 -32
- package/docs/index.md +1 -1
- package/docs/sdk.md +2 -0
- package/docs/session-format.md +21 -21
- package/docs/sessions.md +2 -2
- package/docs/tui.md +1 -1
- package/examples/README.md +3 -0
- package/examples/extensions/README.md +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bookmark.ts +3 -3
- package/examples/extensions/confirm-destructive.ts +1 -1
- package/examples/extensions/custom-compaction.ts +1 -1
- package/examples/extensions/custom-footer.ts +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/git-checkpoint.ts +1 -1
- package/examples/extensions/handoff.ts +2 -2
- package/examples/extensions/plan-mode/index.ts +1 -1
- package/examples/extensions/preset.ts +1 -1
- package/examples/extensions/qna.ts +1 -1
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/snake.ts +1 -1
- package/examples/extensions/space-invaders.ts +1 -1
- package/examples/extensions/summarize.ts +1 -1
- package/examples/extensions/tic-tac-toe.ts +1 -1
- package/examples/extensions/todo.ts +1 -1
- package/examples/extensions/tools.ts +1 -1
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/remote-session-server/README.md +66 -0
- package/examples/remote-session-server/server.ts +359 -0
- package/examples/sdk/11-sessions.ts +3 -3
- package/examples/sdk/13-session-runtime.ts +6 -6
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -134,6 +134,147 @@ async function buildSessionInfo(filePath) {
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
const MAX_CONCURRENT_SESSION_INFO_LOADS = 10;
|
|
137
|
+
export function getSessionDirForReference(reference) {
|
|
138
|
+
return resolve(reference, "..");
|
|
139
|
+
}
|
|
140
|
+
export function getDefaultSessionDir(cwd, agentDir = getDefaultAgentDir()) {
|
|
141
|
+
const safePath = `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
|
|
142
|
+
const sessionDir = join(agentDir, "sessions", safePath);
|
|
143
|
+
ensureDir(sessionDir);
|
|
144
|
+
return sessionDir;
|
|
145
|
+
}
|
|
146
|
+
export function getSessionsRoot() {
|
|
147
|
+
return getSessionsDir();
|
|
148
|
+
}
|
|
149
|
+
export function prepareSessionReference(sessionDir, sessionId, timestamp) {
|
|
150
|
+
const fileTimestamp = timestamp.replace(/[:.]/g, "-");
|
|
151
|
+
return join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);
|
|
152
|
+
}
|
|
153
|
+
export function exists(path) {
|
|
154
|
+
return existsSync(path);
|
|
155
|
+
}
|
|
156
|
+
export function ensureDir(path) {
|
|
157
|
+
if (!existsSync(path)) {
|
|
158
|
+
mkdirSync(path, { recursive: true });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export function load(filePath) {
|
|
162
|
+
if (!existsSync(filePath))
|
|
163
|
+
return [];
|
|
164
|
+
const content = readFileSync(filePath, "utf8");
|
|
165
|
+
const entries = [];
|
|
166
|
+
const lines = content.trim().split("\n");
|
|
167
|
+
for (const line of lines) {
|
|
168
|
+
if (!line.trim())
|
|
169
|
+
continue;
|
|
170
|
+
try {
|
|
171
|
+
const entry = JSON.parse(line);
|
|
172
|
+
entries.push(entry);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Skip malformed lines
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (entries.length === 0)
|
|
179
|
+
return entries;
|
|
180
|
+
const header = entries[0];
|
|
181
|
+
if (header.type !== "session" || typeof header.id !== "string") {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
return entries;
|
|
185
|
+
}
|
|
186
|
+
export function append(filePath, entry) {
|
|
187
|
+
appendFileSync(filePath, `${JSON.stringify(entry)}\n`);
|
|
188
|
+
}
|
|
189
|
+
export function rewrite(filePath, entries) {
|
|
190
|
+
const content = `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`;
|
|
191
|
+
writeFileSync(filePath, content);
|
|
192
|
+
}
|
|
193
|
+
export function forkSession(sessionDir, header, sourceEntries) {
|
|
194
|
+
const reference = prepareSessionReference(sessionDir, header.id, header.timestamp);
|
|
195
|
+
append(reference, header);
|
|
196
|
+
for (const entry of sourceEntries) {
|
|
197
|
+
if (entry.type !== "session") {
|
|
198
|
+
append(reference, entry);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return reference;
|
|
202
|
+
}
|
|
203
|
+
export function findMostRecent(sessionDir) {
|
|
204
|
+
try {
|
|
205
|
+
const files = readdirSync(sessionDir)
|
|
206
|
+
.filter((file) => file.endsWith(".jsonl"))
|
|
207
|
+
.map((file) => join(sessionDir, file))
|
|
208
|
+
.filter(isValidSessionFile)
|
|
209
|
+
.map((path) => ({ path, mtime: statSync(path).mtime }))
|
|
210
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
211
|
+
return files[0]?.path || null;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
export async function list(dir, onProgress) {
|
|
218
|
+
const sessions = [];
|
|
219
|
+
if (!existsSync(dir)) {
|
|
220
|
+
return sessions;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const dirEntries = await readdir(dir);
|
|
224
|
+
const files = dirEntries.filter((file) => file.endsWith(".jsonl")).map((file) => join(dir, file));
|
|
225
|
+
let loaded = 0;
|
|
226
|
+
const results = await buildSessionInfosWithConcurrency(files, () => {
|
|
227
|
+
loaded++;
|
|
228
|
+
onProgress?.(loaded, files.length);
|
|
229
|
+
});
|
|
230
|
+
for (const info of results) {
|
|
231
|
+
if (info) {
|
|
232
|
+
sessions.push(info);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Return empty list on error
|
|
238
|
+
}
|
|
239
|
+
return sessions;
|
|
240
|
+
}
|
|
241
|
+
export async function listAll(sessionsDir, onProgress) {
|
|
242
|
+
try {
|
|
243
|
+
if (!existsSync(sessionsDir)) {
|
|
244
|
+
return [];
|
|
245
|
+
}
|
|
246
|
+
const entries = await readdir(sessionsDir, { withFileTypes: true });
|
|
247
|
+
const dirs = entries.filter((entry) => entry.isDirectory()).map((entry) => join(sessionsDir, entry.name));
|
|
248
|
+
let totalFiles = 0;
|
|
249
|
+
const dirFiles = [];
|
|
250
|
+
for (const dir of dirs) {
|
|
251
|
+
try {
|
|
252
|
+
const files = (await readdir(dir)).filter((file) => file.endsWith(".jsonl"));
|
|
253
|
+
dirFiles.push(files.map((file) => join(dir, file)));
|
|
254
|
+
totalFiles += files.length;
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
dirFiles.push([]);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
let loaded = 0;
|
|
261
|
+
const sessions = [];
|
|
262
|
+
const allFiles = dirFiles.flat();
|
|
263
|
+
const results = await buildSessionInfosWithConcurrency(allFiles, () => {
|
|
264
|
+
loaded++;
|
|
265
|
+
onProgress?.(loaded, totalFiles);
|
|
266
|
+
});
|
|
267
|
+
for (const info of results) {
|
|
268
|
+
if (info) {
|
|
269
|
+
sessions.push(info);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return sessions;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
137
278
|
async function buildSessionInfosWithConcurrency(files, onLoaded) {
|
|
138
279
|
const results = new Array(files.length).fill(null);
|
|
139
280
|
const inFlight = new Set();
|
|
@@ -168,96 +309,36 @@ async function buildSessionInfosWithConcurrency(files, onLoaded) {
|
|
|
168
309
|
return results;
|
|
169
310
|
}
|
|
170
311
|
export class JsonlSessionStore extends InMemorySessionStore {
|
|
171
|
-
|
|
312
|
+
reference;
|
|
172
313
|
flushed = false;
|
|
173
314
|
isPersisted() {
|
|
174
315
|
return true;
|
|
175
316
|
}
|
|
176
317
|
getSessionReference() {
|
|
177
|
-
return this.
|
|
318
|
+
return this.reference;
|
|
178
319
|
}
|
|
179
320
|
setSessionReference(reference) {
|
|
180
|
-
this.
|
|
321
|
+
this.reference = resolve(reference);
|
|
181
322
|
this.flushed = false;
|
|
182
323
|
}
|
|
183
|
-
openSession(reference) {
|
|
184
|
-
this.setSessionReference(reference);
|
|
185
|
-
const currentReference = this.sessionReference;
|
|
186
|
-
const fileExists = this.exists(currentReference);
|
|
187
|
-
return {
|
|
188
|
-
reference: currentReference,
|
|
189
|
-
exists: fileExists,
|
|
190
|
-
entries: fileExists ? this.load(currentReference) : [],
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
getSessionDirForReference(reference) {
|
|
194
|
-
return resolve(reference, "..");
|
|
195
|
-
}
|
|
196
|
-
getDefaultSessionDir(cwd, agentDir = getDefaultAgentDir()) {
|
|
197
|
-
const safePath = `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
|
|
198
|
-
const sessionDir = join(agentDir, "sessions", safePath);
|
|
199
|
-
this.ensureDir(sessionDir);
|
|
200
|
-
return sessionDir;
|
|
201
|
-
}
|
|
202
|
-
getSessionsRoot() {
|
|
203
|
-
return getSessionsDir();
|
|
204
|
-
}
|
|
205
|
-
prepareSessionReference(sessionDir, sessionId, timestamp) {
|
|
206
|
-
const fileTimestamp = timestamp.replace(/[:.]/g, "-");
|
|
207
|
-
this.sessionReference = join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);
|
|
208
|
-
this.flushed = false;
|
|
209
|
-
return this.sessionReference;
|
|
210
|
-
}
|
|
211
|
-
getParentSessionReference() {
|
|
212
|
-
return this.sessionReference;
|
|
213
|
-
}
|
|
214
324
|
exists(path) {
|
|
215
|
-
return
|
|
325
|
+
return exists(path);
|
|
216
326
|
}
|
|
217
327
|
ensureDir(path) {
|
|
218
|
-
|
|
219
|
-
mkdirSync(path, { recursive: true });
|
|
220
|
-
}
|
|
328
|
+
ensureDir(path);
|
|
221
329
|
}
|
|
222
330
|
load(filePath) {
|
|
223
|
-
if (!
|
|
331
|
+
if (!exists(filePath))
|
|
224
332
|
return [];
|
|
225
333
|
this.flushed = true;
|
|
226
|
-
|
|
227
|
-
const entries = [];
|
|
228
|
-
const lines = content.trim().split("\n");
|
|
229
|
-
for (const line of lines) {
|
|
230
|
-
if (!line.trim())
|
|
231
|
-
continue;
|
|
232
|
-
try {
|
|
233
|
-
const entry = JSON.parse(line);
|
|
234
|
-
entries.push(entry);
|
|
235
|
-
}
|
|
236
|
-
catch {
|
|
237
|
-
// Skip malformed lines
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
if (entries.length === 0)
|
|
241
|
-
return entries;
|
|
242
|
-
const header = entries[0];
|
|
243
|
-
if (header.type !== "session" || typeof header.id !== "string") {
|
|
244
|
-
return [];
|
|
245
|
-
}
|
|
246
|
-
return entries;
|
|
247
|
-
}
|
|
248
|
-
append(filePath, entry) {
|
|
249
|
-
appendFileSync(filePath, `${JSON.stringify(entry)}\n`);
|
|
250
|
-
}
|
|
251
|
-
rewrite(filePath, entries) {
|
|
252
|
-
const content = `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`;
|
|
253
|
-
writeFileSync(filePath, content);
|
|
334
|
+
return load(filePath);
|
|
254
335
|
}
|
|
255
336
|
appendEntry(entry) {
|
|
256
337
|
super.appendEntry(entry);
|
|
257
338
|
this.persistAppendedEntry(entry);
|
|
258
339
|
}
|
|
259
340
|
persistAppendedEntry(entry) {
|
|
260
|
-
if (!this.
|
|
341
|
+
if (!this.reference)
|
|
261
342
|
return;
|
|
262
343
|
if (!this.hasAssistantMessage()) {
|
|
263
344
|
this.flushed = false;
|
|
@@ -265,18 +346,18 @@ export class JsonlSessionStore extends InMemorySessionStore {
|
|
|
265
346
|
}
|
|
266
347
|
if (!this.flushed) {
|
|
267
348
|
for (const fileEntry of this.getFileEntries()) {
|
|
268
|
-
|
|
349
|
+
append(this.reference, fileEntry);
|
|
269
350
|
}
|
|
270
351
|
this.flushed = true;
|
|
271
352
|
}
|
|
272
353
|
else {
|
|
273
|
-
|
|
354
|
+
append(this.reference, entry);
|
|
274
355
|
}
|
|
275
356
|
}
|
|
276
357
|
saveSnapshot() {
|
|
277
|
-
if (!this.
|
|
358
|
+
if (!this.reference)
|
|
278
359
|
return;
|
|
279
|
-
|
|
360
|
+
rewrite(this.reference, this.getFileEntries());
|
|
280
361
|
this.flushed = true;
|
|
281
362
|
}
|
|
282
363
|
commitSnapshot() {
|
|
@@ -286,95 +367,5 @@ export class JsonlSessionStore extends InMemorySessionStore {
|
|
|
286
367
|
}
|
|
287
368
|
this.saveSnapshot();
|
|
288
369
|
}
|
|
289
|
-
forkSession(sessionDir, header, sourceEntries) {
|
|
290
|
-
this.prepareSessionReference(sessionDir, header.id, header.timestamp);
|
|
291
|
-
const reference = this.getSessionReference();
|
|
292
|
-
if (!reference) {
|
|
293
|
-
throw new Error("Failed to prepare forked session reference");
|
|
294
|
-
}
|
|
295
|
-
this.append(reference, header);
|
|
296
|
-
for (const entry of sourceEntries) {
|
|
297
|
-
if (entry.type !== "session") {
|
|
298
|
-
this.append(reference, entry);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
this.flushed = true;
|
|
302
|
-
return reference;
|
|
303
|
-
}
|
|
304
|
-
findMostRecent(sessionDir) {
|
|
305
|
-
try {
|
|
306
|
-
const files = readdirSync(sessionDir)
|
|
307
|
-
.filter((file) => file.endsWith(".jsonl"))
|
|
308
|
-
.map((file) => join(sessionDir, file))
|
|
309
|
-
.filter(isValidSessionFile)
|
|
310
|
-
.map((path) => ({ path, mtime: statSync(path).mtime }))
|
|
311
|
-
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
312
|
-
return files[0]?.path || null;
|
|
313
|
-
}
|
|
314
|
-
catch {
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
async list(dir, onProgress) {
|
|
319
|
-
const sessions = [];
|
|
320
|
-
if (!existsSync(dir)) {
|
|
321
|
-
return sessions;
|
|
322
|
-
}
|
|
323
|
-
try {
|
|
324
|
-
const dirEntries = await readdir(dir);
|
|
325
|
-
const files = dirEntries.filter((file) => file.endsWith(".jsonl")).map((file) => join(dir, file));
|
|
326
|
-
let loaded = 0;
|
|
327
|
-
const results = await buildSessionInfosWithConcurrency(files, () => {
|
|
328
|
-
loaded++;
|
|
329
|
-
onProgress?.(loaded, files.length);
|
|
330
|
-
});
|
|
331
|
-
for (const info of results) {
|
|
332
|
-
if (info) {
|
|
333
|
-
sessions.push(info);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
catch {
|
|
338
|
-
// Return empty list on error
|
|
339
|
-
}
|
|
340
|
-
return sessions;
|
|
341
|
-
}
|
|
342
|
-
async listAll(sessionsDir, onProgress) {
|
|
343
|
-
try {
|
|
344
|
-
if (!existsSync(sessionsDir)) {
|
|
345
|
-
return [];
|
|
346
|
-
}
|
|
347
|
-
const entries = await readdir(sessionsDir, { withFileTypes: true });
|
|
348
|
-
const dirs = entries.filter((entry) => entry.isDirectory()).map((entry) => join(sessionsDir, entry.name));
|
|
349
|
-
let totalFiles = 0;
|
|
350
|
-
const dirFiles = [];
|
|
351
|
-
for (const dir of dirs) {
|
|
352
|
-
try {
|
|
353
|
-
const files = (await readdir(dir)).filter((file) => file.endsWith(".jsonl"));
|
|
354
|
-
dirFiles.push(files.map((file) => join(dir, file)));
|
|
355
|
-
totalFiles += files.length;
|
|
356
|
-
}
|
|
357
|
-
catch {
|
|
358
|
-
dirFiles.push([]);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
let loaded = 0;
|
|
362
|
-
const sessions = [];
|
|
363
|
-
const allFiles = dirFiles.flat();
|
|
364
|
-
const results = await buildSessionInfosWithConcurrency(allFiles, () => {
|
|
365
|
-
loaded++;
|
|
366
|
-
onProgress?.(loaded, totalFiles);
|
|
367
|
-
});
|
|
368
|
-
for (const info of results) {
|
|
369
|
-
if (info) {
|
|
370
|
-
sessions.push(info);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
return sessions;
|
|
374
|
-
}
|
|
375
|
-
catch {
|
|
376
|
-
return [];
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
370
|
}
|
|
380
371
|
//# sourceMappingURL=jsonl-session-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-session-store.js","sourceRoot":"","sources":["../../../../src/core/session/stores/jsonl-session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@fleetagent/pi-agent-core\";\nimport type { Message, TextContent } from \"@fleetagent/pi-ai\";\nimport {\n\tappendFileSync,\n\tcloseSync,\n\texistsSync,\n\tmkdirSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\treadSync,\n\tstatSync,\n\twriteFileSync,\n} from \"fs\";\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { join, resolve } from \"path\";\nimport { getAgentDir as getDefaultAgentDir, getSessionsDir } from \"../../../config.ts\";\nimport type {\n\tFileEntry,\n\tSessionEntry,\n\tSessionEntryBase,\n\tSessionHeader,\n\tSessionInfo,\n\tSessionInfoEntry,\n\tSessionListProgress,\n\tSessionMessageEntry,\n} from \"../types.ts\";\nimport { InMemorySessionStore } from \"./in-memory-session-store.ts\";\nimport type { SessionOpenResult } from \"./session-store.ts\";\n\nfunction isMessageWithContent(message: AgentMessage): message is Message {\n\treturn typeof (message as Message).role === \"string\" && \"content\" in message;\n}\n\nfunction extractTextContent(message: Message): string {\n\tconst content = message.content;\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\treturn content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\" \");\n}\n\nfunction getLastActivityTime(entries: FileEntry[]): number | undefined {\n\tlet lastActivityTime: number | undefined;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\n\t\tconst message = (entry as SessionMessageEntry).message;\n\t\tif (!isMessageWithContent(message)) continue;\n\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\tconst msgTimestamp = (message as { timestamp?: number }).timestamp;\n\t\tif (typeof msgTimestamp === \"number\") {\n\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, msgTimestamp);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst entryTimestamp = (entry as SessionEntryBase).timestamp;\n\t\tif (typeof entryTimestamp === \"string\") {\n\t\t\tconst t = new Date(entryTimestamp).getTime();\n\t\t\tif (!Number.isNaN(t)) {\n\t\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lastActivityTime;\n}\n\nfunction getSessionModifiedDate(entries: FileEntry[], header: SessionHeader, statsMtime: Date): Date {\n\tconst lastActivityTime = getLastActivityTime(entries);\n\tif (typeof lastActivityTime === \"number\" && lastActivityTime > 0) {\n\t\treturn new Date(lastActivityTime);\n\t}\n\n\tconst headerTime = typeof header.timestamp === \"string\" ? new Date(header.timestamp).getTime() : NaN;\n\treturn !Number.isNaN(headerTime) ? new Date(headerTime) : statsMtime;\n}\n\nfunction isValidSessionFile(filePath: string): boolean {\n\ttry {\n\t\tconst fd = openSync(filePath, \"r\");\n\t\tconst buffer = Buffer.alloc(512);\n\t\tconst bytesRead = readSync(fd, buffer, 0, 512, 0);\n\t\tcloseSync(fd);\n\t\tconst firstLine = buffer.toString(\"utf8\", 0, bytesRead).split(\"\\n\")[0];\n\t\tif (!firstLine) return false;\n\t\tconst header = JSON.parse(firstLine) as Partial<SessionHeader>;\n\t\treturn header.type === \"session\" && typeof header.id === \"string\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function buildSessionInfo(filePath: string): Promise<SessionInfo | null> {\n\ttry {\n\t\tconst content = await readFile(filePath, \"utf8\");\n\t\tconst entries: FileEntry[] = [];\n\t\tconst lines = content.trim().split(\"\\n\");\n\n\t\tfor (const line of lines) {\n\t\t\tif (!line.trim()) continue;\n\t\t\ttry {\n\t\t\t\tentries.push(JSON.parse(line) as FileEntry);\n\t\t\t} catch {\n\t\t\t\t// Skip malformed lines\n\t\t\t}\n\t\t}\n\n\t\tif (entries.length === 0) return null;\n\t\tconst header = entries[0];\n\t\tif (header.type !== \"session\") return null;\n\n\t\tconst stats = await stat(filePath);\n\t\tlet messageCount = 0;\n\t\tlet firstMessage = \"\";\n\t\tconst allMessages: string[] = [];\n\t\tlet name: string | undefined;\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type === \"session_info\") {\n\t\t\t\tconst infoEntry = entry as SessionInfoEntry;\n\t\t\t\tname = infoEntry.name?.trim() || undefined;\n\t\t\t}\n\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tmessageCount++;\n\n\t\t\tconst message = (entry as SessionMessageEntry).message;\n\t\t\tif (!isMessageWithContent(message)) continue;\n\t\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\t\tconst textContent = extractTextContent(message);\n\t\t\tif (!textContent) continue;\n\n\t\t\tallMessages.push(textContent);\n\t\t\tif (!firstMessage && message.role === \"user\") {\n\t\t\t\tfirstMessage = textContent;\n\t\t\t}\n\t\t}\n\n\t\tconst sessionHeader = header as SessionHeader;\n\t\tconst cwd = typeof sessionHeader.cwd === \"string\" ? sessionHeader.cwd : \"\";\n\t\tconst parentSessionPath = sessionHeader.parentSession;\n\t\tconst modified = getSessionModifiedDate(entries, sessionHeader, stats.mtime);\n\n\t\treturn {\n\t\t\treference: filePath,\n\t\t\tpath: filePath,\n\t\t\tid: sessionHeader.id,\n\t\t\tcwd,\n\t\t\tname,\n\t\t\tparentSessionPath,\n\t\t\tcreated: new Date(sessionHeader.timestamp),\n\t\t\tmodified,\n\t\t\tmessageCount,\n\t\t\tfirstMessage: firstMessage || \"(no messages)\",\n\t\t\tallMessagesText: allMessages.join(\" \"),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nconst MAX_CONCURRENT_SESSION_INFO_LOADS = 10;\n\nasync function buildSessionInfosWithConcurrency(\n\tfiles: string[],\n\tonLoaded: () => void,\n): Promise<(SessionInfo | null)[]> {\n\tconst results: (SessionInfo | null)[] = new Array(files.length).fill(null);\n\tconst inFlight = new Set<Promise<void>>();\n\tlet nextIndex = 0;\n\n\tconst startNext = (): void => {\n\t\tconst index = nextIndex++;\n\t\tconst file = files[index];\n\t\tif (!file) return;\n\n\t\tlet task: Promise<void>;\n\t\ttask = buildSessionInfo(file)\n\t\t\t.then((info) => {\n\t\t\t\tresults[index] = info;\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tresults[index] = null;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tinFlight.delete(task);\n\t\t\t\tonLoaded();\n\t\t\t});\n\t\tinFlight.add(task);\n\t};\n\n\twhile (nextIndex < files.length || inFlight.size > 0) {\n\t\twhile (nextIndex < files.length && inFlight.size < MAX_CONCURRENT_SESSION_INFO_LOADS) {\n\t\t\tstartNext();\n\t\t}\n\t\tif (inFlight.size > 0) {\n\t\t\tawait Promise.race(inFlight);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nexport class JsonlSessionStore extends InMemorySessionStore {\n\tprivate sessionReference: string | undefined;\n\tprivate flushed = false;\n\n\tisPersisted(): boolean {\n\t\treturn true;\n\t}\n\n\tgetSessionReference(): string | undefined {\n\t\treturn this.sessionReference;\n\t}\n\n\tsetSessionReference(reference: string): void {\n\t\tthis.sessionReference = resolve(reference);\n\t\tthis.flushed = false;\n\t}\n\n\topenSession(reference: string): SessionOpenResult {\n\t\tthis.setSessionReference(reference);\n\t\tconst currentReference = this.sessionReference!;\n\t\tconst fileExists = this.exists(currentReference);\n\t\treturn {\n\t\t\treference: currentReference,\n\t\t\texists: fileExists,\n\t\t\tentries: fileExists ? this.load(currentReference) : [],\n\t\t};\n\t}\n\n\tgetSessionDirForReference(reference: string): string {\n\t\treturn resolve(reference, \"..\");\n\t}\n\n\tgetDefaultSessionDir(cwd: string, agentDir: string = getDefaultAgentDir()): string {\n\t\tconst safePath = `--${cwd.replace(/^[/\\\\]/, \"\").replace(/[/\\\\:]/g, \"-\")}--`;\n\t\tconst sessionDir = join(agentDir, \"sessions\", safePath);\n\t\tthis.ensureDir(sessionDir);\n\t\treturn sessionDir;\n\t}\n\n\tgetSessionsRoot(): string {\n\t\treturn getSessionsDir();\n\t}\n\n\tprepareSessionReference(sessionDir: string, sessionId: string, timestamp: string): string | undefined {\n\t\tconst fileTimestamp = timestamp.replace(/[:.]/g, \"-\");\n\t\tthis.sessionReference = join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);\n\t\tthis.flushed = false;\n\t\treturn this.sessionReference;\n\t}\n\n\tgetParentSessionReference(): string | undefined {\n\t\treturn this.sessionReference;\n\t}\n\n\texists(path: string): boolean {\n\t\treturn existsSync(path);\n\t}\n\n\tensureDir(path: string): void {\n\t\tif (!existsSync(path)) {\n\t\t\tmkdirSync(path, { recursive: true });\n\t\t}\n\t}\n\n\tload(filePath: string): FileEntry[] {\n\t\tif (!existsSync(filePath)) return [];\n\t\tthis.flushed = true;\n\n\t\tconst content = readFileSync(filePath, \"utf8\");\n\t\tconst entries: FileEntry[] = [];\n\t\tconst lines = content.trim().split(\"\\n\");\n\n\t\tfor (const line of lines) {\n\t\t\tif (!line.trim()) continue;\n\t\t\ttry {\n\t\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\t\tentries.push(entry);\n\t\t\t} catch {\n\t\t\t\t// Skip malformed lines\n\t\t\t}\n\t\t}\n\n\t\tif (entries.length === 0) return entries;\n\t\tconst header = entries[0];\n\t\tif (header.type !== \"session\" || typeof (header as Partial<SessionHeader>).id !== \"string\") {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn entries;\n\t}\n\n\tappend(filePath: string, entry: FileEntry): void {\n\t\tappendFileSync(filePath, `${JSON.stringify(entry)}\\n`);\n\t}\n\n\trewrite(filePath: string, entries: FileEntry[]): void {\n\t\tconst content = `${entries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`;\n\t\twriteFileSync(filePath, content);\n\t}\n\n\tappendEntry(entry: SessionEntry): void {\n\t\tsuper.appendEntry(entry);\n\t\tthis.persistAppendedEntry(entry);\n\t}\n\n\tprivate persistAppendedEntry(entry: SessionEntry): void {\n\t\tif (!this.sessionReference) return;\n\n\t\tif (!this.hasAssistantMessage()) {\n\t\t\tthis.flushed = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.flushed) {\n\t\t\tfor (const fileEntry of this.getFileEntries()) {\n\t\t\t\tthis.append(this.sessionReference, fileEntry);\n\t\t\t}\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tthis.append(this.sessionReference, entry);\n\t\t}\n\t}\n\n\tsaveSnapshot(): void {\n\t\tif (!this.sessionReference) return;\n\t\tthis.rewrite(this.sessionReference, this.getFileEntries());\n\t\tthis.flushed = true;\n\t}\n\n\tcommitSnapshot(): void {\n\t\tif (!this.hasAssistantMessage()) {\n\t\t\tthis.flushed = false;\n\t\t\treturn;\n\t\t}\n\t\tthis.saveSnapshot();\n\t}\n\n\tforkSession(sessionDir: string, header: SessionHeader, sourceEntries: FileEntry[]): string {\n\t\tthis.prepareSessionReference(sessionDir, header.id, header.timestamp);\n\t\tconst reference = this.getSessionReference();\n\t\tif (!reference) {\n\t\t\tthrow new Error(\"Failed to prepare forked session reference\");\n\t\t}\n\t\tthis.append(reference, header);\n\t\tfor (const entry of sourceEntries) {\n\t\t\tif (entry.type !== \"session\") {\n\t\t\t\tthis.append(reference, entry);\n\t\t\t}\n\t\t}\n\t\tthis.flushed = true;\n\t\treturn reference;\n\t}\n\n\tfindMostRecent(sessionDir: string): string | null {\n\t\ttry {\n\t\t\tconst files = readdirSync(sessionDir)\n\t\t\t\t.filter((file) => file.endsWith(\".jsonl\"))\n\t\t\t\t.map((file) => join(sessionDir, file))\n\t\t\t\t.filter(isValidSessionFile)\n\t\t\t\t.map((path) => ({ path, mtime: statSync(path).mtime }))\n\t\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\t\treturn files[0]?.path || null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync list(dir: string, onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst sessions: SessionInfo[] = [];\n\t\tif (!existsSync(dir)) {\n\t\t\treturn sessions;\n\t\t}\n\n\t\ttry {\n\t\t\tconst dirEntries = await readdir(dir);\n\t\t\tconst files = dirEntries.filter((file) => file.endsWith(\".jsonl\")).map((file) => join(dir, file));\n\t\t\tlet loaded = 0;\n\t\t\tconst results = await buildSessionInfosWithConcurrency(files, () => {\n\t\t\t\tloaded++;\n\t\t\t\tonProgress?.(loaded, files.length);\n\t\t\t});\n\t\t\tfor (const info of results) {\n\t\t\t\tif (info) {\n\t\t\t\t\tsessions.push(info);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Return empty list on error\n\t\t}\n\n\t\treturn sessions;\n\t}\n\n\tasync listAll(sessionsDir: string, onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\ttry {\n\t\t\tif (!existsSync(sessionsDir)) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst entries = await readdir(sessionsDir, { withFileTypes: true });\n\t\t\tconst dirs = entries.filter((entry) => entry.isDirectory()).map((entry) => join(sessionsDir, entry.name));\n\n\t\t\tlet totalFiles = 0;\n\t\t\tconst dirFiles: string[][] = [];\n\t\t\tfor (const dir of dirs) {\n\t\t\t\ttry {\n\t\t\t\t\tconst files = (await readdir(dir)).filter((file) => file.endsWith(\".jsonl\"));\n\t\t\t\t\tdirFiles.push(files.map((file) => join(dir, file)));\n\t\t\t\t\ttotalFiles += files.length;\n\t\t\t\t} catch {\n\t\t\t\t\tdirFiles.push([]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet loaded = 0;\n\t\t\tconst sessions: SessionInfo[] = [];\n\t\t\tconst allFiles = dirFiles.flat();\n\t\t\tconst results = await buildSessionInfosWithConcurrency(allFiles, () => {\n\t\t\t\tloaded++;\n\t\t\t\tonProgress?.(loaded, totalFiles);\n\t\t\t});\n\n\t\t\tfor (const info of results) {\n\t\t\t\tif (info) {\n\t\t\t\t\tsessions.push(info);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn sessions;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"jsonl-session-store.js","sourceRoot":"","sources":["../../../../src/core/session/stores/jsonl-session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@fleetagent/pi-agent-core\";\nimport type { Message, TextContent } from \"@fleetagent/pi-ai\";\nimport {\n\tappendFileSync,\n\tcloseSync,\n\texistsSync,\n\tmkdirSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\treadSync,\n\tstatSync,\n\twriteFileSync,\n} from \"fs\";\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { join, resolve } from \"path\";\nimport { getAgentDir as getDefaultAgentDir, getSessionsDir } from \"../../../config.ts\";\nimport type {\n\tFileEntry,\n\tSessionEntry,\n\tSessionEntryBase,\n\tSessionHeader,\n\tSessionInfo,\n\tSessionInfoEntry,\n\tSessionListProgress,\n\tSessionMessageEntry,\n} from \"../types.ts\";\nimport { InMemorySessionStore } from \"./in-memory-session-store.ts\";\n\nfunction isMessageWithContent(message: AgentMessage): message is Message {\n\treturn typeof (message as Message).role === \"string\" && \"content\" in message;\n}\n\nfunction extractTextContent(message: Message): string {\n\tconst content = message.content;\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\treturn content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\" \");\n}\n\nfunction getLastActivityTime(entries: FileEntry[]): number | undefined {\n\tlet lastActivityTime: number | undefined;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\n\t\tconst message = (entry as SessionMessageEntry).message;\n\t\tif (!isMessageWithContent(message)) continue;\n\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\tconst msgTimestamp = (message as { timestamp?: number }).timestamp;\n\t\tif (typeof msgTimestamp === \"number\") {\n\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, msgTimestamp);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst entryTimestamp = (entry as SessionEntryBase).timestamp;\n\t\tif (typeof entryTimestamp === \"string\") {\n\t\t\tconst t = new Date(entryTimestamp).getTime();\n\t\t\tif (!Number.isNaN(t)) {\n\t\t\t\tlastActivityTime = Math.max(lastActivityTime ?? 0, t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn lastActivityTime;\n}\n\nfunction getSessionModifiedDate(entries: FileEntry[], header: SessionHeader, statsMtime: Date): Date {\n\tconst lastActivityTime = getLastActivityTime(entries);\n\tif (typeof lastActivityTime === \"number\" && lastActivityTime > 0) {\n\t\treturn new Date(lastActivityTime);\n\t}\n\n\tconst headerTime = typeof header.timestamp === \"string\" ? new Date(header.timestamp).getTime() : NaN;\n\treturn !Number.isNaN(headerTime) ? new Date(headerTime) : statsMtime;\n}\n\nfunction isValidSessionFile(filePath: string): boolean {\n\ttry {\n\t\tconst fd = openSync(filePath, \"r\");\n\t\tconst buffer = Buffer.alloc(512);\n\t\tconst bytesRead = readSync(fd, buffer, 0, 512, 0);\n\t\tcloseSync(fd);\n\t\tconst firstLine = buffer.toString(\"utf8\", 0, bytesRead).split(\"\\n\")[0];\n\t\tif (!firstLine) return false;\n\t\tconst header = JSON.parse(firstLine) as Partial<SessionHeader>;\n\t\treturn header.type === \"session\" && typeof header.id === \"string\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function buildSessionInfo(filePath: string): Promise<SessionInfo | null> {\n\ttry {\n\t\tconst content = await readFile(filePath, \"utf8\");\n\t\tconst entries: FileEntry[] = [];\n\t\tconst lines = content.trim().split(\"\\n\");\n\n\t\tfor (const line of lines) {\n\t\t\tif (!line.trim()) continue;\n\t\t\ttry {\n\t\t\t\tentries.push(JSON.parse(line) as FileEntry);\n\t\t\t} catch {\n\t\t\t\t// Skip malformed lines\n\t\t\t}\n\t\t}\n\n\t\tif (entries.length === 0) return null;\n\t\tconst header = entries[0];\n\t\tif (header.type !== \"session\") return null;\n\n\t\tconst stats = await stat(filePath);\n\t\tlet messageCount = 0;\n\t\tlet firstMessage = \"\";\n\t\tconst allMessages: string[] = [];\n\t\tlet name: string | undefined;\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type === \"session_info\") {\n\t\t\t\tconst infoEntry = entry as SessionInfoEntry;\n\t\t\t\tname = infoEntry.name?.trim() || undefined;\n\t\t\t}\n\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tmessageCount++;\n\n\t\t\tconst message = (entry as SessionMessageEntry).message;\n\t\t\tif (!isMessageWithContent(message)) continue;\n\t\t\tif (message.role !== \"user\" && message.role !== \"assistant\") continue;\n\n\t\t\tconst textContent = extractTextContent(message);\n\t\t\tif (!textContent) continue;\n\n\t\t\tallMessages.push(textContent);\n\t\t\tif (!firstMessage && message.role === \"user\") {\n\t\t\t\tfirstMessage = textContent;\n\t\t\t}\n\t\t}\n\n\t\tconst sessionHeader = header as SessionHeader;\n\t\tconst cwd = typeof sessionHeader.cwd === \"string\" ? sessionHeader.cwd : \"\";\n\t\tconst parentSessionPath = sessionHeader.parentSession;\n\t\tconst modified = getSessionModifiedDate(entries, sessionHeader, stats.mtime);\n\n\t\treturn {\n\t\t\treference: filePath,\n\t\t\tpath: filePath,\n\t\t\tid: sessionHeader.id,\n\t\t\tcwd,\n\t\t\tname,\n\t\t\tparentSessionPath,\n\t\t\tcreated: new Date(sessionHeader.timestamp),\n\t\t\tmodified,\n\t\t\tmessageCount,\n\t\t\tfirstMessage: firstMessage || \"(no messages)\",\n\t\t\tallMessagesText: allMessages.join(\" \"),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nconst MAX_CONCURRENT_SESSION_INFO_LOADS = 10;\n\nexport function getSessionDirForReference(reference: string): string {\n\treturn resolve(reference, \"..\");\n}\n\nexport function getDefaultSessionDir(cwd: string, agentDir: string = getDefaultAgentDir()): string {\n\tconst safePath = `--${cwd.replace(/^[/\\\\]/, \"\").replace(/[/\\\\:]/g, \"-\")}--`;\n\tconst sessionDir = join(agentDir, \"sessions\", safePath);\n\tensureDir(sessionDir);\n\treturn sessionDir;\n}\n\nexport function getSessionsRoot(): string {\n\treturn getSessionsDir();\n}\n\nexport function prepareSessionReference(sessionDir: string, sessionId: string, timestamp: string): string {\n\tconst fileTimestamp = timestamp.replace(/[:.]/g, \"-\");\n\treturn join(sessionDir, `${fileTimestamp}_${sessionId}.jsonl`);\n}\n\nexport function exists(path: string): boolean {\n\treturn existsSync(path);\n}\n\nexport function ensureDir(path: string): void {\n\tif (!existsSync(path)) {\n\t\tmkdirSync(path, { recursive: true });\n\t}\n}\n\nexport function load(filePath: string): FileEntry[] {\n\tif (!existsSync(filePath)) return [];\n\n\tconst content = readFileSync(filePath, \"utf8\");\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\n\tfor (const line of lines) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\tentries.push(entry);\n\t\t} catch {\n\t\t\t// Skip malformed lines\n\t\t}\n\t}\n\n\tif (entries.length === 0) return entries;\n\tconst header = entries[0];\n\tif (header.type !== \"session\" || typeof (header as Partial<SessionHeader>).id !== \"string\") {\n\t\treturn [];\n\t}\n\n\treturn entries;\n}\n\nexport function append(filePath: string, entry: FileEntry): void {\n\tappendFileSync(filePath, `${JSON.stringify(entry)}\\n`);\n}\n\nexport function rewrite(filePath: string, entries: FileEntry[]): void {\n\tconst content = `${entries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`;\n\twriteFileSync(filePath, content);\n}\n\nexport function forkSession(sessionDir: string, header: SessionHeader, sourceEntries: FileEntry[]): string {\n\tconst reference = prepareSessionReference(sessionDir, header.id, header.timestamp);\n\tappend(reference, header);\n\tfor (const entry of sourceEntries) {\n\t\tif (entry.type !== \"session\") {\n\t\t\tappend(reference, entry);\n\t\t}\n\t}\n\treturn reference;\n}\n\nexport function findMostRecent(sessionDir: string): string | null {\n\ttry {\n\t\tconst files = readdirSync(sessionDir)\n\t\t\t.filter((file) => file.endsWith(\".jsonl\"))\n\t\t\t.map((file) => join(sessionDir, file))\n\t\t\t.filter(isValidSessionFile)\n\t\t\t.map((path) => ({ path, mtime: statSync(path).mtime }))\n\t\t\t.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n\n\t\treturn files[0]?.path || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function list(dir: string, onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\tconst sessions: SessionInfo[] = [];\n\tif (!existsSync(dir)) {\n\t\treturn sessions;\n\t}\n\n\ttry {\n\t\tconst dirEntries = await readdir(dir);\n\t\tconst files = dirEntries.filter((file) => file.endsWith(\".jsonl\")).map((file) => join(dir, file));\n\t\tlet loaded = 0;\n\t\tconst results = await buildSessionInfosWithConcurrency(files, () => {\n\t\t\tloaded++;\n\t\t\tonProgress?.(loaded, files.length);\n\t\t});\n\t\tfor (const info of results) {\n\t\t\tif (info) {\n\t\t\t\tsessions.push(info);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Return empty list on error\n\t}\n\n\treturn sessions;\n}\n\nexport async function listAll(sessionsDir: string, onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\ttry {\n\t\tif (!existsSync(sessionsDir)) {\n\t\t\treturn [];\n\t\t}\n\t\tconst entries = await readdir(sessionsDir, { withFileTypes: true });\n\t\tconst dirs = entries.filter((entry) => entry.isDirectory()).map((entry) => join(sessionsDir, entry.name));\n\n\t\tlet totalFiles = 0;\n\t\tconst dirFiles: string[][] = [];\n\t\tfor (const dir of dirs) {\n\t\t\ttry {\n\t\t\t\tconst files = (await readdir(dir)).filter((file) => file.endsWith(\".jsonl\"));\n\t\t\t\tdirFiles.push(files.map((file) => join(dir, file)));\n\t\t\t\ttotalFiles += files.length;\n\t\t\t} catch {\n\t\t\t\tdirFiles.push([]);\n\t\t\t}\n\t\t}\n\n\t\tlet loaded = 0;\n\t\tconst sessions: SessionInfo[] = [];\n\t\tconst allFiles = dirFiles.flat();\n\t\tconst results = await buildSessionInfosWithConcurrency(allFiles, () => {\n\t\t\tloaded++;\n\t\t\tonProgress?.(loaded, totalFiles);\n\t\t});\n\n\t\tfor (const info of results) {\n\t\t\tif (info) {\n\t\t\t\tsessions.push(info);\n\t\t\t}\n\t\t}\n\n\t\treturn sessions;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nasync function buildSessionInfosWithConcurrency(\n\tfiles: string[],\n\tonLoaded: () => void,\n): Promise<(SessionInfo | null)[]> {\n\tconst results: (SessionInfo | null)[] = new Array(files.length).fill(null);\n\tconst inFlight = new Set<Promise<void>>();\n\tlet nextIndex = 0;\n\n\tconst startNext = (): void => {\n\t\tconst index = nextIndex++;\n\t\tconst file = files[index];\n\t\tif (!file) return;\n\n\t\tlet task: Promise<void>;\n\t\ttask = buildSessionInfo(file)\n\t\t\t.then((info) => {\n\t\t\t\tresults[index] = info;\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tresults[index] = null;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tinFlight.delete(task);\n\t\t\t\tonLoaded();\n\t\t\t});\n\t\tinFlight.add(task);\n\t};\n\n\twhile (nextIndex < files.length || inFlight.size > 0) {\n\t\twhile (nextIndex < files.length && inFlight.size < MAX_CONCURRENT_SESSION_INFO_LOADS) {\n\t\t\tstartNext();\n\t\t}\n\t\tif (inFlight.size > 0) {\n\t\t\tawait Promise.race(inFlight);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nexport class JsonlSessionStore extends InMemorySessionStore {\n\tprivate reference: string | undefined;\n\tprivate flushed = false;\n\n\tisPersisted(): boolean {\n\t\treturn true;\n\t}\n\n\tgetSessionReference(): string | undefined {\n\t\treturn this.reference;\n\t}\n\n\tsetSessionReference(reference: string): void {\n\t\tthis.reference = resolve(reference);\n\t\tthis.flushed = false;\n\t}\n\n\texists(path: string): boolean {\n\t\treturn exists(path);\n\t}\n\n\tensureDir(path: string): void {\n\t\tensureDir(path);\n\t}\n\n\tload(filePath: string): FileEntry[] {\n\t\tif (!exists(filePath)) return [];\n\t\tthis.flushed = true;\n\t\treturn load(filePath);\n\t}\n\n\tappendEntry(entry: SessionEntry): void {\n\t\tsuper.appendEntry(entry);\n\t\tthis.persistAppendedEntry(entry);\n\t}\n\n\tprivate persistAppendedEntry(entry: SessionEntry): void {\n\t\tif (!this.reference) return;\n\n\t\tif (!this.hasAssistantMessage()) {\n\t\t\tthis.flushed = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.flushed) {\n\t\t\tfor (const fileEntry of this.getFileEntries()) {\n\t\t\t\tappend(this.reference, fileEntry);\n\t\t\t}\n\t\t\tthis.flushed = true;\n\t\t} else {\n\t\t\tappend(this.reference, entry);\n\t\t}\n\t}\n\n\tsaveSnapshot(): void {\n\t\tif (!this.reference) return;\n\t\trewrite(this.reference, this.getFileEntries());\n\t\tthis.flushed = true;\n\t}\n\n\tcommitSnapshot(): void {\n\t\tif (!this.hasAssistantMessage()) {\n\t\t\tthis.flushed = false;\n\t\t\treturn;\n\t\t}\n\t\tthis.saveSnapshot();\n\t}\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { RemoteSessionClient, RemoteSessionSnapshot } from "../remote-session-client.ts";
|
|
2
|
-
import type { SessionEntry } from "../types.ts";
|
|
2
|
+
import type { FileEntry, SessionEntry } from "../types.ts";
|
|
3
3
|
import { InMemorySessionStore } from "./in-memory-session-store.ts";
|
|
4
|
-
import type { SessionOpenResult } from "./session-store.ts";
|
|
5
4
|
export interface RemoteSessionStoreOptions {
|
|
6
5
|
client: RemoteSessionClient;
|
|
7
6
|
reference?: string;
|
|
@@ -17,7 +16,7 @@ export interface RemoteSessionStoreOptions {
|
|
|
17
16
|
*/
|
|
18
17
|
export declare class RemoteSessionStore extends InMemorySessionStore {
|
|
19
18
|
private readonly client;
|
|
20
|
-
private
|
|
19
|
+
private reference;
|
|
21
20
|
private etag;
|
|
22
21
|
private pendingSync;
|
|
23
22
|
private dirtyEntries;
|
|
@@ -27,9 +26,8 @@ export declare class RemoteSessionStore extends InMemorySessionStore {
|
|
|
27
26
|
isPersisted(): boolean;
|
|
28
27
|
getSessionReference(): string | undefined;
|
|
29
28
|
setSessionReference(reference: string): void;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
getParentSessionReference(): string | undefined;
|
|
29
|
+
exists(reference: string): boolean;
|
|
30
|
+
load(reference: string): FileEntry[];
|
|
33
31
|
appendEntry(entry: SessionEntry): void;
|
|
34
32
|
saveSnapshot(): void;
|
|
35
33
|
commitSnapshot(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-session-store.d.ts","sourceRoot":"","sources":["../../../../src/core/session/stores/remote-session-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE9F,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"remote-session-store.d.ts","sourceRoot":"","sources":["../../../../src/core/session/stores/remote-session-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE9F,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAMD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,oBAAoB;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAoC;IAEpD,YAAY,OAAO,EAAE,yBAAyB,EAM7C;IAEQ,WAAW,IAAI,OAAO,CAE9B;IAEQ,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAEjD;IAEQ,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;IAEQ,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAI1C;IAEQ,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAO5C;IAEQ,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAG9C;IAEQ,YAAY,IAAI,IAAI,CAE5B;IAEQ,cAAc,IAAI,IAAI,CAE9B;IAEK,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtC;IAED,gBAAgB,IAAI,OAAO,CAE1B;IAED,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,oBAAoB;YAQd,iBAAiB;YAcjB,eAAe;CAW7B","sourcesContent":["import type { RemoteSessionClient, RemoteSessionSnapshot } from \"../remote-session-client.ts\";\nimport { formatRemoteSessionReference, parseRemoteSessionId } from \"../remote-session-client.ts\";\nimport type { FileEntry, SessionEntry } from \"../types.ts\";\nimport { InMemorySessionStore } from \"./in-memory-session-store.ts\";\n\nexport interface RemoteSessionStoreOptions {\n\tclient: RemoteSessionClient;\n\treference?: string;\n\tsnapshot?: RemoteSessionSnapshot;\n}\n\nfunction getSnapshotReference(snapshot: RemoteSessionSnapshot): string {\n\treturn snapshot.reference || formatRemoteSessionReference(snapshot.id);\n}\n\n/**\n * Remote session store.\n *\n * The active session state is kept in memory for synchronous Session access.\n * Mutations are serialized to the remote service in the background, and\n * snapshots fetched by RemoteSessionManager are used to hydrate the store before\n * Session starts reading from it.\n */\nexport class RemoteSessionStore extends InMemorySessionStore {\n\tprivate readonly client: RemoteSessionClient;\n\tprivate reference: string | undefined;\n\tprivate etag: string | undefined;\n\tprivate pendingSync: Promise<void> = Promise.resolve();\n\tprivate dirtyEntries: FileEntry[] = [];\n\tprivate lastSyncError: unknown;\n\tprivate snapshot: RemoteSessionSnapshot | undefined;\n\n\tconstructor(options: RemoteSessionStoreOptions) {\n\t\tsuper();\n\t\tthis.client = options.client;\n\t\tthis.snapshot = options.snapshot;\n\t\tthis.reference = options.reference ?? (options.snapshot ? getSnapshotReference(options.snapshot) : undefined);\n\t\tthis.etag = options.snapshot?.etag;\n\t}\n\n\toverride isPersisted(): boolean {\n\t\treturn true;\n\t}\n\n\toverride getSessionReference(): string | undefined {\n\t\treturn this.reference;\n\t}\n\n\toverride setSessionReference(reference: string): void {\n\t\tthis.reference = formatRemoteSessionReference(parseRemoteSessionId(reference));\n\t}\n\n\toverride exists(reference: string): boolean {\n\t\tif (!this.snapshot) return false;\n\t\tconst snapshotReference = getSnapshotReference(this.snapshot);\n\t\treturn parseRemoteSessionId(reference) === parseRemoteSessionId(snapshotReference);\n\t}\n\n\toverride load(reference: string): FileEntry[] {\n\t\tif (!this.snapshot || !this.exists(reference)) return [];\n\t\tthis.reference = getSnapshotReference(this.snapshot);\n\t\tthis.etag = this.snapshot.etag;\n\t\tconst entries = [...this.snapshot.entries];\n\t\tthis.snapshot = undefined;\n\t\treturn entries;\n\t}\n\n\toverride appendEntry(entry: SessionEntry): void {\n\t\tsuper.appendEntry(entry);\n\t\tthis.queueAppend([entry]);\n\t}\n\n\toverride saveSnapshot(): void {\n\t\tthis.queueReplaceSnapshot();\n\t}\n\n\toverride commitSnapshot(): void {\n\t\tthis.queueReplaceSnapshot();\n\t}\n\n\tasync flushPendingSync(): Promise<void> {\n\t\tawait this.pendingSync;\n\t\tif (this.lastSyncError) {\n\t\t\tthrow this.lastSyncError;\n\t\t}\n\t}\n\n\tgetLastSyncError(): unknown {\n\t\treturn this.lastSyncError;\n\t}\n\n\tprivate queueAppend(entries: FileEntry[]): void {\n\t\tthis.dirtyEntries.push(...entries);\n\t\tthis.pendingSync = this.pendingSync\n\t\t\t.then(() => this.flushDirtyEntries())\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tthis.lastSyncError = error;\n\t\t\t});\n\t}\n\n\tprivate queueReplaceSnapshot(): void {\n\t\tthis.pendingSync = this.pendingSync\n\t\t\t.then(() => this.replaceSnapshot())\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tthis.lastSyncError = error;\n\t\t\t});\n\t}\n\n\tprivate async flushDirtyEntries(): Promise<void> {\n\t\tif (!this.reference || this.dirtyEntries.length === 0) return;\n\t\tconst entries = [...this.dirtyEntries];\n\t\tconst response = await this.client.appendEntries(this.reference, {\n\t\t\tbaseEtag: this.etag,\n\t\t\tentries,\n\t\t});\n\t\tthis.etag = response.etag ?? this.etag;\n\t\tthis.lastSyncError = undefined;\n\n\t\tconst accepted = Math.max(0, Math.min(response.accepted, entries.length));\n\t\tthis.dirtyEntries = this.dirtyEntries.slice(accepted);\n\t}\n\n\tprivate async replaceSnapshot(): Promise<void> {\n\t\tif (!this.reference) return;\n\n\t\tconst response = await this.client.replaceSnapshot(this.reference, {\n\t\t\tbaseEtag: this.etag,\n\t\t\tentries: this.getFileEntries(),\n\t\t});\n\t\tthis.etag = response.etag ?? this.etag;\n\t\tthis.dirtyEntries = [];\n\t\tthis.lastSyncError = undefined;\n\t}\n}\n"]}
|
|
@@ -13,7 +13,7 @@ function getSnapshotReference(snapshot) {
|
|
|
13
13
|
*/
|
|
14
14
|
export class RemoteSessionStore extends InMemorySessionStore {
|
|
15
15
|
client;
|
|
16
|
-
|
|
16
|
+
reference;
|
|
17
17
|
etag;
|
|
18
18
|
pendingSync = Promise.resolve();
|
|
19
19
|
dirtyEntries = [];
|
|
@@ -23,44 +23,32 @@ export class RemoteSessionStore extends InMemorySessionStore {
|
|
|
23
23
|
super();
|
|
24
24
|
this.client = options.client;
|
|
25
25
|
this.snapshot = options.snapshot;
|
|
26
|
-
this.
|
|
27
|
-
options.reference ?? (options.snapshot ? getSnapshotReference(options.snapshot) : undefined);
|
|
26
|
+
this.reference = options.reference ?? (options.snapshot ? getSnapshotReference(options.snapshot) : undefined);
|
|
28
27
|
this.etag = options.snapshot?.etag;
|
|
29
28
|
}
|
|
30
29
|
isPersisted() {
|
|
31
30
|
return true;
|
|
32
31
|
}
|
|
33
32
|
getSessionReference() {
|
|
34
|
-
return this.
|
|
33
|
+
return this.reference;
|
|
35
34
|
}
|
|
36
35
|
setSessionReference(reference) {
|
|
37
|
-
this.
|
|
36
|
+
this.reference = formatRemoteSessionReference(parseRemoteSessionId(reference));
|
|
38
37
|
}
|
|
39
|
-
|
|
40
|
-
this.
|
|
41
|
-
|
|
42
|
-
return { reference: this.sessionReference, exists: false, entries: [] };
|
|
43
|
-
}
|
|
38
|
+
exists(reference) {
|
|
39
|
+
if (!this.snapshot)
|
|
40
|
+
return false;
|
|
44
41
|
const snapshotReference = getSnapshotReference(this.snapshot);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
this.
|
|
42
|
+
return parseRemoteSessionId(reference) === parseRemoteSessionId(snapshotReference);
|
|
43
|
+
}
|
|
44
|
+
load(reference) {
|
|
45
|
+
if (!this.snapshot || !this.exists(reference))
|
|
46
|
+
return [];
|
|
47
|
+
this.reference = getSnapshotReference(this.snapshot);
|
|
51
48
|
this.etag = this.snapshot.etag;
|
|
52
49
|
const entries = [...this.snapshot.entries];
|
|
53
50
|
this.snapshot = undefined;
|
|
54
|
-
return
|
|
55
|
-
}
|
|
56
|
-
prepareSessionReference(_sessionDir, sessionId, _timestamp) {
|
|
57
|
-
if (!this.sessionReference) {
|
|
58
|
-
this.sessionReference = formatRemoteSessionReference(sessionId);
|
|
59
|
-
}
|
|
60
|
-
return this.sessionReference;
|
|
61
|
-
}
|
|
62
|
-
getParentSessionReference() {
|
|
63
|
-
return this.sessionReference;
|
|
51
|
+
return entries;
|
|
64
52
|
}
|
|
65
53
|
appendEntry(entry) {
|
|
66
54
|
super.appendEntry(entry);
|
|
@@ -97,10 +85,10 @@ export class RemoteSessionStore extends InMemorySessionStore {
|
|
|
97
85
|
});
|
|
98
86
|
}
|
|
99
87
|
async flushDirtyEntries() {
|
|
100
|
-
if (!this.
|
|
88
|
+
if (!this.reference || this.dirtyEntries.length === 0)
|
|
101
89
|
return;
|
|
102
90
|
const entries = [...this.dirtyEntries];
|
|
103
|
-
const response = await this.client.appendEntries(this.
|
|
91
|
+
const response = await this.client.appendEntries(this.reference, {
|
|
104
92
|
baseEtag: this.etag,
|
|
105
93
|
entries,
|
|
106
94
|
});
|
|
@@ -110,9 +98,9 @@ export class RemoteSessionStore extends InMemorySessionStore {
|
|
|
110
98
|
this.dirtyEntries = this.dirtyEntries.slice(accepted);
|
|
111
99
|
}
|
|
112
100
|
async replaceSnapshot() {
|
|
113
|
-
if (!this.
|
|
101
|
+
if (!this.reference)
|
|
114
102
|
return;
|
|
115
|
-
const response = await this.client.replaceSnapshot(this.
|
|
103
|
+
const response = await this.client.replaceSnapshot(this.reference, {
|
|
116
104
|
baseEtag: this.etag,
|
|
117
105
|
entries: this.getFileEntries(),
|
|
118
106
|
});
|