55 * 2.0.
66 */
77
8+ import type { MaybePromise } from '@kbn/utility-types' ;
89import type { KibanaRequest } from '@kbn/core-http-server' ;
910import { createAgentNotFoundError , createBadRequestError } from '@kbn/onechat-common' ;
1011import type { AgentDefinition } from '@kbn/onechat-common/agents' ;
1112import { validateAgentId } from '@kbn/onechat-common/agents' ;
13+ import type { AgentAvailabilityContext , AgentAvailabilityResult } from '@kbn/onechat-server/agents' ;
14+ import type { UiSettingsServiceStart } from '@kbn/core-ui-settings-server' ;
15+ import type { SavedObjectsServiceStart } from '@kbn/core-saved-objects-server' ;
1216import type {
1317 AgentCreateRequest ,
1418 AgentListOptions ,
@@ -18,8 +22,14 @@ import type {
1822import type { WritableAgentProvider , ReadonlyAgentProvider } from './agent_source' ;
1923import { isReadonlyProvider } from './agent_source' ;
2024
21- // for now it's the same
22- export type InternalAgentDefinition = AgentDefinition ;
25+ // internal definition for our agents
26+ export type InternalAgentDefinition = AgentDefinition & {
27+ isAvailable : InternalAgentDefinitionAvailabilityHandler ;
28+ } ;
29+
30+ export type InternalAgentDefinitionAvailabilityHandler = (
31+ ctx : AgentAvailabilityContext
32+ ) => MaybePromise < AgentAvailabilityResult > ;
2333
2434export interface AgentRegistry {
2535 has ( agentId : string ) : Promise < boolean > ;
@@ -32,22 +42,39 @@ export interface AgentRegistry {
3242
3343interface CreateAgentRegistryOpts {
3444 request : KibanaRequest ;
35- space : string ;
45+ spaceId : string ;
3646 persistedProvider : WritableAgentProvider ;
3747 builtinProvider : ReadonlyAgentProvider ;
48+ uiSettings : UiSettingsServiceStart ;
49+ savedObjects : SavedObjectsServiceStart ;
3850}
3951
4052export const createAgentRegistry = ( opts : CreateAgentRegistryOpts ) : AgentRegistry => {
4153 return new AgentRegistryImpl ( opts ) ;
4254} ;
4355
4456class AgentRegistryImpl implements AgentRegistry {
57+ private readonly request : KibanaRequest ;
58+ private readonly spaceId : string ;
4559 private readonly persistedProvider : WritableAgentProvider ;
4660 private readonly builtinProvider : ReadonlyAgentProvider ;
47-
48- constructor ( { persistedProvider, builtinProvider } : CreateAgentRegistryOpts ) {
61+ private readonly uiSettings : UiSettingsServiceStart ;
62+ private readonly savedObjects : SavedObjectsServiceStart ;
63+
64+ constructor ( {
65+ request,
66+ spaceId,
67+ persistedProvider,
68+ builtinProvider,
69+ uiSettings,
70+ savedObjects,
71+ } : CreateAgentRegistryOpts ) {
72+ this . request = request ;
73+ this . spaceId = spaceId ;
4974 this . persistedProvider = persistedProvider ;
5075 this . builtinProvider = builtinProvider ;
76+ this . uiSettings = uiSettings ;
77+ this . savedObjects = savedObjects ;
5178 }
5279
5380 private get orderedProviders ( ) {
@@ -66,7 +93,11 @@ class AgentRegistryImpl implements AgentRegistry {
6693 async get ( agentId : string ) : Promise < InternalAgentDefinition > {
6794 for ( const provider of this . orderedProviders ) {
6895 if ( await provider . has ( agentId ) ) {
69- return provider . get ( agentId ) ;
96+ const agent = await provider . get ( agentId ) ;
97+ if ( ! ( await this . isAvailable ( agent ) ) ) {
98+ throw createBadRequestError ( `Agent ${ agentId } is not available` ) ;
99+ }
100+ return agent ;
70101 }
71102 }
72103 throw createAgentNotFoundError ( { agentId } ) ;
@@ -76,7 +107,11 @@ class AgentRegistryImpl implements AgentRegistry {
76107 const allAgents : InternalAgentDefinition [ ] = [ ] ;
77108 for ( const provider of this . orderedProviders ) {
78109 const providerAgents = await provider . list ( opts ) ;
79- allAgents . push ( ...providerAgents ) ;
110+ for ( const agent of providerAgents ) {
111+ if ( await this . isAvailable ( agent ) ) {
112+ allAgents . push ( agent ) ;
113+ }
114+ }
80115 }
81116 return allAgents ;
82117 }
@@ -121,4 +156,18 @@ class AgentRegistryImpl implements AgentRegistry {
121156 }
122157 throw createAgentNotFoundError ( { agentId } ) ;
123158 }
159+
160+ private async isAvailable ( agent : InternalAgentDefinition ) : Promise < boolean > {
161+ const soClient = this . savedObjects . getScopedClient ( this . request ) ;
162+ const uiSettingsClient = this . uiSettings . asScopedToClient ( soClient ) ;
163+
164+ const context : AgentAvailabilityContext = {
165+ spaceId : this . spaceId ,
166+ request : this . request ,
167+ uiSettings : uiSettingsClient ,
168+ } ;
169+
170+ const status = await agent . isAvailable ( context ) ;
171+ return status . status === 'available' ;
172+ }
124173}
0 commit comments