diff --git a/src/@types/vscode.proposed.chatContextProvider.d.ts b/src/@types/vscode.proposed.chatContextProvider.d.ts index a3b20144fa..ee971b9adb 100644 --- a/src/@types/vscode.proposed.chatContextProvider.d.ts +++ b/src/@types/vscode.proposed.chatContextProvider.d.ts @@ -39,6 +39,10 @@ declare module 'vscode' { * An optional description of the context item, e.g. to describe the item to the language model. */ modelDescription?: string; + /** + * An optional tooltip to show when hovering over the context item in the UI. + */ + tooltip?: MarkdownString; /** * The value of the context item. Can be omitted when returned from one of the `provide` methods if the provider supports `resolveChatContext`. */ diff --git a/src/extension.ts b/src/extension.ts index f99a2b30ff..a65dfd4232 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -269,9 +269,9 @@ async function init( context.subscriptions.push(issuesFeatures); await issuesFeatures.initialize(); - const pullRequestContextProvider = new PullRequestContextProvider(prsTreeModel, reposManager, git); + const pullRequestContextProvider = new PullRequestContextProvider(prsTreeModel, reposManager, git, context); vscode.chat.registerChatContextProvider({ scheme: 'webview-panel', pattern: '**/webview-PullRequestOverview**' }, 'githubpr', pullRequestContextProvider); - vscode.chat.registerChatContextProvider({ scheme: 'webview-panel', pattern: '**/webview-IssueOverview**' }, 'githubissue', new IssueContextProvider(issueStateManager, reposManager)); + vscode.chat.registerChatContextProvider({ scheme: 'webview-panel', pattern: '**/webview-IssueOverview**' }, 'githubissue', new IssueContextProvider(issueStateManager, reposManager, context)); pullRequestContextProvider.initialize(); const notificationsFeatures = new NotificationsFeatureRegister(credentialStore, reposManager, telemetry, notificationsManager); diff --git a/src/lm/issueContextProvider.ts b/src/lm/issueContextProvider.ts index 79a9689c54..83a36c5067 100644 --- a/src/lm/issueContextProvider.ts +++ b/src/lm/issueContextProvider.ts @@ -7,6 +7,7 @@ import * as vscode from 'vscode'; import { CommentEvent, EventType } from '../common/timelineEvent'; import { IssueModel } from '../github/issueModel'; import { IssueOverviewPanel } from '../github/issueOverview'; +import { issueMarkdown } from '../github/markdownUtils'; import { RepositoriesManager } from '../github/repositoriesManager'; import { getIssueNumberLabel } from '../github/utils'; import { IssueQueryResult, StateManager } from '../issues/stateManager'; @@ -23,7 +24,8 @@ export namespace IssueChatContextItem { export class IssueContextProvider implements vscode.ChatContextProvider { constructor(private readonly _stateManager: StateManager, - private readonly _reposManager: RepositoriesManager + private readonly _reposManager: RepositoriesManager, + private readonly _context: vscode.ExtensionContext ) { } async provideChatContextForResource(_options: { resource: vscode.Uri }, _token: vscode.CancellationToken): Promise { @@ -36,6 +38,7 @@ export class IssueContextProvider implements vscode.ChatContextProvider { async resolveChatContext(context: IssueChatContextItem, _token: vscode.CancellationToken): Promise { context.value = await this._resolvedIssueValue(context.issue); context.modelDescription = 'All the information about the GitHub issue the user is viewing, including comments.'; + context.tooltip = await issueMarkdown(context.issue, this._context, this._reposManager); return context; } @@ -71,6 +74,7 @@ export class IssueContextProvider implements vscode.ChatContextProvider { icon: new vscode.ThemeIcon('issues'), label: `#${issue.number} ${issue.title}`, modelDescription: 'The GitHub issue the user is viewing.', + tooltip: new vscode.MarkdownString(`#${issue.number} ${issue.title}`), issue, command: { command: 'issue.openDescription', diff --git a/src/lm/pullRequestContextProvider.ts b/src/lm/pullRequestContextProvider.ts index d311bf6611..f8963f5229 100644 --- a/src/lm/pullRequestContextProvider.ts +++ b/src/lm/pullRequestContextProvider.ts @@ -7,6 +7,7 @@ import * as vscode from 'vscode'; import { GitApiImpl } from '../api/api1'; import { Disposable } from '../common/lifecycle'; import { onceEvent } from '../common/utils'; +import { issueMarkdown } from '../github/markdownUtils'; import { PullRequestModel } from '../github/pullRequestModel'; import { PullRequestOverviewPanel } from '../github/pullRequestOverview'; import { RepositoriesManager } from '../github/repositoriesManager'; @@ -28,7 +29,8 @@ export class PullRequestContextProvider extends Disposable implements vscode.Cha constructor(private readonly _prsTreeModel: PrsTreeModel, private readonly _reposManager: RepositoriesManager, - private readonly _git: GitApiImpl + private readonly _git: GitApiImpl, + private readonly _context: vscode.ExtensionContext ) { super(); } @@ -102,6 +104,7 @@ Active pull request (may not be the same as open pull request): ${folderManager. } context.value = await this._resolvedPrValue(context.pr); context.modelDescription = 'All the information about the GitHub pull request the user is viewing, including comments, review threads, and changes.'; + context.tooltip = await issueMarkdown(context.pr, this._context, this._reposManager); return context; } @@ -117,6 +120,7 @@ Active pull request (may not be the same as open pull request): ${folderManager. icon: new vscode.ThemeIcon('git-pull-request'), label: `#${pr.number} ${pr.title}`, modelDescription: 'The GitHub pull request the user is viewing.', + tooltip: new vscode.MarkdownString(`#${pr.number} ${pr.title}`), pr, command: { command: 'pr.openDescription',