632
633
registerProvider(provider: IAgent): void {
635
throw new Error(`Agent provider already registered: ${provider.id}`);
636
}
637
>
this._logService.info(`Registering agent provider: ${provider.id}`);
agentService.ts
638
>
this._providers.set(provider.id, provider);
639
>
provider.setServerToolHost?.(this._serverToolHost);
640
>
// Deterministic subagent membership ordering: apply a spawned subagent's
641
>
// catalog membership (via the spawn-channel handlers) BEFORE
642
>
// AgentSideEffects — registered next — handles the same signal and starts
643
>
// a turn on the subagent chat, which requires that chat to already exist.
644
>
// Registering this listener ahead of the side-effects listener makes the
645
>
// ordering independent of when the agent registers its own subagent->spawn
646
>
// bridge; addChat/removeChat are idempotent, so the overlap is safe.
647
>
this._providerSubscriptions.add(provider.onDidSessionProgress(signal => this._sequenceSpawnedChat(signal)));
648
>
this._providerSubscriptions.add(this._sideEffects.registerProgressListener(provider));
649
>
if (provider.onDidMaterializeSession) {
650
this._providerSubscriptions.add(provider.onDidMaterializeSession(e => this._onDidMaterializeSession(e)));
651
}
653
this._providerSubscriptions.add(provider.onMcpNotification(e => this._onMcpNotification.fire(e)));
654
}
656
this._providerSubscriptions.add(provider.onDidChangeChatData(e => this._onChatDataChanged(e)));
657
}
659
this._providerSubscriptions.add(provider.onDidSpawnChat(e => this._onChatSpawned(e)));
660
}
662
>
if (!this._defaultProvider) {
663
>
this._defaultProvider = provider.id;
664
>
}
665
>
666
>
// Update root state with current agents list
667
>
this._updateAgents();
668
>
}
669
670
private _registerSkillCompletionProvider(): void {
672
return;
673
}
675
>
const provider = this._register(new AgentHostSkillCompletionProvider(
676
>
session => this._findProviderForSession(session),
677
>
));
678
>
this._register(this._completions.registerProvider(provider));
679
>
}
680
681
// ---- auth ---------------------------------------------------------------