@@ -9,8 +9,9 @@ import { buildAgentRoutes } from './routes/agent-routes.js';
99import { ObjectQLConversationService } from './conversation/objectql-conversation-service.js' ;
1010import { AiConversationObject , AiMessageObject } from './objects/index.js' ;
1111import { registerDataTools } from './tools/data-tools.js' ;
12+ import { registerMetadataTools } from './tools/metadata-tools.js' ;
1213import { AgentRuntime } from './agent-runtime.js' ;
13- import { DATA_CHAT_AGENT } from './agents/index.js' ;
14+ import { DATA_CHAT_AGENT , METADATA_ASSISTANT_AGENT } from './agents/index.js' ;
1415
1516/**
1617 * Configuration options for the AIServicePlugin.
@@ -141,10 +142,17 @@ export class AIServicePlugin implements Plugin {
141142 async start ( ctx : PluginContext ) : Promise < void > {
142143 if ( ! this . service ) return ;
143144
144- // ── Auto-register built-in data tools if data engine + metadata are available ──
145+ // ── Auto-register built-in tools & agents when services are available ──
146+ let metadataService : IMetadataService | undefined ;
147+ try {
148+ metadataService = ctx . getService < IMetadataService > ( 'metadata' ) ;
149+ } catch {
150+ // Metadata service not available — skip
151+ }
152+
153+ // Data tools require both data engine and metadata service
145154 try {
146155 const dataEngine = ctx . getService < IDataEngine > ( 'data' ) ;
147- const metadataService = ctx . getService < IMetadataService > ( 'metadata' ) ;
148156 if ( dataEngine && metadataService ) {
149157 registerDataTools ( this . service . toolRegistry , { dataEngine, metadataService } ) ;
150158 ctx . logger . info ( '[AI] Built-in data tools registered' ) ;
@@ -163,8 +171,30 @@ export class AIServicePlugin implements Plugin {
163171 }
164172 }
165173 } catch {
166- // Data engine or metadata service not available — skip data tools
167- ctx . logger . debug ( '[AI] Data engine or metadata service not available, skipping data tools' ) ;
174+ ctx . logger . debug ( '[AI] Data engine not available, skipping data tools' ) ;
175+ }
176+
177+ // Metadata tools require only the metadata service
178+ if ( metadataService ) {
179+ try {
180+ registerMetadataTools ( this . service . toolRegistry , { metadataService } ) ;
181+ ctx . logger . info ( '[AI] Built-in metadata tools registered' ) ;
182+
183+ // Register the built-in metadata_assistant agent
184+ const agentExists =
185+ typeof metadataService . exists === 'function'
186+ ? await metadataService . exists ( 'agent' , METADATA_ASSISTANT_AGENT . name )
187+ : false ;
188+
189+ if ( ! agentExists ) {
190+ await metadataService . register ( 'agent' , METADATA_ASSISTANT_AGENT . name , METADATA_ASSISTANT_AGENT ) ;
191+ ctx . logger . info ( '[AI] metadata_assistant agent registered' ) ;
192+ } else {
193+ ctx . logger . debug ( '[AI] metadata_assistant agent already exists, skipping auto-registration' ) ;
194+ }
195+ } catch ( err ) {
196+ ctx . logger . debug ( '[AI] Failed to register metadata tools' , err instanceof Error ? err : undefined ) ;
197+ }
168198 }
169199
170200 // Trigger hook to notify AI service is ready — other plugins can register tools
0 commit comments