diff --git a/.github/instructions/api-version.instructions.md b/.github/instructions/api-version.instructions.md deleted file mode 100644 index a109edad415235..00000000000000 --- a/.github/instructions/api-version.instructions.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: Read this when changing proposed API in vscode.proposed.*.d.ts files. -applyTo: 'src/vscode-dts/**/vscode.proposed.*.d.ts' ---- - -The following is only useful for proposed API related to chat and languageModel proposals. It's optional for other proposed API, and not recommended. - -When a proposed API is changed in a non-backwards-compatible way, the version number at the top of the file must be incremented. If it doesn't have a version number, we must add one. The format of the number like this: - -``` -// version: 1 -``` - -No semver, just a basic incrementing integer. See existing examples in `vscode.proposed.chatParticipantPrivate.d.ts` (version 12), `vscode.proposed.chatProvider.d.ts` (version 4), and other chat/languageModel proposals. The corresponding version number in the extension's package.json must be incremented to match (you could remind the user of this if you don't have access to the extension code yourself). - -An example of a non-backwards-compatible change is removing a non-optional property or changing the type to one that is incompatible with the previous type. - -An example of a backwards-compatible change is an additive change or deleting a property that was already optional. - -Whenever possible, make a backwards-compatible change! diff --git a/.github/workflows/api-proposal-version-check.yml b/.github/workflows/api-proposal-version-check.yml deleted file mode 100644 index 4e4dc4e8149963..00000000000000 --- a/.github/workflows/api-proposal-version-check.yml +++ /dev/null @@ -1,298 +0,0 @@ -name: API Proposal Version Check - -on: - pull_request: - branches: - - main - - 'release/*' - paths: - - 'src/vscode-dts/vscode.proposed.*.d.ts' - issue_comment: - types: [created] - -permissions: - contents: read - pull-requests: write - actions: write - -concurrency: - group: api-proposal-${{ github.event.pull_request.number || github.event.issue.number }} - cancel-in-progress: true - -jobs: - check-version-changes: - name: Check API Proposal Version Changes - # Run on PR events, or on issue_comment if it's on a PR and contains the override command - if: | - github.event_name == 'pull_request' || - (github.event_name == 'issue_comment' && - github.event.issue.pull_request && - contains(github.event.comment.body, '/api-proposal-change-required') && - (github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'COLLABORATOR')) - runs-on: ubuntu-latest - steps: - - name: Get PR info - id: pr_info - uses: actions/github-script@v9 - with: - script: | - let prNumber, headSha, baseSha; - - if (context.eventName === 'pull_request') { - prNumber = context.payload.pull_request.number; - headSha = context.payload.pull_request.head.sha; - baseSha = context.payload.pull_request.base.sha; - } else { - // issue_comment event - need to fetch PR details - prNumber = context.payload.issue.number; - const { data: pr } = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber - }); - headSha = pr.head.sha; - baseSha = pr.base.sha; - } - - core.setOutput('number', prNumber); - core.setOutput('head_sha', headSha); - core.setOutput('base_sha', baseSha); - - - name: Check for override comment - id: check_override - uses: actions/github-script@v9 - with: - script: | - const prNumber = ${{ steps.pr_info.outputs.number }}; - const { data: comments } = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber - }); - - // Only accept overrides from trusted users (repo members/collaborators) - const trustedAssociations = ['OWNER', 'MEMBER', 'COLLABORATOR']; - let overrideComment = null; - const untrustedOverrides = []; - - comments.forEach((comment, index) => { - const hasOverrideText = comment.body.includes('/api-proposal-change-required'); - const isTrusted = trustedAssociations.includes(comment.author_association); - console.log(`Comment ${index + 1}:`); - console.log(` Author: ${comment.user.login}`); - console.log(` Author association: ${comment.author_association}`); - console.log(` Created at: ${comment.created_at}`); - console.log(` Contains override command: ${hasOverrideText}`); - console.log(` Author is trusted: ${isTrusted}`); - console.log(` Would be valid override: ${hasOverrideText && isTrusted}`); - - if (hasOverrideText) { - if (isTrusted && !overrideComment) { - overrideComment = comment; - } else if (!isTrusted) { - untrustedOverrides.push(comment); - } - } - }); - - if (overrideComment) { - console.log(`✅ Override comment FOUND`); - console.log(` Comment ID: ${overrideComment.id}`); - console.log(` Author: ${overrideComment.user.login}`); - console.log(` Association: ${overrideComment.author_association}`); - console.log(` Created at: ${overrideComment.created_at}`); - core.setOutput('override_found', 'true'); - core.setOutput('override_user', overrideComment.user.login); - } else { - if (untrustedOverrides.length > 0) { - console.log(`⚠️ Found ${untrustedOverrides.length} override comment(s) from UNTRUSTED user(s):`); - untrustedOverrides.forEach((comment, index) => { - console.log(` Untrusted override ${index + 1}:`); - console.log(` Author: ${comment.user.login}`); - console.log(` Association: ${comment.author_association}`); - console.log(` Created at: ${comment.created_at}`); - console.log(` Comment ID: ${comment.id}`); - }); - console.log(` Trusted associations are: ${trustedAssociations.join(', ')}`); - } - console.log('❌ No valid override comment found'); - core.setOutput('override_found', 'false'); - } - - # If triggered by the override comment, re-run the failed workflow to update its status - # Only allow trusted users to trigger re-runs to prevent spam - - name: Re-run failed workflow on override - if: | - steps.check_override.outputs.override_found == 'true' && - github.event_name == 'issue_comment' && - (github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'COLLABORATOR') - uses: actions/github-script@v9 - with: - script: | - const headSha = '${{ steps.pr_info.outputs.head_sha }}'; - console.log(`Override comment found by ${{ steps.check_override.outputs.override_user }}`); - console.log('API proposal version change has been acknowledged.'); - - // Find the failed workflow run for this PR's head SHA - const { data: runs } = await github.rest.actions.listWorkflowRuns({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'api-proposal-version-check.yml', - head_sha: headSha, - status: 'completed', - per_page: 10 - }); - - // Find the most recent failed run - const failedRun = runs.workflow_runs.find(run => - run.conclusion === 'failure' && run.event === 'pull_request' - ); - - if (failedRun) { - console.log(`Re-running failed workflow run ${failedRun.id}`); - await github.rest.actions.reRunWorkflow({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: failedRun.id - }); - console.log('Workflow re-run triggered successfully'); - } else { - console.log('No failed pull_request workflow run found to re-run'); - // The check will pass on this run since override exists - } - - - name: Pass on override comment - if: steps.check_override.outputs.override_found == 'true' - run: | - echo "Override comment found by ${{ steps.check_override.outputs.override_user }}" - echo "API proposal version change has been acknowledged." - - # Only continue checking if no override found - - name: Checkout repository - if: steps.check_override.outputs.override_found != 'true' - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Check for version changes - if: steps.check_override.outputs.override_found != 'true' - id: version_check - env: - HEAD_SHA: ${{ steps.pr_info.outputs.head_sha }} - BASE_SHA: ${{ steps.pr_info.outputs.base_sha }} - run: | - set -e - - # Use merge-base to get accurate diff of what the PR actually changes - MERGE_BASE=$(git merge-base "$BASE_SHA" "$HEAD_SHA") - echo "Merge base: $MERGE_BASE" - - # Get the list of changed proposed API files (diff against merge-base) - CHANGED_FILES=$(git diff --name-only "$MERGE_BASE" "$HEAD_SHA" -- 'src/vscode-dts/vscode.proposed.*.d.ts' || true) - - if [ -z "$CHANGED_FILES" ]; then - echo "No proposed API files changed" - echo "version_changed=false" >> $GITHUB_OUTPUT - exit 0 - fi - - echo "Changed proposed API files:" - echo "$CHANGED_FILES" - - VERSION_CHANGED="false" - CHANGED_LIST="" - - for FILE in $CHANGED_FILES; do - # Check if file exists in head - if ! git cat-file -e "$HEAD_SHA:$FILE" 2>/dev/null; then - echo "File $FILE was deleted, skipping version check" - continue - fi - - # Get version from head (current PR) - HEAD_VERSION=$(git show "$HEAD_SHA:$FILE" | grep -E '^// version: [0-9]+' | sed 's/.*version: //' || echo "") - - # Get version from merge-base (what the PR is based on) - BASE_VERSION=$(git show "$MERGE_BASE:$FILE" 2>/dev/null | grep -E '^// version: [0-9]+' | sed 's/.*version: //' || echo "") - - echo "File: $FILE" - echo " Base version: ${BASE_VERSION:-'(none)'}" - echo " Head version: ${HEAD_VERSION:-'(none)'}" - - # Check if version was added or changed - if [ -n "$HEAD_VERSION" ] && [ "$HEAD_VERSION" != "$BASE_VERSION" ]; then - echo " -> Version changed!" - VERSION_CHANGED="true" - FILENAME=$(basename "$FILE") - if [ -n "$CHANGED_LIST" ]; then - CHANGED_LIST="$CHANGED_LIST, $FILENAME" - else - CHANGED_LIST="$FILENAME" - fi - fi - done - - echo "version_changed=$VERSION_CHANGED" >> $GITHUB_OUTPUT - echo "changed_files=$CHANGED_LIST" >> $GITHUB_OUTPUT - - - name: Post warning comment - if: steps.check_override.outputs.override_found != 'true' && steps.version_check.outputs.version_changed == 'true' - uses: actions/github-script@v9 - with: - script: | - const prNumber = ${{ steps.pr_info.outputs.number }}; - const changedFiles = '${{ steps.version_check.outputs.changed_files }}'; - - // Check if we already posted a warning comment - const { data: comments } = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber - }); - - const marker = ''; - const existingComment = comments.find(comment => - comment.body.includes(marker) - ); - - const body = `${marker} - ## ⚠️ API Proposal Version Change Detected - - The following proposed API files have version changes: **${changedFiles}** - - API proposal version changes should only be used when maintaining compatibility is not possible. Consider keeping the version as is and maintaining backward compatibility. - - **Any version changes must be adopted by the consuming extensions before the next insiders for the extension to work.** - - --- - - If the version change is required, comment \`/api-proposal-change-required\` to unblock this check and acknowledge that you will update any critical consuming extensions (Copilot Chat).`; - - if (existingComment) { - await github.rest.issues.updateComment({ - owner: context.repo.owner, - repo: context.repo.repo, - comment_id: existingComment.id, - body: body - }); - console.log('Updated existing warning comment'); - } else { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber, - body: body - }); - console.log('Posted new warning comment'); - } - - - name: Fail if version changed without override - if: steps.check_override.outputs.override_found != 'true' && steps.version_check.outputs.version_changed == 'true' - run: | - echo "::error::API proposal version changed in: ${{ steps.version_check.outputs.changed_files }}" - echo "To unblock, comment '/api-proposal-change-required' on the PR." - exit 1 diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index bfeffc48d530e8..742c7cc68ed26c 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -292,8 +292,7 @@ function generateApiProposalNames() { } const pattern = /vscode\.proposed\.([a-zA-Z\d]+)\.d\.ts$/; - const versionPattern = /^\s*\/\/\s*version\s*:\s*(\d+)\s*$/mi; - const proposals = new Map(); + const proposals = new Map(); const input = es.through(); const output = input @@ -308,13 +307,8 @@ function generateApiProposalNames() { const proposalName = match[1]; - const contents = f.contents!.toString('utf8'); - const versionMatch = versionPattern.exec(contents); - const version = versionMatch ? versionMatch[1] : undefined; - proposals.set(proposalName, { proposal: `https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${proposalName}.d.ts`, - version: version ? parseInt(version) : undefined }); }, function () { const names = [...proposals.keys()].sort(); @@ -329,10 +323,10 @@ function generateApiProposalNames() { 'const _allApiProposals = {', `${names.map(proposalName => { const proposal = proposals.get(proposalName)!; - return `\t${proposalName}: {${eol}\t\tproposal: '${proposal.proposal}',${eol}${proposal.version ? `\t\tversion: ${proposal.version}${eol}` : ''}\t}`; + return `\t${proposalName}: {${eol}\t\tproposal: '${proposal.proposal}',${eol}\t}`; }).join(`,${eol}`)}`, '};', - 'export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>(_allApiProposals);', + 'export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string }> }>(_allApiProposals);', 'export type ApiProposalName = keyof typeof _allApiProposals;', '', ].join(eol); diff --git a/extensions/copilot/CONTRIBUTING.md b/extensions/copilot/CONTRIBUTING.md index 128b5d08a3a5cb..9ca0d5a8261b40 100644 --- a/extensions/copilot/CONTRIBUTING.md +++ b/extensions/copilot/CONTRIBUTING.md @@ -308,26 +308,17 @@ The view also has entries for tool calls on their own, and a prompt-tsx debug vi ## API updates -When updating VS Code proposed extension API that is used by the extension, we have two tools to make sure that the version of the extension that gets installed will be compatible with the version of VS Code: the `engines.vscode` field in `package.json`, and the proposed API version. +When updating VS Code proposed extension API that is used by the extension, the `engines.vscode` field in `package.json` is used to make sure that the version of the extension that gets installed will be compatible with the version of VS Code. -### Making breaking changes to API +### Updating to the latest API -When making a change to the proposed API that breaks backwards compatibility, you MUST update the API version of the proposal. This is declared in a comment at the top of the proposal .d.ts, and gets automatically updated in `extensionsApiProposals.ts` by the build task. Example: https://github.com/microsoft/vscode/blob/93a7382ecd63439a5bc507ef60e57610845ec05d/src/vscode-dts/vscode.proposed.lmTools.d.ts#L6. +When adopting any change to a proposed API (whether backwards-compatible or not), you must update the date part of the `engines.vscode` field in `package.json`. For example, `"vscode": "^1.91.0-20240624"`. This ensures that the extension will only be installed and activated in a version of VS Code that supports the new API. -Then, you must adopt this change in the extension and declare that the extension supports this version of the API in `package.json`'s `enabledApiProposals`, like `lmTools@2`. This will ensure that the extension will only be installed and activated in a version of VS Code that supports the same version of the API. +You must adopt API changes in the extension at the same time as they're made in VS Code, otherwise the next day's Insiders build won't have a compatible Copilot Chat extension available. -And, you must adopt this change in the extension at the same time as it's made in VS Code, otherwise the next day's Insiders build won't have a compatible Copilot Chat extension available. - -Examples of changes that break backwards compatibility: +Examples of API changes: - Renaming a method that is used by the extension - Changing the parameters that an existing method takes -- Adding a required static contribution point for a proposal that the extension already uses - -### Making additive changes to API - -When making a change to proposed API that adds a new feature but doesn't break backwards compatibility, you don't have to update the API version, because an older version of the extension will still work with the new VS Code build. But, once you adopt that new API, you must update the date part of the `engines.vscode` field in `package.json`. For example, `"vscode": "^1.91.0-20240624"`. This ensures that the extension will only be installed and activated in a version of VS Code that supports the new API. - -Examples of additive changes - Adding a new response type to `ChatResponseStream` - Adding a new API proposal - Adding a new method to an existing interface diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts index 00b153a44ab0ae..a6ab287ab5f0c4 100644 --- a/extensions/extension-editing/src/extensionLinter.ts +++ b/extensions/extension-editing/src/extensionLinter.ts @@ -33,6 +33,7 @@ const dataUrlsNotValid = l10n.t("Data URLs are not a valid image source."); const relativeUrlRequiresHttpsRepository = l10n.t("Relative image URLs require a repository with HTTPS protocol to be specified in the package.json."); const relativeBadgeUrlRequiresHttpsRepository = l10n.t("Relative badge URLs require a repository with HTTPS protocol to be specified in this package.json."); const apiProposalNotListed = l10n.t("This proposal cannot be used because for this extension the product defines a fixed set of API proposals. You can test your extension but before publishing you MUST reach out to the VS Code team."); +const apiProposalVersionNotSupported = l10n.t("API proposal versions are no longer supported. Remove the '@' suffix."); const starActivation = l10n.t("Using '*' activation is usually a bad idea as it impacts performance."); const parsingErrorHeader = l10n.t("Error parsing the when-clause:"); @@ -144,6 +145,18 @@ export class ExtensionLinter { const publisher = findNodeAtLocation(tree, ['publisher']); const name = findNodeAtLocation(tree, ['name']); const enabledApiProposals = findNodeAtLocation(tree, ['enabledApiProposals']); + if (enabledApiProposals?.type === 'array' && enabledApiProposals.children) { + for (const child of enabledApiProposals.children) { + const proposalName = child.type === 'string' ? getNodeValue(child) : undefined; + if (typeof proposalName === 'string' && proposalName.includes('@')) { + const atIndex = proposalName.indexOf('@'); + // child.offset points at the opening quote; +1 for the quote, +atIndex to reach '@' + const start = document.positionAt(child.offset + 1 + atIndex); + const end = document.positionAt(child.offset + child.length - 1); + diagnostics.push(new Diagnostic(new Range(start, end), apiProposalVersionNotSupported, DiagnosticSeverity.Warning)); + } + } + } if (publisher?.type === 'string' && name?.type === 'string' && enabledApiProposals?.type === 'array') { const extensionId = `${getNodeValue(publisher)}.${getNodeValue(name)}`; const effectiveProposalNames = extensionEnabledApiProposals[extensionId]; diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index fa9431d7e77084..5a1a2018592493 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -223,7 +223,6 @@ export interface IProductConfiguration { readonly extensionPointExtensionKind?: { readonly [extensionPointId: string]: ('ui' | 'workspace' | 'web')[] }; readonly extensionSyncedKeys?: { readonly [extensionId: string]: string[] }; - readonly extensionsEnabledWithApiProposalVersion?: string[]; readonly extensionEnabledApiProposals?: { readonly [extensionId: string]: string[] }; readonly extensionUntrustedWorkspaceSupport?: { readonly [extensionId: string]: ExtensionUntrustedWorkspaceSupport }; readonly extensionVirtualWorkspacesSupport?: { readonly [extensionId: string]: ExtensionVirtualWorkspaceSupport }; diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 1089ffb25bce02..e506b83187c666 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -26,7 +26,6 @@ import { } from './extensionManagement.js'; import { areSameExtensions, ExtensionKey, getGalleryExtensionId, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, isMalicious } from './extensionManagementUtil.js'; import { ExtensionType, IExtensionManifest, isApplicationScopedExtension, TargetPlatform } from '../../extensions/common/extensions.js'; -import { areApiProposalsCompatible } from '../../extensions/common/extensionValidator.js'; import { ILogService } from '../../log/common/log.js'; import { IProductService } from '../../product/common/productService.js'; import { ITelemetryService } from '../../telemetry/common/telemetry.js'; @@ -727,10 +726,6 @@ export abstract class AbstractExtensionManagementService extends CommontExtensio compatibleExtension = await this.getCompatibleVersion(extension, sameVersion, installPreRelease, productVersion); if (!compatibleExtension) { - const incompatibleApiProposalsMessages: string[] = []; - if (!areApiProposalsCompatible(extension.properties.enabledApiProposals ?? [], incompatibleApiProposalsMessages)) { - throw new ExtensionManagementError(nls.localize('incompatibleAPI', "Can't install '{0}' extension. {1}", extension.displayName ?? extension.identifier.id, incompatibleApiProposalsMessages[0]), ExtensionManagementErrorCode.IncompatibleApi); - } /** If no compatible release version is found, check if the extension has a release version or not and throw relevant error */ if (!installPreRelease && extension.hasPreReleaseVersion && extension.properties.isPreReleaseVersion && (await this.galleryService.getExtensions([extension.identifier], CancellationToken.None))[0]) { throw new ExtensionManagementError(nls.localize('notFoundReleaseExtension', "Can't install release version of '{0}' extension because it has no release version.", extension.displayName ?? extension.identifier.id), ExtensionManagementErrorCode.ReleaseVersionNotFound); diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index a87ed6646f43fc..a48e462942083d 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -19,7 +19,7 @@ import { IEnvironmentService } from '../../environment/common/environment.js'; import { getTargetPlatform, IExtensionGalleryService, IExtensionIdentifier, IExtensionInfo, IGalleryExtension, IGalleryExtensionAsset, IGalleryExtensionAssets, IGalleryExtensionVersion, InstallOperation, IQueryOptions, IExtensionsControlManifest, isNotWebExtensionInWebTargetPlatform, isTargetPlatformCompatible, ITranslation, SortOrder, StatisticType, toTargetPlatform, WEB_EXTENSION_TAG, IExtensionQueryOptions, IDeprecationInfo, ISearchPrefferedResults, ExtensionGalleryError, ExtensionGalleryErrorCode, IProductVersion, IAllowedExtensionsService, EXTENSION_IDENTIFIER_REGEX, SortBy, FilterType, MaliciousExtensionInfo, ExtensionRequestsTimeoutConfigKey } from './extensionManagement.js'; import { adoptToGalleryExtensionId, areSameExtensions, getGalleryExtensionId, getGalleryExtensionTelemetryData } from './extensionManagementUtil.js'; import { IExtensionManifest, TargetPlatform } from '../../extensions/common/extensions.js'; -import { areApiProposalsCompatible, isEngineValid } from '../../extensions/common/extensionValidator.js'; +import { isEngineValid } from '../../extensions/common/extensionValidator.js'; import { IFileService } from '../../files/common/files.js'; import { ILogService } from '../../log/common/log.js'; import { IProductService } from '../../product/common/productService.js'; @@ -609,7 +609,6 @@ export abstract class AbstractExtensionGalleryService implements IExtensionGalle private readonly unpkgResourceApi: string | undefined; private readonly commonHeadersPromise: Promise; - private readonly extensionsEnabledWithApiProposalVersion: string[]; constructor( storageService: IStorageService | undefined, @@ -625,7 +624,6 @@ export abstract class AbstractExtensionGalleryService implements IExtensionGalle ) { this.extensionsControlUrl = productService.extensionsGallery?.controlUrl; this.unpkgResourceApi = productService.extensionsGallery?.extensionUrlTemplate; - this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; this.commonHeadersPromise = resolveMarketplaceHeaders( productService.version, productService, @@ -1033,10 +1031,6 @@ export abstract class AbstractExtensionGalleryService implements IExtensionGalle return false; } - if (!this.areApiProposalsCompatible(extension.id, extension.enabledApiProposals)) { - return false; - } - if (!(await this.isEngineValid(extension.id, extension.version, extension.engine, extension.manifestAsset, productVersion))) { return false; } @@ -1045,16 +1039,6 @@ export abstract class AbstractExtensionGalleryService implements IExtensionGalle return true; } - private areApiProposalsCompatible(extensionId: string, enabledApiProposals: string[] | undefined): boolean { - if (!enabledApiProposals) { - return true; - } - if (!this.extensionsEnabledWithApiProposalVersion.includes(extensionId.toLowerCase())) { - return true; - } - return areApiProposalsCompatible(enabledApiProposals); - } - private async isEngineValid(extensionId: string, version: string, engine: string | undefined, manifestAsset: IGalleryExtensionAsset | null, productVersion: IProductVersion): Promise { if (!engine) { try { diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index f0d9860b0915c8..7fea8e5dc8c179 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -587,7 +587,6 @@ type NlsConfiguration = { class ExtensionsScanner extends Disposable { - private readonly extensionsEnabledWithApiProposalVersion: string[]; private readonly productQuality: string | undefined; private readonly productBuiltInExtensionsEnabledWithAutoUpdates: Set; @@ -596,11 +595,10 @@ class ExtensionsScanner extends Disposable { @IUriIdentityService protected readonly uriIdentityService: IUriIdentityService, @IFileService protected readonly fileService: IFileService, @IProductService productService: IProductService, - @IEnvironmentService private readonly environmentService: IEnvironmentService, + @IEnvironmentService environmentService: IEnvironmentService, @ILogService protected readonly logService: ILogService ) { super(); - this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; this.productQuality = productService.quality; this.productBuiltInExtensionsEnabledWithAutoUpdates = getProductBuiltInExtensionsEnabledWithAutoUpdates(productService, environmentService); } @@ -746,7 +744,7 @@ class ExtensionsScanner extends Disposable { if (input.validate) { extension = this.validate(extension, input); } - if (manifest.enabledApiProposals && (!this.environmentService.isBuilt || this.extensionsEnabledWithApiProposalVersion.includes(id.toLowerCase()))) { + if (manifest.enabledApiProposals) { manifest.originalEnabledApiProposals = manifest.enabledApiProposals; manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); } @@ -755,8 +753,7 @@ class ExtensionsScanner extends Disposable { validate(extension: IRelaxedScannedExtension, input: ExtensionScannerInput): IRelaxedScannedExtension { let isValid = extension.isValid; - const validateApiVersion = this.environmentService.isBuilt && this.extensionsEnabledWithApiProposalVersion.includes(extension.identifier.id.toLowerCase()); - const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin, validateApiVersion); + const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin); for (const [severity, message] of validations) { if (severity === Severity.Error) { isValid = false; diff --git a/src/vs/platform/extensions/common/extensionValidator.ts b/src/vs/platform/extensions/common/extensionValidator.ts index 6346b9d490cb8a..4ad52708ec39ef 100644 --- a/src/vs/platform/extensions/common/extensionValidator.ts +++ b/src/vs/platform/extensions/common/extensionValidator.ts @@ -8,8 +8,7 @@ import Severity from '../../../base/common/severity.js'; import { URI } from '../../../base/common/uri.js'; import * as nls from '../../../nls.js'; import * as semver from '../../../base/common/semver/semver.js'; -import { IExtensionManifest, parseApiProposals } from './extensions.js'; -import { allApiProposals } from './extensionsApiProposals.js'; +import { IExtensionManifest } from './extensions.js'; export interface IParsedVersion { hasCaret: boolean; @@ -240,7 +239,7 @@ export function isValidVersion(_inputVersion: string | INormalizedVersion, _inpu type ProductDate = string | Date | undefined; -export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean, validateApiVersion: boolean): readonly [Severity, string][] { +export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean): readonly [Severity, string][] { const validations: [Severity, string][] = []; if (typeof extensionManifest.publisher !== 'undefined' && typeof extensionManifest.publisher !== 'string') { validations.push([Severity.Error, nls.localize('extensionDescription.publisher', "property publisher must be of type `string`.")]); @@ -328,15 +327,6 @@ export function validateExtensionManifest(productVersion: string, productDate: P } } - if (validateApiVersion && extensionManifest.enabledApiProposals?.length) { - const incompatibleNotices: string[] = []; - if (!areApiProposalsCompatible([...extensionManifest.enabledApiProposals], incompatibleNotices)) { - for (const notice of incompatibleNotices) { - validations.push([Severity.Error, notice]); - } - } - } - return validations; } @@ -355,41 +345,6 @@ export function isEngineValid(engine: string, version: string, date: ProductDate return engine === '*' || isVersionValid(version, date, engine); } -export function areApiProposalsCompatible(apiProposals: string[]): boolean; -export function areApiProposalsCompatible(apiProposals: string[], notices: string[]): boolean; -export function areApiProposalsCompatible(apiProposals: string[], productApiProposals: Readonly<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>): boolean; -export function areApiProposalsCompatible(apiProposals: string[], arg1?: string[] | Readonly<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>): boolean { - if (apiProposals.length === 0) { - return true; - } - const notices: string[] | undefined = Array.isArray(arg1) ? arg1 : undefined; - const productApiProposals: Readonly<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }> = (Array.isArray(arg1) ? undefined : arg1) ?? allApiProposals; - const incompatibleProposals: string[] = []; - const parsedProposals = parseApiProposals(apiProposals); - for (const { proposalName, version } of parsedProposals) { - if (!version) { - continue; - } - const existingProposal = productApiProposals[proposalName]; - if (existingProposal?.version !== version) { - incompatibleProposals.push(proposalName); - } - } - if (incompatibleProposals.length) { - if (notices) { - if (incompatibleProposals.length === 1) { - notices.push(nls.localize('apiProposalMismatch1', "This extension is using the API proposal '{0}' that is not compatible with the current version of VS Code.", incompatibleProposals[0])); - } else { - notices.push(nls.localize('apiProposalMismatch2', "This extension is using the API proposals {0} and '{1}' that are not compatible with the current version of VS Code.", - incompatibleProposals.slice(0, incompatibleProposals.length - 1).map(p => `'${p}'`).join(', '), - incompatibleProposals[incompatibleProposals.length - 1])); - } - } - return false; - } - return true; -} - function isVersionValid(currentVersion: string, date: ProductDate, requestedVersion: string, notices: string[] = []): boolean { const desiredVersion = normalizeVersion(parseVersion(requestedVersion)); diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index bd90ac80c01d0b..e26d74e2e63c1b 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -547,13 +547,6 @@ export function isResolverExtension(manifest: IExtensionManifest, remoteAuthorit return false; } -export function parseApiProposals(enabledApiProposals: string[]): { proposalName: string; version?: number }[] { - return enabledApiProposals.map(proposal => { - const [proposalName, version] = proposal.split('@'); - return { proposalName, version: version ? parseInt(version) : undefined }; - }); -} - export function parseEnabledApiProposalNames(enabledApiProposals: string[]): string[] { return enabledApiProposals.map(proposal => proposal.split('@')[0]); } diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index 8bcf790a965019..7be6d6b3659722 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -23,7 +23,6 @@ const _allApiProposals = { }, aiTextSearchProvider: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.aiTextSearchProvider.d.ts', - version: 2 }, authIssuers: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authIssuers.d.ts', @@ -54,11 +53,9 @@ const _allApiProposals = { }, chatDebug: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatDebug.d.ts', - version: 4 }, chatHooks: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatHooks.d.ts', - version: 6 }, chatInputNotification: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatInputNotification.d.ts', @@ -68,19 +65,15 @@ const _allApiProposals = { }, chatParticipantAdditions: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts', - version: 3 }, chatParticipantPrivate: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts', - version: 15 }, chatPromptFiles: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatPromptFiles.d.ts', - version: 2 }, chatProvider: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatProvider.d.ts', - version: 5 }, chatReferenceBinaryData: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatReferenceBinaryData.d.ts', @@ -93,7 +86,6 @@ const _allApiProposals = { }, chatSessionsProvider: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatSessionsProvider.d.ts', - version: 3 }, chatStatusItem: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatStatusItem.d.ts', @@ -229,7 +221,6 @@ const _allApiProposals = { }, defaultChatParticipant: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.defaultChatParticipant.d.ts', - version: 4 }, devDeviceId: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.devDeviceId.d.ts', @@ -284,7 +275,6 @@ const _allApiProposals = { }, findFiles2: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.findFiles2.d.ts', - version: 2 }, findTextInFiles: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.findTextInFiles.d.ts', @@ -321,14 +311,12 @@ const _allApiProposals = { }, languageModelThinkingPart: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageModelThinkingPart.d.ts', - version: 1 }, languageModelToolResultAudience: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageModelToolResultAudience.d.ts', }, languageModelToolSupportsModel: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageModelToolSupportsModel.d.ts', - version: 1 }, languageStatusText: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageStatusText.d.ts', @@ -341,7 +329,6 @@ const _allApiProposals = { }, mcpServerDefinitions: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.mcpServerDefinitions.d.ts', - version: 1 }, mcpToolDefinitions: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.mcpToolDefinitions.d.ts', @@ -542,5 +529,5 @@ const _allApiProposals = { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.workspaceTrust.d.ts', } }; -export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>(_allApiProposals); +export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string }> }>(_allApiProposals); export type ApiProposalName = keyof typeof _allApiProposals; diff --git a/src/vs/platform/extensions/test/common/extensionValidator.test.ts b/src/vs/platform/extensions/test/common/extensionValidator.test.ts index 2c468295d28e6c..576c45fab970fc 100644 --- a/src/vs/platform/extensions/test/common/extensionValidator.test.ts +++ b/src/vs/platform/extensions/test/common/extensionValidator.test.ts @@ -5,7 +5,7 @@ import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js'; import { IExtensionManifest } from '../../common/extensions.js'; -import { areApiProposalsCompatible, INormalizedVersion, IParsedVersion, isValidExtensionVersion, isValidVersion, isValidVersionStr, normalizeVersion, parseVersion } from '../../common/extensionValidator.js'; +import { INormalizedVersion, IParsedVersion, isValidExtensionVersion, isValidVersion, isValidVersionStr, normalizeVersion, parseVersion } from '../../common/extensionValidator.js'; suite('Extension Version Validator', () => { @@ -438,21 +438,4 @@ suite('Extension Version Validator', () => { assert.strictEqual(isValidExtensionVersion('1.44.0', undefined, manifest, false, []), false); }); - test('areApiProposalsCompatible', () => { - assert.strictEqual(areApiProposalsCompatible([]), true); - assert.strictEqual(areApiProposalsCompatible([], ['hello']), true); - assert.strictEqual(areApiProposalsCompatible([], {}), true); - assert.strictEqual(areApiProposalsCompatible(['proposal1'], {}), true); - assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '' } }), true); - assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '', version: 1 } }), true); - assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 1 } }), true); - assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal2': { proposal: '' } }), true); - assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], {}), true); - assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], { 'proposal1': { proposal: '' } }), true); - - assert.strictEqual(areApiProposalsCompatible(['proposal2@1'], { 'proposal1': { proposal: '' } }), false); - assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 2 } }), false); - assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '' } }), false); - }); - }); diff --git a/src/vs/server/node/webClientServer.ts b/src/vs/server/node/webClientServer.ts index c920340ed13044..2e79a2e4c73214 100644 --- a/src/vs/server/node/webClientServer.ts +++ b/src/vs/server/node/webClientServer.ts @@ -364,12 +364,6 @@ export class WebClientServer { } : undefined }; - const proposedApi = this._environmentService.args['enable-proposed-api']; - if (proposedApi?.length) { - productConfiguration.extensionsEnabledWithApiProposalVersion ??= []; - productConfiguration.extensionsEnabledWithApiProposalVersion.push(...proposedApi); - } - if (!this._environmentService.isBuilt) { try { const productOverrides = JSON.parse((await promises.readFile(join(APP_ROOT, 'product.overrides.json'))).toString()); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index e276cb939a9b86..3c63d4fa3c8f48 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -64,7 +64,7 @@ import { IUserDataProfileService } from '../../../services/userDataProfile/commo import { mainWindow } from '../../../../base/browser/window.js'; import { IDialogService, IFileDialogService, IPromptButton } from '../../../../platform/dialogs/common/dialogs.js'; import { IUpdateService, StateType } from '../../../../platform/update/common/update.js'; -import { areApiProposalsCompatible, isEngineValid } from '../../../../platform/extensions/common/extensionValidator.js'; +import { isEngineValid } from '../../../../platform/extensions/common/extensionValidator.js'; import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js'; import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js'; import { ShowCurrentReleaseNotesActionId } from '../../update/common/update.js'; @@ -1560,7 +1560,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension const invalidExtensions = this.local.filter(e => e.enablementState === EnablementState.DisabledByInvalidExtension && !e.isWorkspaceScoped); if (invalidExtensions.length) { if (invalidExtensions.some(e => e.local && e.local.manifest.engines?.vscode && - (!isEngineValid(e.local.manifest.engines.vscode, this.productService.version, this.productService.date) || areApiProposalsCompatible([...e.local.manifest.enabledApiProposals ?? []])) + !isEngineValid(e.local.manifest.engines.vscode, this.productService.version, this.productService.date) )) { computedNotificiations.push({ message: nls.localize('incompatibleExtensions', "Some extensions are disabled due to version incompatibility. Review and update them."), diff --git a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts index 1ef848409f3c6d..f5c752b1d39923 100644 --- a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts @@ -100,7 +100,6 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten private readonly systemExtensionsCacheResource: URI | undefined = undefined; private readonly customBuiltinExtensionsCacheResource: URI | undefined = undefined; private readonly resourcesAccessQueueMap = new ResourceMap>(); - private readonly extensionsEnabledWithApiProposalVersion: string[]; constructor( @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService, @@ -125,7 +124,6 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten // Eventually update caches lifecycleService.when(LifecyclePhase.Eventually).then(() => this.updateCaches()); } - this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? []; } private _customBuiltinExtensionsInfoPromise: Promise<{ extensions: ExtensionInfo[]; extensionsToMigrate: [string, string][]; extensionLocations: URI[]; extensionGalleryResources: URI[] }> | undefined; @@ -769,8 +767,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten const uuid = (webExtension.metadata)?.id; - const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(webExtension.identifier.id.toLowerCase()); - validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false, validateApiVersion)); + validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false)); let isValid = true; for (const [severity, message] of validations) { if (severity === Severity.Error) { @@ -779,7 +776,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten } } - if (manifest.enabledApiProposals && validateApiVersion) { + if (manifest.enabledApiProposals) { manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]); } diff --git a/src/vs/workbench/services/extensionManagement/electron-browser/remoteExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/electron-browser/remoteExtensionManagementService.ts index 81a6a52a0c9fad..57e700d05e0e86 100644 --- a/src/vs/workbench/services/extensionManagement/electron-browser/remoteExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-browser/remoteExtensionManagementService.ts @@ -24,7 +24,6 @@ import { IUserDataProfilesService } from '../../../../platform/userDataProfile/c import { IUserDataProfileService } from '../../userDataProfile/common/userDataProfile.js'; import { IRemoteUserDataProfilesService } from '../../userDataProfile/common/remoteUserDataProfiles.js'; import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js'; -import { areApiProposalsCompatible } from '../../../../platform/extensions/common/extensionValidator.js'; import { isBoolean, isUndefined } from '../../../../base/common/types.js'; export class NativeRemoteExtensionManagementService extends RemoteExtensionManagementService { @@ -141,10 +140,6 @@ export class NativeRemoteExtensionManagementService extends RemoteExtensionManag } if (!compatibleExtension) { - const incompatibleApiProposalsMessages: string[] = []; - if (!areApiProposalsCompatible(extension.properties.enabledApiProposals ?? [], incompatibleApiProposalsMessages)) { - throw new ExtensionManagementError(localize('incompatibleAPI', "Can't install '{0}' extension. {1}", extension.displayName ?? extension.identifier.id, incompatibleApiProposalsMessages[0]), ExtensionManagementErrorCode.IncompatibleApi); - } /** If no compatible release version is found, check if the extension has a release version or not and throw relevant error */ if (!includePreRelease && extension.properties.isPreReleaseVersion && (await this.galleryService.getExtensions([extension.identifier], CancellationToken.None))[0]) { throw new ExtensionManagementError(localize('notFoundReleaseExtension', "Can't install release version of '{0}' extension because it has no release version.", extension.identifier.id), ExtensionManagementErrorCode.ReleaseVersionNotFound); diff --git a/src/vscode-dts/vscode.proposed.aiTextSearchProvider.d.ts b/src/vscode-dts/vscode.proposed.aiTextSearchProvider.d.ts index 46960a0b5b1c21..d82f9ecc9f45d5 100644 --- a/src/vscode-dts/vscode.proposed.aiTextSearchProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.aiTextSearchProvider.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 2 - declare module 'vscode' { /** * An AITextSearchProvider provides additional AI text search results in the workspace. diff --git a/src/vscode-dts/vscode.proposed.chatDebug.d.ts b/src/vscode-dts/vscode.proposed.chatDebug.d.ts index 42764ef956545c..367f20dd1bbb51 100644 --- a/src/vscode-dts/vscode.proposed.chatDebug.d.ts +++ b/src/vscode-dts/vscode.proposed.chatDebug.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 4 - declare module 'vscode' { /** * The severity level of a chat debug log event. diff --git a/src/vscode-dts/vscode.proposed.chatHooks.d.ts b/src/vscode-dts/vscode.proposed.chatHooks.d.ts index 85323b85156cc0..817ddd8762f4da 100644 --- a/src/vscode-dts/vscode.proposed.chatHooks.d.ts +++ b/src/vscode-dts/vscode.proposed.chatHooks.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 6 - declare module 'vscode' { /** diff --git a/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts index 40babc93433605..f399f3b4b70005 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 3 - declare module 'vscode' { export interface ChatParticipant { diff --git a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts index 9cbc18c074aaa5..ca8685d874db03 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 15 - declare module 'vscode' { /** diff --git a/src/vscode-dts/vscode.proposed.chatPromptFiles.d.ts b/src/vscode-dts/vscode.proposed.chatPromptFiles.d.ts index a712f76cab2591..eb77adbd1a1084 100644 --- a/src/vscode-dts/vscode.proposed.chatPromptFiles.d.ts +++ b/src/vscode-dts/vscode.proposed.chatPromptFiles.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 2 - declare module 'vscode' { // #region Resource Classes diff --git a/src/vscode-dts/vscode.proposed.chatProvider.d.ts b/src/vscode-dts/vscode.proposed.chatProvider.d.ts index 7f1a9e716d60ac..e391b10f79cf5f 100644 --- a/src/vscode-dts/vscode.proposed.chatProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.chatProvider.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 5 - declare module 'vscode' { /** diff --git a/src/vscode-dts/vscode.proposed.chatSessionsProvider.d.ts b/src/vscode-dts/vscode.proposed.chatSessionsProvider.d.ts index 556d4d580b25fc..6a6e761d5d92b9 100644 --- a/src/vscode-dts/vscode.proposed.chatSessionsProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.chatSessionsProvider.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 3 - declare module 'vscode' { /** * Represents the status of a chat session. diff --git a/src/vscode-dts/vscode.proposed.defaultChatParticipant.d.ts b/src/vscode-dts/vscode.proposed.defaultChatParticipant.d.ts index a4f907a116ca5f..bc7bcf72af72fc 100644 --- a/src/vscode-dts/vscode.proposed.defaultChatParticipant.d.ts +++ b/src/vscode-dts/vscode.proposed.defaultChatParticipant.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 4 - declare module 'vscode' { export interface ChatWelcomeMessageContent { diff --git a/src/vscode-dts/vscode.proposed.findFiles2.d.ts b/src/vscode-dts/vscode.proposed.findFiles2.d.ts index af324e90719cde..6b9916add122d8 100644 --- a/src/vscode-dts/vscode.proposed.findFiles2.d.ts +++ b/src/vscode-dts/vscode.proposed.findFiles2.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 2 - declare module 'vscode' { export interface FindFiles2Options { diff --git a/src/vscode-dts/vscode.proposed.languageModelThinkingPart.d.ts b/src/vscode-dts/vscode.proposed.languageModelThinkingPart.d.ts index 7c5da1aa622b43..e60cd9fe43258c 100644 --- a/src/vscode-dts/vscode.proposed.languageModelThinkingPart.d.ts +++ b/src/vscode-dts/vscode.proposed.languageModelThinkingPart.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 1 - declare module 'vscode' { /** diff --git a/src/vscode-dts/vscode.proposed.languageModelToolSupportsModel.d.ts b/src/vscode-dts/vscode.proposed.languageModelToolSupportsModel.d.ts index 7d3b546e9c2f5e..5336f6268cee06 100644 --- a/src/vscode-dts/vscode.proposed.languageModelToolSupportsModel.d.ts +++ b/src/vscode-dts/vscode.proposed.languageModelToolSupportsModel.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 1 - declare module 'vscode' { export interface LanguageModelToolDefinition extends LanguageModelToolInformation { diff --git a/src/vscode-dts/vscode.proposed.mcpServerDefinitions.d.ts b/src/vscode-dts/vscode.proposed.mcpServerDefinitions.d.ts index 855056f181e2cb..81e75fe69d74e8 100644 --- a/src/vscode-dts/vscode.proposed.mcpServerDefinitions.d.ts +++ b/src/vscode-dts/vscode.proposed.mcpServerDefinitions.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 1 - declare module 'vscode' { // https://github.com/microsoft/vscode/issues/288777 @DonJayamanne