@felan-ai/felan 0.21.16 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/dependencies.js +1 -1
- package/dist/dependencies.js.map +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +2 -2
- package/dist/extensions.js.map +1 -1
- package/dist/herdr.d.ts +22 -0
- package/dist/herdr.d.ts.map +1 -0
- package/dist/herdr.js +208 -0
- package/dist/herdr.js.map +1 -0
- package/dist/insights.d.ts +1 -1
- package/dist/insights.d.ts.map +1 -1
- package/dist/insights.js +11 -8
- package/dist/insights.js.map +1 -1
- package/dist/memory/control.d.ts +1 -1
- package/dist/memory/control.d.ts.map +1 -1
- package/dist/memory/control.js +90 -34
- package/dist/memory/control.js.map +1 -1
- package/dist/memory/coordinator.d.ts +13 -2
- package/dist/memory/coordinator.d.ts.map +1 -1
- package/dist/memory/coordinator.js +416 -67
- package/dist/memory/coordinator.js.map +1 -1
- package/dist/memory/dreamer.d.ts +7 -1
- package/dist/memory/dreamer.d.ts.map +1 -1
- package/dist/memory/dreamer.js +145 -59
- package/dist/memory/dreamer.js.map +1 -1
- package/dist/memory/history-view.d.ts +26 -0
- package/dist/memory/history-view.d.ts.map +1 -0
- package/dist/memory/history-view.js +192 -0
- package/dist/memory/history-view.js.map +1 -0
- package/dist/memory/history.d.ts +33 -0
- package/dist/memory/history.d.ts.map +1 -0
- package/dist/memory/history.js +314 -0
- package/dist/memory/history.js.map +1 -0
- package/dist/memory/run-retention.d.ts +12 -0
- package/dist/memory/run-retention.d.ts.map +1 -0
- package/dist/memory/run-retention.js +294 -0
- package/dist/memory/run-retention.js.map +1 -0
- package/dist/memory/run.d.ts +67 -0
- package/dist/memory/run.d.ts.map +1 -0
- package/dist/memory/run.js +417 -0
- package/dist/memory/run.js.map +1 -0
- package/dist/memory/store.d.ts +67 -3
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +517 -110
- package/dist/memory/store.js.map +1 -1
- package/dist/resume.d.ts.map +1 -1
- package/dist/resume.js +12 -7
- package/dist/resume.js.map +1 -1
- package/dist/runtime.d.ts +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +27 -18
- package/dist/runtime.js.map +1 -1
- package/dist/session-picker.d.ts +8 -1
- package/dist/session-picker.d.ts.map +1 -1
- package/dist/session-picker.js +7 -4
- package/dist/session-picker.js.map +1 -1
- package/dist/settings.d.ts +0 -3
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +0 -22
- package/dist/settings.js.map +1 -1
- package/dist/subagents/agent-transcript.d.ts +4 -1
- package/dist/subagents/agent-transcript.d.ts.map +1 -1
- package/dist/subagents/agent-transcript.js +16 -4
- package/dist/subagents/agent-transcript.js.map +1 -1
- package/package.json +24 -23
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { lstat, open, readdir, realpath, rmdir, unlink } from 'node:fs/promises';
|
|
3
|
+
import { basename, join, resolve, sep } from 'node:path';
|
|
4
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
|
|
5
|
+
const METADATA_BYTES = 64 * 1_024;
|
|
6
|
+
const ACTIVE_STATUSES = new Set(['started', 'worker_completed']);
|
|
7
|
+
const STATUSES = new Set([...ACTIVE_STATUSES, 'completed', 'failed', 'cancelled', 'blocked', 'interrupted']);
|
|
8
|
+
// Unverified records and orphan memory sessions are preserved. Symlink targets are never
|
|
9
|
+
// followed; positively verified foreign-project records are excluded.
|
|
10
|
+
export async function pruneMemoryRuns(options) {
|
|
11
|
+
const maxCompletedRuns = options.maxCompletedRuns ?? 50;
|
|
12
|
+
if (!Number.isSafeInteger(maxCompletedRuns) || maxCompletedRuns < 0) {
|
|
13
|
+
throw new RangeError('Memory retention maxCompletedRuns must be a nonnegative safe integer');
|
|
14
|
+
}
|
|
15
|
+
for (const [name, value] of Object.entries({ maxCompletedRuns })) {
|
|
16
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
17
|
+
throw new RangeError(`Memory retention ${name} must be a nonnegative safe integer`);
|
|
18
|
+
}
|
|
19
|
+
if (!options.projectKey || !options.projectDirectory || !options.sessionDirectory) {
|
|
20
|
+
throw new Error('Memory retention requires project and session directories and a project key');
|
|
21
|
+
}
|
|
22
|
+
const project = await rootDirectory(options.projectDirectory);
|
|
23
|
+
const sessions = await rootDirectory(options.sessionDirectory);
|
|
24
|
+
const runs = project && await rootDirectory(join(project.path, 'runs'));
|
|
25
|
+
const roots = [project, sessions, runs].filter((entry) => entry !== undefined);
|
|
26
|
+
const protectedIds = new Set(options.protectedRunIds);
|
|
27
|
+
const retained = (await inventory(runs, sessions, options.projectKey)).runs;
|
|
28
|
+
let terminalRuns = retained.filter((run) => !run.active).length;
|
|
29
|
+
for (const run of retained.sort((left, right) => left.timestamp - right.timestamp || left.id.localeCompare(right.id))) {
|
|
30
|
+
if (run.active || protectedIds.has(run.id) || !run.safeToDelete)
|
|
31
|
+
continue;
|
|
32
|
+
if (terminalRuns <= maxCompletedRuns)
|
|
33
|
+
break;
|
|
34
|
+
if (!await matchesDirectories(roots))
|
|
35
|
+
throw new Error('Memory retention directories changed');
|
|
36
|
+
const current = runs && sessions && await ownedRun(runs, sessions, run.id);
|
|
37
|
+
if (!current || current.projectKey !== options.projectKey || current.active || !current.safeToDelete || !sameRun(run, current))
|
|
38
|
+
continue;
|
|
39
|
+
await removeRun(current, roots);
|
|
40
|
+
terminalRuns -= 1;
|
|
41
|
+
}
|
|
42
|
+
if (!await matchesDirectories(roots))
|
|
43
|
+
throw new Error('Memory retention directories changed');
|
|
44
|
+
const remaining = (await inventory(runs, sessions, options.projectKey)).runs;
|
|
45
|
+
terminalRuns = remaining.filter((run) => !run.active).length;
|
|
46
|
+
return { terminalRuns, overLimit: terminalRuns > maxCompletedRuns };
|
|
47
|
+
}
|
|
48
|
+
async function rootDirectory(path) {
|
|
49
|
+
const entry = await entryAt(resolve(path));
|
|
50
|
+
if (!entry)
|
|
51
|
+
return undefined;
|
|
52
|
+
if (!entry.stat.isDirectory())
|
|
53
|
+
throw new Error('Memory retention requires real directories, not symlinks or files');
|
|
54
|
+
const canonical = await entryAt(await realpath(entry.path));
|
|
55
|
+
if (!canonical || !sameNode(entry, canonical))
|
|
56
|
+
throw new Error('Memory retention directory changed');
|
|
57
|
+
return canonical;
|
|
58
|
+
}
|
|
59
|
+
async function inventory(runs, sessions, projectKey) {
|
|
60
|
+
const retained = [];
|
|
61
|
+
const pairedSessions = new Set();
|
|
62
|
+
if (runs) {
|
|
63
|
+
for (const id of await readdir(runs.path)) {
|
|
64
|
+
const run = UUID.test(id) && sessions ? await ownedRun(runs, sessions, id) : undefined;
|
|
65
|
+
if (!run)
|
|
66
|
+
continue;
|
|
67
|
+
if (run.projectKey !== projectKey)
|
|
68
|
+
continue;
|
|
69
|
+
retained.push(run);
|
|
70
|
+
pairedSessions.add(run.session.path);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (sessions) {
|
|
74
|
+
for (const name of await readdir(sessions.path)) {
|
|
75
|
+
if (!isSessionFileName(name))
|
|
76
|
+
continue;
|
|
77
|
+
const path = join(sessions.path, name);
|
|
78
|
+
if (pairedSessions.has(path))
|
|
79
|
+
continue;
|
|
80
|
+
const session = await readPrefix(path, false);
|
|
81
|
+
if (!session || initialIdentity(session.text)?.projectKey !== projectKey)
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { runs: retained };
|
|
86
|
+
}
|
|
87
|
+
async function ownedRun(runs, sessions, id) {
|
|
88
|
+
const directory = await entryAt(join(runs.path, id));
|
|
89
|
+
if (!directory?.stat.isDirectory())
|
|
90
|
+
return undefined;
|
|
91
|
+
const manifest = await readPrefix(join(directory.path, 'manifest.json'), true);
|
|
92
|
+
if (!manifest)
|
|
93
|
+
return undefined;
|
|
94
|
+
const metadata = parseObject(manifest.text);
|
|
95
|
+
const projectKey = metadata?.projectKey;
|
|
96
|
+
if (typeof projectKey !== 'string' || !projectKey)
|
|
97
|
+
return undefined;
|
|
98
|
+
if (!hasIdentity(metadata, id, projectKey) || typeof metadata.status !== 'string' || !STATUSES.has(metadata.status))
|
|
99
|
+
return undefined;
|
|
100
|
+
const timestamp = isoTimestamp(metadata.startedAt);
|
|
101
|
+
const finishedAt = metadata.finishedAt === undefined ? undefined : isoTimestamp(metadata.finishedAt);
|
|
102
|
+
if (timestamp === undefined || (metadata.finishedAt !== undefined && (finishedAt === undefined || finishedAt < timestamp)))
|
|
103
|
+
return undefined;
|
|
104
|
+
const name = metadata.sessionFile;
|
|
105
|
+
if (!isSessionFileName(name))
|
|
106
|
+
return undefined;
|
|
107
|
+
const sessionPath = join(sessions.path, name);
|
|
108
|
+
if (sessionPath.startsWith(`${directory.path}${sep}`))
|
|
109
|
+
return undefined;
|
|
110
|
+
const session = await readPrefix(sessionPath, false);
|
|
111
|
+
const identity = session && initialIdentity(session.text);
|
|
112
|
+
if (!session || identity?.id !== id || identity.projectKey !== projectKey)
|
|
113
|
+
return undefined;
|
|
114
|
+
const files = [];
|
|
115
|
+
const directories = [directory];
|
|
116
|
+
let safeToDelete = true;
|
|
117
|
+
for (let index = 0; index < directories.length; index += 1) {
|
|
118
|
+
const parent = directories[index];
|
|
119
|
+
if (!await matchesDirectories(directories))
|
|
120
|
+
return undefined;
|
|
121
|
+
for (const name of await readdir(parent.path)) {
|
|
122
|
+
const entry = await entryAt(join(parent.path, name));
|
|
123
|
+
if (!entry)
|
|
124
|
+
return undefined;
|
|
125
|
+
if (entry.stat.isFile())
|
|
126
|
+
files.push(entry);
|
|
127
|
+
else if (entry.stat.isDirectory())
|
|
128
|
+
directories.push(entry);
|
|
129
|
+
else
|
|
130
|
+
safeToDelete = false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (!await matchesDirectories(directories))
|
|
134
|
+
return undefined;
|
|
135
|
+
const manifestEntry = files.find((entry) => entry.path === manifest.entry.path);
|
|
136
|
+
if (!manifestEntry || !unchanged(manifest.entry, manifestEntry))
|
|
137
|
+
return undefined;
|
|
138
|
+
return {
|
|
139
|
+
id,
|
|
140
|
+
projectKey,
|
|
141
|
+
active: ACTIVE_STATUSES.has(metadata.status),
|
|
142
|
+
timestamp: finishedAt ?? timestamp,
|
|
143
|
+
manifestText: manifest.text,
|
|
144
|
+
session: session.entry,
|
|
145
|
+
files,
|
|
146
|
+
directories,
|
|
147
|
+
safeToDelete,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function readPrefix(path, wholeFile) {
|
|
151
|
+
const entry = await entryAt(path);
|
|
152
|
+
if (!entry?.stat.isFile() || (wholeFile && entry.stat.size > METADATA_BYTES))
|
|
153
|
+
return undefined;
|
|
154
|
+
try {
|
|
155
|
+
const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
156
|
+
try {
|
|
157
|
+
const opened = { path, stat: await handle.stat() };
|
|
158
|
+
if (!opened.stat.isFile() || !sameNode(entry, opened) || (wholeFile && opened.stat.size > METADATA_BYTES))
|
|
159
|
+
return undefined;
|
|
160
|
+
const buffer = Buffer.alloc(Math.min(opened.stat.size, METADATA_BYTES));
|
|
161
|
+
let length = 0;
|
|
162
|
+
while (length < buffer.length) {
|
|
163
|
+
const { bytesRead } = await handle.read(buffer, length, buffer.length - length, length);
|
|
164
|
+
if (bytesRead === 0)
|
|
165
|
+
break;
|
|
166
|
+
length += bytesRead;
|
|
167
|
+
}
|
|
168
|
+
const current = await entryAt(path);
|
|
169
|
+
if (!current || !sameNode(opened, current) || (wholeFile && (!unchanged(opened, current) || length !== current.stat.size)))
|
|
170
|
+
return undefined;
|
|
171
|
+
return { entry: current, text: buffer.subarray(0, length).toString('utf8') };
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
await handle.close();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
if (unavailable(error))
|
|
179
|
+
return undefined;
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function isSessionFileName(value) {
|
|
184
|
+
return typeof value === 'string' && value === basename(value) && value.endsWith('.jsonl') && !/[/\\:\x00-\x1f\x7f]/u.test(value);
|
|
185
|
+
}
|
|
186
|
+
function initialIdentity(text) {
|
|
187
|
+
const lines = text.split('\n');
|
|
188
|
+
lines.pop();
|
|
189
|
+
const header = parseObject(lines.shift() ?? '');
|
|
190
|
+
if (header?.type !== 'session' || typeof header.id !== 'string' || !UUID.test(header.id))
|
|
191
|
+
return undefined;
|
|
192
|
+
for (const line of lines) {
|
|
193
|
+
const entry = parseObject(line);
|
|
194
|
+
if (!entry)
|
|
195
|
+
return undefined;
|
|
196
|
+
if (entry.type === 'custom' && entry.customType === 'felan-memory-run') {
|
|
197
|
+
const data = entry.data;
|
|
198
|
+
const projectKey = data !== null && typeof data === 'object' && 'projectKey' in data ? data.projectKey : undefined;
|
|
199
|
+
return typeof projectKey === 'string' && projectKey && hasIdentity(data, header.id, projectKey)
|
|
200
|
+
? { id: header.id, projectKey }
|
|
201
|
+
: undefined;
|
|
202
|
+
}
|
|
203
|
+
if (!['session_info', 'model_change', 'thinking_level_change'].includes(String(entry.type)))
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
function hasIdentity(value, id, projectKey) {
|
|
209
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
210
|
+
&& 'version' in value && value.version === 1 && 'kind' in value && value.kind === 'memory'
|
|
211
|
+
&& 'sessionId' in value && value.sessionId === id && 'projectKey' in value && value.projectKey === projectKey;
|
|
212
|
+
}
|
|
213
|
+
function parseObject(text) {
|
|
214
|
+
try {
|
|
215
|
+
const value = JSON.parse(text);
|
|
216
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function isoTimestamp(value) {
|
|
223
|
+
if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?(?:Z|[+-]\d{2}:\d{2})$/u.test(value))
|
|
224
|
+
return undefined;
|
|
225
|
+
const local = Date.parse(`${value.slice(0, 19)}Z`);
|
|
226
|
+
const timestamp = Date.parse(value);
|
|
227
|
+
if (!Number.isFinite(local) || !Number.isFinite(timestamp) || new Date(local).toISOString().slice(0, 19) !== value.slice(0, 19))
|
|
228
|
+
return undefined;
|
|
229
|
+
return timestamp;
|
|
230
|
+
}
|
|
231
|
+
function sameRun(left, right) {
|
|
232
|
+
return left.manifestText === right.manifestText && unchanged(left.session, right.session)
|
|
233
|
+
&& left.files.length === right.files.length && left.directories.length === right.directories.length
|
|
234
|
+
&& left.files.every((entry) => right.files.some((other) => entry.path === other.path && unchanged(entry, other)))
|
|
235
|
+
&& left.directories.every((entry) => right.directories.some((other) => entry.path === other.path && sameNode(entry, other)));
|
|
236
|
+
}
|
|
237
|
+
async function removeRun(run, roots) {
|
|
238
|
+
const directories = [...roots, ...run.directories];
|
|
239
|
+
const manifestPath = join(run.directories[0].path, 'manifest.json');
|
|
240
|
+
const files = [...run.files.filter((entry) => entry.path !== manifestPath), run.files.find((entry) => entry.path === manifestPath)];
|
|
241
|
+
// Unlink only inventoried files. Recursive removal could consume newly added or unverified entries.
|
|
242
|
+
for (const file of files) {
|
|
243
|
+
const ancestors = directories.filter((entry) => file.path.startsWith(`${entry.path}${sep}`));
|
|
244
|
+
const current = await entryAt(file.path);
|
|
245
|
+
if (!current || !unchanged(file, current) || !await matchesDirectories(ancestors)
|
|
246
|
+
|| !await matchesDirectories(roots) || !unchangedSession(run.session, await entryAt(run.session.path))) {
|
|
247
|
+
throw new Error('Memory run changed during retention');
|
|
248
|
+
}
|
|
249
|
+
await unlink(file.path);
|
|
250
|
+
}
|
|
251
|
+
for (const directory of [...run.directories].reverse()) {
|
|
252
|
+
const ancestors = directories.filter((entry) => directory.path === entry.path || directory.path.startsWith(`${entry.path}${sep}`));
|
|
253
|
+
if (!await matchesDirectories(ancestors))
|
|
254
|
+
throw new Error('Memory run directory changed during retention');
|
|
255
|
+
await rmdir(directory.path);
|
|
256
|
+
}
|
|
257
|
+
if (!await matchesDirectories(roots) || !unchangedSession(run.session, await entryAt(run.session.path))) {
|
|
258
|
+
throw new Error('Memory session changed during retention');
|
|
259
|
+
}
|
|
260
|
+
await unlink(run.session.path);
|
|
261
|
+
}
|
|
262
|
+
function unchangedSession(expected, actual) {
|
|
263
|
+
return actual !== undefined && unchanged(expected, actual);
|
|
264
|
+
}
|
|
265
|
+
async function matchesDirectories(entries) {
|
|
266
|
+
for (const entry of entries) {
|
|
267
|
+
const current = await entryAt(entry.path);
|
|
268
|
+
if (!current?.stat.isDirectory() || !sameNode(entry, current))
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
function sameNode(left, right) {
|
|
274
|
+
return left.stat.dev === right.stat.dev && left.stat.ino === right.stat.ino && left.stat.mode === right.stat.mode;
|
|
275
|
+
}
|
|
276
|
+
function unchanged(left, right) {
|
|
277
|
+
return sameNode(left, right) && left.stat.size === right.stat.size
|
|
278
|
+
&& left.stat.mtimeMs === right.stat.mtimeMs && left.stat.ctimeMs === right.stat.ctimeMs;
|
|
279
|
+
}
|
|
280
|
+
async function entryAt(path) {
|
|
281
|
+
try {
|
|
282
|
+
return { path, stat: await lstat(path) };
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
if (unavailable(error))
|
|
286
|
+
return undefined;
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
function unavailable(error) {
|
|
291
|
+
return error !== null && typeof error === 'object' && 'code' in error
|
|
292
|
+
&& ['ENOENT', 'ENOTDIR', 'ELOOP'].includes(String(error.code));
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=run-retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-retention.js","sourceRoot":"","sources":["../../src/memory/run-retention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { SessionManager, type Api, type Model } from '@felan-ai/agent-core';
|
|
2
|
+
import type { SessionCheckpoint } from '@felan-ai/ext-memory';
|
|
3
|
+
export declare const MEMORY_RUN_ENTRY = "felan-memory-run";
|
|
4
|
+
export type MemoryRunStatus = 'started' | 'worker_completed' | 'completed' | 'failed' | 'cancelled' | 'blocked' | 'interrupted';
|
|
5
|
+
export type MemoryRunPhase = 'materialize' | 'model' | 'validate' | 'publish';
|
|
6
|
+
export interface MemoryRunUsage {
|
|
7
|
+
readonly input?: number;
|
|
8
|
+
readonly output?: number;
|
|
9
|
+
readonly cacheRead?: number;
|
|
10
|
+
readonly cacheWrite?: number;
|
|
11
|
+
readonly totalTokens?: number;
|
|
12
|
+
readonly costUsd?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface MemoryRunMetadata {
|
|
15
|
+
readonly version: 1;
|
|
16
|
+
readonly kind: 'memory';
|
|
17
|
+
readonly sessionId: string;
|
|
18
|
+
readonly sessionFile: string;
|
|
19
|
+
readonly projectKey: string;
|
|
20
|
+
readonly projectRoot: string;
|
|
21
|
+
readonly startedAt: string;
|
|
22
|
+
readonly finishedAt?: string;
|
|
23
|
+
readonly status: MemoryRunStatus;
|
|
24
|
+
readonly phase: MemoryRunPhase;
|
|
25
|
+
readonly checkpoints: readonly SessionCheckpoint[];
|
|
26
|
+
readonly baseFingerprint: string;
|
|
27
|
+
readonly outputFingerprint?: string;
|
|
28
|
+
readonly model?: {
|
|
29
|
+
readonly provider: string;
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly thinking?: string;
|
|
32
|
+
};
|
|
33
|
+
readonly usage?: MemoryRunUsage;
|
|
34
|
+
readonly error?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface CreateMemoryRunOptions {
|
|
37
|
+
readonly projectDirectory: string;
|
|
38
|
+
readonly sessionDirectory: string;
|
|
39
|
+
readonly projectKey: string;
|
|
40
|
+
readonly projectRoot: string;
|
|
41
|
+
readonly checkpoints: readonly SessionCheckpoint[];
|
|
42
|
+
readonly baseFingerprint: string;
|
|
43
|
+
readonly protectedRunIds?: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
export declare class LocalMemoryRun {
|
|
46
|
+
#private;
|
|
47
|
+
readonly options: CreateMemoryRunOptions;
|
|
48
|
+
readonly directory: string;
|
|
49
|
+
readonly workspace: string;
|
|
50
|
+
readonly sessionManager: SessionManager;
|
|
51
|
+
private constructor();
|
|
52
|
+
static reconcile(options: Pick<CreateMemoryRunOptions, 'projectDirectory' | 'projectKey' | 'sessionDirectory' | 'protectedRunIds'>, outcome: {
|
|
53
|
+
readonly runId: string;
|
|
54
|
+
readonly status: 'success' | 'failure' | 'cancelled';
|
|
55
|
+
readonly at: string;
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
static reconcileAbandoned(options: Pick<CreateMemoryRunOptions, 'projectDirectory' | 'projectKey' | 'sessionDirectory' | 'protectedRunIds'>, activeRunIds: readonly string[], now?: number): Promise<void>;
|
|
58
|
+
static create(options: CreateMemoryRunOptions): Promise<LocalMemoryRun>;
|
|
59
|
+
get metadata(): MemoryRunMetadata;
|
|
60
|
+
record(update: Partial<Omit<MemoryRunMetadata, 'version' | 'kind' | 'sessionId' | 'sessionFile' | 'projectKey'>>): Promise<void>;
|
|
61
|
+
model(model: Model<Api>, thinking?: string): Promise<void>;
|
|
62
|
+
finish(status: MemoryRunStatus, error?: unknown): Promise<void>;
|
|
63
|
+
enforceRetention(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
export declare function memoryRunUsage(entries: ReturnType<SessionManager['getEntries']>): MemoryRunUsage | undefined;
|
|
66
|
+
export declare function sanitizeMemoryDiagnostic(error: unknown): string;
|
|
67
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/memory/run.ts"],"names":[],"mappings":"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"}
|