Skip to content

Commit 303922d

Browse files
Merge master into feature/auto-debug
2 parents 62d2b98 + 9eaeb1c commit 303922d

File tree

7 files changed

+71
-130
lines changed

7 files changed

+71
-130
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
const isLocalDev = false
7+
const localhost = 'http://127.0.0.1:3000'
8+
const cdn = 'https://ide-toolkits.app-composer.aws.dev'
9+
10+
export { isLocalDev, localhost, cdn }

packages/core/src/applicationcomposer/messageHandlers/generateResourceHandler.ts

Lines changed: 16 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,6 @@
22
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
import {
6-
GenerateAssistantResponseRequest,
7-
SupplementaryWebLink,
8-
Reference,
9-
UserIntent,
10-
} from '@amzn/codewhisperer-streaming'
115

126
import {
137
GenerateResourceRequestMessage,
@@ -16,15 +10,13 @@ import {
1610
Command,
1711
MessageType,
1812
} from '../types'
19-
import globals from '../../shared/extensionGlobals'
2013
import { getLogger } from '../../shared/logger/logger'
21-
import { AmazonqNotFoundError, getAmazonqApi } from '../../amazonq/extApi'
22-
23-
const TIMEOUT = 30_000
14+
import request from '../../shared/request'
15+
import { isLocalDev, localhost, cdn } from '../constants'
2416

2517
export async function generateResourceHandler(request: GenerateResourceRequestMessage, context: WebviewContext) {
2618
try {
27-
const { chatResponse, references, metadata, isSuccess } = await generateResource(request.cfnType)
19+
const { chatResponse, references, metadata, isSuccess } = await fetchExampleResource(request.cfnType)
2820

2921
const responseMessage: GenerateResourceResponseMessage = {
3022
command: Command.GENERATE_RESOURCE,
@@ -54,116 +46,18 @@ export async function generateResourceHandler(request: GenerateResourceRequestMe
5446
}
5547
}
5648

57-
async function generateResource(cfnType: string) {
58-
let startTime = globals.clock.Date.now()
59-
49+
async function fetchExampleResource(cfnType: string) {
6050
try {
61-
const amazonqApi = await getAmazonqApi()
62-
if (!amazonqApi) {
63-
throw new AmazonqNotFoundError()
64-
}
65-
const request: GenerateAssistantResponseRequest = {
66-
conversationState: {
67-
currentMessage: {
68-
userInputMessage: {
69-
content: cfnType,
70-
userIntent: UserIntent.GENERATE_CLOUDFORMATION_TEMPLATE,
71-
},
72-
},
73-
chatTriggerType: 'MANUAL',
74-
},
75-
}
76-
77-
let response = ''
78-
let metadata
79-
let conversationId
80-
let supplementaryWebLinks: SupplementaryWebLink[] = []
81-
let references: Reference[] = []
82-
83-
await amazonqApi.authApi.reauthIfNeeded()
84-
85-
startTime = globals.clock.Date.now()
86-
// TODO-STARLING - Revisit to see if timeout still needed prior to launch
87-
const data = await timeout(amazonqApi.chatApi.chat(request), TIMEOUT)
88-
const initialResponseTime = globals.clock.Date.now() - startTime
89-
getLogger().debug(`CW Chat initial response: %O, ${initialResponseTime} ms`, data)
90-
if (data['$metadata']) {
91-
metadata = data['$metadata']
92-
}
93-
94-
if (data.generateAssistantResponseResponse === undefined) {
95-
getLogger().debug(`Error: Unexpected model response: %O`, data)
96-
throw new Error('No model response')
97-
}
98-
99-
for await (const value of data.generateAssistantResponseResponse) {
100-
if (value?.assistantResponseEvent?.content) {
101-
try {
102-
response += value.assistantResponseEvent.content
103-
} catch (error: any) {
104-
getLogger().debug(`Warning: Failed to parse content response: ${error.message}`)
105-
throw new Error('Invalid model response')
106-
}
107-
}
108-
if (value?.messageMetadataEvent?.conversationId) {
109-
conversationId = value.messageMetadataEvent.conversationId
110-
}
111-
112-
const newWebLinks = value?.supplementaryWebLinksEvent?.supplementaryWebLinks
113-
114-
if (newWebLinks && newWebLinks.length > 0) {
115-
supplementaryWebLinks = supplementaryWebLinks.concat(newWebLinks)
116-
}
117-
118-
if (value.codeReferenceEvent?.references && value.codeReferenceEvent.references.length > 0) {
119-
references = references.concat(value.codeReferenceEvent.references)
120-
121-
// Code References are not expected for these single resource prompts
122-
// As we don't yet have the workflows needed to accept references, create the properly structured
123-
// CW Reference log event, we will reject responses that have code references
124-
let errorMessage = 'Code references found for this response, rejecting.'
125-
126-
if (conversationId) {
127-
errorMessage += ` cID(${conversationId})`
128-
}
129-
130-
if (metadata?.requestId) {
131-
errorMessage += ` rID(${metadata.requestId})`
132-
}
133-
134-
throw new Error(errorMessage)
135-
}
136-
}
137-
138-
const elapsedTime = globals.clock.Date.now() - startTime
139-
140-
getLogger().debug(
141-
`CW Chat Debug message:
142-
cfnType = "${cfnType}",
143-
conversationId = ${conversationId},
144-
metadata = %O,
145-
supplementaryWebLinks = %O,
146-
references = %O,
147-
response = "${response}",
148-
initialResponse = ${initialResponseTime} ms,
149-
elapsed time = ${elapsedTime} ms`,
150-
metadata,
151-
supplementaryWebLinks,
152-
references
153-
)
154-
51+
const source = isLocalDev ? localhost : cdn
52+
const resp = request.fetch('GET', `${source}/examples/${convertCFNType(cfnType)}.json`, {})
15553
return {
156-
chatResponse: response,
54+
chatResponse: await (await resp.response).text(),
15755
references: [],
158-
metadata: {
159-
...metadata,
160-
conversationId,
161-
queryTime: elapsedTime,
162-
},
56+
metadata: {},
16357
isSuccess: true,
16458
}
16559
} catch (error: any) {
166-
getLogger().debug(`CW Chat error: ${error.name} - ${error.message}`)
60+
getLogger().debug(`Resource fetch error: ${error.name} - ${error.message}`)
16761
if (error.$metadata) {
16862
const { requestId, cfId, extendedRequestId } = error.$metadata
16963
getLogger().debug('%O', { requestId, cfId, extendedRequestId })
@@ -173,11 +67,11 @@ async function generateResource(cfnType: string) {
17367
}
17468
}
17569

176-
function timeout<T>(promise: Promise<T>, ms: number, timeoutError = new Error('Promise timed out')): Promise<T> {
177-
const _timeout = new Promise<never>((_, reject) => {
178-
globals.clock.setTimeout(() => {
179-
reject(timeoutError)
180-
}, ms)
181-
})
182-
return Promise.race<T>([promise, _timeout])
70+
function convertCFNType(cfnType: string): string {
71+
const resourceParts = cfnType.split('::')
72+
if (resourceParts.length !== 3) {
73+
throw new Error('CFN type did not contain three parts')
74+
}
75+
76+
return resourceParts.join('_')
18377
}

packages/core/src/applicationcomposer/webviewManager.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,11 @@ import * as vscode from 'vscode'
77
import * as nls from 'vscode-nls'
88
import request from '../shared/request'
99
import { ApplicationComposer } from './composerWebview'
10+
import { isLocalDev, localhost, cdn } from './constants'
1011
import { getLogger } from '../shared/logger/logger'
1112

1213
const localize = nls.loadMessageBundle()
1314

14-
// TODO turn this into a flag to make local dev easier
15-
// Change this to true for local dev
16-
const isLocalDev = false
17-
const localhost = 'http://127.0.0.1:3000'
18-
const cdn = 'https://ide-toolkits.app-composer.aws.dev'
19-
2015
const enabledFeatures = ['ide-only', 'anything-resource', 'sfnV2', 'starling']
2116

2217
export class ApplicationComposerManager {

packages/core/src/shared/lsp/utils/setupStage.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import { LanguageServerSetup, LanguageServerSetupStage, telemetry } from '../../telemetry/telemetry'
77
import { tryFunctions } from '../../utilities/tsUtils'
8+
import { AuthUtil } from '../../../codewhisperer/util/authUtil'
89

910
/**
1011
* Runs the designated stage within a telemetry span and optionally uses the getMetadata extractor to record metadata from the result of the stage.
@@ -20,6 +21,7 @@ export async function lspSetupStage<Result>(
2021
) {
2122
return await telemetry.languageServer_setup.run(async (span) => {
2223
span.record({ languageServerSetupStage: stageName })
24+
span.record({ credentialStartUrl: AuthUtil.instance.startUrl ?? 'Undefined' })
2325
const result = await runStage()
2426
if (getMetadata) {
2527
span.record(getMetadata(result))

packages/core/src/shared/telemetry/service-2.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,8 @@
205205
"AWSProduct",
206206
"AWSProductVersion",
207207
"ClientID",
208-
"MetricData"
208+
"MetricData",
209+
"CredentialStartUrl"
209210
],
210211
"members":{
211212
"AWSProduct":{"shape":"AWSProduct"},
@@ -217,7 +218,8 @@
217218
"ComputeEnv": {"shape":"ComputeEnv"},
218219
"ParentProduct":{"shape":"Value"},
219220
"ParentProductVersion":{"shape":"Value"},
220-
"MetricData":{"shape":"MetricData"}
221+
"MetricData":{"shape":"MetricData"},
222+
"CredentialStartUrl": {"shape":"Value"}
221223
}
222224
},
223225
"Sentiment":{

packages/core/src/shared/telemetry/telemetryClient.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import globals from '../extensionGlobals'
1717
import { DevSettings } from '../settings'
1818
import { ClassToInterfaceType } from '../utilities/tsUtils'
1919
import { getComputeEnvType, getSessionId } from './util'
20+
import { AuthUtil } from '../../codewhisperer/util/authUtil'
2021

2122
export const accountMetadataKey = 'awsAccount'
2223
export const regionKey = 'awsRegion'
@@ -112,6 +113,7 @@ export class DefaultTelemetryClient implements TelemetryClient {
112113
ParentProduct: vscode.env.appName,
113114
ParentProductVersion: vscode.version,
114115
MetricData: batch,
116+
CredentialStartUrl: AuthUtil.instance.startUrl ?? 'Undefined',
115117
})
116118
.promise()
117119
this.logger.info(`telemetry: sent batch (size=${batch.length})`)

packages/core/src/shared/telemetry/vscodeTelemetry.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,42 @@
12211221
"required": false
12221222
}
12231223
]
1224+
},
1225+
{
1226+
"name": "languageServer_setup",
1227+
"description": "Sets up a language server",
1228+
"unit": "Milliseconds",
1229+
"passive": true,
1230+
"metadata": [
1231+
{
1232+
"type": "id",
1233+
"required": true
1234+
},
1235+
{
1236+
"type": "languageServerSetupStage",
1237+
"required": true
1238+
},
1239+
{
1240+
"type": "languageServerLocation",
1241+
"required": false
1242+
},
1243+
{
1244+
"type": "languageServerVersion",
1245+
"required": false
1246+
},
1247+
{
1248+
"type": "manifestLocation",
1249+
"required": false
1250+
},
1251+
{
1252+
"type": "manifestSchemaVersion",
1253+
"required": false
1254+
},
1255+
{
1256+
"type": "credentialStartUrl",
1257+
"required": false
1258+
}
1259+
]
12241260
}
12251261
]
12261262
}

0 commit comments

Comments
 (0)