@moxxy/core 0.5.4 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/sessions/persistence.d.ts +75 -10
- package/dist/sessions/persistence.d.ts.map +1 -1
- package/dist/sessions/persistence.js +186 -64
- package/dist/sessions/persistence.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +6 -0
- package/src/sessions/persistence.flush.test.ts +1 -1
- package/src/sessions/persistence.ready.test.ts +1 -1
- package/src/sessions/persistence.test.ts +12 -13
- package/src/sessions/persistence.ts +240 -62
package/dist/index.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export { SynthesizerRegistry } from './registries/synthesizers.js';
|
|
|
27
27
|
export { EmbedderRegistry } from './registries/embedders.js';
|
|
28
28
|
export { IsolatorRegistry as ContributedIsolatorRegistry } from './registries/isolators.js';
|
|
29
29
|
export { RequirementRegistry, type RequirementRegistryOptions } from './requirements.js';
|
|
30
|
-
export { SessionPersistence, defaultSessionsDir, readIndex as readSessionIndex, restoreEvents as restoreSessionEvents, readEventPage as readSessionEventPage, pageEvents, deleteSession, type SessionMeta, type SessionPersistenceOpts, type EventPage, } from './sessions/persistence.js';
|
|
30
|
+
export { SessionPersistence, defaultSessionsDir, readIndex as readSessionIndex, restoreEvents as restoreSessionEvents, readEventPage as readSessionEventPage, pageEvents, deleteSession, listSessionMetas, setSessionTitle, setSessionGroup, seedSessionMeta, SESSION_META_VERSION, type SessionMeta, type SessionSource, type SessionPersistenceOpts, type EventPage, } from './sessions/persistence.js';
|
|
31
31
|
export { PluginHost, PluginRequirementError, type PluginLoader, type PluginSkipReason, type PluginSkipRecord, type PluginSkipSource, type RegisterStaticOptions, } from './plugins/host.js';
|
|
32
32
|
export { HookDispatcherImpl } from './plugins/lifecycle.js';
|
|
33
33
|
export { discoverPlugins } from './plugins/discovery.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export { SynthesizerRegistry } from './registries/synthesizers.js';
|
|
|
28
28
|
export { EmbedderRegistry } from './registries/embedders.js';
|
|
29
29
|
export { IsolatorRegistry as ContributedIsolatorRegistry } from './registries/isolators.js';
|
|
30
30
|
export { RequirementRegistry } from './requirements.js';
|
|
31
|
-
export { SessionPersistence, defaultSessionsDir, readIndex as readSessionIndex, restoreEvents as restoreSessionEvents, readEventPage as readSessionEventPage, pageEvents, deleteSession, } from './sessions/persistence.js';
|
|
31
|
+
export { SessionPersistence, defaultSessionsDir, readIndex as readSessionIndex, restoreEvents as restoreSessionEvents, readEventPage as readSessionEventPage, pageEvents, deleteSession, listSessionMetas, setSessionTitle, setSessionGroup, seedSessionMeta, SESSION_META_VERSION, } from './sessions/persistence.js';
|
|
32
32
|
export { PluginHost, PluginRequirementError, } from './plugins/host.js';
|
|
33
33
|
export { HookDispatcherImpl } from './plugins/lifecycle.js';
|
|
34
34
|
export { discoverPlugins } from './plugins/discovery.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,UAAU,GAIX,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAwB,MAAM,gBAAgB,CAAC;AACpG,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,0BAA0B,GAK3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAsB,MAAM,iBAAiB,CAAC;AAC/D,wEAAwE;AACxE,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,IAAI,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAmC,MAAM,mBAAmB,CAAC;AACzF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,IAAI,gBAAgB,EAC7B,aAAa,IAAI,oBAAoB,EACrC,aAAa,IAAI,oBAAoB,EACrC,UAAU,EACV,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,16 +18,52 @@
|
|
|
18
18
|
import { type MoxxyEvent, type SessionId } from '@moxxy/sdk';
|
|
19
19
|
import type { EventLog } from '../events/log.js';
|
|
20
20
|
import { type Logger } from '../logger.js';
|
|
21
|
+
/**
|
|
22
|
+
* The channel that originated a session. Persisted into the sidecar by the
|
|
23
|
+
* runner so every surface (desktop/TUI/mobile) derives the session list from a
|
|
24
|
+
* single source instead of each keeping its own copy. `desktop`/`mobile`
|
|
25
|
+
* sessions are kept in the derived workspace list even before they have a first
|
|
26
|
+
* prompt (a brand-new chat the user just opened); empty `cli`/`tui` sidecars are
|
|
27
|
+
* dropped as noise.
|
|
28
|
+
*/
|
|
29
|
+
export type SessionSource = 'cli' | 'tui' | 'desktop' | 'mobile';
|
|
30
|
+
/** Schema version of the per-session metadata file (`<id>.json`). Bump when the
|
|
31
|
+
* shape changes incompatibly; readers tolerate a missing/older version. */
|
|
32
|
+
export declare const SESSION_META_VERSION = 1;
|
|
33
|
+
/**
|
|
34
|
+
* The single per-session metadata file: `~/.moxxy/sessions/<id>.json`.
|
|
35
|
+
*
|
|
36
|
+
* ONE file per session, the unit every surface (TUI/desktop/mobile) lists,
|
|
37
|
+
* searches and caches. The conversation itself lives in the append-only
|
|
38
|
+
* `<id>.jsonl`. Fields split by owner:
|
|
39
|
+
* - the RUNNER owns the content fields (`firstPrompt`, `eventCount`,
|
|
40
|
+
* `lastActivity`, `provider`, `model`, `startedAt`, `source`) and rewrites
|
|
41
|
+
* them on a debounce;
|
|
42
|
+
* - the UI owns `title` (a rename) and `groupId` (which desk it belongs to).
|
|
43
|
+
* Because both write the same file, the runner ADOPTS the UI fields on attach
|
|
44
|
+
* and re-merges them just before each write, so a live session never clobbers a
|
|
45
|
+
* rename or a move.
|
|
46
|
+
*/
|
|
21
47
|
export interface SessionMeta {
|
|
48
|
+
/** Schema version; absent on older files (treated as v0). */
|
|
49
|
+
readonly version?: number;
|
|
22
50
|
readonly id: string;
|
|
23
51
|
readonly cwd: string;
|
|
24
52
|
readonly startedAt: string;
|
|
25
53
|
readonly lastActivity: string;
|
|
26
54
|
readonly eventCount: number;
|
|
27
|
-
/** First 80 chars of the first user_prompt.
|
|
55
|
+
/** First 80 chars of the first user_prompt. The list/search label. */
|
|
28
56
|
readonly firstPrompt: string | null;
|
|
29
57
|
readonly provider: string | null;
|
|
30
58
|
readonly model: string | null;
|
|
59
|
+
/** Originating channel, when known. Written by the runner via `opts.source`. */
|
|
60
|
+
readonly source?: SessionSource;
|
|
61
|
+
/** Explicit workspace/desk membership (UI-owned). `null`/absent → grouped by
|
|
62
|
+
* cwd containment (CLI/TUI sessions that don't know about desks). */
|
|
63
|
+
readonly groupId?: string | null;
|
|
64
|
+
/** User-set display name, the rename (UI-owned). `null`/absent → the name is
|
|
65
|
+
* derived from `firstPrompt`. */
|
|
66
|
+
readonly title?: string | null;
|
|
31
67
|
}
|
|
32
68
|
export interface SessionPersistenceOpts {
|
|
33
69
|
readonly sessionId: SessionId;
|
|
@@ -38,6 +74,9 @@ export interface SessionPersistenceOpts {
|
|
|
38
74
|
readonly providerName?: string;
|
|
39
75
|
/** Currently-active model id — captured into the index for the picker. */
|
|
40
76
|
readonly modelId?: string;
|
|
77
|
+
/** Originating channel — persisted into the sidecar so the workspace list can
|
|
78
|
+
* be derived from a single source (see {@link SessionSource}). */
|
|
79
|
+
readonly source?: SessionSource;
|
|
41
80
|
/**
|
|
42
81
|
* Structured logger for persistence-degradation warnings. Defaults to a
|
|
43
82
|
* stderr JSON logger — event-log write failures are the session's source
|
|
@@ -154,15 +193,20 @@ export declare class SessionPersistence {
|
|
|
154
193
|
*/
|
|
155
194
|
private writeIndex;
|
|
156
195
|
private doWriteIndex;
|
|
157
|
-
/** One-time, memoized: `mkdir -p` the dir + create the empty `.jsonl
|
|
158
|
-
*
|
|
159
|
-
*
|
|
196
|
+
/** One-time, memoized: `mkdir -p` the dir + create the empty `.jsonl`, then
|
|
197
|
+
* ADOPT a pre-existing file's stable identity: `startedAt` (so the derived
|
|
198
|
+
* "created" time doesn't jump on every resume), `source` (when the caller
|
|
199
|
+
* didn't pass one), and the UI-owned `title`/`groupId` (so the first runner
|
|
200
|
+
* write doesn't drop a rename/move made while no runner was attached). On
|
|
201
|
+
* failure the latch is cleared so a later flush retries. */
|
|
160
202
|
private ensureReady;
|
|
161
203
|
}
|
|
162
204
|
/**
|
|
163
|
-
* Read the session index by assembling per-session
|
|
164
|
-
*
|
|
165
|
-
* `.jsonl` is missing are dropped. Sorted most-recent-activity first.
|
|
205
|
+
* Read the session index by assembling per-session metadata files (`<id>.json`),
|
|
206
|
+
* then hydrating each one's first prompt from its `.jsonl`. Sessions whose
|
|
207
|
+
* `.jsonl` is missing are dropped. Sorted most-recent-activity first. This is the
|
|
208
|
+
* heavier, jsonl-hydrated read used by `moxxy resume`; the workspace list uses
|
|
209
|
+
* the cheap {@link listSessionMetas} instead.
|
|
166
210
|
*/
|
|
167
211
|
export declare function readIndex(dir?: string): Promise<SessionMeta[]>;
|
|
168
212
|
/**
|
|
@@ -266,9 +310,30 @@ export declare function pageEvents(events: ReadonlyArray<MoxxyEvent>, before: nu
|
|
|
266
310
|
*/
|
|
267
311
|
export declare function seedSessionLog(sessionId: string, events: ReadonlyArray<MoxxyEvent>, dir?: string): Promise<boolean>;
|
|
268
312
|
/**
|
|
269
|
-
* Remove a session
|
|
270
|
-
*
|
|
271
|
-
*
|
|
313
|
+
* Remove a session entirely: its event log (`<id>.jsonl`) and its single
|
|
314
|
+
* metadata file (`<id>.json`). This is the SINGLE deletion mechanism — a session
|
|
315
|
+
* exists iff its `<id>.json` does, so erasing it removes the session from every
|
|
316
|
+
* surface's derived list with no second copy to resurrect it.
|
|
272
317
|
*/
|
|
273
318
|
export declare function deleteSession(sessionId: string, dir?: string): Promise<void>;
|
|
319
|
+
/** Persist (or clear, when blank) a user-set session title — the rename path. */
|
|
320
|
+
export declare function setSessionTitle(sessionId: string, title: string, dir?: string): Promise<void>;
|
|
321
|
+
/** Persist (or clear, when null) a session's explicit desk/workspace membership. */
|
|
322
|
+
export declare function setSessionGroup(sessionId: string, groupId: string | null, dir?: string): Promise<void>;
|
|
323
|
+
/**
|
|
324
|
+
* Seed a session's `<id>.json` (+ empty `.jsonl`) so a freshly-created session
|
|
325
|
+
* appears in the derived workspace list IMMEDIATELY, before its runner spawns
|
|
326
|
+
* and attaches. Idempotent: if a metadata file already exists this is a no-op,
|
|
327
|
+
* so it never clobbers a live session. The runner adopts the seeded
|
|
328
|
+
* `startedAt`/`source`/`groupId`/`title` on attach.
|
|
329
|
+
*/
|
|
330
|
+
export declare function seedSessionMeta(sessionId: string, cwd: string, source: SessionSource, dir?: string, groupId?: string | null): Promise<void>;
|
|
331
|
+
/**
|
|
332
|
+
* List every session from its `<id>.json` (mtime-cached, no `.jsonl` re-read) —
|
|
333
|
+
* the cheap read the workspace list/search uses on every `desks.list`. Sessions
|
|
334
|
+
* whose `.jsonl` is gone are dropped (a deleted session never lingers). Use
|
|
335
|
+
* {@link readIndex} when you need the jsonl-hydrated picker view. Sorted
|
|
336
|
+
* most-recent-activity first.
|
|
337
|
+
*/
|
|
338
|
+
export declare function listSessionMetas(dir?: string): Promise<SessionMeta[]>;
|
|
274
339
|
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/sessions/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAA2B,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/sessions/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,9 @@ import * as path from 'node:path';
|
|
|
20
20
|
import { createMutex } from '@moxxy/sdk';
|
|
21
21
|
import { moxxyPath, writeFileAtomic } from '@moxxy/sdk/server';
|
|
22
22
|
import { createLogger } from '../logger.js';
|
|
23
|
+
/** Schema version of the per-session metadata file (`<id>.json`). Bump when the
|
|
24
|
+
* shape changes incompatibly; readers tolerate a missing/older version. */
|
|
25
|
+
export const SESSION_META_VERSION = 1;
|
|
23
26
|
export function defaultSessionsDir() {
|
|
24
27
|
return moxxyPath('sessions');
|
|
25
28
|
}
|
|
@@ -110,6 +113,7 @@ export class SessionPersistence {
|
|
|
110
113
|
this.logPath = path.join(this.dir, `${this.id}.jsonl`);
|
|
111
114
|
const now = new Date().toISOString();
|
|
112
115
|
this.meta = {
|
|
116
|
+
version: SESSION_META_VERSION,
|
|
113
117
|
id: this.id,
|
|
114
118
|
cwd: opts.cwd,
|
|
115
119
|
startedAt: now,
|
|
@@ -118,6 +122,7 @@ export class SessionPersistence {
|
|
|
118
122
|
firstPrompt: null,
|
|
119
123
|
provider: opts.providerName ?? null,
|
|
120
124
|
model: opts.modelId ?? null,
|
|
125
|
+
...(opts.source ? { source: opts.source } : {}),
|
|
121
126
|
};
|
|
122
127
|
}
|
|
123
128
|
/**
|
|
@@ -319,28 +324,50 @@ export class SessionPersistence {
|
|
|
319
324
|
if (!this.closed) {
|
|
320
325
|
await this.ensureReady();
|
|
321
326
|
}
|
|
322
|
-
// Write ONLY this session's
|
|
323
|
-
//
|
|
324
|
-
//
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
//
|
|
328
|
-
|
|
327
|
+
// Write ONLY this session's file (`<id>.json`), never a read-modify-write
|
|
328
|
+
// of a shared index — that loses rows when two moxxy processes update
|
|
329
|
+
// "their" row concurrently. `writeJsonAtomic` already `mkdir -p`s the dir,
|
|
330
|
+
// so this owns no ensureLogFile — the `.jsonl` is the append path's job.
|
|
331
|
+
//
|
|
332
|
+
// The UI fields (`title`, `groupId`) are owned by the rename/move path,
|
|
333
|
+
// not the runner. Re-read them just before writing so an external rename
|
|
334
|
+
// or move that landed mid-session is preserved rather than clobbered by
|
|
335
|
+
// our (possibly stale) in-memory copy. The runner owns every other field.
|
|
336
|
+
const onDisk = await readMetaSidecar(this.dir, this.meta.id);
|
|
337
|
+
const merged = {
|
|
338
|
+
...this.meta,
|
|
339
|
+
title: onDisk?.title ?? this.meta.title ?? null,
|
|
340
|
+
groupId: onDisk?.groupId ?? this.meta.groupId ?? null,
|
|
341
|
+
};
|
|
342
|
+
await writeJsonAtomic(metaPath(this.dir, this.meta.id), merged);
|
|
329
343
|
}
|
|
330
344
|
catch {
|
|
331
345
|
// Index write failures shouldn't bring down a session; the
|
|
332
346
|
// user can always re-resume by id from the filename.
|
|
333
347
|
}
|
|
334
348
|
}
|
|
335
|
-
/** One-time, memoized: `mkdir -p` the dir + create the empty `.jsonl
|
|
336
|
-
*
|
|
337
|
-
*
|
|
349
|
+
/** One-time, memoized: `mkdir -p` the dir + create the empty `.jsonl`, then
|
|
350
|
+
* ADOPT a pre-existing file's stable identity: `startedAt` (so the derived
|
|
351
|
+
* "created" time doesn't jump on every resume), `source` (when the caller
|
|
352
|
+
* didn't pass one), and the UI-owned `title`/`groupId` (so the first runner
|
|
353
|
+
* write doesn't drop a rename/move made while no runner was attached). On
|
|
354
|
+
* failure the latch is cleared so a later flush retries. */
|
|
338
355
|
ensureReady() {
|
|
339
356
|
if (!this.ready) {
|
|
340
357
|
this.ready = (async () => {
|
|
341
358
|
await fs.mkdir(this.dir, { recursive: true });
|
|
342
359
|
const handle = await fs.open(this.logPath, 'a');
|
|
343
360
|
await handle.close();
|
|
361
|
+
const existing = await readMetaSidecar(this.dir, this.id);
|
|
362
|
+
if (existing) {
|
|
363
|
+
this.meta = {
|
|
364
|
+
...this.meta,
|
|
365
|
+
startedAt: existing.startedAt,
|
|
366
|
+
source: this.meta.source ?? existing.source,
|
|
367
|
+
title: existing.title ?? null,
|
|
368
|
+
groupId: existing.groupId ?? null,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
344
371
|
})().catch((err) => {
|
|
345
372
|
this.ready = null;
|
|
346
373
|
throw err;
|
|
@@ -350,57 +377,15 @@ export class SessionPersistence {
|
|
|
350
377
|
}
|
|
351
378
|
}
|
|
352
379
|
/**
|
|
353
|
-
* Read the session index by assembling per-session
|
|
354
|
-
*
|
|
355
|
-
* `.jsonl` is missing are dropped. Sorted most-recent-activity first.
|
|
380
|
+
* Read the session index by assembling per-session metadata files (`<id>.json`),
|
|
381
|
+
* then hydrating each one's first prompt from its `.jsonl`. Sessions whose
|
|
382
|
+
* `.jsonl` is missing are dropped. Sorted most-recent-activity first. This is the
|
|
383
|
+
* heavier, jsonl-hydrated read used by `moxxy resume`; the workspace list uses
|
|
384
|
+
* the cheap {@link listSessionMetas} instead.
|
|
356
385
|
*/
|
|
357
386
|
export async function readIndex(dir = defaultSessionsDir()) {
|
|
358
|
-
const
|
|
359
|
-
|
|
360
|
-
try {
|
|
361
|
-
const raw = await fs.readFile(path.join(dir, 'index.json'), 'utf8');
|
|
362
|
-
const parsed = JSON.parse(raw);
|
|
363
|
-
if (Array.isArray(parsed)) {
|
|
364
|
-
for (const m of parsed.filter(isSessionMeta))
|
|
365
|
-
byId.set(m.id, m);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
catch {
|
|
369
|
-
// no legacy index — fine
|
|
370
|
-
}
|
|
371
|
-
let dirents;
|
|
372
|
-
try {
|
|
373
|
-
dirents = await fs.readdir(dir, { withFileTypes: true });
|
|
374
|
-
}
|
|
375
|
-
catch {
|
|
376
|
-
dirents = [];
|
|
377
|
-
}
|
|
378
|
-
// Cap fan-out: a user with thousands of sidecars in ~/.moxxy/sessions would
|
|
379
|
-
// otherwise open thousands of file handles at once (EMFILE) on every resume/
|
|
380
|
-
// list. Process in bounded batches instead.
|
|
381
|
-
const sidecarFiles = dirents.filter((d) => d.isFile() && d.name.endsWith('.meta.json'));
|
|
382
|
-
await mapWithConcurrency(sidecarFiles, READ_INDEX_CONCURRENCY, async (d) => {
|
|
383
|
-
try {
|
|
384
|
-
const raw = await fs.readFile(path.join(dir, d.name), 'utf8');
|
|
385
|
-
const parsed = JSON.parse(raw);
|
|
386
|
-
if (isSessionMeta(parsed))
|
|
387
|
-
byId.set(parsed.id, parsed);
|
|
388
|
-
}
|
|
389
|
-
catch {
|
|
390
|
-
// skip a malformed/half-written sidecar
|
|
391
|
-
}
|
|
392
|
-
});
|
|
393
|
-
const metas = [...byId.values()];
|
|
394
|
-
const checks = await mapWithConcurrency(metas, READ_INDEX_CONCURRENCY, async (meta) => {
|
|
395
|
-
try {
|
|
396
|
-
await fs.access(path.join(dir, `${meta.id}.jsonl`));
|
|
397
|
-
return true;
|
|
398
|
-
}
|
|
399
|
-
catch {
|
|
400
|
-
return false;
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
const present = metas.filter((_, index) => checks[index]);
|
|
387
|
+
const { metas, logs } = await readSessionsDir(dir);
|
|
388
|
+
const present = metas.filter((meta) => logs.has(meta.id));
|
|
404
389
|
const hydrated = await mapWithConcurrency(present, READ_INDEX_CONCURRENCY, (meta) => hydrateMetaFirstPrompt(meta, dir));
|
|
405
390
|
return hydrated.sort((a, b) => b.lastActivity.localeCompare(a.lastActivity));
|
|
406
391
|
}
|
|
@@ -756,18 +741,155 @@ async function backupForeignSessionLog(logPath) {
|
|
|
756
741
|
}
|
|
757
742
|
}
|
|
758
743
|
/**
|
|
759
|
-
* Remove a session
|
|
760
|
-
*
|
|
761
|
-
*
|
|
744
|
+
* Remove a session entirely: its event log (`<id>.jsonl`) and its single
|
|
745
|
+
* metadata file (`<id>.json`). This is the SINGLE deletion mechanism — a session
|
|
746
|
+
* exists iff its `<id>.json` does, so erasing it removes the session from every
|
|
747
|
+
* surface's derived list with no second copy to resurrect it.
|
|
762
748
|
*/
|
|
763
749
|
export async function deleteSession(sessionId, dir = defaultSessionsDir()) {
|
|
764
750
|
assertSafeSessionId(sessionId);
|
|
765
751
|
await fs.rm(path.join(dir, `${sessionId}.jsonl`), { force: true });
|
|
766
752
|
await fs.rm(metaPath(dir, sessionId), { force: true });
|
|
753
|
+
metaCache.delete(metaPath(dir, sessionId));
|
|
767
754
|
}
|
|
768
|
-
/** Per-session metadata
|
|
755
|
+
/** Per-session metadata file path: `<id>.json` (one file per session). */
|
|
769
756
|
function metaPath(dir, id) {
|
|
770
|
-
return path.join(dir, `${id}.
|
|
757
|
+
return path.join(dir, `${id}.json`);
|
|
758
|
+
}
|
|
759
|
+
/** Read one session's metadata file, or null if absent/corrupt. */
|
|
760
|
+
async function readMetaSidecar(dir, id) {
|
|
761
|
+
try {
|
|
762
|
+
const parsed = JSON.parse(await fs.readFile(metaPath(dir, id), 'utf8'));
|
|
763
|
+
return isSessionMeta(parsed) ? parsed : null;
|
|
764
|
+
}
|
|
765
|
+
catch {
|
|
766
|
+
return null;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* Patch the UI-owned fields of a session's `<id>.json` in place (read-modify-
|
|
771
|
+
* write): the rename (`title`) and move (`groupId`) paths. A live runner adopts
|
|
772
|
+
* and re-merges these on its next write, so this is safe whether or not a runner
|
|
773
|
+
* is attached. No-op if the session has no metadata file yet.
|
|
774
|
+
*/
|
|
775
|
+
async function patchSessionMeta(sessionId, patch, dir) {
|
|
776
|
+
assertSafeSessionId(sessionId);
|
|
777
|
+
const existing = await readMetaSidecar(dir, sessionId);
|
|
778
|
+
if (!existing)
|
|
779
|
+
return;
|
|
780
|
+
await writeJsonAtomic(metaPath(dir, sessionId), { ...existing, ...patch });
|
|
781
|
+
metaCache.delete(metaPath(dir, sessionId));
|
|
782
|
+
}
|
|
783
|
+
/** Persist (or clear, when blank) a user-set session title — the rename path. */
|
|
784
|
+
export async function setSessionTitle(sessionId, title, dir = defaultSessionsDir()) {
|
|
785
|
+
await patchSessionMeta(sessionId, { title: title.trim() || null }, dir);
|
|
786
|
+
}
|
|
787
|
+
/** Persist (or clear, when null) a session's explicit desk/workspace membership. */
|
|
788
|
+
export async function setSessionGroup(sessionId, groupId, dir = defaultSessionsDir()) {
|
|
789
|
+
await patchSessionMeta(sessionId, { groupId: groupId ?? null }, dir);
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
792
|
+
* Seed a session's `<id>.json` (+ empty `.jsonl`) so a freshly-created session
|
|
793
|
+
* appears in the derived workspace list IMMEDIATELY, before its runner spawns
|
|
794
|
+
* and attaches. Idempotent: if a metadata file already exists this is a no-op,
|
|
795
|
+
* so it never clobbers a live session. The runner adopts the seeded
|
|
796
|
+
* `startedAt`/`source`/`groupId`/`title` on attach.
|
|
797
|
+
*/
|
|
798
|
+
export async function seedSessionMeta(sessionId, cwd, source, dir = defaultSessionsDir(), groupId = null) {
|
|
799
|
+
assertSafeSessionId(sessionId);
|
|
800
|
+
if (await readMetaSidecar(dir, sessionId))
|
|
801
|
+
return;
|
|
802
|
+
await fs.mkdir(dir, { recursive: true });
|
|
803
|
+
const handle = await fs.open(path.join(dir, `${sessionId}.jsonl`), 'a');
|
|
804
|
+
await handle.close();
|
|
805
|
+
const now = new Date().toISOString();
|
|
806
|
+
const meta = {
|
|
807
|
+
version: SESSION_META_VERSION,
|
|
808
|
+
id: sessionId,
|
|
809
|
+
cwd,
|
|
810
|
+
startedAt: now,
|
|
811
|
+
lastActivity: now,
|
|
812
|
+
eventCount: 0,
|
|
813
|
+
firstPrompt: null,
|
|
814
|
+
provider: null,
|
|
815
|
+
model: null,
|
|
816
|
+
source,
|
|
817
|
+
groupId,
|
|
818
|
+
title: null,
|
|
819
|
+
};
|
|
820
|
+
await writeJsonAtomic(metaPath(dir, sessionId), meta);
|
|
821
|
+
metaCache.delete(metaPath(dir, sessionId));
|
|
822
|
+
}
|
|
823
|
+
/**
|
|
824
|
+
* Parse-cache for `<id>.json` files, keyed by absolute path. A file is re-parsed
|
|
825
|
+
* only when its mtime/size changes, so listing thousands of sessions on every
|
|
826
|
+
* `desks.list` costs N cheap stats plus reparses of just the CHANGED files — not
|
|
827
|
+
* N JSON parses. Cross-process safe: another process's write bumps the mtime,
|
|
828
|
+
* observed on the next stat. Per-process, bounded by the number of sessions.
|
|
829
|
+
*/
|
|
830
|
+
const metaCache = new Map();
|
|
831
|
+
/**
|
|
832
|
+
* One pass over the sessions dir: a single `readdir` yields BOTH the `<id>.json`
|
|
833
|
+
* metadata files and the set of `<id>` ids that have an event log, so callers
|
|
834
|
+
* test log-existence with an O(1) Set lookup instead of an `fs.access` per
|
|
835
|
+
* session. Each `<id>.json` is `stat`-checked and re-parsed only when its
|
|
836
|
+
* mtime/size changed (the parse cache), so steady-state cost is one `readdir` +
|
|
837
|
+
* N cheap `stat`s + reparses of only the CHANGED files.
|
|
838
|
+
*/
|
|
839
|
+
async function readSessionsDir(dir) {
|
|
840
|
+
let dirents;
|
|
841
|
+
try {
|
|
842
|
+
dirents = await fs.readdir(dir, { withFileTypes: true });
|
|
843
|
+
}
|
|
844
|
+
catch {
|
|
845
|
+
return { metas: [], logs: new Set() };
|
|
846
|
+
}
|
|
847
|
+
const logs = new Set();
|
|
848
|
+
const files = [];
|
|
849
|
+
for (const d of dirents) {
|
|
850
|
+
if (!d.isFile())
|
|
851
|
+
continue;
|
|
852
|
+
if (d.name.endsWith('.jsonl'))
|
|
853
|
+
logs.add(d.name.slice(0, -'.jsonl'.length));
|
|
854
|
+
else if (d.name.endsWith('.json') && d.name !== 'index.json')
|
|
855
|
+
files.push(d);
|
|
856
|
+
}
|
|
857
|
+
const live = new Set(files.map((d) => path.join(dir, d.name)));
|
|
858
|
+
for (const key of metaCache.keys())
|
|
859
|
+
if (!live.has(key))
|
|
860
|
+
metaCache.delete(key);
|
|
861
|
+
const metas = await mapWithConcurrency(files, READ_INDEX_CONCURRENCY, async (d) => {
|
|
862
|
+
const file = path.join(dir, d.name);
|
|
863
|
+
try {
|
|
864
|
+
const stat = await fs.stat(file);
|
|
865
|
+
const cached = metaCache.get(file);
|
|
866
|
+
if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
|
|
867
|
+
return cached.meta;
|
|
868
|
+
}
|
|
869
|
+
const parsed = JSON.parse(await fs.readFile(file, 'utf8'));
|
|
870
|
+
if (!isSessionMeta(parsed))
|
|
871
|
+
return null;
|
|
872
|
+
metaCache.set(file, { mtimeMs: stat.mtimeMs, size: stat.size, meta: parsed });
|
|
873
|
+
return parsed;
|
|
874
|
+
}
|
|
875
|
+
catch {
|
|
876
|
+
return null;
|
|
877
|
+
}
|
|
878
|
+
});
|
|
879
|
+
return { metas: metas.filter((m) => m !== null), logs };
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* List every session from its `<id>.json` (mtime-cached, no `.jsonl` re-read) —
|
|
883
|
+
* the cheap read the workspace list/search uses on every `desks.list`. Sessions
|
|
884
|
+
* whose `.jsonl` is gone are dropped (a deleted session never lingers). Use
|
|
885
|
+
* {@link readIndex} when you need the jsonl-hydrated picker view. Sorted
|
|
886
|
+
* most-recent-activity first.
|
|
887
|
+
*/
|
|
888
|
+
export async function listSessionMetas(dir = defaultSessionsDir()) {
|
|
889
|
+
const { metas, logs } = await readSessionsDir(dir);
|
|
890
|
+
return metas
|
|
891
|
+
.filter((meta) => logs.has(meta.id))
|
|
892
|
+
.sort((a, b) => b.lastActivity.localeCompare(a.lastActivity));
|
|
771
893
|
}
|
|
772
894
|
/**
|
|
773
895
|
* First 80 chars of a prompt for the picker label, sliced on code-point (not
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/sessions/persistence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/sessions/persistence.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "The moxxy runtime as a programmatic library: the agentic Session + runTurn loop, the event log, the plugin host, every block registry (providers, tools, modes, compactors, cache strategies, channels, …), session persistence, and the permission engine. Pair with @moxxy/sdk to build and embed moxxy agents in your own code.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
package/src/index.ts
CHANGED
|
@@ -68,7 +68,13 @@ export {
|
|
|
68
68
|
readEventPage as readSessionEventPage,
|
|
69
69
|
pageEvents,
|
|
70
70
|
deleteSession,
|
|
71
|
+
listSessionMetas,
|
|
72
|
+
setSessionTitle,
|
|
73
|
+
setSessionGroup,
|
|
74
|
+
seedSessionMeta,
|
|
75
|
+
SESSION_META_VERSION,
|
|
71
76
|
type SessionMeta,
|
|
77
|
+
type SessionSource,
|
|
72
78
|
type SessionPersistenceOpts,
|
|
73
79
|
type EventPage,
|
|
74
80
|
} from './sessions/persistence.js';
|
|
@@ -18,7 +18,7 @@ afterEach(async () => {
|
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
async function readMeta(dir: string, id: string): Promise<SessionMeta> {
|
|
21
|
-
const raw = await fs.readFile(path.join(dir, `${id}.
|
|
21
|
+
const raw = await fs.readFile(path.join(dir, `${id}.json`), 'utf8');
|
|
22
22
|
return JSON.parse(raw) as SessionMeta;
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -53,7 +53,7 @@ describe('SessionPersistence one-time setup (no per-flush open/close)', () => {
|
|
|
53
53
|
expect(openSpy).toHaveBeenCalledTimes(1);
|
|
54
54
|
|
|
55
55
|
// Sidecar still written correctly.
|
|
56
|
-
const raw = await fs.readFile(path.join(dir, `${id}.
|
|
56
|
+
const raw = await fs.readFile(path.join(dir, `${id}.json`), 'utf8');
|
|
57
57
|
const meta = JSON.parse(raw) as { eventCount: number; firstPrompt: string | null };
|
|
58
58
|
expect(meta.eventCount).toBe(5);
|
|
59
59
|
expect(meta.firstPrompt).toBe('msg 0');
|
|
@@ -73,12 +73,11 @@ describe('SessionPersistence', () => {
|
|
|
73
73
|
it('readIndex ignores rows whose event log file is missing', async () => {
|
|
74
74
|
const dir = await makeTempDir();
|
|
75
75
|
await fs.mkdir(dir, { recursive: true });
|
|
76
|
+
// `present` has a metadata file AND an event log; `missing` has only the
|
|
77
|
+
// metadata file. readIndex drops the one whose `.jsonl` is gone.
|
|
76
78
|
await fs.writeFile(path.join(dir, 'present.jsonl'), '', 'utf8');
|
|
77
|
-
await fs.writeFile(
|
|
78
|
-
|
|
79
|
-
JSON.stringify([meta('missing'), meta('present')], null, 2),
|
|
80
|
-
'utf8',
|
|
81
|
-
);
|
|
79
|
+
await fs.writeFile(path.join(dir, 'present.json'), JSON.stringify(meta('present')), 'utf8');
|
|
80
|
+
await fs.writeFile(path.join(dir, 'missing.json'), JSON.stringify(meta('missing')), 'utf8');
|
|
82
81
|
|
|
83
82
|
await expect(readIndex(dir)).resolves.toEqual([meta('present')]);
|
|
84
83
|
});
|
|
@@ -88,7 +87,7 @@ describe('SessionPersistence', () => {
|
|
|
88
87
|
await fs.mkdir(dir, { recursive: true });
|
|
89
88
|
const id = '01HYDRATEPROMPT0000000000';
|
|
90
89
|
await fs.writeFile(
|
|
91
|
-
path.join(dir, `${id}.
|
|
90
|
+
path.join(dir, `${id}.json`),
|
|
92
91
|
JSON.stringify({ ...meta(id, 3), firstPrompt: null }, null, 2),
|
|
93
92
|
'utf8',
|
|
94
93
|
);
|
|
@@ -117,7 +116,7 @@ describe('SessionPersistence', () => {
|
|
|
117
116
|
await fs.mkdir(dir, { recursive: true });
|
|
118
117
|
const id = '01HYDRATEPROVIDER00000000';
|
|
119
118
|
await fs.writeFile(
|
|
120
|
-
path.join(dir, `${id}.
|
|
119
|
+
path.join(dir, `${id}.json`),
|
|
121
120
|
JSON.stringify({ ...meta(id, 2), provider: 'old-provider', model: 'old-model' }, null, 2),
|
|
122
121
|
'utf8',
|
|
123
122
|
);
|
|
@@ -165,7 +164,7 @@ describe('SessionPersistence', () => {
|
|
|
165
164
|
await fs.mkdir(dir, { recursive: true });
|
|
166
165
|
const id = '01SIDECARPROMPT0000000000';
|
|
167
166
|
await fs.writeFile(
|
|
168
|
-
path.join(dir, `${id}.
|
|
167
|
+
path.join(dir, `${id}.json`),
|
|
169
168
|
JSON.stringify({ ...meta(id, 2), firstPrompt: 'sidecar title', eventCount: 2 }, null, 2),
|
|
170
169
|
'utf8',
|
|
171
170
|
);
|
|
@@ -182,7 +181,7 @@ describe('SessionPersistence', () => {
|
|
|
182
181
|
await fs.mkdir(dir, { recursive: true });
|
|
183
182
|
const id = '01MATCHPROMPT000000000000';
|
|
184
183
|
await fs.writeFile(
|
|
185
|
-
path.join(dir, `${id}.
|
|
184
|
+
path.join(dir, `${id}.json`),
|
|
186
185
|
JSON.stringify({ ...meta(id, 2), firstPrompt: 'foreign title', eventCount: 2 }, null, 2),
|
|
187
186
|
'utf8',
|
|
188
187
|
);
|
|
@@ -224,7 +223,7 @@ describe('SessionPersistence', () => {
|
|
|
224
223
|
await fs.mkdir(dir, { recursive: true });
|
|
225
224
|
const id = '01FOREIGNONLY00000000000';
|
|
226
225
|
await fs.writeFile(
|
|
227
|
-
path.join(dir, `${id}.
|
|
226
|
+
path.join(dir, `${id}.json`),
|
|
228
227
|
JSON.stringify({ ...meta(id, 1), firstPrompt: 'foreign prompt', eventCount: 1 }, null, 2),
|
|
229
228
|
'utf8',
|
|
230
229
|
);
|
|
@@ -266,7 +265,7 @@ describe('SessionPersistence', () => {
|
|
|
266
265
|
const id = '01SIDECAR00000000000000000';
|
|
267
266
|
const persistence = new SessionPersistence({ sessionId: id as never, cwd: '/tmp/p', dir });
|
|
268
267
|
const detach = persistence.attach(new EventLog());
|
|
269
|
-
await waitForFile(path.join(dir, `${id}.
|
|
268
|
+
await waitForFile(path.join(dir, `${id}.json`));
|
|
270
269
|
const ids = (await readIndex(dir)).map((m) => m.id);
|
|
271
270
|
expect(ids).toContain(id);
|
|
272
271
|
detach();
|
|
@@ -635,8 +634,8 @@ describe('SessionPersistence', () => {
|
|
|
635
634
|
const detachB = new SessionPersistence({ sessionId: idB as never, cwd: '/b', dir }).attach(
|
|
636
635
|
new EventLog(),
|
|
637
636
|
);
|
|
638
|
-
await waitForFile(path.join(dir, `${idA}.
|
|
639
|
-
await waitForFile(path.join(dir, `${idB}.
|
|
637
|
+
await waitForFile(path.join(dir, `${idA}.json`));
|
|
638
|
+
await waitForFile(path.join(dir, `${idB}.json`));
|
|
640
639
|
const ids = (await readIndex(dir)).map((m) => m.id);
|
|
641
640
|
expect(ids).toContain(idA);
|
|
642
641
|
expect(ids).toContain(idB);
|
|
@@ -23,16 +23,54 @@ import { moxxyPath, writeFileAtomic } from '@moxxy/sdk/server';
|
|
|
23
23
|
import type { EventLog } from '../events/log.js';
|
|
24
24
|
import { createLogger, type Logger } from '../logger.js';
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* The channel that originated a session. Persisted into the sidecar by the
|
|
28
|
+
* runner so every surface (desktop/TUI/mobile) derives the session list from a
|
|
29
|
+
* single source instead of each keeping its own copy. `desktop`/`mobile`
|
|
30
|
+
* sessions are kept in the derived workspace list even before they have a first
|
|
31
|
+
* prompt (a brand-new chat the user just opened); empty `cli`/`tui` sidecars are
|
|
32
|
+
* dropped as noise.
|
|
33
|
+
*/
|
|
34
|
+
export type SessionSource = 'cli' | 'tui' | 'desktop' | 'mobile';
|
|
35
|
+
|
|
36
|
+
/** Schema version of the per-session metadata file (`<id>.json`). Bump when the
|
|
37
|
+
* shape changes incompatibly; readers tolerate a missing/older version. */
|
|
38
|
+
export const SESSION_META_VERSION = 1;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The single per-session metadata file: `~/.moxxy/sessions/<id>.json`.
|
|
42
|
+
*
|
|
43
|
+
* ONE file per session, the unit every surface (TUI/desktop/mobile) lists,
|
|
44
|
+
* searches and caches. The conversation itself lives in the append-only
|
|
45
|
+
* `<id>.jsonl`. Fields split by owner:
|
|
46
|
+
* - the RUNNER owns the content fields (`firstPrompt`, `eventCount`,
|
|
47
|
+
* `lastActivity`, `provider`, `model`, `startedAt`, `source`) and rewrites
|
|
48
|
+
* them on a debounce;
|
|
49
|
+
* - the UI owns `title` (a rename) and `groupId` (which desk it belongs to).
|
|
50
|
+
* Because both write the same file, the runner ADOPTS the UI fields on attach
|
|
51
|
+
* and re-merges them just before each write, so a live session never clobbers a
|
|
52
|
+
* rename or a move.
|
|
53
|
+
*/
|
|
26
54
|
export interface SessionMeta {
|
|
55
|
+
/** Schema version; absent on older files (treated as v0). */
|
|
56
|
+
readonly version?: number;
|
|
27
57
|
readonly id: string;
|
|
28
58
|
readonly cwd: string;
|
|
29
59
|
readonly startedAt: string;
|
|
30
60
|
readonly lastActivity: string;
|
|
31
61
|
readonly eventCount: number;
|
|
32
|
-
/** First 80 chars of the first user_prompt.
|
|
62
|
+
/** First 80 chars of the first user_prompt. The list/search label. */
|
|
33
63
|
readonly firstPrompt: string | null;
|
|
34
64
|
readonly provider: string | null;
|
|
35
65
|
readonly model: string | null;
|
|
66
|
+
/** Originating channel, when known. Written by the runner via `opts.source`. */
|
|
67
|
+
readonly source?: SessionSource;
|
|
68
|
+
/** Explicit workspace/desk membership (UI-owned). `null`/absent → grouped by
|
|
69
|
+
* cwd containment (CLI/TUI sessions that don't know about desks). */
|
|
70
|
+
readonly groupId?: string | null;
|
|
71
|
+
/** User-set display name, the rename (UI-owned). `null`/absent → the name is
|
|
72
|
+
* derived from `firstPrompt`. */
|
|
73
|
+
readonly title?: string | null;
|
|
36
74
|
}
|
|
37
75
|
|
|
38
76
|
export interface SessionPersistenceOpts {
|
|
@@ -44,6 +82,9 @@ export interface SessionPersistenceOpts {
|
|
|
44
82
|
readonly providerName?: string;
|
|
45
83
|
/** Currently-active model id — captured into the index for the picker. */
|
|
46
84
|
readonly modelId?: string;
|
|
85
|
+
/** Originating channel — persisted into the sidecar so the workspace list can
|
|
86
|
+
* be derived from a single source (see {@link SessionSource}). */
|
|
87
|
+
readonly source?: SessionSource;
|
|
47
88
|
/**
|
|
48
89
|
* Structured logger for persistence-degradation warnings. Defaults to a
|
|
49
90
|
* stderr JSON logger — event-log write failures are the session's source
|
|
@@ -151,6 +192,7 @@ export class SessionPersistence {
|
|
|
151
192
|
this.logPath = path.join(this.dir, `${this.id}.jsonl`);
|
|
152
193
|
const now = new Date().toISOString();
|
|
153
194
|
this.meta = {
|
|
195
|
+
version: SESSION_META_VERSION,
|
|
154
196
|
id: this.id,
|
|
155
197
|
cwd: opts.cwd,
|
|
156
198
|
startedAt: now,
|
|
@@ -159,6 +201,7 @@ export class SessionPersistence {
|
|
|
159
201
|
firstPrompt: null,
|
|
160
202
|
provider: opts.providerName ?? null,
|
|
161
203
|
model: opts.modelId ?? null,
|
|
204
|
+
...(opts.source ? { source: opts.source } : {}),
|
|
162
205
|
};
|
|
163
206
|
}
|
|
164
207
|
|
|
@@ -371,28 +414,50 @@ export class SessionPersistence {
|
|
|
371
414
|
if (!this.closed) {
|
|
372
415
|
await this.ensureReady();
|
|
373
416
|
}
|
|
374
|
-
// Write ONLY this session's
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
|
|
417
|
+
// Write ONLY this session's file (`<id>.json`), never a read-modify-write
|
|
418
|
+
// of a shared index — that loses rows when two moxxy processes update
|
|
419
|
+
// "their" row concurrently. `writeJsonAtomic` already `mkdir -p`s the dir,
|
|
420
|
+
// so this owns no ensureLogFile — the `.jsonl` is the append path's job.
|
|
421
|
+
//
|
|
422
|
+
// The UI fields (`title`, `groupId`) are owned by the rename/move path,
|
|
423
|
+
// not the runner. Re-read them just before writing so an external rename
|
|
424
|
+
// or move that landed mid-session is preserved rather than clobbered by
|
|
425
|
+
// our (possibly stale) in-memory copy. The runner owns every other field.
|
|
426
|
+
const onDisk = await readMetaSidecar(this.dir, this.meta.id);
|
|
427
|
+
const merged: SessionMeta = {
|
|
428
|
+
...this.meta,
|
|
429
|
+
title: onDisk?.title ?? this.meta.title ?? null,
|
|
430
|
+
groupId: onDisk?.groupId ?? this.meta.groupId ?? null,
|
|
431
|
+
};
|
|
432
|
+
await writeJsonAtomic(metaPath(this.dir, this.meta.id), merged);
|
|
381
433
|
} catch {
|
|
382
434
|
// Index write failures shouldn't bring down a session; the
|
|
383
435
|
// user can always re-resume by id from the filename.
|
|
384
436
|
}
|
|
385
437
|
}
|
|
386
438
|
|
|
387
|
-
/** One-time, memoized: `mkdir -p` the dir + create the empty `.jsonl
|
|
388
|
-
*
|
|
389
|
-
*
|
|
439
|
+
/** One-time, memoized: `mkdir -p` the dir + create the empty `.jsonl`, then
|
|
440
|
+
* ADOPT a pre-existing file's stable identity: `startedAt` (so the derived
|
|
441
|
+
* "created" time doesn't jump on every resume), `source` (when the caller
|
|
442
|
+
* didn't pass one), and the UI-owned `title`/`groupId` (so the first runner
|
|
443
|
+
* write doesn't drop a rename/move made while no runner was attached). On
|
|
444
|
+
* failure the latch is cleared so a later flush retries. */
|
|
390
445
|
private ensureReady(): Promise<void> {
|
|
391
446
|
if (!this.ready) {
|
|
392
447
|
this.ready = (async () => {
|
|
393
448
|
await fs.mkdir(this.dir, { recursive: true });
|
|
394
449
|
const handle = await fs.open(this.logPath, 'a');
|
|
395
450
|
await handle.close();
|
|
451
|
+
const existing = await readMetaSidecar(this.dir, this.id);
|
|
452
|
+
if (existing) {
|
|
453
|
+
this.meta = {
|
|
454
|
+
...this.meta,
|
|
455
|
+
startedAt: existing.startedAt,
|
|
456
|
+
source: this.meta.source ?? existing.source,
|
|
457
|
+
title: existing.title ?? null,
|
|
458
|
+
groupId: existing.groupId ?? null,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
396
461
|
})().catch((err) => {
|
|
397
462
|
this.ready = null;
|
|
398
463
|
throw err;
|
|
@@ -403,54 +468,15 @@ export class SessionPersistence {
|
|
|
403
468
|
}
|
|
404
469
|
|
|
405
470
|
/**
|
|
406
|
-
* Read the session index by assembling per-session
|
|
407
|
-
*
|
|
408
|
-
* `.jsonl` is missing are dropped. Sorted most-recent-activity first.
|
|
471
|
+
* Read the session index by assembling per-session metadata files (`<id>.json`),
|
|
472
|
+
* then hydrating each one's first prompt from its `.jsonl`. Sessions whose
|
|
473
|
+
* `.jsonl` is missing are dropped. Sorted most-recent-activity first. This is the
|
|
474
|
+
* heavier, jsonl-hydrated read used by `moxxy resume`; the workspace list uses
|
|
475
|
+
* the cheap {@link listSessionMetas} instead.
|
|
409
476
|
*/
|
|
410
477
|
export async function readIndex(dir = defaultSessionsDir()): Promise<SessionMeta[]> {
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
// Legacy single-file index (pre-sidecar layout). Sidecars override it below.
|
|
414
|
-
try {
|
|
415
|
-
const raw = await fs.readFile(path.join(dir, 'index.json'), 'utf8');
|
|
416
|
-
const parsed = JSON.parse(raw) as unknown;
|
|
417
|
-
if (Array.isArray(parsed)) {
|
|
418
|
-
for (const m of parsed.filter(isSessionMeta)) byId.set(m.id, m);
|
|
419
|
-
}
|
|
420
|
-
} catch {
|
|
421
|
-
// no legacy index — fine
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
let dirents: import('node:fs').Dirent[];
|
|
425
|
-
try {
|
|
426
|
-
dirents = await fs.readdir(dir, { withFileTypes: true });
|
|
427
|
-
} catch {
|
|
428
|
-
dirents = [];
|
|
429
|
-
}
|
|
430
|
-
// Cap fan-out: a user with thousands of sidecars in ~/.moxxy/sessions would
|
|
431
|
-
// otherwise open thousands of file handles at once (EMFILE) on every resume/
|
|
432
|
-
// list. Process in bounded batches instead.
|
|
433
|
-
const sidecarFiles = dirents.filter((d) => d.isFile() && d.name.endsWith('.meta.json'));
|
|
434
|
-
await mapWithConcurrency(sidecarFiles, READ_INDEX_CONCURRENCY, async (d) => {
|
|
435
|
-
try {
|
|
436
|
-
const raw = await fs.readFile(path.join(dir, d.name), 'utf8');
|
|
437
|
-
const parsed = JSON.parse(raw) as unknown;
|
|
438
|
-
if (isSessionMeta(parsed)) byId.set(parsed.id, parsed);
|
|
439
|
-
} catch {
|
|
440
|
-
// skip a malformed/half-written sidecar
|
|
441
|
-
}
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
const metas = [...byId.values()];
|
|
445
|
-
const checks = await mapWithConcurrency(metas, READ_INDEX_CONCURRENCY, async (meta) => {
|
|
446
|
-
try {
|
|
447
|
-
await fs.access(path.join(dir, `${meta.id}.jsonl`));
|
|
448
|
-
return true;
|
|
449
|
-
} catch {
|
|
450
|
-
return false;
|
|
451
|
-
}
|
|
452
|
-
});
|
|
453
|
-
const present = metas.filter((_, index) => checks[index]);
|
|
478
|
+
const { metas, logs } = await readSessionsDir(dir);
|
|
479
|
+
const present = metas.filter((meta) => logs.has(meta.id));
|
|
454
480
|
const hydrated = await mapWithConcurrency(present, READ_INDEX_CONCURRENCY, (meta) =>
|
|
455
481
|
hydrateMetaFirstPrompt(meta, dir),
|
|
456
482
|
);
|
|
@@ -832,9 +858,10 @@ async function backupForeignSessionLog(logPath: string): Promise<void> {
|
|
|
832
858
|
}
|
|
833
859
|
|
|
834
860
|
/**
|
|
835
|
-
* Remove a session
|
|
836
|
-
*
|
|
837
|
-
*
|
|
861
|
+
* Remove a session entirely: its event log (`<id>.jsonl`) and its single
|
|
862
|
+
* metadata file (`<id>.json`). This is the SINGLE deletion mechanism — a session
|
|
863
|
+
* exists iff its `<id>.json` does, so erasing it removes the session from every
|
|
864
|
+
* surface's derived list with no second copy to resurrect it.
|
|
838
865
|
*/
|
|
839
866
|
export async function deleteSession(
|
|
840
867
|
sessionId: string,
|
|
@@ -843,11 +870,162 @@ export async function deleteSession(
|
|
|
843
870
|
assertSafeSessionId(sessionId);
|
|
844
871
|
await fs.rm(path.join(dir, `${sessionId}.jsonl`), { force: true });
|
|
845
872
|
await fs.rm(metaPath(dir, sessionId), { force: true });
|
|
873
|
+
metaCache.delete(metaPath(dir, sessionId));
|
|
846
874
|
}
|
|
847
875
|
|
|
848
|
-
/** Per-session metadata
|
|
876
|
+
/** Per-session metadata file path: `<id>.json` (one file per session). */
|
|
849
877
|
function metaPath(dir: string, id: string): string {
|
|
850
|
-
return path.join(dir, `${id}.
|
|
878
|
+
return path.join(dir, `${id}.json`);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
/** Read one session's metadata file, or null if absent/corrupt. */
|
|
882
|
+
async function readMetaSidecar(dir: string, id: string): Promise<SessionMeta | null> {
|
|
883
|
+
try {
|
|
884
|
+
const parsed = JSON.parse(await fs.readFile(metaPath(dir, id), 'utf8')) as unknown;
|
|
885
|
+
return isSessionMeta(parsed) ? parsed : null;
|
|
886
|
+
} catch {
|
|
887
|
+
return null;
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
/**
|
|
892
|
+
* Patch the UI-owned fields of a session's `<id>.json` in place (read-modify-
|
|
893
|
+
* write): the rename (`title`) and move (`groupId`) paths. A live runner adopts
|
|
894
|
+
* and re-merges these on its next write, so this is safe whether or not a runner
|
|
895
|
+
* is attached. No-op if the session has no metadata file yet.
|
|
896
|
+
*/
|
|
897
|
+
async function patchSessionMeta(
|
|
898
|
+
sessionId: string,
|
|
899
|
+
patch: Partial<Pick<SessionMeta, 'title' | 'groupId'>>,
|
|
900
|
+
dir: string,
|
|
901
|
+
): Promise<void> {
|
|
902
|
+
assertSafeSessionId(sessionId);
|
|
903
|
+
const existing = await readMetaSidecar(dir, sessionId);
|
|
904
|
+
if (!existing) return;
|
|
905
|
+
await writeJsonAtomic(metaPath(dir, sessionId), { ...existing, ...patch });
|
|
906
|
+
metaCache.delete(metaPath(dir, sessionId));
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
/** Persist (or clear, when blank) a user-set session title — the rename path. */
|
|
910
|
+
export async function setSessionTitle(
|
|
911
|
+
sessionId: string,
|
|
912
|
+
title: string,
|
|
913
|
+
dir = defaultSessionsDir(),
|
|
914
|
+
): Promise<void> {
|
|
915
|
+
await patchSessionMeta(sessionId, { title: title.trim() || null }, dir);
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/** Persist (or clear, when null) a session's explicit desk/workspace membership. */
|
|
919
|
+
export async function setSessionGroup(
|
|
920
|
+
sessionId: string,
|
|
921
|
+
groupId: string | null,
|
|
922
|
+
dir = defaultSessionsDir(),
|
|
923
|
+
): Promise<void> {
|
|
924
|
+
await patchSessionMeta(sessionId, { groupId: groupId ?? null }, dir);
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
/**
|
|
928
|
+
* Seed a session's `<id>.json` (+ empty `.jsonl`) so a freshly-created session
|
|
929
|
+
* appears in the derived workspace list IMMEDIATELY, before its runner spawns
|
|
930
|
+
* and attaches. Idempotent: if a metadata file already exists this is a no-op,
|
|
931
|
+
* so it never clobbers a live session. The runner adopts the seeded
|
|
932
|
+
* `startedAt`/`source`/`groupId`/`title` on attach.
|
|
933
|
+
*/
|
|
934
|
+
export async function seedSessionMeta(
|
|
935
|
+
sessionId: string,
|
|
936
|
+
cwd: string,
|
|
937
|
+
source: SessionSource,
|
|
938
|
+
dir = defaultSessionsDir(),
|
|
939
|
+
groupId: string | null = null,
|
|
940
|
+
): Promise<void> {
|
|
941
|
+
assertSafeSessionId(sessionId);
|
|
942
|
+
if (await readMetaSidecar(dir, sessionId)) return;
|
|
943
|
+
await fs.mkdir(dir, { recursive: true });
|
|
944
|
+
const handle = await fs.open(path.join(dir, `${sessionId}.jsonl`), 'a');
|
|
945
|
+
await handle.close();
|
|
946
|
+
const now = new Date().toISOString();
|
|
947
|
+
const meta: SessionMeta = {
|
|
948
|
+
version: SESSION_META_VERSION,
|
|
949
|
+
id: sessionId,
|
|
950
|
+
cwd,
|
|
951
|
+
startedAt: now,
|
|
952
|
+
lastActivity: now,
|
|
953
|
+
eventCount: 0,
|
|
954
|
+
firstPrompt: null,
|
|
955
|
+
provider: null,
|
|
956
|
+
model: null,
|
|
957
|
+
source,
|
|
958
|
+
groupId,
|
|
959
|
+
title: null,
|
|
960
|
+
};
|
|
961
|
+
await writeJsonAtomic(metaPath(dir, sessionId), meta);
|
|
962
|
+
metaCache.delete(metaPath(dir, sessionId));
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
/**
|
|
966
|
+
* Parse-cache for `<id>.json` files, keyed by absolute path. A file is re-parsed
|
|
967
|
+
* only when its mtime/size changes, so listing thousands of sessions on every
|
|
968
|
+
* `desks.list` costs N cheap stats plus reparses of just the CHANGED files — not
|
|
969
|
+
* N JSON parses. Cross-process safe: another process's write bumps the mtime,
|
|
970
|
+
* observed on the next stat. Per-process, bounded by the number of sessions.
|
|
971
|
+
*/
|
|
972
|
+
const metaCache = new Map<string, { mtimeMs: number; size: number; meta: SessionMeta }>();
|
|
973
|
+
|
|
974
|
+
/**
|
|
975
|
+
* One pass over the sessions dir: a single `readdir` yields BOTH the `<id>.json`
|
|
976
|
+
* metadata files and the set of `<id>` ids that have an event log, so callers
|
|
977
|
+
* test log-existence with an O(1) Set lookup instead of an `fs.access` per
|
|
978
|
+
* session. Each `<id>.json` is `stat`-checked and re-parsed only when its
|
|
979
|
+
* mtime/size changed (the parse cache), so steady-state cost is one `readdir` +
|
|
980
|
+
* N cheap `stat`s + reparses of only the CHANGED files.
|
|
981
|
+
*/
|
|
982
|
+
async function readSessionsDir(dir: string): Promise<{ metas: SessionMeta[]; logs: Set<string> }> {
|
|
983
|
+
let dirents: import('node:fs').Dirent[];
|
|
984
|
+
try {
|
|
985
|
+
dirents = await fs.readdir(dir, { withFileTypes: true });
|
|
986
|
+
} catch {
|
|
987
|
+
return { metas: [], logs: new Set() };
|
|
988
|
+
}
|
|
989
|
+
const logs = new Set<string>();
|
|
990
|
+
const files: import('node:fs').Dirent[] = [];
|
|
991
|
+
for (const d of dirents) {
|
|
992
|
+
if (!d.isFile()) continue;
|
|
993
|
+
if (d.name.endsWith('.jsonl')) logs.add(d.name.slice(0, -'.jsonl'.length));
|
|
994
|
+
else if (d.name.endsWith('.json') && d.name !== 'index.json') files.push(d);
|
|
995
|
+
}
|
|
996
|
+
const live = new Set(files.map((d) => path.join(dir, d.name)));
|
|
997
|
+
for (const key of metaCache.keys()) if (!live.has(key)) metaCache.delete(key);
|
|
998
|
+
const metas = await mapWithConcurrency(files, READ_INDEX_CONCURRENCY, async (d) => {
|
|
999
|
+
const file = path.join(dir, d.name);
|
|
1000
|
+
try {
|
|
1001
|
+
const stat = await fs.stat(file);
|
|
1002
|
+
const cached = metaCache.get(file);
|
|
1003
|
+
if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
|
|
1004
|
+
return cached.meta;
|
|
1005
|
+
}
|
|
1006
|
+
const parsed = JSON.parse(await fs.readFile(file, 'utf8')) as unknown;
|
|
1007
|
+
if (!isSessionMeta(parsed)) return null;
|
|
1008
|
+
metaCache.set(file, { mtimeMs: stat.mtimeMs, size: stat.size, meta: parsed });
|
|
1009
|
+
return parsed;
|
|
1010
|
+
} catch {
|
|
1011
|
+
return null;
|
|
1012
|
+
}
|
|
1013
|
+
});
|
|
1014
|
+
return { metas: metas.filter((m): m is SessionMeta => m !== null), logs };
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
/**
|
|
1018
|
+
* List every session from its `<id>.json` (mtime-cached, no `.jsonl` re-read) —
|
|
1019
|
+
* the cheap read the workspace list/search uses on every `desks.list`. Sessions
|
|
1020
|
+
* whose `.jsonl` is gone are dropped (a deleted session never lingers). Use
|
|
1021
|
+
* {@link readIndex} when you need the jsonl-hydrated picker view. Sorted
|
|
1022
|
+
* most-recent-activity first.
|
|
1023
|
+
*/
|
|
1024
|
+
export async function listSessionMetas(dir = defaultSessionsDir()): Promise<SessionMeta[]> {
|
|
1025
|
+
const { metas, logs } = await readSessionsDir(dir);
|
|
1026
|
+
return metas
|
|
1027
|
+
.filter((meta) => logs.has(meta.id))
|
|
1028
|
+
.sort((a, b) => b.lastActivity.localeCompare(a.lastActivity));
|
|
851
1029
|
}
|
|
852
1030
|
|
|
853
1031
|
/**
|