@aexol/spectral 0.9.173 → 0.9.175
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/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +1 -0
- package/dist/extensions/desktop-screenshot/index.d.ts.map +1 -1
- package/dist/extensions/desktop-screenshot/index.js +6 -5
- package/dist/generated/zeus/const.d.ts.map +1 -1
- package/dist/generated/zeus/const.js +6 -2
- package/dist/generated/zeus/index.d.ts +24 -0
- package/dist/generated/zeus/index.d.ts.map +1 -1
- package/dist/memory/config.d.ts +2 -0
- package/dist/memory/config.d.ts.map +1 -1
- package/dist/memory/config.js +25 -0
- package/dist/relay/auto-optimizer.d.ts +1 -1
- package/dist/relay/auto-optimizer.d.ts.map +1 -1
- package/dist/relay/auto-optimizer.js +3 -3
- package/dist/relay/auto-research.d.ts +1 -1
- package/dist/relay/auto-research.d.ts.map +1 -1
- package/dist/relay/auto-research.js +3 -3
- package/dist/relay/dispatcher.d.ts +7 -2
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +27 -20
- package/dist/server/handlers/agent-settings.d.ts +6 -0
- package/dist/server/handlers/agent-settings.d.ts.map +1 -1
- package/dist/server/handlers/agent-settings.js +88 -1
- package/dist/server/handlers/paths-autocomplete.d.ts +4 -4
- package/dist/server/handlers/paths-autocomplete.d.ts.map +1 -1
- package/dist/server/handlers/paths-autocomplete.js +10 -10
- package/dist/server/handlers/projects.d.ts +6 -0
- package/dist/server/handlers/projects.d.ts.map +1 -1
- package/dist/server/handlers/projects.js +18 -0
- package/dist/server/handlers/sessions.d.ts +12 -0
- package/dist/server/handlers/sessions.d.ts.map +1 -1
- package/dist/server/handlers/sessions.js +68 -0
- package/dist/server/handlers/settings-lock.d.ts +19 -0
- package/dist/server/handlers/settings-lock.d.ts.map +1 -1
- package/dist/server/handlers/settings-lock.js +65 -1
- package/dist/server/handlers/settings.d.ts +4 -0
- package/dist/server/handlers/settings.d.ts.map +1 -1
- package/dist/server/handlers/settings.js +38 -2
- package/dist/server/session-stream.d.ts +6 -1
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +32 -12
- package/dist/server/sqlite-adapter.d.ts +31 -0
- package/dist/server/sqlite-adapter.d.ts.map +1 -1
- package/dist/server/sqlite-adapter.js +53 -0
- package/dist/server/storage.d.ts +52 -0
- package/dist/server/storage.d.ts.map +1 -1
- package/dist/server/storage.js +178 -8
- package/package.json +1 -1
package/dist/server/storage.d.ts
CHANGED
|
@@ -85,8 +85,10 @@ export declare class SessionStore {
|
|
|
85
85
|
readonly path: string;
|
|
86
86
|
private db;
|
|
87
87
|
private closed;
|
|
88
|
+
private readonly stmtListProjectsSQL;
|
|
88
89
|
private stmtListProjects;
|
|
89
90
|
private stmtGetProject;
|
|
91
|
+
private stmtCountSessionsByProject;
|
|
90
92
|
private stmtCreateProject;
|
|
91
93
|
private stmtUpdateProject;
|
|
92
94
|
private stmtSetProjectStudioBinding;
|
|
@@ -142,10 +144,20 @@ export declare class SessionStore {
|
|
|
142
144
|
constructor(path: string);
|
|
143
145
|
/** Smoke check: returns the names of the tables in the DB. */
|
|
144
146
|
listTables(): string[];
|
|
147
|
+
/** Shared row→WireProject mapping for the synchronous and async list paths. */
|
|
148
|
+
private mapProjectRowsWithCount;
|
|
145
149
|
listProjects(): WireProject[];
|
|
150
|
+
/**
|
|
151
|
+
* Async twin of {@link listProjects}. Uses the adapter's `queryAll`
|
|
152
|
+
* trampoline so the Node adapter yields to the event loop before the
|
|
153
|
+
* potentially-large aggregate query runs. Wire shape is identical.
|
|
154
|
+
*/
|
|
155
|
+
listProjectsAsync(): Promise<WireProject[]>;
|
|
146
156
|
createProject(input: CreateProjectInput): WireProject;
|
|
147
157
|
/** Returns null if not found. */
|
|
148
158
|
getProject(id: string): WireProject | null;
|
|
159
|
+
/** Async twin of {@link getProject}. */
|
|
160
|
+
getProjectAsync(id: string): Promise<WireProject | null>;
|
|
149
161
|
setProjectStudioBinding(id: string, binding: StudioBinding | null): WireProject | null;
|
|
150
162
|
/**
|
|
151
163
|
* Update a project's name and/or path. At least one must be provided.
|
|
@@ -166,6 +178,8 @@ export declare class SessionStore {
|
|
|
166
178
|
};
|
|
167
179
|
/** Sessions belonging to a single project, newest-first. */
|
|
168
180
|
listSessionsByProject(projectId: string): WireSessionSummary[];
|
|
181
|
+
/** Async twin of {@link listSessionsByProject}. */
|
|
182
|
+
listSessionsByProjectAsync(projectId: string): Promise<WireSessionSummary[]>;
|
|
169
183
|
/**
|
|
170
184
|
* Batched variant of {@link listSessionsByProject} for many projects at once.
|
|
171
185
|
*
|
|
@@ -184,6 +198,14 @@ export declare class SessionStore {
|
|
|
184
198
|
* no sessions map to an empty array.
|
|
185
199
|
*/
|
|
186
200
|
listSessionsByProjectIds(projectIds: string[]): Map<string, WireSessionSummary[]>;
|
|
201
|
+
/**
|
|
202
|
+
* Async twin of {@link listSessionsByProjectIds}. Runs the same single
|
|
203
|
+
* LEFT JOIN + GROUP BY query through the adapter trampoline so large
|
|
204
|
+
* aggregate reads yield to the event loop. Returns an identical Map with
|
|
205
|
+
* every requested project id present (empty arrays for projects with no
|
|
206
|
+
* sessions) and identical per-project `updated_at DESC` ordering.
|
|
207
|
+
*/
|
|
208
|
+
listSessionsByProjectIdsAsync(projectIds: string[]): Promise<Map<string, WireSessionSummary[]>>;
|
|
187
209
|
createSession(input: CreateSessionInput): WireSessionSummary;
|
|
188
210
|
/** Returns null if not found. */
|
|
189
211
|
getSession(id: string): WireSessionDetail | null;
|
|
@@ -201,6 +223,24 @@ export declare class SessionStore {
|
|
|
201
223
|
createdAt: number;
|
|
202
224
|
updatedAt: number;
|
|
203
225
|
} | null;
|
|
226
|
+
/** Async twin of {@link getSessionMeta}. */
|
|
227
|
+
getSessionMetaAsync(id: string): Promise<{
|
|
228
|
+
id: string;
|
|
229
|
+
projectId: string;
|
|
230
|
+
title: string;
|
|
231
|
+
createdAt: number;
|
|
232
|
+
updatedAt: number;
|
|
233
|
+
} | null>;
|
|
234
|
+
/** Async twin of {@link getMessages} with a caller-supplied bound. */
|
|
235
|
+
getMessagesTailAsync(sessionId: string, limit: number): Promise<StoredMessage[]>;
|
|
236
|
+
/**
|
|
237
|
+
* Non-blocking full-history read used by the WS `attach()` first-attach
|
|
238
|
+
* path. The Node adapter pages the result set with an event-loop yield
|
|
239
|
+
* between pages (see `SqliteAdapter.queryAll`), while the Bun adapter
|
|
240
|
+
* falls back to its synchronous `.all()` path. Row order and wire shape
|
|
241
|
+
* are identical to the synchronous `getMessages()`.
|
|
242
|
+
*/
|
|
243
|
+
getMessagesAsync(sessionId: string): Promise<StoredMessage[]>;
|
|
204
244
|
getMessages(sessionId: string): StoredMessage[];
|
|
205
245
|
getMessagesTail(sessionId: string, limit: number): StoredMessage[];
|
|
206
246
|
getMessagesBefore(sessionId: string, opts: {
|
|
@@ -208,7 +248,15 @@ export declare class SessionStore {
|
|
|
208
248
|
beforeId: string | null;
|
|
209
249
|
limit: number;
|
|
210
250
|
}): StoredMessage[];
|
|
251
|
+
/** Async twin of {@link getMessagesBefore}. */
|
|
252
|
+
getMessagesBeforeAsync(sessionId: string, opts: {
|
|
253
|
+
beforeCreatedAt: number | null;
|
|
254
|
+
beforeId: string | null;
|
|
255
|
+
limit: number;
|
|
256
|
+
}): Promise<StoredMessage[]>;
|
|
211
257
|
countMessagesBySession(sessionId: string): number;
|
|
258
|
+
/** Async twin of {@link countMessagesBySession}. */
|
|
259
|
+
countMessagesBySessionAsync(sessionId: string): Promise<number>;
|
|
212
260
|
private mapMessageRows;
|
|
213
261
|
/**
|
|
214
262
|
* Append a message and bump the session's updated_at in one transaction.
|
|
@@ -275,6 +323,8 @@ export declare class SessionStore {
|
|
|
275
323
|
*/
|
|
276
324
|
setSessionModel(sessionId: string, modelId: string | null): void;
|
|
277
325
|
getSessionActiveAgent(sessionId: string): string | null;
|
|
326
|
+
/** Async twin of {@link getSessionActiveAgent}. */
|
|
327
|
+
getSessionActiveAgentAsync(sessionId: string): Promise<string | null>;
|
|
278
328
|
setSessionActiveAgent(sessionId: string, agentName: string | null): void;
|
|
279
329
|
/**
|
|
280
330
|
* Get the persisted reasoningEffort for a session, or null if none
|
|
@@ -307,6 +357,8 @@ export declare class SessionStore {
|
|
|
307
357
|
* was not forked or has already been compacted.
|
|
308
358
|
*/
|
|
309
359
|
getForkCompactSource(sessionId: string): string | null;
|
|
360
|
+
/** Async twin of {@link getForkCompactSource}. */
|
|
361
|
+
getForkCompactSourceAsync(sessionId: string): Promise<string | null>;
|
|
310
362
|
/**
|
|
311
363
|
* Clear the fork-compact flag after compaction completes (or fails).
|
|
312
364
|
* Idempotent-safe.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAUH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,sEAAsE;AACtE,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAExC,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,sBAAsB,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0ND,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAgBD,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,gBAAgB,CAA2C;IACnE,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,iBAAiB,CAA4D;IACrF,OAAO,CAAC,iBAAiB,CAAoD;IAC7E,OAAO,CAAC,2BAA2B,CAAiF;IACpH,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,yBAAyB,CAAiD;IAClF,OAAO,CAAC,2BAA2B,CAA4C;IAC/E,OAAO,CAAC,kCAAkC,CAAoD;IAC9F,OAAO,CAAC,kCAAkC,CAAoC;IAG9E,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,iBAAiB,CAA4D;IACrF,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,oBAAoB,CAAgD;IAC5E,OAAO,CAAC,sBAAsB,CAAwE;IACtG,OAAO,CAAC,0BAA0B,CAAsC;IACxE,OAAO,CAAC,iBAAiB,CAEvB;IACF,OAAO,CAAC,wBAAwB,CAAoC;IACpE,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,2BAA2B,CAAoC;IACvE,OAAO,CAAC,2BAA2B,CAA4B;IAC/D,OAAO,CAAC,2BAA2B,CAAoC;IACvE,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,iBAAiB,CAA4C;IACrE,OAAO,CAAC,oBAAoB,CAAiD;IAC7E,OAAO,CAAC,4BAA4B,CAAsD;IAC1F,OAAO,CAAC,+BAA+B,CAA4D;IACnG,OAAO,CAAC,+BAA+B,CAA4B;IAEnE,OAAO,CAAC,mBAAmB,CAAyD;IACpF,OAAO,CAAC,mBAAmB,CAA2C;IACtE,OAAO,CAAC,yBAAyB,CAA6D;IAC9F,OAAO,CAAC,yBAAyB,CAA2C;IAC5E,OAAO,CAAC,6BAA6B,CAAiE;IACtG,OAAO,CAAC,6BAA6B,CAA2C;IAChF,OAAO,CAAC,8BAA8B,CAAmE;IACzG,OAAO,CAAC,8BAA8B,CAA2C;IAEjF,OAAO,CAAC,wBAAwB,CAA2C;IAC3E,OAAO,CAAC,wBAAwB,CAAuE;IAEvG,OAAO,CAAC,oBAAoB,CAAoE;IAChG,OAAO,CAAC,oBAAoB,CAA2D;IACvF,OAAO,CAAC,qBAAqB,CAA2D;IACxF,OAAO,CAAC,mBAAmB,CAA4C;IAGvE,OAAO,CAAC,iBAAiB,CAAoE;IAC7F,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,iBAAiB,CAAsC;IAC/D,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,kBAAkB,CAA4C;IAGtE,OAAO,CAAC,2BAA2B,CAEjC;IACF,OAAO,CAAC,0BAA0B,CAGhC;IACF,OAAO,CAAC,kCAAkC,CAAoC;IAC9E,OAAO,CAAC,mCAAmC,CAA4B;IACvE,OAAO,CAAC,+BAA+B,CAA4B;gBAEvD,IAAI,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/server/storage.js
CHANGED
|
@@ -190,8 +190,16 @@ export class SessionStore {
|
|
|
190
190
|
db;
|
|
191
191
|
closed = false;
|
|
192
192
|
// Project statements
|
|
193
|
+
stmtListProjectsSQL = `
|
|
194
|
+
SELECT p.id, p.name, p.path, p.created_at, p.updated_at,
|
|
195
|
+
p.studio_project_id, p.studio_project_name, p.studio_team_id,
|
|
196
|
+
(SELECT COUNT(*) FROM sessions s WHERE s.project_id = p.id) AS session_count
|
|
197
|
+
FROM projects p
|
|
198
|
+
ORDER BY p.updated_at DESC
|
|
199
|
+
`;
|
|
193
200
|
stmtListProjects;
|
|
194
201
|
stmtGetProject;
|
|
202
|
+
stmtCountSessionsByProject;
|
|
195
203
|
stmtCreateProject;
|
|
196
204
|
stmtUpdateProject;
|
|
197
205
|
stmtSetProjectStudioBinding;
|
|
@@ -375,6 +383,7 @@ export class SessionStore {
|
|
|
375
383
|
ORDER BY p.updated_at DESC
|
|
376
384
|
`);
|
|
377
385
|
this.stmtGetProject = this.db.prepare(`SELECT id, name, path, created_at, updated_at, studio_project_id, studio_project_name, studio_team_id FROM projects WHERE id = ?`);
|
|
386
|
+
this.stmtCountSessionsByProject = this.db.prepare(`SELECT COUNT(*) AS count FROM sessions WHERE project_id = ?`);
|
|
378
387
|
this.stmtCreateProject = this.db.prepare(`INSERT INTO projects (id, name, path, created_at, updated_at) VALUES (?, ?, ?, ?, ?)`);
|
|
379
388
|
this.stmtUpdateProject = this.db.prepare(`UPDATE projects SET name = ?, path = ?, updated_at = ? WHERE id = ?`);
|
|
380
389
|
this.stmtSetProjectStudioBinding = this.db.prepare(`UPDATE projects SET studio_project_id = ?, studio_project_name = ?, studio_team_id = ?, updated_at = ? WHERE id = ?`);
|
|
@@ -500,11 +509,9 @@ export class SessionStore {
|
|
|
500
509
|
.all();
|
|
501
510
|
return rows.map((r) => r.name);
|
|
502
511
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
listProjects() {
|
|
507
|
-
return this.stmtListProjects.all().map((r) => {
|
|
512
|
+
/** Shared row→WireProject mapping for the synchronous and async list paths. */
|
|
513
|
+
mapProjectRowsWithCount(rows) {
|
|
514
|
+
return rows.map((r) => {
|
|
508
515
|
const project = {
|
|
509
516
|
id: r.id,
|
|
510
517
|
name: r.name,
|
|
@@ -523,6 +530,21 @@ export class SessionStore {
|
|
|
523
530
|
return applyBindingFields(project, rowBinding);
|
|
524
531
|
});
|
|
525
532
|
}
|
|
533
|
+
// ----------------------------------------------------------------------
|
|
534
|
+
// Projects
|
|
535
|
+
// ----------------------------------------------------------------------
|
|
536
|
+
listProjects() {
|
|
537
|
+
return this.mapProjectRowsWithCount(this.stmtListProjects.all());
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Async twin of {@link listProjects}. Uses the adapter's `queryAll`
|
|
541
|
+
* trampoline so the Node adapter yields to the event loop before the
|
|
542
|
+
* potentially-large aggregate query runs. Wire shape is identical.
|
|
543
|
+
*/
|
|
544
|
+
async listProjectsAsync() {
|
|
545
|
+
const rows = await this.db.queryAll(this.stmtListProjectsSQL);
|
|
546
|
+
return this.mapProjectRowsWithCount(rows);
|
|
547
|
+
}
|
|
526
548
|
createProject(input) {
|
|
527
549
|
const id = input.id ?? randomUUID();
|
|
528
550
|
const name = input.name.trim() || "Untitled project";
|
|
@@ -543,15 +565,40 @@ export class SessionStore {
|
|
|
543
565
|
const row = this.stmtGetProject.get(id);
|
|
544
566
|
if (!row)
|
|
545
567
|
return null;
|
|
546
|
-
|
|
547
|
-
const withCount = this.stmtListProjects.all().find((r) => r.id === id);
|
|
568
|
+
const withCount = this.stmtCountSessionsByProject.get(id);
|
|
548
569
|
const project = {
|
|
549
570
|
id: row.id,
|
|
550
571
|
name: row.name,
|
|
551
572
|
path: row.path,
|
|
552
573
|
createdAt: row.created_at,
|
|
553
574
|
updatedAt: row.updated_at,
|
|
554
|
-
sessionCount: withCount?.
|
|
575
|
+
sessionCount: withCount?.count ?? 0,
|
|
576
|
+
};
|
|
577
|
+
const rowBinding = row.studio_project_id
|
|
578
|
+
? {
|
|
579
|
+
projectId: row.studio_project_id,
|
|
580
|
+
...(row.studio_project_name ? { name: row.studio_project_name } : {}),
|
|
581
|
+
...(row.studio_team_id ? { teamId: row.studio_team_id } : {}),
|
|
582
|
+
}
|
|
583
|
+
: null;
|
|
584
|
+
return applyBindingFields(project, rowBinding);
|
|
585
|
+
}
|
|
586
|
+
/** Async twin of {@link getProject}. */
|
|
587
|
+
async getProjectAsync(id) {
|
|
588
|
+
const rows = await this.db.queryAll(`SELECT id, name, path, created_at, updated_at,
|
|
589
|
+
studio_project_id, studio_project_name, studio_team_id
|
|
590
|
+
FROM projects WHERE id = ?`, id);
|
|
591
|
+
const row = rows[0];
|
|
592
|
+
if (!row)
|
|
593
|
+
return null;
|
|
594
|
+
const countRows = await this.db.queryAll(`SELECT COUNT(*) AS count FROM sessions WHERE project_id = ?`, id);
|
|
595
|
+
const project = {
|
|
596
|
+
id: row.id,
|
|
597
|
+
name: row.name,
|
|
598
|
+
path: row.path,
|
|
599
|
+
createdAt: row.created_at,
|
|
600
|
+
updatedAt: row.updated_at,
|
|
601
|
+
sessionCount: countRows[0]?.count ?? 0,
|
|
555
602
|
};
|
|
556
603
|
const rowBinding = row.studio_project_id
|
|
557
604
|
? {
|
|
@@ -607,6 +654,22 @@ export class SessionStore {
|
|
|
607
654
|
messageCount: r.message_count,
|
|
608
655
|
}));
|
|
609
656
|
}
|
|
657
|
+
/** Async twin of {@link listSessionsByProject}. */
|
|
658
|
+
async listSessionsByProjectAsync(projectId) {
|
|
659
|
+
const rows = await this.db.queryAll(`SELECT s.id, s.project_id, s.title, s.created_at, s.updated_at,
|
|
660
|
+
(SELECT COUNT(*) FROM messages m WHERE m.session_id = s.id) AS message_count
|
|
661
|
+
FROM sessions s
|
|
662
|
+
WHERE s.project_id = ?
|
|
663
|
+
ORDER BY s.updated_at DESC`, projectId);
|
|
664
|
+
return rows.map((r) => ({
|
|
665
|
+
id: r.id,
|
|
666
|
+
projectId: r.project_id,
|
|
667
|
+
title: r.title,
|
|
668
|
+
createdAt: r.created_at,
|
|
669
|
+
updatedAt: r.updated_at,
|
|
670
|
+
messageCount: r.message_count,
|
|
671
|
+
}));
|
|
672
|
+
}
|
|
610
673
|
/**
|
|
611
674
|
* Batched variant of {@link listSessionsByProject} for many projects at once.
|
|
612
675
|
*
|
|
@@ -654,6 +717,42 @@ export class SessionStore {
|
|
|
654
717
|
}
|
|
655
718
|
return result;
|
|
656
719
|
}
|
|
720
|
+
/**
|
|
721
|
+
* Async twin of {@link listSessionsByProjectIds}. Runs the same single
|
|
722
|
+
* LEFT JOIN + GROUP BY query through the adapter trampoline so large
|
|
723
|
+
* aggregate reads yield to the event loop. Returns an identical Map with
|
|
724
|
+
* every requested project id present (empty arrays for projects with no
|
|
725
|
+
* sessions) and identical per-project `updated_at DESC` ordering.
|
|
726
|
+
*/
|
|
727
|
+
async listSessionsByProjectIdsAsync(projectIds) {
|
|
728
|
+
const result = new Map();
|
|
729
|
+
for (const id of projectIds)
|
|
730
|
+
result.set(id, []);
|
|
731
|
+
if (projectIds.length === 0)
|
|
732
|
+
return result;
|
|
733
|
+
const placeholders = projectIds.map(() => "?").join(", ");
|
|
734
|
+
const rows = await this.db.queryAll(`SELECT s.id, s.project_id, s.title, s.created_at, s.updated_at,
|
|
735
|
+
COUNT(m.id) AS message_count
|
|
736
|
+
FROM sessions s
|
|
737
|
+
LEFT JOIN messages m ON m.session_id = s.id
|
|
738
|
+
WHERE s.project_id IN (${placeholders})
|
|
739
|
+
GROUP BY s.id, s.project_id, s.title, s.created_at, s.updated_at
|
|
740
|
+
ORDER BY s.updated_at DESC, s.created_at DESC, s.id DESC`, ...projectIds);
|
|
741
|
+
for (const r of rows) {
|
|
742
|
+
const list = result.get(r.project_id);
|
|
743
|
+
if (!list)
|
|
744
|
+
continue;
|
|
745
|
+
list.push({
|
|
746
|
+
id: r.id,
|
|
747
|
+
projectId: r.project_id,
|
|
748
|
+
title: r.title,
|
|
749
|
+
createdAt: r.created_at,
|
|
750
|
+
updatedAt: r.updated_at,
|
|
751
|
+
messageCount: r.message_count,
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
return result;
|
|
755
|
+
}
|
|
657
756
|
// ----------------------------------------------------------------------
|
|
658
757
|
// Sessions
|
|
659
758
|
// ----------------------------------------------------------------------
|
|
@@ -727,6 +826,46 @@ export class SessionStore {
|
|
|
727
826
|
updatedAt: row.updated_at,
|
|
728
827
|
};
|
|
729
828
|
}
|
|
829
|
+
/** Async twin of {@link getSessionMeta}. */
|
|
830
|
+
async getSessionMetaAsync(id) {
|
|
831
|
+
const rows = await this.db.queryAll(`SELECT id, project_id, title, created_at, updated_at
|
|
832
|
+
FROM sessions WHERE id = ?`, id);
|
|
833
|
+
const row = rows[0];
|
|
834
|
+
if (!row)
|
|
835
|
+
return null;
|
|
836
|
+
return {
|
|
837
|
+
id: row.id,
|
|
838
|
+
projectId: row.project_id,
|
|
839
|
+
title: row.title,
|
|
840
|
+
createdAt: row.created_at,
|
|
841
|
+
updatedAt: row.updated_at,
|
|
842
|
+
};
|
|
843
|
+
}
|
|
844
|
+
/** Async twin of {@link getMessages} with a caller-supplied bound. */
|
|
845
|
+
async getMessagesTailAsync(sessionId, limit) {
|
|
846
|
+
const rows = await this.db.queryAll(`SELECT id, session_id, role, content, events_jsonl, images_json, credits_used, created_at
|
|
847
|
+
FROM (
|
|
848
|
+
SELECT id, session_id, role, content, events_jsonl, images_json, credits_used, created_at
|
|
849
|
+
FROM messages
|
|
850
|
+
WHERE session_id = ?
|
|
851
|
+
ORDER BY created_at DESC, id DESC
|
|
852
|
+
LIMIT ?
|
|
853
|
+
)
|
|
854
|
+
ORDER BY created_at ASC, id ASC`, sessionId, limit);
|
|
855
|
+
return this.mapMessageRows(rows);
|
|
856
|
+
}
|
|
857
|
+
/**
|
|
858
|
+
* Non-blocking full-history read used by the WS `attach()` first-attach
|
|
859
|
+
* path. The Node adapter pages the result set with an event-loop yield
|
|
860
|
+
* between pages (see `SqliteAdapter.queryAll`), while the Bun adapter
|
|
861
|
+
* falls back to its synchronous `.all()` path. Row order and wire shape
|
|
862
|
+
* are identical to the synchronous `getMessages()`.
|
|
863
|
+
*/
|
|
864
|
+
async getMessagesAsync(sessionId) {
|
|
865
|
+
const rows = await this.db.queryAll(`SELECT id, session_id, role, content, events_jsonl, images_json, credits_used, created_at
|
|
866
|
+
FROM messages WHERE session_id = ? ORDER BY created_at ASC, id ASC`, sessionId);
|
|
867
|
+
return this.mapMessageRows(rows);
|
|
868
|
+
}
|
|
730
869
|
getMessages(sessionId) {
|
|
731
870
|
return this.mapMessageRows(this.stmtListMessages.all(sessionId));
|
|
732
871
|
}
|
|
@@ -738,9 +877,30 @@ export class SessionStore {
|
|
|
738
877
|
return [];
|
|
739
878
|
return this.mapMessageRows(this.stmtListMessagesBefore.all(sessionId, opts.beforeCreatedAt, opts.beforeCreatedAt, opts.beforeId ?? "\uffff", opts.limit));
|
|
740
879
|
}
|
|
880
|
+
/** Async twin of {@link getMessagesBefore}. */
|
|
881
|
+
async getMessagesBeforeAsync(sessionId, opts) {
|
|
882
|
+
if (opts.beforeCreatedAt === null)
|
|
883
|
+
return [];
|
|
884
|
+
const rows = await this.db.queryAll(`SELECT id, session_id, role, content, events_jsonl, images_json, credits_used, created_at
|
|
885
|
+
FROM (
|
|
886
|
+
SELECT id, session_id, role, content, events_jsonl, images_json, credits_used, created_at
|
|
887
|
+
FROM messages
|
|
888
|
+
WHERE session_id = ?
|
|
889
|
+
AND (created_at < ? OR (created_at = ? AND id < ?))
|
|
890
|
+
ORDER BY created_at DESC, id DESC
|
|
891
|
+
LIMIT ?
|
|
892
|
+
)
|
|
893
|
+
ORDER BY created_at ASC, id ASC`, sessionId, opts.beforeCreatedAt, opts.beforeCreatedAt, opts.beforeId ?? "\uffff", opts.limit);
|
|
894
|
+
return this.mapMessageRows(rows);
|
|
895
|
+
}
|
|
741
896
|
countMessagesBySession(sessionId) {
|
|
742
897
|
return this.stmtCountMessagesBySession.get(sessionId)?.count ?? 0;
|
|
743
898
|
}
|
|
899
|
+
/** Async twin of {@link countMessagesBySession}. */
|
|
900
|
+
async countMessagesBySessionAsync(sessionId) {
|
|
901
|
+
const rows = await this.db.queryAll(`SELECT COUNT(*) AS count FROM messages WHERE session_id = ?`, sessionId);
|
|
902
|
+
return rows[0]?.count ?? 0;
|
|
903
|
+
}
|
|
744
904
|
mapMessageRows(rows) {
|
|
745
905
|
return rows.map((r) => {
|
|
746
906
|
const images = parseImagesJson(r.images_json);
|
|
@@ -952,6 +1112,11 @@ export class SessionStore {
|
|
|
952
1112
|
getSessionActiveAgent(sessionId) {
|
|
953
1113
|
return this.stmtGetSessionActiveAgent.get(sessionId)?.active_agent ?? null;
|
|
954
1114
|
}
|
|
1115
|
+
/** Async twin of {@link getSessionActiveAgent}. */
|
|
1116
|
+
async getSessionActiveAgentAsync(sessionId) {
|
|
1117
|
+
const rows = await this.db.queryAll(`SELECT active_agent FROM sessions WHERE id = ?`, sessionId);
|
|
1118
|
+
return rows[0]?.active_agent ?? null;
|
|
1119
|
+
}
|
|
955
1120
|
setSessionActiveAgent(sessionId, agentName) {
|
|
956
1121
|
this.stmtSetSessionActiveAgent.run(agentName, sessionId);
|
|
957
1122
|
}
|
|
@@ -1035,6 +1200,11 @@ export class SessionStore {
|
|
|
1035
1200
|
const row = this.stmtGetForkCompactSource.get(sessionId);
|
|
1036
1201
|
return row?.fork_compact_source_id ?? null;
|
|
1037
1202
|
}
|
|
1203
|
+
/** Async twin of {@link getForkCompactSource}. */
|
|
1204
|
+
async getForkCompactSourceAsync(sessionId) {
|
|
1205
|
+
const rows = await this.db.queryAll(`SELECT fork_compact_source_id FROM sessions WHERE id = ?`, sessionId);
|
|
1206
|
+
return rows[0]?.fork_compact_source_id ?? null;
|
|
1207
|
+
}
|
|
1038
1208
|
/**
|
|
1039
1209
|
* Clear the fork-compact flag after compaction completes (or fails).
|
|
1040
1210
|
* Idempotent-safe.
|