feat(session): persist optional time zones

This commit is contained in:
pku-xht
2026-08-06 05:06:57 +08:00
committed by Tianyi Cui
parent d61059364e
commit a667ec55d6
25 changed files with 516 additions and 70 deletions

View File

@@ -63,7 +63,9 @@ function inherited(session: Session): readonly SessionEvent[] {
describe('SessionStore.fork', () => {
it('forks an empty live session as an empty child with lineage metadata', async () => {
const { ctx, sessions } = await setup()
const source = ctx.sessions.create(SessionId('empty-parent'), { meta: { cwd: '/workspace' } })
const source = ctx.sessions.create(SessionId('empty-parent'), {
meta: { cwd: '/workspace', timeZone: 'Asia/Shanghai' },
})
const child = sessions.fork(source, undefined, SessionId('empty-child'))
@@ -71,11 +73,21 @@ describe('SessionStore.fork', () => {
expect(child.header).toMatchObject({
id: SessionId('empty-child'),
cwd: '/workspace',
timeZone: 'Asia/Shanghai',
parentSession: SessionId('empty-parent'),
seedLength: 0,
})
})
it('keeps a headerless fork headerless', async () => {
const { ctx, sessions } = await setup()
const source = ctx.sessions.create(SessionId('headerless-parent'), { meta: { cwd: '/workspace' } })
const child = sessions.fork(source, undefined, SessionId('headerless-child'))
expect(child.header.timeZone).toBeUndefined()
})
it('forks the latest completed boundary by default into detached frozen seed events', async () => {
const { ctx, sessions } = await setup()
const source = ctx.sessions.create(SessionId('parent'), { meta: { cwd: '/workspace' } })

View File

@@ -997,6 +997,7 @@ describe('Session', () => {
id: SessionId('header-owned'),
createdAt: 123,
cwd: '/accepted',
timeZone: 'Caller/Canonical',
parentSession: SessionId('parent'),
seedLength: 2,
}
@@ -1009,6 +1010,7 @@ describe('Session', () => {
id: 'header-owned',
createdAt: 123,
cwd: '/accepted',
timeZone: 'Caller/Canonical',
parentSession: 'parent',
seedLength: 2,
})
@@ -1063,6 +1065,7 @@ describe('Session', () => {
{ header: { ...base, createdAt: '123' }, error: /createdAt must be a non-negative safe integer/ },
{ header: { ...base, cwd: 1 }, error: /header cwd must be a string/ },
{ header: { ...base, cwd: 'relative' }, error: /header cwd must be an absolute path/ },
{ header: { ...base, timeZone: 1 }, error: /header timeZone must be a string/ },
{ header: { ...base, parentSession: 1 }, error: /header parentSession must be a string/ },
{ header: { ...base, seedLength: '1' }, error: /seedLength must be a non-negative safe integer/ },
{ header: { ...base, seedLength: 0.5 }, error: /seedLength must be a non-negative safe integer/ },
@@ -1273,16 +1276,17 @@ describe('SessionStore', () => {
expect(session.header.parentSession).toBeUndefined()
})
it('attaches cwd and parentSession from meta to the header', async () => {
it('attaches cwd, timeZone, and parentSession from meta to the header', async () => {
const ctx = new Context()
await ctx.plugin(SessionStore)
const session = ctx.sessions.create(SessionId('child'), {
meta: { cwd: '/work/project', parentSession: SessionId('parent') },
meta: { cwd: '/work/project', timeZone: 'Asia/Shanghai', parentSession: SessionId('parent') },
})
expect(session.header).toMatchObject({
version: SESSION_FORMAT_VERSION,
id: 'child',
cwd: '/work/project',
timeZone: 'Asia/Shanghai',
parentSession: 'parent',
})
})
@@ -1307,6 +1311,7 @@ describe('SessionStore', () => {
const cases: Array<{ meta: unknown; error: RegExp }> = [
{ meta: { parentSession: 1n }, error: /header is not losslessly JSON-serializable/ },
{ meta: { cwd: 1 }, error: /header cwd must be a string/ },
{ meta: { timeZone: 1 }, error: /header timeZone must be a string/ },
{ meta: { parentSession: 1 }, error: /header parentSession must be a string/ },
{ meta: { createdAt: '123' }, error: /header createdAt must be a non-negative safe integer/ },
{ meta: { createdAt: 1.5 }, error: /header createdAt must be a non-negative safe integer/ },