Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ module.exports = {
'aws-toolkits/no-console-log': 'error',
'aws-toolkits/no-json-stringify-in-log': 'error',
'aws-toolkits/no-printf-mismatch': 'error',
'aws-toolkits/no-index-import': 'error',
'no-restricted-imports': [
'error',
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type": "Bug Fix",
"description": "Amazon Q /test: Q identify active test file and infer source file for test generation."
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import {
sessionWriteFile,
assertTelemetry,
} from 'aws-core-vscode/test'
import { CurrentWsFolders, CodeGenState, FeatureDevClient, featureDevScheme } from 'aws-core-vscode/amazonqFeatureDev'
import { Messenger } from 'aws-core-vscode/amazonq'
import { FeatureDevClient, featureDevScheme, FeatureDevCodeGenState } from 'aws-core-vscode/amazonqFeatureDev'
import { Messenger, CurrentWsFolders } from 'aws-core-vscode/amazonq'
import path from 'path'
import { fs } from 'aws-core-vscode/shared'

Expand Down Expand Up @@ -75,7 +75,7 @@ describe('session', () => {
workspaceFolders,
}

const codeGenState = new CodeGenState(
const codeGenState = new FeatureDevCodeGenState(
testConfig,
[
{
Expand Down
33 changes: 33 additions & 0 deletions packages/core/src/amazonq/client/client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*!
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

import { ServiceOptions } from '../../shared/awsClientBuilder'

export abstract class FeatureClient {
public abstract getClient(options?: Partial<ServiceOptions>): Promise<any>

public abstract createConversation(): Promise<string>

public abstract createUploadUrl(
conversationId: string,
contentChecksumSha256: string,
contentLength: number,
uploadId: string
): Promise<any>

public abstract startCodeGeneration(
conversationId: string,
uploadId: string,
message: string,
intent: any,
codeGenerationId: string,
currentCodeGenerationId?: string,
intentContext?: any
): Promise<any>

public abstract getCodeGeneration(conversationId: string, codeGenerationId: string): Promise<any>

public abstract exportResultArchive(conversationId: string): Promise<any>
}
5 changes: 2 additions & 3 deletions packages/core/src/amazonq/commons/connector/baseMessenger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import { ChatItemAction, ProgressField } from '@aws/mynah-ui'
import { AuthFollowUpType, AuthMessageDataMap } from '../../../amazonq/auth/model'
import { FeatureAuthState } from '../../../codewhisperer'
import { i18n } from '../../../shared/i18n-helper'
import { CodeReference } from '../../../amazonq/webview/ui/connector'

Expand All @@ -25,9 +24,9 @@ import {
UpdatePlaceholderMessage,
UpdatePromptProgressMessage,
} from './connectorMessages'
import { FollowUpTypes } from '../types'
import { DeletedFileInfo, FollowUpTypes, NewFileInfo } from '../types'
import { messageWithConversationId } from '../../../amazonqFeatureDev/userFacingText'
import { DeletedFileInfo, NewFileInfo } from '../../../amazonqFeatureDev/types'
import { FeatureAuthState } from '../../../codewhisperer/util/authUtil'

export class Messenger {
public constructor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { MessagePublisher } from '../../messages/messagePublisher'
import { CodeReference } from '../../webview/ui/connector'
import { ChatItemAction, ProgressField, SourceLink } from '@aws/mynah-ui'
import { ChatItemType } from '../model'
import { DeletedFileInfo, NewFileInfo } from '../../../amazonqFeatureDev/types'
import { DeletedFileInfo, NewFileInfo } from '../types'
import { licenseText } from '../../../amazonqFeatureDev/constants'

class UiMessage {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import * as vscode from 'vscode'
import path from 'path'
import { Position, TextEditor, window } from 'vscode'
import { getLogger } from '../../../shared/logger'
import { getLogger } from '../../../shared/logger/logger'
import { amazonQDiffScheme, amazonQTabSuffix } from '../../../shared/constants'
import { disposeOnEditorClose } from '../../../shared/utilities/editorUtilities'
import {
Expand All @@ -15,7 +15,9 @@ import {
getIndentedCode,
getSelectionFromRange,
} from '../../../shared/utilities/textDocumentUtilities'
import { extractFileAndCodeSelectionFromMessage, fs, getErrorMsg, ToolkitError } from '../../../shared'
import { ToolkitError, getErrorMsg } from '../../../shared/errors'
import fs from '../../../shared/fs/fs'
import { extractFileAndCodeSelectionFromMessage } from '../../../shared/utilities/textUtilities'
import { UserWrittenCodeTracker } from '../../../codewhisperer/tracker/userWrittenCodeTracker'

export class ContentProvider implements vscode.TextDocumentContentProvider {
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/amazonq/commons/diff.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/

import * as vscode from 'vscode'
import { fs } from '../../shared'
import { fs } from '../../shared/fs/fs'
import { diffLines } from 'diff'

export async function openDiff(leftPath: string, rightPath: string, tabId: string, scheme: string) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@

import * as vscode from 'vscode'
import { WorkspaceFolderNotFoundError } from '../../../amazonqFeatureDev/errors'
import { VirtualFileSystem, VirtualMemoryFile } from '../../../shared'
import { CurrentWsFolders } from '../../../amazonqFeatureDev/types'
import { CurrentWsFolders } from '../types'
import { VirtualFileSystem } from '../../../shared/virtualFilesystem'
import { VirtualMemoryFile } from '../../../shared/virtualMemoryFile'

export interface SessionConfig {
// The paths on disk to where the source code lives
Expand Down
125 changes: 125 additions & 0 deletions packages/core/src/amazonq/commons/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@
* SPDX-License-Identifier: Apache-2.0
*/

import * as vscode from 'vscode'
import { VirtualFileSystem } from '../../shared/virtualFilesystem'
import type { CancellationTokenSource } from 'vscode'
import { CodeReference, UploadHistory } from '../webview/ui/connector'
import { DiffTreeFileInfo } from '../webview/ui/diffTree/types'
import { Messenger } from './connector/baseMessenger'
import { FeatureClient } from '../client/client'
import { TelemetryHelper } from '../util/telemetryHelper'

export enum FollowUpTypes {
// UnitTestGeneration
ViewDiff = 'ViewDiff',
Expand Down Expand Up @@ -39,3 +48,119 @@ export enum FollowUpTypes {
ProceedFolderSelection = 'ProceedFolderSelection',
CancelFolderSelection = 'CancelFolderSelection',
}

export type Interaction = {
// content to be sent back to the chat UI
content?: string
responseType?: LLMResponseType
}

export interface SessionStateInteraction {
nextState: SessionState | Omit<SessionState, 'uploadId'> | undefined
interaction: Interaction
currentCodeGenerationId?: string
}

export enum Intent {
DEV = 'DEV',
DOC = 'DOC',
}

export enum DevPhase {
INIT = 'Init',
APPROACH = 'Approach',
CODEGEN = 'Codegen',
}

export enum CodeGenerationStatus {
COMPLETE = 'Complete',
PREDICT_READY = 'predict-ready',
IN_PROGRESS = 'InProgress',
PREDICT_FAILED = 'predict-failed',
DEBATE_FAILED = 'debate-failed',
FAILED = 'Failed',
}

export type SessionStatePhase = DevPhase.INIT | DevPhase.CODEGEN

export type CurrentWsFolders = [vscode.WorkspaceFolder, ...vscode.WorkspaceFolder[]]

export interface SessionState {
readonly filePaths?: NewFileInfo[]
readonly deletedFiles?: DeletedFileInfo[]
readonly references?: CodeReference[]
readonly phase?: SessionStatePhase
readonly uploadId: string
readonly currentIteration?: number
currentCodeGenerationId?: string
tokenSource?: CancellationTokenSource
readonly codeGenerationId?: string
readonly tabID: string
interact(action: SessionStateAction): Promise<SessionStateInteraction>
updateWorkspaceRoot?: (workspaceRoot: string) => void
codeGenerationRemainingIterationCount?: number
codeGenerationTotalIterationCount?: number
uploadHistory?: UploadHistory
}

export interface SessionStateConfig {
workspaceRoots: string[]
workspaceFolders: CurrentWsFolders
conversationId: string
proxyClient: FeatureClient
uploadId: string
currentCodeGenerationId?: string
}

export interface SessionStateAction {
task: string
msg: string
messenger: Messenger
fs: VirtualFileSystem
telemetry: TelemetryHelper
uploadHistory?: UploadHistory
tokenSource?: CancellationTokenSource
}

export type NewFileZipContents = { zipFilePath: string; fileContent: string }
export type NewFileInfo = DiffTreeFileInfo &
NewFileZipContents & {
virtualMemoryUri: vscode.Uri
workspaceFolder: vscode.WorkspaceFolder
}

export type DeletedFileInfo = DiffTreeFileInfo & {
workspaceFolder: vscode.WorkspaceFolder
}

export interface SessionInfo {
// TODO, if it had a summarized name that was better for the UI
name?: string
history: string[]
}

export interface SessionStorage {
[key: string]: SessionInfo
}

export type LLMResponseType = 'EMPTY' | 'INVALID_STATE' | 'VALID'

export interface UpdateFilesPathsParams {
tabID: string
filePaths: NewFileInfo[]
deletedFiles: DeletedFileInfo[]
messageId: string
disableFileActions?: boolean
}

export enum MetricDataOperationName {
StartCodeGeneration = 'StartCodeGeneration',
EndCodeGeneration = 'EndCodeGeneration',
}

export enum MetricDataResult {
Success = 'Success',
Fault = 'Fault',
Error = 'Error',
LlmFailure = 'LLMFailure',
}
6 changes: 4 additions & 2 deletions packages/core/src/amazonq/explorer/amazonQChildrenNodes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ import { installAmazonQExtension } from '../../codewhisperer/commands/basicComma
import { amazonQHelpUrl } from '../../shared/constants'
import { cwTreeNodeSource } from '../../codewhisperer/commands/types'
import { VSCODE_EXTENSION_ID } from '../../shared/extensions'
import { globals, setContext } from '../../shared'
import { ExtStartUpSources, telemetry } from '../../shared/telemetry'
import globals from '../../shared/extensionGlobals'
import { setContext } from '../../shared/vscode/setContext'
import { telemetry } from '../../shared/telemetry/telemetry'
import { ExtStartUpSources } from '../../shared/telemetry/util'
import { ExtensionUse } from '../../auth/utils'

const localize = nls.loadMessageBundle()
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/amazonq/extApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
*/

import vscode from 'vscode'
import { VSCODE_EXTENSION_ID } from '../shared/utilities'
import { VSCODE_EXTENSION_ID } from '../shared/extensions'
import { SendMessageCommandOutput, SendMessageRequest } from '@amzn/amazon-q-developer-streaming-client'
import { GenerateAssistantResponseCommandOutput, GenerateAssistantResponseRequest } from '@amzn/codewhisperer-streaming'
import { FeatureAuthState } from '../codewhisperer/util/authUtil'
import { ToolkitError } from '../shared'
import { ToolkitError } from '../shared/errors'

/**
* This interface is used and exported by the amazon q extension. If you make a change here then
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/amazonq/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export { ExtensionMessage } from '../amazonq/webview/ui/commands'
export { CodeReference } from '../codewhispererChat/view/connector/connector'
export { extractAuthFollowUp } from './util/authUtils'
export { Messenger } from './commons/connector/baseMessenger'
import { FeatureContext } from '../shared'
import { FeatureContext } from '../shared/featureConfig'

/**
* main from createMynahUI is a purely browser dependency. Due to this
Expand Down
6 changes: 5 additions & 1 deletion packages/core/src/amazonq/lsp/lspClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ import {
Usage,
} from './types'
import { CodeWhispererSettings } from '../../codewhisperer/util/codewhispererSettings'
import { ResourcePaths, createServerOptions, fs, getLogger, globals } from '../../shared'
import { fs } from '../../shared/fs/fs'
import { getLogger } from '../../shared/logger/logger'
import globals from '../../shared/extensionGlobals'
import { ResourcePaths } from '../../shared/lsp/types'
import { createServerOptions } from '../../shared/lsp/utils/platform'

const localize = nls.loadMessageBundle()

Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/amazonq/lsp/lspController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import { CurrentWsFolders, collectFilesForIndex } from '../../shared/utilities/w
import { LspClient } from './lspClient'
import { RelevantTextDocument } from '@amzn/codewhisperer-streaming'
import { activate as activateLsp } from './lspClient'
import { telemetry } from '../../shared/telemetry'
import { telemetry } from '../../shared/telemetry/telemetry'
import { isCloud9 } from '../../shared/extensionUtilities'
import globals, { isWeb } from '../../shared/extensionGlobals'
import { isAmazonInternalOs } from '../../shared/vscode/env'
import { WorkspaceLSPResolver } from './workspaceInstaller'
import { lspSetupStage } from '../../shared'
import { lspSetupStage } from '../../shared/lsp/utils/setupStage'

export interface Chunk {
readonly filePath: string
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/amazonq/lsp/workspaceInstaller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import { LanguageServerResolver } from '../../shared/lsp/lspResolver'
import { Range } from 'semver'
import { getNodeExecutableName } from '../../shared/lsp/utils/platform'
import { fs } from '../../shared/fs/fs'
import { cleanLspDownloads, getLogger } from '../../shared'
import { cleanLspDownloads } from '../../shared/lsp/utils/cleanup'
import { getLogger } from '../../shared/logger/logger'

const manifestUrl = 'https://aws-toolkit-language-servers.amazonaws.com/q-context/manifest.json'
// this LSP client in Q extension is only going to work with these LSP server versions
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/amazonq/messages/chatMessageDuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
*/

import AsyncLock from 'async-lock'
import { globals } from '../../shared'
import { telemetry } from '../../shared/telemetry'
import globals from '../../shared/extensionGlobals'
import { telemetry } from '../../shared/telemetry/telemetry'
import { Event, uiEventRecorder } from '../util/eventRecorder'
import { CWCTelemetryHelper } from '../../codewhispererChat/controllers/chat/telemetryHelper'
import { TabType } from '../webview/ui/storages/tabsStorage'
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/amazonq/onboardingPage/walkthrough.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import { focusAmazonQPanel } from '../../codewhispererChat/commands/registerCommands'
import globals, { isWeb } from '../../shared/extensionGlobals'
import { VSCODE_EXTENSION_ID } from '../../shared/extensions'
import { getLogger } from '../../shared/logger'
import { getLogger } from '../../shared/logger/logger'
import { localize } from '../../shared/utilities/vsCodeUtils'
import { Commands, placeholder } from '../../shared/vscode/commands2'
import vscode from 'vscode'
Expand Down
Loading
Loading