Skip to content

Commit 79f86f6

Browse files
committed
feat(q): add image context support
1 parent 92b30dc commit 79f86f6

File tree

5 files changed

+46
-20
lines changed

5 files changed

+46
-20
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ import com.google.gson.Gson
88
import com.intellij.openapi.Disposable
99
import com.intellij.openapi.project.Project
1010
import com.intellij.openapi.util.Disposer
11+
import com.intellij.ui.jcef.JBCefClient
1112
import com.intellij.ui.jcef.JBCefJSQuery
1213
import org.cef.CefApp
14+
import org.cef.browser.CefBrowser
15+
import org.cef.callback.CefDragData
16+
import org.cef.handler.CefDragHandler
1317
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
1418
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
1519
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
@@ -85,6 +89,9 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project)
8589
// setup empty state. The message request handlers use this for storing state
8690
// that's persistent between page loads.
8791
jcefBrowser.setProperty("state", "")
92+
jcefBrowser.jbCefClient.addDragHandler({ browser, dragData, mask ->
93+
true // Allow drag operations
94+
}, jcefBrowser.cefBrowser)
8895
// load the web app
8996
jcefBrowser.loadHTML(
9097
getWebviewHTML(

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,6 @@ import com.intellij.openapi.fileEditor.FileEditorManager
1414
import com.intellij.openapi.options.ShowSettingsUtil
1515
import com.intellij.openapi.project.Project
1616
import com.intellij.ui.jcef.JBCefJSQuery.Response
17-
import kotlinx.coroutines.CancellationException
18-
import kotlinx.coroutines.CompletableDeferred
19-
import kotlinx.coroutines.channels.awaitClose
20-
import kotlinx.coroutines.coroutineScope
21-
import kotlinx.coroutines.flow.Flow
22-
import kotlinx.coroutines.flow.callbackFlow
23-
import kotlinx.coroutines.flow.distinctUntilChanged
24-
import kotlinx.coroutines.flow.launchIn
25-
import kotlinx.coroutines.flow.merge
26-
import kotlinx.coroutines.flow.onEach
27-
import kotlinx.coroutines.launch
2817
import org.cef.browser.CefBrowser
2918
import org.eclipse.lsp4j.TextDocumentIdentifier
3019
import org.eclipse.lsp4j.jsonrpc.ResponseErrorException
@@ -74,6 +63,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_S
7463
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResponse
7564
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.LIST_MCP_SERVERS_REQUEST_METHOD
7665
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.MCP_SERVER_CLICK_REQUEST_METHOD
66+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIALOG
7767
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIALOG_REQUEST_METHOD
7868
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_SETTINGS
7969
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_WORKSPACE_SETTINGS_KEY
@@ -86,7 +76,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.PROMP
8676
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.QuickChatActionRequest
8777
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
8878
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.STOP_CHAT_RESPONSE
89-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIALOG
9079
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendChatPromptRequest
9180
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.StopResponseMessage
9281
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TELEMETRY_EVENT
@@ -108,6 +97,17 @@ import software.aws.toolkits.telemetry.Telemetry
10897
import java.util.concurrent.CompletableFuture
10998
import java.util.concurrent.CompletionException
11099
import java.util.function.Function
100+
import kotlinx.coroutines.CancellationException
101+
import kotlinx.coroutines.CompletableDeferred
102+
import kotlinx.coroutines.channels.awaitClose
103+
import kotlinx.coroutines.coroutineScope
104+
import kotlinx.coroutines.flow.Flow
105+
import kotlinx.coroutines.flow.callbackFlow
106+
import kotlinx.coroutines.flow.distinctUntilChanged
107+
import kotlinx.coroutines.flow.launchIn
108+
import kotlinx.coroutines.flow.merge
109+
import kotlinx.coroutines.flow.onEach
110+
import kotlinx.coroutines.launch
111111

112112
class BrowserConnector(
113113
private val serializer: MessageSerializer = MessageSerializer.getInstance(),

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClient.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_
2424
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams
2525
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SHOW_OPEN_FILE_DIALOG_REQUEST_METHOD
2626
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD
27+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowOpenFileDialogParams
2728
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
2829
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult
2930
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
@@ -44,7 +45,7 @@ interface AmazonQLanguageClient : LanguageClient {
4445
fun showSaveFileDialog(params: ShowSaveFileDialogParams): CompletableFuture<ShowSaveFileDialogResult>
4546

4647
@JsonRequest(SHOW_OPEN_FILE_DIALOG_REQUEST_METHOD)
47-
fun showOpenFileDialog(params: LSPAny): CompletableFuture<LSPAny>
48+
fun showOpenFileDialog(params: ShowOpenFileDialogParams): CompletableFuture<LSPAny>
4849

4950
@JsonRequest(GET_SERIALIZED_CHAT_REQUEST_METHOD)
5051
fun getSerializedChat(params: LSPAny): CompletableFuture<GetSerializedChatResult>

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import com.intellij.ide.BrowserUtil
1010
import com.intellij.notification.NotificationAction
1111
import com.intellij.notification.NotificationType
1212
import com.intellij.openapi.application.ApplicationManager
13-
import com.intellij.openapi.fileChooser.FileChooserFactory
14-
import com.intellij.openapi.fileChooser.FileSaverDescriptor
1513
import com.intellij.openapi.fileChooser.FileChooser
1614
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
15+
import com.intellij.openapi.fileChooser.FileChooserFactory
16+
import com.intellij.openapi.fileChooser.FileSaverDescriptor
1717
import com.intellij.openapi.fileEditor.FileEditorManager
1818
import com.intellij.openapi.project.Project
1919
import com.intellij.openapi.vfs.LocalFileSystem
@@ -53,6 +53,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FileP
5353
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
5454
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
5555
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams
56+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowOpenFileDialogParams
5657
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
5758
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult
5859
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
@@ -251,17 +252,21 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
251252
)
252253
}
253254

254-
override fun showOpenFileDialog(params: LSPAny): CompletableFuture<LSPAny> {
255+
override fun showOpenFileDialog(params: ShowOpenFileDialogParams): CompletableFuture<LSPAny> {
255256
return CompletableFuture.supplyAsync(
256257
{
257-
val descriptor = FileChooserDescriptorFactory.createMultipleFilesNoJarsDescriptor().apply {
258-
title = "Select Files"
259-
description = "Choose files to open"
258+
val descriptor = if (params.canSelectMany) {
259+
FileChooserDescriptorFactory.createMultipleFilesNoJarsDescriptor().apply {
260+
title = "Select Files"
261+
description = "Choose files to open"
262+
}
263+
} else {
264+
FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()
260265
}
261266

262267
val chosenFiles = FileChooser.chooseFiles(descriptor, project, null)
263268
val uris = chosenFiles.map { it.url }
264-
269+
265270
mapOf("uris" to uris) as LSPAny
266271
},
267272
ApplicationManager.getApplication()::invokeLater
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
5+
6+
data class ShowOpenFileDialogParams(
7+
val canSelectFiles: Boolean = false,
8+
val canSelectFolders: Boolean = false,
9+
val canSelectMany: Boolean = false,
10+
val filters: Map<String, List<String>> = emptyMap(),
11+
val defaultUri: String? = null,
12+
val title: String? = null
13+
)

0 commit comments

Comments
 (0)