Skip to content

Commit 37bbb2f

Browse files
Claudehotlong
andauthored
fix: Access kernel services dynamically to fix AI metadata visibility
**Root Cause:** Protocol callback captured PluginContext during ObjectQLPlugin.init(), but MetadataPlugin registers its service AFTER ObjectQLPlugin. This meant ctx.getServices() returned a snapshot without the metadata service, causing agents/tools to be invisible in Studio sidebar. **Fix:** Changed protocol initialization to access kernel.context.getServices() dynamically at request time instead of capturing ctx.getServices() during init. This ensures the protocol always accesses the live services registry with all registered services including MetadataService. **Changes:** - ObjectQLPlugin: Use ctx.getKernel() to get kernel reference, access services via kernel.context - Protocol: Removed diagnostic logging (no longer needed) - AIServicePlugin: Removed diagnostic logging - MetadataPlugin: Removed diagnostic logging **Verified:** - Protocol now accesses services dynamically at runtime - MetadataService is accessible even though it registers after ObjectQLPlugin - Agents and tools should now be visible in Studio sidebar on Vercel Agent-Logs-Url: https://github.com/objectstack-ai/framework/sessions/8252cffa-ca7f-44e7-9646-e56ed9b05e6a Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 770fb91 commit 37bbb2f

File tree

4 files changed

+10
-21
lines changed

4 files changed

+10
-21
lines changed

packages/metadata/src/plugin.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export class MetadataPlugin implements Plugin {
4646

4747
// Register Metadata Manager as the primary metadata service provider.
4848
ctx.registerService('metadata', this.manager);
49-
console.log('[MetadataPlugin] Registered metadata service, has getRegisteredTypes:', typeof this.manager.getRegisteredTypes);
5049

5150
// Register metadata system objects via the manifest service (if available).
5251
// MetadataPlugin may init before ObjectQLPlugin, so wrap in try/catch.

packages/objectql/src/plugin.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,16 @@ export class ObjectQLPlugin implements Plugin {
7272
});
7373

7474
// Register Protocol Implementation
75+
// IMPORTANT: Use getKernel() to access services dynamically.
76+
// ctx.getServices() returns a snapshot at call time, but we need
77+
// live access to services that are registered after this plugin's init().
78+
// MetadataPlugin and AIServicePlugin register after ObjectQLPlugin,
79+
// so we must access kernel.context.getServices() at request time.
80+
const kernel = ctx.getKernel();
7581
const protocolShim = new ObjectStackProtocolImplementation(
7682
this.ql,
77-
() => ctx.getServices ? ctx.getServices() : new Map(),
78-
() => ctx.getServices()?.get('feed') as any
83+
() => kernel.context?.getServices() ?? new Map(),
84+
() => kernel.context?.getService('feed') as any
7985
);
8086

8187
ctx.registerService('protocol', protocolShim);

packages/objectql/src/protocol.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -186,20 +186,15 @@ export class ObjectStackProtocolImplementation implements ObjectStackProtocol {
186186
let runtimeTypes: string[] = [];
187187
try {
188188
const services = this.getServicesRegistry?.();
189-
console.log('[Protocol] getMetaTypes - services registry available:', !!services, 'size:', services?.size);
190189
const metadataService = services?.get('metadata');
191-
console.log('[Protocol] getMetaTypes - metadata service available:', !!metadataService, 'has getRegisteredTypes:', typeof metadataService?.getRegisteredTypes);
192190
if (metadataService && typeof metadataService.getRegisteredTypes === 'function') {
193191
runtimeTypes = await metadataService.getRegisteredTypes();
194-
console.log('[Protocol] getMetaTypes - runtime types from metadata service:', runtimeTypes);
195192
}
196-
} catch (err) {
193+
} catch {
197194
// MetadataService not available
198-
console.warn('[Protocol] getMetaTypes - error accessing metadata service:', err);
199195
}
200196

201197
const allTypes = Array.from(new Set([...schemaTypes, ...runtimeTypes]));
202-
console.log('[Protocol] getMetaTypes - final types:', allTypes);
203198
return { types: allTypes };
204199
}
205200

@@ -253,12 +248,9 @@ export class ObjectStackProtocolImplementation implements ObjectStackProtocol {
253248
// Merge with MetadataService (runtime-registered items: agents, tools, etc.)
254249
try {
255250
const services = this.getServicesRegistry?.();
256-
console.log('[Protocol] getMetaItems - type:', request.type, 'services available:', !!services, 'size:', services?.size);
257251
const metadataService = services?.get('metadata');
258-
console.log('[Protocol] getMetaItems - metadata service available:', !!metadataService, 'has list:', typeof metadataService?.list);
259252
if (metadataService && typeof metadataService.list === 'function') {
260253
const runtimeItems = await metadataService.list(request.type);
261-
console.log('[Protocol] getMetaItems - runtime items from metadata service:', runtimeItems?.length, 'items');
262254
if (runtimeItems && runtimeItems.length > 0) {
263255
// Merge, avoiding duplicates by name
264256
const itemMap = new Map<string, any>();
@@ -275,12 +267,10 @@ export class ObjectStackProtocolImplementation implements ObjectStackProtocol {
275267
}
276268
}
277269
items = Array.from(itemMap.values());
278-
console.log('[Protocol] getMetaItems - merged items count:', items.length);
279270
}
280271
}
281-
} catch (err) {
272+
} catch {
282273
// MetadataService not available or doesn't support this type
283-
console.warn('[Protocol] getMetaItems - error accessing metadata service:', err);
284274
}
285275

286276
return {

packages/services/service-ai/src/plugin.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,7 @@ export class AIServicePlugin implements Plugin {
250250
let metadataService: IMetadataService | undefined;
251251
try {
252252
metadataService = ctx.getService<IMetadataService>('metadata');
253-
console.log('[AI Plugin] Retrieved metadata service:', !!metadataService, 'has getRegisteredTypes:', typeof (metadataService as any)?.getRegisteredTypes);
254253
} catch (e: any) {
255-
console.log('[AI] Metadata service not available:', e.message);
256254
ctx.logger.debug('[AI] Metadata service not available');
257255
}
258256

@@ -289,10 +287,8 @@ export class AIServicePlugin implements Plugin {
289287

290288
if (!agentExists) {
291289
await metadataService.register('agent', DATA_CHAT_AGENT.name, DATA_CHAT_AGENT);
292-
console.log('[AI] Registered data_chat agent to metadataService');
293290
ctx.logger.info('[AI] data_chat agent registered');
294291
} else {
295-
console.log('[AI] data_chat agent already exists, skipping');
296292
ctx.logger.debug('[AI] data_chat agent already exists, skipping auto-registration');
297293
}
298294
} catch (err) {
@@ -333,10 +329,8 @@ export class AIServicePlugin implements Plugin {
333329

334330
if (!agentExists) {
335331
await metadataService.register('agent', METADATA_ASSISTANT_AGENT.name, METADATA_ASSISTANT_AGENT);
336-
console.log('[AI] Registered metadata_assistant agent to metadataService');
337332
ctx.logger.info('[AI] metadata_assistant agent registered');
338333
} else {
339-
console.log('[AI] metadata_assistant agent already exists, skipping');
340334
ctx.logger.debug('[AI] metadata_assistant agent already exists, skipping auto-registration');
341335
}
342336
} catch (err) {

0 commit comments

Comments
 (0)