From 24898c4fb4e37f64910b6ea91b1d1ecad9e7b761 Mon Sep 17 00:00:00 2001 From: Osvaldo Ortega Date: Thu, 14 Aug 2025 13:36:51 -0600 Subject: [PATCH] Adding description and tooltip --- .../vscode.proposed.chatSessionsProvider.d.ts | 35 +++++++++++++++++++ src/extension.ts | 2 +- src/github/copilotRemoteAgent.ts | 9 +++-- src/test/github/copilotRemoteAgent.test.ts | 2 +- src/test/view/prsTree.test.ts | 2 +- src/test/view/reviewCommentController.test.ts | 2 +- 6 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/@types/vscode.proposed.chatSessionsProvider.d.ts b/src/@types/vscode.proposed.chatSessionsProvider.d.ts index a1045ff47b..fcb48e72b8 100644 --- a/src/@types/vscode.proposed.chatSessionsProvider.d.ts +++ b/src/@types/vscode.proposed.chatSessionsProvider.d.ts @@ -4,6 +4,26 @@ *--------------------------------------------------------------------------------------------*/ declare module 'vscode' { + /** + * Represents the status of a chat session. + */ + export enum ChatSessionStatus { + /** + * The chat session failed to complete. + */ + Failed = 0, + + /** + * The chat session completed successfully. + */ + Completed = 1, + + /** + * The chat session is currently in progress. + */ + InProgress = 2 + } + /** * Provides a list of information about chat sessions. */ @@ -46,6 +66,21 @@ declare module 'vscode' { * An icon for the participant shown in UI. */ iconPath?: IconPath; + + /** + * An optional description that provides additional context about the chat session. + */ + description?: string | MarkdownString; + + /** + * An optional status indicating the current state of the session. + */ + status?: ChatSessionStatus; + + /** + * The tooltip text when you hover over this item. + */ + tooltip?: string | MarkdownString; } export interface ChatSession { diff --git a/src/extension.ts b/src/extension.ts index ad7530b15e..1465ed8995 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -410,7 +410,7 @@ async function deferredActivate(context: vscode.ExtensionContext, showPRControll Logger.debug('Creating tree view.', 'Activation'); - const copilotRemoteAgentManager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry); + const copilotRemoteAgentManager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry, context); context.subscriptions.push(copilotRemoteAgentManager); if (vscode.chat?.registerChatSessionItemProvider) { const provider = new class implements vscode.ChatSessionContentProvider, vscode.ChatSessionItemProvider { diff --git a/src/github/copilotRemoteAgent.ts b/src/github/copilotRemoteAgent.ts index 7a547069e1..cc6dd169e2 100644 --- a/src/github/copilotRemoteAgent.ts +++ b/src/github/copilotRemoteAgent.ts @@ -16,6 +16,7 @@ import { GitHubRemote } from '../common/remote'; import { CODING_AGENT, CODING_AGENT_AUTO_COMMIT_AND_PUSH } from '../common/settingKeys'; import { ITelemetry } from '../common/telemetry'; import { DataUri, toOpenPullRequestWebviewUri } from '../common/uri'; +import { dateFromNow } from '../common/utils'; import { getIconForeground, getListErrorForeground, getListWarningForeground, getNotebookStatusSuccessIconForeground } from '../view/theme'; import { IAPISessionLogs, ICopilotRemoteAgentCommandArgs, ICopilotRemoteAgentCommandResponse, OctokitCommon, RemoteAgentResult, RepoInfo } from './common'; import { ChatSessionWithPR, CopilotApi, getCopilotApi, RemoteAgentJobPayload, SessionInfo, SessionSetupStep } from './copilotApi'; @@ -26,6 +27,7 @@ import { CredentialStore } from './credentials'; import { ReposManagerState } from './folderRepositoryManager'; import { GitHubRepository } from './githubRepository'; import { GithubItemStateEnum } from './interface'; +import { issueMarkdown } from './markdownUtils'; import { PullRequestModel } from './pullRequestModel'; import { RepositoriesManager } from './repositoriesManager'; @@ -56,7 +58,7 @@ export class CopilotRemoteAgentManager extends Disposable { private readonly gitOperationsManager: GitOperationsManager; - constructor(private credentialStore: CredentialStore, public repositoriesManager: RepositoriesManager, private telemetry: ITelemetry) { + constructor(private credentialStore: CredentialStore, public repositoriesManager: RepositoriesManager, private telemetry: ITelemetry, private context: vscode.ExtensionContext) { super(); this.gitOperationsManager = new GitOperationsManager(CopilotRemoteAgentManager.ID); this._register(this.credentialStore.onDidChangeSessions((e: vscode.AuthenticationSessionsChangeEvent) => { @@ -658,11 +660,14 @@ export class CopilotRemoteAgentManager extends Disposable { }); this._register(disposable); } + const tooltip = await issueMarkdown(session, this.context, this.repositoriesManager); return { id: `${session.number}`, label: session.title || `Session ${session.number}`, iconPath: this.getIconForSession(status), - pullRequest: session + description: `${dateFromNow(session.createdAt)}`, + pullRequest: session, + tooltip, }; })); } catch (error) { diff --git a/src/test/github/copilotRemoteAgent.test.ts b/src/test/github/copilotRemoteAgent.test.ts index 225864abfa..d09c1081a7 100644 --- a/src/test/github/copilotRemoteAgent.test.ts +++ b/src/test/github/copilotRemoteAgent.test.ts @@ -62,7 +62,7 @@ describe('CopilotRemoteAgentManager', function () { mockRepo = new MockGitHubRepository(remote, credentialStore, telemetry, sinon); - manager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry); + manager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry, context); Resource.initialize(context); }); diff --git a/src/test/view/prsTree.test.ts b/src/test/view/prsTree.test.ts index 0e30360000..8889f03eaf 100644 --- a/src/test/view/prsTree.test.ts +++ b/src/test/view/prsTree.test.ts @@ -58,7 +58,7 @@ describe('GitHub Pull Requests view', function () { telemetry, ); credentialStore = new CredentialStore(telemetry, context); - copilotManager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry); + copilotManager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry, context); provider = new PullRequestsTreeDataProvider(telemetry, context, reposManager, copilotManager); createPrHelper = new CreatePullRequestHelper(); diff --git a/src/test/view/reviewCommentController.test.ts b/src/test/view/reviewCommentController.test.ts index ff6dbd17c1..17b5ef177b 100644 --- a/src/test/view/reviewCommentController.test.ts +++ b/src/test/view/reviewCommentController.test.ts @@ -78,7 +78,7 @@ describe('ReviewCommentController', function () { repository = new MockRepository(); repository.addRemote('origin', 'git@github.com:aaa/bbb'); reposManager = new RepositoriesManager(credentialStore, telemetry); - copilotManager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry); + copilotManager = new CopilotRemoteAgentManager(credentialStore, reposManager, telemetry, context); provider = new PullRequestsTreeDataProvider(telemetry, context, reposManager, copilotManager); const activePrViewCoordinator = new WebviewViewCoordinator(context); const createPrHelper = new CreatePullRequestHelper();