Advanced TypeScript for Harness Builders
13. Declaration Merging & Module Augmentation
Extend third-party interfaces without forking them — the plugin pattern done right.
Extend interfaces from external packages without modifying their source code.
Extensible interface (the hook):
File: packages/agent/src/types.ts L236-238
export interface CustomAgentMessages {
// Empty by default - apps extend via declaration merging
}
Consumer augmentation (the extension):
File: packages/coding-agent/src/core/messages.ts L70-77
declare module "@mariozechner/pi-agent-core" {
interface CustomAgentMessages {
bashExecution: BashExecutionMessage;
custom: CustomMessage;
branchSummary: BranchSummaryMessage;
compactionSummary: CompactionSummaryMessage;
}
}
After this augmentation, AgentMessage (which is Message | CustomAgentMessages[keyof CustomAgentMessages]) automatically includes all four new message types, with full type safety in switch statements.