From 4e7193945da43bbc59d9abc12d6f17b38f2e86eb Mon Sep 17 00:00:00 2001 From: creatixchu Date: Fri, 11 Sep 2026 15:38:04 +0800 Subject: [PATCH] fix: expose the projection registration async disposer --- docs/subsystems/session.md | 2 +- packages/core/session/src/index.ts | 2 +- packages/extensions/tool-cordis/src/api-catalog.ts | 2 +- packages/session/session-format-catalog/tests/catalog.spec.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/subsystems/session.md b/docs/subsystems/session.md index 4058d432d7..85d55e87fc 100644 --- a/docs/subsystems/session.md +++ b/docs/subsystems/session.md @@ -909,7 +909,7 @@ Persistence is intentionally not implemented here — the agent lifecycle attach * @returns the fiber-owned disposer. * @throws when another definition already owns this event type. */ -registerMessageProjection(projection: SessionMessageProjection): () => void +registerMessageProjection(projection: SessionMessageProjection): () => Promise /** * Create a session owned by the calling fiber: disposing that fiber stops diff --git a/packages/core/session/src/index.ts b/packages/core/session/src/index.ts index b7fe8f8568..548603f613 100644 --- a/packages/core/session/src/index.ts +++ b/packages/core/session/src/index.ts @@ -922,7 +922,7 @@ export class SessionStore extends Service { * @returns the fiber-owned disposer. * @throws when another definition already owns this event type. */ - registerMessageProjection(projection: SessionMessageProjection): () => void { + registerMessageProjection(projection: SessionMessageProjection): () => Promise { if (this.projections.some(item => item.type === projection.type)) { throw new Error(`session message projection "${projection.type}" is already registered`) } diff --git a/packages/extensions/tool-cordis/src/api-catalog.ts b/packages/extensions/tool-cordis/src/api-catalog.ts index 05966710ba..4836cd2588 100644 --- a/packages/extensions/tool-cordis/src/api-catalog.ts +++ b/packages/extensions/tool-cordis/src/api-catalog.ts @@ -1870,7 +1870,7 @@ export const SERVICE_API: readonly ServiceApiEntry[] = [ description: 'In-memory session store (`ctx.sessions`).\n\nPersistence is intentionally not implemented here — the agent lifecycle attaches a session-log writer to each published session\'s write handle; a session published outside that lifecycle persists nothing.', methods: [ { - signature: 'registerMessageProjection(projection: SessionMessageProjection): () => void', + signature: 'registerMessageProjection(projection: SessionMessageProjection): () => Promise', description: 'Register one event interpreter for live creation, restore, and fork. Disposing the contribution makes sessions that used it refuse further derivation.', parameters: [{ name: 'projection', description: 'pure definition owned by the event\'s plugin.' }], returns: 'the fiber-owned disposer.', diff --git a/packages/session/session-format-catalog/tests/catalog.spec.ts b/packages/session/session-format-catalog/tests/catalog.spec.ts index e3cb8e5e98..335f406e89 100644 --- a/packages/session/session-format-catalog/tests/catalog.spec.ts +++ b/packages/session/session-format-catalog/tests/catalog.spec.ts @@ -25,7 +25,7 @@ describe('first-party Session format catalog', () => { header: { ...session.header, delegationDepth: 0 }, inheritedEventCount: 0, events: [...session.snapshotEvents() as unknown as SessionFormatEvent[], { type: 'image/offload', seq: 1, time: 0, data: { targets: [{ seq: 0, imageIndexes: [0] }] } }], } - expect(() => validateInstalledCurrentSessionArtifact(artifact)).toThrow(/image index 0 does not exist/) + expect(() => { validateInstalledCurrentSessionArtifact(artifact) }).toThrow(/image index 0 does not exist/) }) it('statically owns the complete adjacent v0 to v3 chain', () => { const header = {