# Self-declared harness contracts El plugin necesita `PreToolDecision`, `ToolExecution`, el seam de settings y, desde el ruteo de aprobaciones de subagentes, también el seam de aprobación (`ApprovalService`/`ApprovalOutcome`), el seam del registro de agentes (`AgentsService`) y vistas mínimas de `Agent`/`Session`/`SessionHeader`. Decidimos **auto-declarar espejos mínimos en `src/contracts.ts`** en vez de importar `@deepseek-ai/dsh-tools` / `@deepseek-ai/dsh-settings` / `@deepseek-ai/dsh-user-approval` / `@deepseek-ai/dsh-agent` / `@deepseek-ai/dsh-session`, porque esos paquetes no instalan limpio desde npm (la dependencia transitiva `@deepseek-ai/dsh-type-meta` no está publicada) y el plugin solo necesita unos pocos tipos y métodos en runtime. ## Considered Options - **Importar los paquetes del harness.** Tipos exactos, pero arrastran un árbol de peer-dependencies del monorepo del harness y falla la instalación por `@deepseek-ai/dsh-type-meta` no publicado. Rechazada. - **Auto-declarar espejos mínimos.** Solo lo que se usa, instalación limpia, a cambio del riesgo de desincronización con el contrato real (mitigado centralizándolo en un solo archivo y documentándolo aquí). Elegida. Los espejos se describen como vistas estructurales mínimas (`ApprovalAgent`, `ApprovalSession`, `ApprovalSessionHeader`, `ApprovalService`, `AgentsService`) compatibles estructuralmente con los objetos reales que el harness entrega en `tools/pre-execute` y en `ctx.get("approval")`/`ctx.get("agents")`; el plugin solo lee de ellos lo que necesita y el resto del contrato queda fuera de la superficie auto-declarada.