Skip to content

Commit a3bb8ab

Browse files
authored
Merge pull request #4176 from jpinkney-aws/feature/featureDev
Amazon Q: Support feature development (/dev)
2 parents cbff757 + f1c40df commit a3bb8ab

File tree

63 files changed

+3430
-111
lines changed

Some content is hidden

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

63 files changed

+3430
-111
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Amazon Q: Support feature development (/dev)"
4+
}

.github/CODEOWNERS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
* @aws/aws-ides-team
22
codewhisperer/ @aws/codewhisperer-team
3+
amazonq/ @aws/aws-mynah
4+
amazonqFeatureDev/ @aws/earlybird
35
mynah-ui/ @aws/aws-mynah
46
codemodernizer/ @aws/elastic-gumby

plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/featureDevChatConnector.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export interface ConnectorProps {
2323
onWarning: (tabID: string, message: string, title: string) => void
2424
onUpdatePlaceholder: (tabID: string, newPlaceholder: string) => void
2525
onChatInputEnabled: (tabID: string, enabled: boolean) => void
26-
onUpdateAuthentication: (featureDevEnabled: boolean, authenticatingTabIDs: string[]) => void
26+
onUpdateAuthentication: (featureDevEnabled: boolean, gumbyEnabled: boolean, authenticatingTabIDs: string[]) => void
2727
onNewTab: (tabType: TabType) => void
2828
tabsStorage: TabsStorage
2929
}
@@ -149,6 +149,7 @@ export class Connector {
149149
filePaths: messageData.filePaths,
150150
deletedFiles: messageData.deletedFiles,
151151
},
152+
body: '',
152153
}
153154
this.onChatAnswerReceived(messageData.tabID, answer)
154155
}
@@ -213,7 +214,7 @@ export class Connector {
213214
}
214215

215216
if (messageData.type === 'authenticationUpdateMessage') {
216-
this.onUpdateAuthentication(messageData.featureDevEnabled, messageData.authenticatingTabIDs)
217+
this.onUpdateAuthentication(messageData.featureDevEnabled, messageData.gumbyEnabled, messageData.authenticatingTabIDs)
217218
return
218219
}
219220

@@ -264,4 +265,14 @@ export class Connector {
264265
tabType: 'featuredev',
265266
})
266267
}
268+
269+
onResponseBodyLinkClick = (tabID: string, messageId: string, link: string): void => {
270+
this.sendMessageToExtension({
271+
command: 'response-body-link-click',
272+
tabID,
273+
messageId,
274+
link,
275+
tabType: 'featuredev',
276+
})
277+
}
267278
}

plugins/amazonq/mynah-ui/src/mynah-ui/ui/connector.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export interface ConnectorProps {
3939
onWarning: (tabID: string, message: string, title: string) => void
4040
onUpdatePlaceholder: (tabID: string, newPlaceholder: string) => void
4141
onChatInputEnabled: (tabID: string, enabled: boolean) => void
42-
onUpdateAuthentication: (featureDevEnabled: boolean, authenticatingTabIDs: string[]) => void
42+
onUpdateAuthentication: (featureDevEnabled: boolean, gumbyEnabled: boolean, authenticatingTabIDs: string[]) => void
4343
onNewTab: (tabType: TabType) => void
4444
tabsStorage: TabsStorage
4545
}
@@ -79,6 +79,9 @@ export class Connector {
7979
case 'cwc':
8080
this.cwChatConnector.onResponseBodyLinkClick(tabID, messageId, link)
8181
break
82+
case 'featuredev':
83+
this.featureDevChatConnector.onResponseBodyLinkClick(tabID, messageId, link)
84+
break
8285
}
8386
}
8487

plugins/amazonq/mynah-ui/src/mynah-ui/ui/followUps/generator.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,6 @@ export class FollowUpGenerator {
5050
pillText: 'What are some examples?',
5151
type: 'DevExamples',
5252
},
53-
{
54-
pillText: 'Modify source folder',
55-
type: 'ModifyDefaultSourceFolder',
56-
},
5753
],
5854
}
5955
default:

plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const createMynahUI = (ideApi: any, featureDevInitEnabled: boolean, gumby
4444
// used to keep track of whether or not featureDev is enabled and has an active idC
4545
let isFeatureDevEnabled = featureDevInitEnabled
4646

47-
const isGumbyEnabled = gumbyInitEnabled
47+
let isGumbyEnabled = gumbyInitEnabled
4848

4949
const tabDataGenerator = new TabDataGenerator({
5050
isFeatureDevEnabled,
@@ -63,11 +63,14 @@ export const createMynahUI = (ideApi: any, featureDevInitEnabled: boolean, gumby
6363
// eslint-disable-next-line prefer-const
6464
connector = new Connector({
6565
tabsStorage,
66-
onUpdateAuthentication: (featureDevEnabled: boolean, authenticatingTabIDs: string[]): void => {
66+
onUpdateAuthentication: (featureDevEnabled: boolean, gumbyEnabled: boolean, authenticatingTabIDs: string[]): void => {
6767
isFeatureDevEnabled = featureDevEnabled
68+
isGumbyEnabled = gumbyEnabled
6869

6970
quickActionHandler.isFeatureDevEnabled = isFeatureDevEnabled
71+
quickActionHandler.isGumbyEnabled = isGumbyEnabled
7072
tabDataGenerator.quickActionsGenerator.isFeatureDevEnabled = isFeatureDevEnabled
73+
tabDataGenerator.quickActionsGenerator.isGumbyEnabled = isGumbyEnabled
7174

7275
// Set the new defaults for the quick action commands in all tabs now that isFeatureDevEnabled was enabled/disabled
7376
for (const tab of tabsStorage.getTabs()) {
@@ -253,7 +256,14 @@ export const createMynahUI = (ideApi: any, featureDevInitEnabled: boolean, gumby
253256

254257
mynahUI = new MynahUI({
255258
onReady: connector.uiReady,
256-
onTabAdd: connector.onTabAdd,
259+
onTabAdd: (tabID: string) => {
260+
// If featureDev or gumby has changed availability inbetween the default store settings and now
261+
// make sure to show/hide it accordingly
262+
mynahUI.updateStore(tabID, {
263+
quickActionCommands: tabDataGenerator.quickActionsGenerator.generateForTab('unknown'),
264+
})
265+
connector.onTabAdd(tabID)
266+
},
257267
onTabRemove: connector.onTabRemove,
258268
onTabChange: connector.onTabChange,
259269
onChatPrompt: (tabID: string, prompt: ChatPrompt) => {

plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export interface QuickActionGeneratorProps {
1313

1414
export class QuickActionGenerator {
1515
public isFeatureDevEnabled: boolean
16-
private isGumbyEnabled: boolean
16+
public isGumbyEnabled: boolean
1717

1818
constructor(props: QuickActionGeneratorProps) {
1919
this.isFeatureDevEnabled = props.isFeatureDevEnabled

plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export class QuickActionHandler {
2323
private tabsStorage: TabsStorage
2424
private tabDataGenerator: TabDataGenerator
2525
public isFeatureDevEnabled: boolean
26+
public isGumbyEnabled: boolean
2627

2728
constructor(props: QuickActionsHandlerProps) {
2829
this.mynahUI = props.mynahUI
@@ -33,6 +34,7 @@ export class QuickActionHandler {
3334
isGumbyEnabled: props.isGumbyEnabled,
3435
})
3536
this.isFeatureDevEnabled = props.isFeatureDevEnabled
37+
this.isGumbyEnabled = props.isGumbyEnabled
3638
}
3739

3840
public handle(chatPrompt: ChatPrompt, tabID: string) {
@@ -54,6 +56,9 @@ export class QuickActionHandler {
5456
}
5557

5658
private handleGumbyCommand(tabID: string) {
59+
if (!this.isGumbyEnabled) {
60+
return
61+
}
5762
this.connector.transform(tabID)
5863
}
5964

plugins/core/sdk-codegen/codegen-resources/codewhispererruntime/service-2.json

Lines changed: 154 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,33 @@
4747
],
4848
"idempotent":true
4949
},
50+
"CreateTaskAssistConversation": {
51+
"name": "CreateTaskAssistConversation",
52+
"http": {
53+
"method": "POST",
54+
"requestUri": "/"
55+
},
56+
"input": {
57+
"shape": "CreateTaskAssistConversationRequest"
58+
},
59+
"output": {
60+
"shape": "CreateTaskAssistConversationResponse"
61+
},
62+
"errors": [
63+
{
64+
"shape": "ThrottlingException"
65+
},
66+
{
67+
"shape": "InternalServerException"
68+
},
69+
{
70+
"shape": "ValidationException"
71+
},
72+
{
73+
"shape": "AccessDeniedException"
74+
}
75+
]
76+
},
5077
"GenerateCompletions":{
5178
"name":"GenerateCompletions",
5279
"http":{
@@ -78,6 +105,39 @@
78105
{"shape":"AccessDeniedException"}
79106
]
80107
},
108+
"GetTaskAssistCodeGeneration": {
109+
"name": "GetTaskAssistCodeGeneration",
110+
"http": {
111+
"method": "POST",
112+
"requestUri": "/"
113+
},
114+
"input": {
115+
"shape": "GetTaskAssistCodeGenerationRequest"
116+
},
117+
"output": {
118+
"shape": "GetTaskAssistCodeGenerationResponse"
119+
},
120+
"errors": [
121+
{
122+
"shape": "ThrottlingException"
123+
},
124+
{
125+
"shape": "ConflictException"
126+
},
127+
{
128+
"shape": "ResourceNotFoundException"
129+
},
130+
{
131+
"shape": "InternalServerException"
132+
},
133+
{
134+
"shape": "ValidationException"
135+
},
136+
{
137+
"shape": "AccessDeniedException"
138+
}
139+
]
140+
},
81141
"GetTransformation":{
82142
"name":"GetTransformation",
83143
"http":{
@@ -188,6 +248,23 @@
188248
],
189249
"idempotent":true
190250
},
251+
"StartTaskAssistCodeGeneration": {
252+
"name":"StartTaskAssistCodeGeneration",
253+
"http":{
254+
"method":"POST",
255+
"requestUri":"/"
256+
},
257+
"input":{"shape":"StartTaskAssistCodeGenerationRequest"},
258+
"output":{"shape":"StartTaskAssistCodeGenerationResponse"},
259+
"errors":[
260+
{"shape":"ThrottlingException"},
261+
{"shape":"ConflictException"},
262+
{"shape":"ResourceNotFoundException"},
263+
{"shape":"InternalServerException"},
264+
{"shape":"ValidationException"},
265+
{"shape":"AccessDeniedException"}
266+
]
267+
},
191268
"StartTransformation":{
192269
"name":"StartTransformation",
193270
"http":{
@@ -309,6 +386,25 @@
309386
"acceptedSnippetHasReference": { "shape": "Boolean" }
310387
}
311388
},
389+
"CreateTaskAssistConversationRequest": {
390+
"type": "structure",
391+
"members": {}
392+
},
393+
"CreateTaskAssistConversationResponse": {
394+
"type": "structure",
395+
"required": ["conversationId"],
396+
"members": {
397+
"conversationId": {
398+
"shape": "TaskAssistConversationId"
399+
}
400+
}
401+
},
402+
"TaskAssistConversationId": {
403+
"type": "string",
404+
"documentation": "<p>ID which represents a multi-turn conversation</p>",
405+
"max": 128,
406+
"min": 1
407+
},
312408
"ChatMessage":{
313409
"type":"structure",
314410
"members":{
@@ -799,6 +895,30 @@
799895
"errorMessage":{"shape":"SensitiveString"}
800896
}
801897
},
898+
"GetTaskAssistCodeGenerationRequest": {
899+
"type": "structure",
900+
"required": ["conversationId", "codeGenerationId"],
901+
"members": {
902+
"conversationId": {
903+
"shape": "ConversationId"
904+
},
905+
"codeGenerationId": {
906+
"shape": "CodeGenerationId"
907+
}
908+
}
909+
},
910+
"GetTaskAssistCodeGenerationResponse": {
911+
"type": "structure",
912+
"required": ["conversationId", "codeGenerationStatus"],
913+
"members": {
914+
"conversationId": {
915+
"shape": "ConversationId"
916+
},
917+
"codeGenerationStatus": {
918+
"shape": "CodeGenerationStatus"
919+
}
920+
}
921+
},
802922
"GetTransformationPlanRequest":{
803923
"type":"structure",
804924
"required":["transformationJobId"],
@@ -1190,6 +1310,28 @@
11901310
"max":256,
11911311
"min":1
11921312
},
1313+
"StartTaskAssistCodeGenerationRequest": {
1314+
"type":"structure",
1315+
"required":[
1316+
"conversationState",
1317+
"workspaceState"
1318+
],
1319+
"members":{
1320+
"conversationState":{"shape":"ConversationState"},
1321+
"workspaceState":{"shape":"WorkspaceState"}
1322+
}
1323+
},
1324+
"StartTaskAssistCodeGenerationResponse": {
1325+
"type":"structure",
1326+
"required":[
1327+
"conversationId",
1328+
"codeGenerationId"
1329+
],
1330+
"members":{
1331+
"conversationId":{"shape":"ConversationId"},
1332+
"codeGenerationId":{"shape": "CodeGenerationId"}
1333+
}
1334+
},
11931335
"StartTransformationRequest":{
11941336
"type":"structure",
11951337
"required":[
@@ -1508,14 +1650,23 @@
15081650
"type":"string",
15091651
"enum":["LANGUAGE_UPGRADE"]
15101652
},
1653+
"TaskAssistPlanningUploadContext": {
1654+
"type": "structure",
1655+
"required": ["conversationId"],
1656+
"members": {
1657+
"conversationId": { "shape": "ConversationId" }
1658+
}
1659+
},
15111660
"UUID":{
15121661
"type":"string",
15131662
"max":36,
15141663
"min":36
15151664
},
15161665
"UploadContext":{
15171666
"type":"structure",
1518-
"members":{},
1667+
"members":{
1668+
"taskAssistPlanningUploadContext": {"shape": "TaskAssistPlanningUploadContext"}
1669+
},
15191670
"union":true
15201671
},
15211672
"UploadId":{
@@ -1526,7 +1677,8 @@
15261677
"UploadIntent":{
15271678
"type":"string",
15281679
"enum":[
1529-
"TRANSFORMATION"
1680+
"TRANSFORMATION",
1681+
"TASK_ASSIST_PLANNING"
15301682
]
15311683
},
15321684
"UserContext":{

0 commit comments

Comments
 (0)