Skip to content

Commit aaf66c1

Browse files
committed
Refactor ServerComponents into separate classes to that Telemetry SDK can startup before other OTEL instrumentations are loaded
1 parent eb75e98 commit aaf66c1

File tree

92 files changed

+929
-1221
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+929
-1221
lines changed

src/ai/CfnAI.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { BaseMessage } from '@langchain/core/messages';
22
import { StructuredTool } from '@langchain/core/tools';
33
import { DocumentManager } from '../document/DocumentManager';
4-
import { Closeable, Configurable, ServerComponents } from '../server/ServerComponents';
4+
import { CfnExternal } from '../server/CfnExternal';
5+
import { CfnInfraCore } from '../server/CfnInfraCore';
56
import { AwsClient } from '../services/AwsClient';
67
import { RelationshipSchemaService } from '../services/RelationshipSchemaService';
78
import { getFilteredScannedResources, formatScannedResourcesForAI } from '../services/ResourceScanService';
8-
import { ISettingsSubscriber } from '../settings/Settings';
9-
import { ClientMessage } from '../telemetry/ClientMessage';
9+
import { SettingsConfigurable, ISettingsSubscriber } from '../settings/ISettingsSubscriber';
1010
import { LoggerFactory } from '../telemetry/LoggerFactory';
11+
import { Closeable } from '../utils/Closeable';
1112
import { extractErrorMessage } from '../utils/Errors';
1213
import { toString } from '../utils/String';
1314
import { Agent } from './Agent';
@@ -17,18 +18,16 @@ import { Prompts } from './Prompts';
1718

1819
const logger = LoggerFactory.getLogger('CfnAI');
1920

20-
export class CfnAI implements Closeable, Configurable {
21+
export class CfnAI implements SettingsConfigurable, Closeable {
2122
private readonly llmConfig: LLMConfig;
2223
private agent?: Agent;
2324
private mcpTools?: McpTools;
2425

2526
constructor(
26-
components: ServerComponents,
27-
private readonly documentManager: DocumentManager = components.documentManager,
28-
private readonly clientMessage: ClientMessage = components.clientMessage,
29-
private readonly awsClient: AwsClient = components.awsClient,
27+
private readonly documentManager: DocumentManager,
28+
private readonly awsClient: AwsClient,
3029
) {
31-
this.llmConfig = LLMConfig.create(components);
30+
this.llmConfig = LLMConfig.create();
3231
}
3332

3433
configure(settingsManager: ISettingsSubscriber): void {
@@ -40,7 +39,7 @@ export class CfnAI implements Closeable, Configurable {
4039
const config = this.llmConfig.get();
4140
if (config !== undefined) {
4241
this.agent = Agent.create(config);
43-
this.mcpTools = new McpTools(this.clientMessage);
42+
this.mcpTools = new McpTools();
4443
}
4544
}
4645
}
@@ -162,7 +161,7 @@ export class CfnAI implements Closeable, Configurable {
162161
return this.mcpTools?.close();
163162
}
164163

165-
static create(components: ServerComponents): CfnAI {
166-
return new CfnAI(components);
164+
static create(core: CfnInfraCore, external: CfnExternal): CfnAI {
165+
return new CfnAI(core.documentManager, external.awsClient);
167166
}
168167
}

src/ai/McpTools.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
import { StructuredTool } from '@langchain/core/tools';
22
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
3-
import { Closeable, Configurable } from '../server/ServerComponents';
4-
import { DefaultSettings, ISettingsSubscriber, ProfileSettings, SettingsSubscription } from '../settings/Settings';
5-
import { ClientMessage } from '../telemetry/ClientMessage';
3+
import { SettingsConfigurable, ISettingsSubscriber, SettingsSubscription } from '../settings/ISettingsSubscriber';
4+
import { DefaultSettings, ProfileSettings } from '../settings/Settings';
65
import { LoggerFactory } from '../telemetry/LoggerFactory';
6+
import { Closeable } from '../utils/Closeable';
77
import { extractErrorMessage } from '../utils/Errors';
88

99
const logger = LoggerFactory.getLogger('McpTools');
1010

11-
export class McpTools implements Configurable, Closeable {
11+
export class McpTools implements SettingsConfigurable, Closeable {
1212
private mcpClient?: MultiServerMCPClient;
1313
private settingsSubscription?: SettingsSubscription;
1414
private initializationPromise?: Promise<void>;
1515
private pendingSettingsChange = false;
1616

17-
constructor(
18-
private readonly clientMessage: ClientMessage,
19-
private profile: ProfileSettings = DefaultSettings.profile,
20-
) {
17+
constructor(private profile: ProfileSettings = DefaultSettings.profile) {
2118
void this.initializeMCP();
2219
}
2320

src/ai/llm/LLMConfig.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { readFileSync, existsSync } from 'fs';
22
import { homedir } from 'os';
33
import { join } from 'path';
44
import { DeepReadonly } from 'ts-essentials';
5-
import { ServerComponents } from '../../server/ServerComponents';
65
import { LoggerFactory } from '../../telemetry/LoggerFactory';
76
import { extractErrorMessage } from '../../utils/Errors';
87
import { parseWithPrettyError } from '../../utils/ZodErrorWrapper';
@@ -36,7 +35,7 @@ export class LLMConfig {
3635
return this.config === undefined ? undefined : structuredClone(this.config);
3736
}
3837

39-
static create(_components: ServerComponents) {
38+
static create() {
4039
return new LLMConfig();
4140
}
4241
}

src/app/standalone.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ import { createConnection, InitializeParams, ProposedFeatures } from 'vscode-lan
22
import { InitializedParams } from 'vscode-languageserver-protocol';
33
import { LspCapabilities } from '../protocol/LspCapabilities';
44
import { LspConnection } from '../protocol/LspConnection';
5+
import { CfnInfraCore } from '../server/CfnInfraCore';
56
import { CfnServer } from '../server/CfnServer';
6-
import { LoggerFactory } from '../telemetry/LoggerFactory';
7-
import { TelemetryService } from '../telemetry/TelemetryService';
87

98
let server: CfnServer | undefined;
109

1110
function onInitialize(params: InitializeParams) {
12-
server = new CfnServer(lsp.features, params);
11+
server = new CfnServer(lsp.components, new CfnInfraCore(lsp.components, params));
1312
return LspCapabilities;
1413
}
1514

@@ -23,10 +22,6 @@ function onShutdown() {
2322

2423
function onExit() {}
2524

26-
// Startup telemetry and loggers before LSP creation
27-
const _logger = LoggerFactory.instance; // eslint-disable-line @typescript-eslint/no-unused-vars
28-
const _telemetry = TelemetryService.instance; // eslint-disable-line @typescript-eslint/no-unused-vars
29-
3025
const lsp = new LspConnection(createConnection(ProposedFeatures.all), {
3126
onInitialize,
3227
onInitialized,

src/auth/AwsCredentials.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { AwsCredentialIdentity } from '@aws-sdk/types';
22
import { DeepReadonly } from 'ts-essentials';
33
import { MessageType } from 'vscode-languageserver-protocol/lib/common/protocol';
44
import { LspAuthHandlers } from '../protocol/LspAuthHandlers';
5-
import { ServerComponents } from '../server/ServerComponents';
65
import { DefaultSettings } from '../settings/Settings';
76
import { SettingsManager } from '../settings/SettingsManager';
87
import { parseProfile } from '../settings/SettingsParser';
@@ -46,7 +45,9 @@ export class AwsCredentials {
4645
private readonly awsHandlers: LspAuthHandlers,
4746
private readonly settingsManager: SettingsManager,
4847
private readonly clientMessage: ClientMessage,
49-
private readonly getIAMFromSdk: (profile: string) => Promise<DeepReadonly<AwsCredentialIdentity>>,
48+
private readonly getIAMFromSdk: (
49+
profile: string,
50+
) => Promise<DeepReadonly<AwsCredentialIdentity>> = sdkIAMCredentials,
5051
) {}
5152

5253
getIAM(): Promise<DeepReadonly<AwsCredentialIdentity>> {
@@ -211,13 +212,4 @@ export class AwsCredentials {
211212
this.logger.error({ error }, 'Error handling SSO token change');
212213
}
213214
}
214-
215-
static create(components: ServerComponents) {
216-
return new AwsCredentials(
217-
components.authHandlers,
218-
components.settingsManager,
219-
components.clientMessage,
220-
sdkIAMCredentials,
221-
);
222-
}
223215
}

src/autocomplete/CompletionRouter.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@ import { Entity, Output, Parameter } from '../context/semantic/Entity';
77
import { EntityType } from '../context/semantic/SemanticTypes';
88
import { DocumentType } from '../document/Document';
99
import { DocumentManager } from '../document/DocumentManager';
10-
import { Closeable, Configurable, ServerComponents } from '../server/ServerComponents';
11-
import { CompletionSettings, DefaultSettings, ISettingsSubscriber, SettingsSubscription } from '../settings/Settings';
10+
import { CfnExternal } from '../server/CfnExternal';
11+
import { CfnInfraCore } from '../server/CfnInfraCore';
12+
import { CfnLspProviders } from '../server/CfnLspProviders';
13+
import { SettingsConfigurable, ISettingsSubscriber, SettingsSubscription } from '../settings/ISettingsSubscriber';
14+
import { CompletionSettings, DefaultSettings } from '../settings/Settings';
1215
import { LoggerFactory } from '../telemetry/LoggerFactory';
16+
import { Closeable } from '../utils/Closeable';
1317
import { CompletionFormatter } from './CompletionFormatter';
1418
import { CompletionProvider } from './CompletionProvider';
1519
import { ConditionCompletionProvider } from './ConditionCompletionProvider';
@@ -28,7 +32,7 @@ export type CompletionProviderType =
2832
| EntityType;
2933
const Condition = 'Condition';
3034

31-
export class CompletionRouter implements Configurable, Closeable {
35+
export class CompletionRouter implements SettingsConfigurable, Closeable {
3236
private completionSettings: CompletionSettings = DefaultSettings.completion;
3337
private settingsSubscription?: SettingsSubscription;
3438
private readonly log = LoggerFactory.getLogger(CompletionRouter);
@@ -268,32 +272,34 @@ export class CompletionRouter implements Configurable, Closeable {
268272
}
269273
}
270274

271-
static create(components: ServerComponents) {
275+
static create(core: CfnInfraCore, external: CfnExternal, providers: CfnLspProviders) {
272276
return new CompletionRouter(
273-
components.contextManager,
274-
createCompletionProviders(components),
275-
components.documentManager,
277+
core.contextManager,
278+
createCompletionProviders(core, external, providers),
279+
core.documentManager,
276280
);
277281
}
278282
}
279283

280284
export function createCompletionProviders(
281-
components: ServerComponents,
285+
core: CfnInfraCore,
286+
external: CfnExternal,
287+
providers: CfnLspProviders,
282288
): Map<CompletionProviderType, CompletionProvider> {
283289
const completionProviderMap = new Map<CompletionProviderType, CompletionProvider>();
284290
completionProviderMap.set(
285291
'TopLevelSection',
286-
new TopLevelSectionCompletionProvider(components.syntaxTreeManager, components.documentManager),
292+
new TopLevelSectionCompletionProvider(core.syntaxTreeManager, core.documentManager),
287293
);
288-
completionProviderMap.set(EntityType.Resource, new ResourceSectionCompletionProvider(components));
289-
completionProviderMap.set(EntityType.Condition, new ConditionCompletionProvider(components.syntaxTreeManager));
294+
completionProviderMap.set(EntityType.Resource, new ResourceSectionCompletionProvider(core, external, providers));
295+
completionProviderMap.set(EntityType.Condition, new ConditionCompletionProvider(core.syntaxTreeManager));
290296
completionProviderMap.set('IntrinsicFunction', new IntrinsicFunctionCompletionProvider());
291297
completionProviderMap.set(
292298
'IntrinsicFunctionArgument',
293299
new IntrinsicFunctionArgumentCompletionProvider(
294-
components.syntaxTreeManager,
295-
components.schemaRetriever,
296-
components.documentManager,
300+
core.syntaxTreeManager,
301+
external.schemaRetriever,
302+
core.documentManager,
297303
),
298304
);
299305
completionProviderMap.set('ParameterTypeValue', new ParameterTypeValueCompletionProvider());

src/autocomplete/InlineCompletionRouter.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@ import { InlineCompletionList, InlineCompletionParams, InlineCompletionItem } fr
22
import { Context } from '../context/Context';
33
import { ContextManager } from '../context/ContextManager';
44
import { DocumentManager } from '../document/DocumentManager';
5-
import { Closeable, Configurable, ServerComponents } from '../server/ServerComponents';
5+
import { CfnInfraCore } from '../server/CfnInfraCore';
66
import { RelationshipSchemaService } from '../services/RelationshipSchemaService';
7-
import { CompletionSettings, DefaultSettings, ISettingsSubscriber, SettingsSubscription } from '../settings/Settings';
7+
import { SettingsConfigurable, ISettingsSubscriber, SettingsSubscription } from '../settings/ISettingsSubscriber';
8+
import { CompletionSettings, DefaultSettings } from '../settings/Settings';
89
import { LoggerFactory } from '../telemetry/LoggerFactory';
10+
import { Closeable } from '../utils/Closeable';
911
import { InlineCompletionProvider } from './InlineCompletionProvider';
1012
import { RelatedResourcesInlineCompletionProvider } from './RelatedResourcesInlineCompletionProvider';
1113

1214
export type InlineCompletionProviderType = 'RelatedResources' | 'ResourceBlock' | 'PropertyBlock';
1315
type ReturnType = InlineCompletionList | InlineCompletionItem[] | null | undefined;
1416

15-
export class InlineCompletionRouter implements Configurable, Closeable {
17+
export class InlineCompletionRouter implements SettingsConfigurable, Closeable {
1618
private completionSettings: CompletionSettings = DefaultSettings.completion;
1719
private settingsSubscription?: SettingsSubscription;
1820
private readonly log = LoggerFactory.getLogger(InlineCompletionRouter);
@@ -94,11 +96,11 @@ export class InlineCompletionRouter implements Configurable, Closeable {
9496
);
9597
}
9698

97-
static create(components: ServerComponents) {
99+
static create(core: CfnInfraCore) {
98100
return new InlineCompletionRouter(
99-
components.contextManager,
100-
createInlineCompletionProviders(components.documentManager, RelationshipSchemaService.getInstance()),
101-
components.documentManager,
101+
core.contextManager,
102+
createInlineCompletionProviders(core.documentManager, RelationshipSchemaService.getInstance()),
103+
core.documentManager,
102104
);
103105
}
104106
}

src/autocomplete/ResourceEntityCompletionProvider.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { DocumentType } from '../document/Document';
55
import { DocumentManager } from '../document/DocumentManager';
66
import { ResourceSchema } from '../schema/ResourceSchema';
77
import { SchemaRetriever } from '../schema/SchemaRetriever';
8-
import { ServerComponents } from '../server/ServerComponents';
98
import { getFuzzySearchFunction } from '../utils/FuzzySearchUtil';
109
import { applySnippetIndentation } from '../utils/IndentationUtils';
1110
import { CompletionFormatter, ExtendedCompletionItem } from './CompletionFormatter';
@@ -110,8 +109,4 @@ export class ResourceEntityCompletionProvider implements CompletionProvider {
110109

111110
return applySnippetIndentation(snippet, documentSpecificSettings, documentType);
112111
}
113-
114-
static create(components: ServerComponents) {
115-
return new ResourceEntityCompletionProvider(components.schemaRetriever, components.documentManager);
116-
}
117112
}

src/autocomplete/ResourceSectionCompletionProvider.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { CompletionItem, CompletionParams, CompletionTriggerKind } from 'vscode-languageserver';
22
import { Context } from '../context/Context';
33
import { Resource } from '../context/semantic/Entity';
4-
import { ServerComponents } from '../server/ServerComponents';
4+
import { CfnExternal } from '../server/CfnExternal';
5+
import { CfnInfraCore } from '../server/CfnInfraCore';
6+
import { CfnLspProviders } from '../server/CfnLspProviders';
57
import { LoggerFactory } from '../telemetry/LoggerFactory';
68
import { CompletionProvider } from './CompletionProvider';
79
import { ResourceEntityCompletionProvider } from './ResourceEntityCompletionProvider';
@@ -20,8 +22,10 @@ export class ResourceSectionCompletionProvider implements CompletionProvider {
2022
private readonly log = LoggerFactory.getLogger(ResourceSectionCompletionProvider);
2123

2224
constructor(
23-
components: ServerComponents,
24-
private readonly resourceProviders = createResourceCompletionProviders(components),
25+
core: CfnInfraCore,
26+
external: CfnExternal,
27+
providers: CfnLspProviders,
28+
private readonly resourceProviders = createResourceCompletionProviders(core, external, providers),
2529
) {}
2630

2731
getCompletions(
@@ -74,27 +78,26 @@ export class ResourceSectionCompletionProvider implements CompletionProvider {
7478
}
7579

7680
export function createResourceCompletionProviders(
77-
components: ServerComponents,
81+
core: CfnInfraCore,
82+
external: CfnExternal,
83+
providers: CfnLspProviders,
7884
): Map<ResourceCompletionType, CompletionProvider> {
7985
const resourceProviderMap = new Map<ResourceCompletionType, CompletionProvider>();
8086
resourceProviderMap.set(
8187
ResourceCompletionType.Entity,
82-
new ResourceEntityCompletionProvider(components.schemaRetriever, components.documentManager),
83-
);
84-
resourceProviderMap.set(
85-
ResourceCompletionType.Type,
86-
new ResourceTypeCompletionProvider(components.schemaRetriever),
88+
new ResourceEntityCompletionProvider(external.schemaRetriever, core.documentManager),
8789
);
90+
resourceProviderMap.set(ResourceCompletionType.Type, new ResourceTypeCompletionProvider(external.schemaRetriever));
8891
resourceProviderMap.set(
8992
ResourceCompletionType.Property,
90-
new ResourcePropertyCompletionProvider(components.schemaRetriever),
93+
new ResourcePropertyCompletionProvider(external.schemaRetriever),
9194
);
9295
resourceProviderMap.set(
9396
ResourceCompletionType.State,
9497
new ResourceStateCompletionProvider(
95-
components.resourceStateManager,
96-
components.documentManager,
97-
components.schemaRetriever,
98+
providers.resourceStateManager,
99+
core.documentManager,
100+
external.schemaRetriever,
98101
),
99102
);
100103
return resourceProviderMap;

src/autocomplete/ResourceStateCompletionProvider.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import { ResourceStatePurpose } from '../resourceState/ResourceStateTypes';
1717
import { ResourceSchema } from '../schema/ResourceSchema';
1818
import { SchemaRetriever } from '../schema/SchemaRetriever';
1919
import { TransformersUtil } from '../schema/transformers/TransformersUtil';
20-
import { ServerComponents } from '../server/ServerComponents';
20+
import { CfnExternal } from '../server/CfnExternal';
21+
import { CfnInfraCore } from '../server/CfnInfraCore';
22+
import { CfnLspProviders } from '../server/CfnLspProviders';
2123
import { LoggerFactory } from '../telemetry/LoggerFactory';
2224
import { CompletionProvider } from './CompletionProvider';
2325
import { createCompletionItem, handleSnippetJsonQuotes } from './CompletionUtils';
@@ -168,11 +170,11 @@ export class ResourceStateCompletionProvider implements CompletionProvider {
168170
textEdit.range.start.character = textEdit.range.start.character - tabSize;
169171
}
170172

171-
static create(components: ServerComponents) {
173+
static create(core: CfnInfraCore, external: CfnExternal, providers: CfnLspProviders) {
172174
return new ResourceStateCompletionProvider(
173-
components.resourceStateManager,
174-
components.documentManager,
175-
components.schemaRetriever,
175+
providers.resourceStateManager,
176+
core.documentManager,
177+
external.schemaRetriever,
176178
);
177179
}
178180
}

0 commit comments

Comments
 (0)