fix(session): load pre-react-loop persisted sessions

This commit is contained in:
_Kerman
2026-08-04 11:25:31 +08:00
parent 98947afece
commit 2a9ebfcac2
19 changed files with 486 additions and 45 deletions

View File

@@ -77,7 +77,7 @@ function throwUnknown(value: unknown): never {
}
describe('the session-persistence Agent Note: AgentLoop factory create/resume', () => {
it('resumes a session persisted before messages gained identities', async () => {
it('resumes a pre-react-loop session including pre-identity message events', async () => {
const sessionId = SessionId('pre-identity-resume')
const first = await persistentHarness(new MockAdapter([]))
await first.ctx.sessionPersistence.create({
@@ -86,7 +86,10 @@ describe('the session-persistence Agent Note: AgentLoop factory create/resume',
createdAt: 1,
})
await first.ctx.sessionPersistence.append(sessionId, [
{ type: 'turn/start', seq: 0, time: 1, data: { turn: 1 } },
{
type: 'turn/start', seq: 0, time: 1,
data: { turn: 1, trigger: { kind: 'message', source: { kind: 'user' } } },
},
{
type: 'user/message',
seq: 1,
@@ -107,8 +110,19 @@ describe('the session-persistence Agent Note: AgentLoop factory create/resume',
},
surfaceOp: 'append',
},
{ type: 'step/end', seq: 4, time: 5, data: { turn: 1, step: 1 } },
{ type: 'turn/end', seq: 5, time: 6, data: { turn: 1, step: 1, reason: { kind: 'completed' } } },
{
type: 'steering/message',
seq: 4,
time: 5,
data: {
turn: 1,
content: [{ type: 'text', text: 'old steering' }],
source: { kind: 'user' },
},
surfaceOp: 'append',
},
{ type: 'step/end', seq: 5, time: 6, data: { turn: 1, step: 1 } },
{ type: 'turn/end', seq: 6, time: 7, data: { turn: 1, reason: { kind: 'completed' } } },
] as unknown as SessionEvent[])
await first.ctx.fiber.dispose()
@@ -120,14 +134,17 @@ describe('the session-persistence Agent Note: AgentLoop factory create/resume',
expect(handle.agent.session.deriveMessages()).toMatchObject([
{ id: `legacy-message:${sessionId}:1`, role: 'user' },
{ id: `legacy-message:${sessionId}:3`, role: 'assistant' },
{ id: `legacy-message:${sessionId}:4`, role: 'user' },
])
expect(handle.agent.inbox.nextTurn).toEqual([])
expect(handle.agent.inbox.nextStep).toEqual([])
handle.agent.followup(createUserMessage({
content: [{ type: 'text', text: 'new question' }],
source: { kind: 'user' },
}))
await waitForIdle(ctx, handle.agent)
expect(handle.agent.session.deriveMessages()).toHaveLength(4)
expect(handle.agent.session.deriveMessages()).toHaveLength(5)
expect(handle.agent.session.events.at(-1)).toMatchObject({
type: 'turn/end',
data: { reason: { kind: 'completed' } },