feat: single-source projection keys via domain ./client/types pure outlets

This commit is contained in:
imccyu
2026-07-27 22:15:35 +08:00
parent f42943a14c
commit 75ea589976
7 changed files with 73 additions and 22 deletions

View File

@@ -17,6 +17,12 @@ import type {
} from '@deepseek-ai/dsh-session'
// Type-only: resolves ctx.sessionProjections for the optional unit child.
import type {} from '@deepseek-ai/dsh-session-projection'
// The `title` projection-key declaration lives in the client outlet (its one
// home). A PLAIN side-effect import, not `import type`: declaration emit
// elides type-only imports, and the aggregate programs resolve this package
// through its emitted declarations — the merge must survive in index.d.ts.
// The imported module is types-only, so the runtime edge is an empty module.
import './client/types.ts'
import { fallbackSessionTitle, normalizeSessionTitle } from './normalize.ts'
export { fallbackSessionTitle, normalizeSessionTitle, truncateTitleUtf8 } from './normalize.ts'
@@ -103,17 +109,6 @@ declare module '@deepseek-ai/dsh-session' {
}
}
declare module '@deepseek-ai/dsh-session-projection/types' {
interface SessionProjectionMap {
/**
* The session's current normalized title — the latest `session/title`
* event's text (last-wins), or `null` before the first title lands. A
* plain string: the shape the client list rows consume.
*/
title: string | null
}
}
/** Per-session settlement tails for title-capability out-of-band writes. */
const SESSION_TITLE_WRITE_TAILS = new WeakMap<Session, Promise<void>>()