Skip to content

Commit cc4bba8

Browse files
authored
Merge pull request #6536 from aws/autoMerge/feature/amazonqLSP
Merge master into feature/amazonqLSP
2 parents 5bbea3e + 81d3454 commit cc4bba8

17 files changed

+152
-70
lines changed

CONTRIBUTING.md

+8-11
Original file line numberDiff line numberDiff line change
@@ -368,31 +368,28 @@ The `aws.dev.forceDevMode` setting enables or disables Toolkit "dev mode". Witho
368368
```
369369
tail -F ~/awstoolkit.log
370370
```
371-
- Use the `AWS (Developer): Watch Logs` command to watch and filter Toolkit logs (including
372-
telemetry) in VSCode.
373-
- Only available if you enabled "dev mode" (`aws.dev.forceDevMode` setting, see above).
374-
- Enter text in the Debug Console filter box to show only log messages with that text. <br/>
375-
<img src="./docs/images/debug-console-filter.png" alt="VSCode Debug Console" width="320"/>
371+
- Use the Output panel to watch and filter Toolkit logs (including telemetry) in VSCode.
372+
- Enter text in the Output panel filter box to show only log messages with that text.
376373
377374
#### Enabling Debug Logs
378375
379376
How to enable more detailed debug logs in the extensions.
380377
If you need to report an issue attach these to give the most detailed information.
381378
382-
1. Open the Command Palette (`cmd/ctrl` + `shift` + `p`), then search for "View Logs". Choose the correct option for the extension you want, eg: `AWS: View Logs` or `Amazon Q: View Logs`
383-
![](./docs/images/logsView.png)
379+
1. Open the Command Palette (`cmd/ctrl` + `shift` + `p`), then search for "View Logs". Choose either `AWS: View Logs` or `Amazon Q: View Logs`.
380+
- ![](./docs/images/logsView.png)
384381
2. Click the gear icon on the bottom right and select `Debug`
385-
![](./docs/images/logsSetDebug.png)
382+
- ![](./docs/images/logsSetDebug.png)
386383
3. Click the gear icon again and select `Set As Default`. This will ensure we stay in `Debug` until explicitly changed
387-
![](./docs/images/logsSetDefault.png)
384+
- ![](./docs/images/logsSetDefault.png)
388385
4. Open the Command Palette again and select `Reload Window`.
389386
5. Now you should see additional `[debug]` prefixed logs in the output.
390-
![](./docs/images/logsDebugLog.png)
387+
- ![](./docs/images/logsDebugLog.png)
391388
392389
### Telemetry
393390
394391
- See [docs/telemetry.md](./docs/telemetry.md) for guidelines on developing telemetry in this project.
395-
- To watch Toolkit telemetry events, use the `AWS (Developer): Watch Logs` command (see [Logging](#logging) above) and enter "telemetry" in the Debug Console filter box.
392+
- To watch Toolkit telemetry events, use the `Amazon Q: View Logs` command (see [Logging](#logging) above) and enter "telemetry" in the filter box.
396393
397394
### Service Endpoints
398395

docs/images/debug-console-filter.png

-22.9 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Bug Fix",
3+
"description": "`Send to prompt` and other context menu options not sent if chat was closed"
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Feature",
3+
"description": "Amazon Q /dev: support `.hbs`, `.gjs`, `.gts`, `.astro`, `.mdx`, `.svelte`, `.erb`, `.rake` files"
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Feature",
3+
"description": "/transform: automatically download results when ready"
4+
}

packages/core/src/amazonq/apps/initContext.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
*/
55

66
import { EventEmitter } from 'vscode'
7-
import { MessagePublisher } from '../messages/messagePublisher'
7+
import { MessagePublisher, UiMessagePublisher } from '../messages/messagePublisher'
88
import { MessageListener } from '../messages/messageListener'
99
import { TabType } from '../webview/ui/storages/tabsStorage'
1010

1111
export interface AmazonQAppInitContext {
1212
registerWebViewToAppMessagePublisher(eventEmitter: MessagePublisher<any>, tabType: TabType): void
13-
getAppsToWebViewMessagePublisher(): MessagePublisher<any>
13+
getAppsToWebViewMessagePublisher(): UiMessagePublisher<any>
1414
onDidChangeAmazonQVisibility: EventEmitter<boolean>
1515
}
1616

1717
export class DefaultAmazonQAppInitContext implements AmazonQAppInitContext {
1818
private readonly appsToWebViewEventEmitter = new EventEmitter<any>()
1919
private readonly appsToWebViewMessageListener = new MessageListener<any>(this.appsToWebViewEventEmitter)
20-
private readonly appsToWebViewMessagePublisher = new MessagePublisher<any>(this.appsToWebViewEventEmitter)
20+
private readonly appsToWebViewMessagePublisher = new UiMessagePublisher<any>(this.appsToWebViewEventEmitter)
2121
private readonly webViewToAppsMessagePublishers: Map<TabType, MessagePublisher<any>> = new Map()
2222
public readonly onDidChangeAmazonQVisibility = new EventEmitter<boolean>()
2323

@@ -41,7 +41,7 @@ export class DefaultAmazonQAppInitContext implements AmazonQAppInitContext {
4141
return this.appsToWebViewMessageListener
4242
}
4343

44-
getAppsToWebViewMessagePublisher(): MessagePublisher<any> {
44+
getAppsToWebViewMessagePublisher(): UiMessagePublisher<any> {
4545
return this.appsToWebViewMessagePublisher
4646
}
4747
}

packages/core/src/amazonq/messages/messagePublisher.ts

+45
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,48 @@ export class MessagePublisher<T> {
1212
this.eventEmitter.fire(event)
1313
}
1414
}
15+
16+
/**
17+
* Same as {@link MessagePublisher}, but will wait until the UI indicates it
18+
* is ready to recieve messages, before the message is published.
19+
*
20+
* This solves a problem when running a right click menu option like
21+
* "Send To Prompt" BUT chat is not opened yet, it would result in the prompt failing to
22+
* be recieved by chat.
23+
*/
24+
export class UiMessagePublisher<T> extends MessagePublisher<T> {
25+
private isUiReady: boolean = false
26+
private buffer: T[] = []
27+
28+
constructor(eventEmitter: EventEmitter<T>) {
29+
super(eventEmitter)
30+
}
31+
32+
public override publish(event: T): void {
33+
// immediately send if Chat UI is ready
34+
if (this.isUiReady) {
35+
super.publish(event)
36+
return
37+
}
38+
39+
this.buffer.push(event)
40+
}
41+
42+
/**
43+
* Indicate the Q Chat UI is ready to recieve messages.
44+
*/
45+
public setUiReady() {
46+
this.isUiReady = true
47+
this.flush()
48+
}
49+
50+
/**
51+
* Publishes all blocked messages
52+
*/
53+
private flush() {
54+
for (const msg of this.buffer) {
55+
super.publish(msg)
56+
}
57+
this.buffer = []
58+
}
59+
}

packages/core/src/amazonq/webview/messages/messageDispatcher.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { telemetry } from '../../../shared/telemetry'
1313
import { AmazonQChatMessageDuration } from '../../messages/chatMessageDuration'
1414
import { globals, openUrl } from '../../../shared'
1515
import { isClickTelemetry, isOpenAgentTelemetry } from '../ui/telemetry/actions'
16+
import { DefaultAmazonQAppInitContext } from '../../apps/initContext'
1617

1718
export function dispatchWebViewMessagesToApps(
1819
webview: Webview,
@@ -21,12 +22,12 @@ export function dispatchWebViewMessagesToApps(
2122
webview.onDidReceiveMessage((msg) => {
2223
switch (msg.command) {
2324
case 'ui-is-ready': {
25+
DefaultAmazonQAppInitContext.instance.getAppsToWebViewMessagePublisher().setUiReady()
2426
/**
2527
* ui-is-ready isn't associated to any tab so just record the telemetry event and continue.
2628
* This would be equivalent of the duration between "user clicked open q" and "ui has become available"
2729
* NOTE: Amazon Q UI is only loaded ONCE. The state is saved between each hide/show of the webview.
2830
*/
29-
3031
telemetry.webview_load.emit({
3132
webviewName: 'amazonq',
3233
duration: performance.measure(amazonqMark.uiReady, amazonqMark.open).duration,

packages/core/src/codewhisperer/commands/startTransformByQ.ts

+6
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,12 @@ export async function postTransformationJob() {
775775
if (transformByQState.getPayloadFilePath() !== '') {
776776
fs.rmSync(transformByQState.getPayloadFilePath(), { recursive: true, force: true }) // delete ZIP if it exists
777777
}
778+
779+
// attempt download for user
780+
// TODO: refactor as explained here https://github.com/aws/aws-toolkit-vscode/pull/6519/files#r1946873107
781+
if (transformByQState.isSucceeded() || transformByQState.isPartiallySucceeded()) {
782+
await vscode.commands.executeCommand('aws.amazonq.transformationHub.reviewChanges.startReview')
783+
}
778784
}
779785

780786
export async function transformationJobErrorHandler(error: any) {

packages/core/src/dev/activation.ts

-14
Original file line numberDiff line numberDiff line change
@@ -199,20 +199,6 @@ export async function activate(ctx: vscode.ExtensionContext): Promise<void> {
199199
.filter((e) => (opts.menuOptions ?? Object.keys(options)).includes(e[0]))
200200
.map((e) => e[1])
201201
)
202-
}),
203-
// "AWS (Developer): Watch Logs"
204-
Commands.register('aws.dev.viewLogs', async () => {
205-
// HACK: Use startDebugging() so we can use the DEBUG CONSOLE (which supports
206-
// user-defined filtering, unlike the OUTPUT panel).
207-
await vscode.debug.startDebugging(undefined, {
208-
name: 'aws-dev-log',
209-
request: 'launch',
210-
type: 'node', // Nonsense, to force the debugger to start.
211-
})
212-
getLogger().enableDebugConsole()
213-
if (!getLogger().logLevelEnabled('debug')) {
214-
getLogger().setLogLevel('debug')
215-
}
216202
})
217203
)
218204

packages/core/src/shared/filetypes.ts

+8
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ export const codefileExtensions = new Set([
155155
'.ads',
156156
'.apl',
157157
'.asm',
158+
'.astro',
158159
'.awk',
159160
'.b',
160161
'.bas',
@@ -195,6 +196,7 @@ export const codefileExtensions = new Set([
195196
'.el',
196197
'.elm',
197198
'.env',
199+
'.erb',
198200
'.erl',
199201
'.ex',
200202
'.exs',
@@ -211,6 +213,7 @@ export const codefileExtensions = new Set([
211213
'.fsx',
212214
'.gd',
213215
'.gitignore',
216+
'.gjs',
214217
'.go',
215218
'.gql',
216219
'.gradle',
@@ -220,9 +223,11 @@ export const codefileExtensions = new Set([
220223
'.gsp',
221224
'.gst',
222225
'.gsx',
226+
'.gts',
223227
'.gvy',
224228
'.h',
225229
'.hack',
230+
'.hbs',
226231
'.hh',
227232
'.hpp',
228233
'.hrl',
@@ -253,6 +258,7 @@ export const codefileExtensions = new Set([
253258
'.mak',
254259
'.makefile',
255260
'.md',
261+
'.mdx',
256262
'.mjs',
257263
'.ml',
258264
'.mli',
@@ -289,6 +295,7 @@ export const codefileExtensions = new Set([
289295
'.pyw',
290296
'.qs',
291297
'.r',
298+
'.rake',
292299
'.raku',
293300
'.rakumod',
294301
'.rakutest',
@@ -331,6 +338,7 @@ export const codefileExtensions = new Set([
331338
'.ss',
332339
'.st',
333340
'.sv',
341+
'.svelte',
334342
'.svg',
335343
'.swift',
336344
'.t',

packages/core/src/shared/logger/logger.ts

+9-11
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,15 @@
55

66
import * as vscode from 'vscode'
77

8-
export type LogTopic = 'crashMonitoring' | 'dev/beta' | 'notifications' | 'test' | 'childProcess' | 'lsp' | 'unknown'
8+
export type LogTopic =
9+
| 'crashMonitoring'
10+
| 'dev/beta'
11+
| 'notifications'
12+
| 'test'
13+
| 'childProcess'
14+
| 'unknown'
15+
| 'chat'
16+
| 'lsp'
917

1018
class ErrorLog {
1119
constructor(
@@ -35,8 +43,6 @@ export interface Logger {
3543
/** Returns true if the given log level is being logged. */
3644
logLevelEnabled(logLevel: LogLevel): boolean
3745
getLogById(logID: number, file: vscode.Uri): string | undefined
38-
/** HACK: Enables logging to vscode Debug Console. */
39-
enableDebugConsole(): void
4046
sendToLog(
4147
logLevel: 'debug' | 'verbose' | 'info' | 'warn' | 'error',
4248
message: string | Error,
@@ -74,8 +80,6 @@ export abstract class BaseLogger implements Logger {
7480
abstract setLogLevel(logLevel: LogLevel): void
7581
abstract logLevelEnabled(logLevel: LogLevel): boolean
7682
abstract getLogById(logID: number, file: vscode.Uri): string | undefined
77-
/** HACK: Enables logging to vscode Debug Console. */
78-
abstract enableDebugConsole(): void
7983
}
8084

8185
/**
@@ -166,7 +170,6 @@ export class NullLogger extends BaseLogger {
166170
public getLogById(logID: number, file: vscode.Uri): string | undefined {
167171
return undefined
168172
}
169-
public enableDebugConsole(): void {}
170173
override sendToLog(
171174
logLevel: 'error' | 'warn' | 'info' | 'verbose' | 'debug',
172175
message: string | Error,
@@ -190,7 +193,6 @@ export class ConsoleLogger extends BaseLogger {
190193
public getLogById(logID: number, file: vscode.Uri): string | undefined {
191194
return undefined
192195
}
193-
public enableDebugConsole(): void {}
194196
override sendToLog(
195197
logLevel: 'error' | 'warn' | 'info' | 'verbose' | 'debug',
196198
message: string | Error,
@@ -244,10 +246,6 @@ export class TopicLogger extends BaseLogger implements vscode.Disposable {
244246
return this.logger.getLogById(logID, file)
245247
}
246248

247-
override enableDebugConsole(): void {
248-
this.logger.enableDebugConsole()
249-
}
250-
251249
override sendToLog(level: LogLevel, message: string | Error, ...meta: any[]): number {
252250
if (typeof message === 'string') {
253251
message = prependTopic(this.topic, message) as string

packages/core/src/shared/logger/toolkitLogger.ts

-4
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ export class ToolkitLogger extends BaseLogger implements vscode.Disposable {
4848
})
4949
}
5050

51-
public enableDebugConsole(): void {
52-
this.logToConsole()
53-
}
54-
5551
public setLogLevel(logLevel: LogLevel) {
5652
if (this.logger.level === logLevel) {
5753
return

packages/core/src/shared/regions/regionProvider.ts

+21-18
Original file line numberDiff line numberDiff line change
@@ -162,25 +162,30 @@ export class RegionProvider {
162162
remote: () => Endpoints | Promise<Endpoints>
163163
}): RegionProvider {
164164
const instance = new this()
165+
void instance.init(endpointsProvider)
166+
return instance
167+
}
165168

166-
async function load() {
167-
getLogger().info('endpoints: retrieving AWS endpoints data')
168-
instance.loadFromEndpoints(await endpointsProvider.local())
169-
170-
try {
171-
instance.loadFromEndpoints(await endpointsProvider.remote())
172-
} catch (err) {
173-
getLogger().warn(
174-
`endpoints: failed to load from remote source, region data may appear outdated: %s`,
175-
err
176-
)
177-
}
169+
async init(endpointsProvider: {
170+
local: () => Endpoints | Promise<Endpoints>
171+
remote: () => Endpoints | Promise<Endpoints>
172+
}) {
173+
getLogger().info('endpoints: retrieving AWS endpoints data')
174+
175+
try {
176+
this.loadFromEndpoints(await endpointsProvider.local())
177+
} catch (err) {
178+
getLogger().warn(`endpoints: failed to load from local source: %s`, err)
178179
}
179180

180-
load().catch((err) => {
181-
getLogger().error('Failure while loading Endpoints Manifest: %s', err)
181+
try {
182+
this.loadFromEndpoints(await endpointsProvider.remote())
183+
} catch (err) {
184+
getLogger().warn(`endpoints: failed to load from remote source, region data may appear outdated: %s`, err)
185+
}
182186

183-
return vscode.window.showErrorMessage(
187+
if (this.getRegions().length === 0) {
188+
void vscode.window.showErrorMessage(
184189
`${localize(
185190
'AWS.error.endpoint.load.failure',
186191
'The {0} Toolkit was unable to load endpoints data.',
@@ -190,9 +195,7 @@ export class RegionProvider {
190195
'Toolkit functionality may be impacted until VS Code is restarted.'
191196
)}`
192197
)
193-
})
194-
195-
return instance
198+
}
196199
}
197200
}
198201

packages/core/src/test/testLogger.ts

-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ export class TestLogger extends BaseLogger {
2323
super()
2424
}
2525

26-
public enableDebugConsole(): void {}
27-
2826
public getLoggedEntries(...logLevels: LogLevel[]): Loggable[] {
2927
return this.loggedEntries
3028
.filter((loggedEntry) => logLevels.length === 0 || logLevels.includes(loggedEntry.logLevel))

0 commit comments

Comments
 (0)