diff --git a/packages/mcp-manager/src/types.ts b/packages/mcp-manager/src/types.ts index 8d142d8..84571c7 100644 --- a/packages/mcp-manager/src/types.ts +++ b/packages/mcp-manager/src/types.ts @@ -33,6 +33,12 @@ export interface McpRuntimeCapabilitiesSnapshot { readonly subscriptions: boolean; } +/** + * Normalized immutable projection of one managed runtime's lifecycle state. + * + * Optional properties are absent rather than present with an `undefined` value. + * The snapshot and its nested capability projection are frozen. + */ export interface McpRuntimeStateSnapshot { readonly phase: McpRuntimePhase; readonly lastTransitionAt: string; diff --git a/packages/mcp-manager/tests/runtime-manager.test.ts b/packages/mcp-manager/tests/runtime-manager.test.ts index c1d4bff..9062af4 100644 --- a/packages/mcp-manager/tests/runtime-manager.test.ts +++ b/packages/mcp-manager/tests/runtime-manager.test.ts @@ -466,6 +466,12 @@ describe("McpRuntimeManager", () => { expect(mcpRuntimeStateSnapshotSchema["~standard"].validate(offline)).toEqual({ value: offline, }); + + for (const state of [online, untracked, degraded, offline]) { + expect(Object.isFrozen(state)).toBe(true); + expect(Object.values(state)).not.toContain(undefined); + } + expect(Object.isFrozen(online.capabilities)).toBe(true); await manager.close(); });