@@ -43,6 +43,8 @@ import { resolveProviderIdForAuth } from "../../agents/provider-auth-aliases.js"
4343import type { AgentMessage } from "../../agents/runtime/index.js" ;
4444import { ensureSandboxWorkspaceForSession } from "../../agents/sandbox/context.js" ;
4545import { resolveAgentTimeoutMs } from "../../agents/timeout.js" ;
46+ import type { ModelCatalogEntry } from "../../agents/model-catalog.types.js" ;
47+ import { modelCatalogBrowseRequiresFullDiscovery } from "../../agents/model-catalog-browse.js" ;
4648import { dispatchInboundMessage } from "../../auto-reply/dispatch.js" ;
4749import { getReplyPayloadMetadata , type ReplyPayload } from "../../auto-reply/reply-payload.js" ;
4850import { createReplyDispatcher } from "../../auto-reply/reply/reply-dispatcher.js" ;
@@ -213,6 +215,11 @@ type PreRegisteredAgentRun = {
213215
214216type ChatHistoryMethod = "chat.history" | "chat.startup" ;
215217
218+ type ChatMetadataResult = {
219+ commands ?: unknown [ ] ;
220+ models ?: unknown [ ] ;
221+ } ;
222+
216223type ChatSendAckServerTiming = {
217224 receivedToAckMs : number ;
218225 loadSessionMs : number ;
@@ -324,31 +331,76 @@ async function handleChatMetadataRequest({
324331 return ;
325332 }
326333 try {
327- const [ { buildModelsListResult } , { buildCommandsListResult } ] = await Promise . all ( [
328- import ( "./models-list-result.js" ) ,
329- import ( "./commands-list-result.js" ) ,
330- ] ) ;
331- const [ models , commands ] = await Promise . all ( [
332- buildModelsListResult ( {
334+ respond (
335+ true ,
336+ await buildChatMetadataResult ( {
337+ cfg,
333338 context,
334339 agentId : requestedAgentId ,
335- params : { view : "configured" } ,
336340 } ) ,
337- Promise . resolve (
338- buildCommandsListResult ( {
339- cfg,
340- agentId : requestedAgentId ,
341- includeArgs : true ,
342- scope : "text" ,
343- } ) ,
344- ) ,
345- ] ) ;
346- respond ( true , { ...models , ...commands } ) ;
341+ ) ;
347342 } catch ( err ) {
348343 respond ( false , undefined , errorShape ( ErrorCodes . UNAVAILABLE , String ( err ) ) ) ;
349344 }
350345}
351346
347+ async function buildChatMetadataResult ( params : {
348+ cfg : OpenClawConfig ;
349+ context : GatewayRequestContext ;
350+ agentId : string ;
351+ preloadedModelCatalog ?: ModelCatalogEntry [ ] ;
352+ } ) : Promise < ChatMetadataResult > {
353+ const [ { buildModelsListResult } , { buildCommandsListResult } ] = await Promise . all ( [
354+ import ( "./models-list-result.js" ) ,
355+ import ( "./commands-list-result.js" ) ,
356+ ] ) ;
357+ const [ models , commands ] = await Promise . all ( [
358+ buildModelsListResult ( {
359+ context : params . context ,
360+ agentId : params . agentId ,
361+ params : { view : "configured" } ,
362+ preloadedCatalog : params . preloadedModelCatalog ,
363+ } ) ,
364+ Promise . resolve (
365+ buildCommandsListResult ( {
366+ cfg : params . cfg ,
367+ agentId : params . agentId ,
368+ includeArgs : true ,
369+ scope : "text" ,
370+ } ) ,
371+ ) ,
372+ ] ) ;
373+ return { ...models , ...commands } ;
374+ }
375+
376+ async function buildChatStartupMetadataResult ( params : {
377+ cfg : OpenClawConfig ;
378+ context : GatewayRequestContext ;
379+ agentId : string ;
380+ modelCatalog : ModelCatalogEntry [ ] | undefined ;
381+ } ) : Promise < ChatMetadataResult | undefined > {
382+ if ( ! params . modelCatalog ) {
383+ return undefined ;
384+ }
385+ if ( modelCatalogBrowseRequiresFullDiscovery ( { cfg : params . cfg , view : "configured" } ) ) {
386+ return undefined ;
387+ }
388+ try {
389+ const { buildModelsListResult } = await import ( "./models-list-result.js" ) ;
390+ return await buildModelsListResult ( {
391+ context : params . context ,
392+ agentId : params . agentId ,
393+ params : { view : "configured" } ,
394+ preloadedCatalog : params . modelCatalog ,
395+ } ) ;
396+ } catch ( err ) {
397+ params . context . logGateway . debug (
398+ `chat.startup continuing without metadata: ${ formatErrorMessage ( err ) } ` ,
399+ ) ;
400+ return undefined ;
401+ }
402+ }
403+
352404function normalizeUnknownText ( value : unknown ) : string | undefined {
353405 return typeof value === "string" ? normalizeOptionalText ( value ) : undefined ;
354406}
@@ -2380,9 +2432,11 @@ async function handleChatHistoryRequest({
23802432 context,
23812433 method,
23822434 includeAgentsList,
2435+ includeMetadata,
23832436} : GatewayRequestHandlerOptions & {
23842437 method : ChatHistoryMethod ;
23852438 includeAgentsList ?: boolean ;
2439+ includeMetadata ?: boolean ;
23862440} ) {
23872441 if ( ! validateChatHistoryParams ( params ) ) {
23882442 respond (
@@ -2510,6 +2564,15 @@ async function handleChatHistoryRequest({
25102564 ) ;
25112565 }
25122566 const modelCatalog = await modelCatalogPromise ;
2567+ const defaultAgentId = resolveDefaultAgentId ( cfg ) ;
2568+ const startupMetadata = includeMetadata
2569+ ? await buildChatStartupMetadataResult ( {
2570+ cfg,
2571+ context,
2572+ agentId : sessionAgentId ,
2573+ modelCatalog,
2574+ } )
2575+ : undefined ;
25132576 const sessionInfo = buildGatewaySessionInfo ( {
25142577 cfg,
25152578 storePath,
@@ -2519,7 +2582,6 @@ async function handleChatHistoryRequest({
25192582 agentId : selectedAgent . agentId ,
25202583 modelCatalog,
25212584 } ) ;
2522- const defaultAgentId = resolveDefaultAgentId ( cfg ) ;
25232585 const activeRunAgentId =
25242586 canonicalKey === "global" ? ( selectedAgent . agentId ?? defaultAgentId ) : selectedAgent . agentId ;
25252587 sessionInfo . hasActiveRun = hasTrackedActiveSessionRun ( {
@@ -2560,6 +2622,7 @@ async function handleChatHistoryRequest({
25602622 verboseLevel,
25612623 ...( boundedInFlightRun ? { inFlightRun : boundedInFlightRun } : { } ) ,
25622624 ...( includeAgentsList ? { agentsList : listAgentsForGateway ( cfg , modelCatalog ) } : { } ) ,
2625+ ...( startupMetadata ? { metadata : startupMetadata } : { } ) ,
25632626 } ;
25642627 respond ( true , payload ) ;
25652628}
@@ -2569,7 +2632,12 @@ export const chatHandlers: GatewayRequestHandlers = {
25692632 await handleChatHistoryRequest ( { ...opts , method : "chat.history" } ) ;
25702633 } ,
25712634 "chat.startup" : async ( opts ) => {
2572- await handleChatHistoryRequest ( { ...opts , method : "chat.startup" , includeAgentsList : true } ) ;
2635+ await handleChatHistoryRequest ( {
2636+ ...opts ,
2637+ method : "chat.startup" ,
2638+ includeAgentsList : true ,
2639+ includeMetadata : true ,
2640+ } ) ;
25732641 } ,
25742642 "chat.metadata" : handleChatMetadataRequest ,
25752643 "chat.message.get" : async ( { params, respond, context } ) => {
0 commit comments