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.


Open this chapter inside the full course