Add assertNever with closed-vs-extensible exhaustiveness guidance

assertNever (dsh-llm) marks unreachable defaults on CLOSED unions:
adding a StreamChunk variant now breaks compilation at
BlockAssembler.push, and a value escaping its type at runtime throws
with diagnostics. The module doc and a new AGENTS.md convention spell
out the dividing line: merge-extensible unions (SessionEventMap,
ContentBlockMap, …) must NOT use assertNever — plugin-added variants
are valid unknown values there; handle known cases and fall through
with a comment.
This commit is contained in:
Tianyi Cui
2026-06-11 15:21:25 +08:00
parent 225ed051b1
commit 370b5d3aab
5 changed files with 60 additions and 0 deletions
+2
View File
@@ -6,6 +6,7 @@
*/
import { CallId } from './brand.ts'
import { assertNever } from './never.ts'
import type { ContentBlock, FinishReason, GenerateResult, Message, StreamChunk, TokenUsage } from './types.ts'
interface PartialBlock {
@@ -82,6 +83,7 @@ export class BlockAssembler {
this._finish = chunk.reason
return
}
default: return assertNever(chunk, 'BlockAssembler.push')
}
}