fix(protocol): allow future agent capability flags

This commit is contained in:
Mohamed Boudra
2026-06-11 12:40:07 +07:00
parent a682476d11
commit f639c4cba6
4 changed files with 31 additions and 14 deletions
+2
View File
@@ -131,8 +131,10 @@ export interface AgentFeatureSelect {
export type AgentFeature = AgentFeatureToggle | AgentFeatureSelect; export type AgentFeature = AgentFeatureToggle | AgentFeatureSelect;
export interface AgentCapabilityFlags { export interface AgentCapabilityFlags {
[capability: string]: boolean | undefined;
supportsStreaming: boolean; supportsStreaming: boolean;
supportsSessionPersistence: boolean; supportsSessionPersistence: boolean;
supportsSessionListing?: boolean;
supportsDynamicModes: boolean; supportsDynamicModes: boolean;
supportsMcpServers: boolean; supportsMcpServers: boolean;
supportsReasoningStream: boolean; supportsReasoningStream: boolean;
+17 -14
View File
@@ -237,20 +237,23 @@ export const ProviderSnapshotEntrySchema = z.object({
defaultModeId: z.string().nullable().optional(), defaultModeId: z.string().nullable().optional(),
}); });
const AgentCapabilityFlagsSchema: z.ZodType<AgentCapabilityFlags> = z.object({ const AgentCapabilityFlagsSchema: z.ZodType<AgentCapabilityFlags> = z
supportsStreaming: z.boolean(), .object({
supportsSessionPersistence: z.boolean(), supportsStreaming: z.boolean(),
supportsDynamicModes: z.boolean(), supportsSessionPersistence: z.boolean(),
supportsMcpServers: z.boolean(), supportsSessionListing: z.boolean().optional(),
supportsReasoningStream: z.boolean(), supportsDynamicModes: z.boolean(),
supportsToolInvocations: z.boolean(), supportsMcpServers: z.boolean(),
// COMPAT(rewind): added in v0.1.X, drop when floor >= v0.1.X. supportsReasoningStream: z.boolean(),
supportsRewindConversation: z.boolean().optional().default(false), supportsToolInvocations: z.boolean(),
// COMPAT(rewind): added in v0.1.X, drop when floor >= v0.1.X. // COMPAT(rewind): added in v0.1.X, drop when floor >= v0.1.X.
supportsRewindFiles: z.boolean().optional().default(false), supportsRewindConversation: z.boolean().optional().default(false),
// COMPAT(rewind): added in v0.1.X, drop when floor >= v0.1.X. // COMPAT(rewind): added in v0.1.X, drop when floor >= v0.1.X.
supportsRewindBoth: z.boolean().optional().default(false), supportsRewindFiles: z.boolean().optional().default(false),
}); // COMPAT(rewind): added in v0.1.X, drop when floor >= v0.1.X.
supportsRewindBoth: z.boolean().optional().default(false),
})
.catchall(z.boolean());
const AgentUsageSchema: z.ZodType<AgentUsage> = z.object({ const AgentUsageSchema: z.ZodType<AgentUsage> = z.object({
inputTokens: z.number().optional(), inputTokens: z.number().optional(),
@@ -160,6 +160,7 @@ export interface AgentFeatureSelect {
export type AgentFeature = AgentFeatureToggle | AgentFeatureSelect; export type AgentFeature = AgentFeatureToggle | AgentFeatureSelect;
export interface AgentCapabilityFlags { export interface AgentCapabilityFlags {
[capability: string]: boolean | undefined;
supportsStreaming: boolean; supportsStreaming: boolean;
supportsSessionPersistence: boolean; supportsSessionPersistence: boolean;
supportsSessionListing?: boolean; supportsSessionListing?: boolean;
@@ -3306,6 +3306,16 @@ describe("agent snapshot MCP serialization", () => {
provider: "codex", provider: "codex",
sessionId: "session-full", sessionId: "session-full",
}, },
capabilities: {
supportsStreaming: false,
supportsSessionPersistence: false,
supportsSessionListing: true,
supportsDynamicModes: false,
supportsMcpServers: true,
supportsReasoningStream: false,
supportsToolInvocations: true,
supportsNewProviderCapability: true,
},
}), }),
); );
@@ -3325,6 +3335,7 @@ describe("agent snapshot MCP serialization", () => {
`get_agent_status response failed AgentSnapshotPayloadSchema: ${JSON.stringify(parsed.error.issues, null, 2)}`, `get_agent_status response failed AgentSnapshotPayloadSchema: ${JSON.stringify(parsed.error.issues, null, 2)}`,
); );
} }
expectOutputSchemaAccepts(tool, response.structuredContent);
expect(response.structuredContent.status).toBe("idle"); expect(response.structuredContent.status).toBe("idle");
expect(snapshot).toEqual( expect(snapshot).toEqual(
expect.objectContaining({ expect.objectContaining({