perf(control-ui): coalesce chat metadata startup

Add a coalesced chat.metadata Gateway method so the Control UI can fetch model and command metadata without blocking a clean first message path. Reuses existing models/commands builders, keeps compatibility fallback for older gateways, updates protocol artifacts, and adds focused gateway/UI/e2e coverage.
This commit is contained in:
Vincent Koc
2026-06-02 22:34:54 -07:00
committed by GitHub
parent 2a512025ad
commit c0b05a2100
21 changed files with 708 additions and 321 deletions

View File

@@ -5,6 +5,7 @@ import {
formatValidationErrors,
validateChatAbortParams,
validateChatHistoryParams,
validateChatMetadataParams,
validateChatSendParams,
validateChatEvent,
validateCommandsListParams,
@@ -104,6 +105,13 @@ describe("lazy protocol validators", () => {
).toBe(true);
});
it("accepts selected-agent scope on chat metadata params", () => {
expect(validateChatMetadataParams({})).toBe(true);
expect(validateChatMetadataParams({ agentId: "work" })).toBe(true);
expect(validateChatMetadataParams({ agentId: "" })).toBe(false);
expect(validateChatMetadataParams({ agentId: "work", view: "configured" })).toBe(false);
});
it("can still compile every exported protocol validator", () => {
const failures: string[] = [];
const validators: Array<[string, ProtocolValidator]> = [];

View File

@@ -126,6 +126,8 @@ import {
type ChatEvent,
ChatEventSchema,
ChatHistoryParamsSchema,
type ChatMetadataParams,
ChatMetadataParamsSchema,
ChatMessageGetResultSchema,
ChatMessageGetParamsSchema,
type ChatInjectParams,
@@ -846,6 +848,7 @@ export const validateExecApprovalsNodeSetParams = lazyCompile<ExecApprovalsNodeS
);
export const validateLogsTailParams = lazyCompile<LogsTailParams>(LogsTailParamsSchema);
export const validateChatHistoryParams = lazyCompile(ChatHistoryParamsSchema);
export const validateChatMetadataParams = lazyCompile<ChatMetadataParams>(ChatMetadataParamsSchema);
export const validateChatMessageGetParams = lazyCompile(ChatMessageGetParamsSchema);
export const validateChatSendParams = lazyCompile(ChatSendParamsSchema);
export const validateChatAbortParams = lazyCompile<ChatAbortParams>(ChatAbortParamsSchema);
@@ -1115,6 +1118,7 @@ export {
ExecApprovalRequestParamsSchema,
ExecApprovalResolveParamsSchema,
ChatHistoryParamsSchema,
ChatMetadataParamsSchema,
ChatSendParamsSchema,
ChatInjectParamsSchema,
UpdateRunParamsSchema,
@@ -1223,6 +1227,7 @@ export type {
ArtifactsDownloadResult,
AgentsListParams,
AgentsListResult,
ChatMetadataParams,
CommandsListParams,
CommandsListResult,
CommandEntry,

View File

@@ -34,6 +34,13 @@ export const ChatHistoryParamsSchema = Type.Object(
{ additionalProperties: false },
);
export const ChatMetadataParamsSchema = Type.Object(
{
agentId: Type.Optional(NonEmptyString),
},
{ additionalProperties: false },
);
export const ChatMessageGetParamsSchema = Type.Object(
{
sessionKey: NonEmptyString,

View File

@@ -191,6 +191,7 @@ import {
ChatEventSchema,
ChatFinalEventSchema,
ChatHistoryParamsSchema,
ChatMetadataParamsSchema,
ChatMessageGetParamsSchema,
ChatMessageGetResultSchema,
ChatInjectParamsSchema,
@@ -534,6 +535,7 @@ export const ProtocolSchemas = {
DevicePairRequestedEvent: DevicePairRequestedEventSchema,
DevicePairResolvedEvent: DevicePairResolvedEventSchema,
ChatHistoryParams: ChatHistoryParamsSchema,
ChatMetadataParams: ChatMetadataParamsSchema,
ChatMessageGetParams: ChatMessageGetParamsSchema,
ChatMessageGetResult: ChatMessageGetResultSchema,
ChatSendParams: ChatSendParamsSchema,

View File

@@ -160,6 +160,7 @@ export type AgentsListResult = SchemaType<"AgentsListResult">;
export type ModelChoice = SchemaType<"ModelChoice">;
export type ModelsListParams = SchemaType<"ModelsListParams">;
export type ModelsListResult = SchemaType<"ModelsListResult">;
export type ChatMetadataParams = SchemaType<"ChatMetadataParams">;
export type CommandEntry = SchemaType<"CommandEntry">;
export type CommandsListParams = SchemaType<"CommandsListParams">;
export type CommandsListResult = SchemaType<"CommandsListResult">;