feat(client): improve workspace session browsing

This commit is contained in:
_Kerman
2026-08-11 13:20:16 +08:00
parent c172faed37
commit 8e0cb2bdba
19 changed files with 198 additions and 62 deletions

View File

@@ -466,6 +466,7 @@ function sessionListFields(header: SessionHeader, events: readonly SessionEvent[
function summarize(session: Session, running: boolean): SessionSummary {
return {
sessionId: session.id,
createdAt: session.header.createdAt,
// Excludes end-seed: a resumed-but-untouched session
// must not sort as freshly worked in.
updatedAt: lastActivityTime(session.events) ?? session.header.createdAt,
@@ -499,6 +500,7 @@ async function summarizeCold(
}
return {
sessionId: meta.id,
createdAt: meta.createdAt,
updatedAt,
running: false,
// Lazy persistence keeps never-appended sessions out of list(); reading
@@ -3377,6 +3379,7 @@ export function createApiProxy(ctx: Context, defaults: ApiProxyDefaults): ApiPro
queue.push(frame({
type: 'host/session-added',
sessionId: session.id,
createdAt: session.header.createdAt,
// Derived at frame time like summarize(); a just-created session
// has run no turn yet, so this is constantly true in practice.
blank: sessionBlank(session),

View File

@@ -71,6 +71,7 @@ export const hostFrameSchema = z.discriminatedUnion('type', [
z.object({
type: z.literal('host/session-added'),
sessionId: sessionIdSchema,
createdAt: z.number().optional(),
blank: z.boolean(),
parentSessionId: sessionIdSchema.optional(),
origin: z.literal('subagent').optional(),

View File

@@ -127,6 +127,7 @@ export type HostFrame =
| {
type: 'host/session-added'
sessionId: SessionId
createdAt?: number
blank: boolean
parentSessionId?: SessionId
origin?: 'subagent'

View File

@@ -51,6 +51,7 @@ export const sessionEventSchema = z.object({
/** SessionSummary row of session.list (`projections` reuses the history block's shape and schema). */
export const sessionSummarySchema = z.object({
sessionId: sessionIdSchema,
createdAt: z.number().optional(),
updatedAt: z.number(),
running: z.boolean(),
blank: z.boolean(),

View File

@@ -147,6 +147,8 @@ export type QueueAction =
/** Session list entry (v1 builds no index: list does readdir+stat). */
export interface SessionSummary {
sessionId: SessionId
/** Session creation time from the durable session header when supplied by the Host. */
createdAt?: number
/**
* Last activity. Attached: the last non-`session/end-seed` event, since a
* pickup is not activity. Cold: the log's mtime, or `createdAt` for a backend