From b640cbe0e1bcbf1a1d3757d4c81ac88774d0ceab Mon Sep 17 00:00:00 2001 From: mrleemurray Date: Mon, 9 Feb 2026 12:17:52 +0000 Subject: [PATCH 01/51] Add support for restart required extensions in the extensions view --- .../extensions/browser/extensionsIcons.ts | 1 + .../extensions/browser/extensionsList.ts | 7 ++- .../extensions/browser/extensionsViewlet.ts | 55 ++++++++++++------- .../extensions/browser/extensionsViews.ts | 22 ++++++++ .../extensions/browser/extensionsWidgets.ts | 25 ++++++++- .../browser/extensionsWorkbenchService.ts | 30 ++++++++++ .../extensions/browser/media/extension.css | 25 ++++++++- .../browser/media/extensionsViewlet.css | 37 ++++++++++--- .../extensions/common/extensionQuery.ts | 2 +- .../contrib/extensions/common/extensions.ts | 2 + 10 files changed, 169 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts b/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts index ea1bc04ede840..b0c6042d458e9 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts @@ -38,3 +38,4 @@ export const infoIcon = registerIcon('extensions-info-message', Codicon.info, lo export const trustIcon = registerIcon('extension-workspace-trust', Codicon.shield, localize('trustIcon', 'Icon shown with a workspace trust message in the extension editor.')); export const activationTimeIcon = registerIcon('extension-activation-time', Codicon.history, localize('activationtimeIcon', 'Icon shown with a activation time message in the extension editor.')); +export const restartRequiredIcon = registerIcon('extension-restart-required', Codicon.refresh, localize('restartRequiredIcon', 'Icon shown when an extension requires a restart in the extensions view.')); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index 95226c5b08032..42134f0b6d376 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -12,9 +12,9 @@ import { IInstantiationService } from '../../../../platform/instantiation/common import { IListVirtualDelegate } from '../../../../base/browser/ui/list/list.js'; import { IPagedRenderer } from '../../../../base/browser/ui/list/listPaging.js'; import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchService, IExtensionsViewState } from '../common/extensions.js'; -import { ManageExtensionAction, ExtensionRuntimeStateAction, ExtensionStatusLabelAction, RemoteInstallAction, ExtensionStatusAction, LocalInstallAction, ButtonWithDropDownExtensionAction, InstallDropdownAction, InstallingLabelAction, ButtonWithDropdownExtensionActionViewItem, DropDownExtensionAction, WebInstallAction, MigrateDeprecatedExtensionAction, SetLanguageAction, ClearLanguageAction, UpdateAction } from './extensionsActions.js'; +import { ManageExtensionAction, ExtensionStatusLabelAction, RemoteInstallAction, ExtensionStatusAction, LocalInstallAction, ButtonWithDropDownExtensionAction, InstallDropdownAction, InstallingLabelAction, ButtonWithDropdownExtensionActionViewItem, DropDownExtensionAction, WebInstallAction, MigrateDeprecatedExtensionAction, SetLanguageAction, ClearLanguageAction, UpdateAction } from './extensionsActions.js'; import { areSameExtensions } from '../../../../platform/extensionManagement/common/extensionManagementUtil.js'; -import { RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, ExtensionPackCountWidget as ExtensionPackBadgeWidget, SyncIgnoredWidget, ExtensionHoverWidget, ExtensionRuntimeStatusWidget, PreReleaseBookmarkWidget, PublisherWidget, ExtensionKindIndicatorWidget, ExtensionIconWidget } from './extensionsWidgets.js'; +import { RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, ExtensionPackCountWidget as ExtensionPackBadgeWidget, SyncIgnoredWidget, ExtensionHoverWidget, ExtensionRuntimeStatusWidget, ExtensionRestartRequiredWidget, PreReleaseBookmarkWidget, PublisherWidget, ExtensionKindIndicatorWidget, ExtensionIconWidget } from './extensionsWidgets.js'; import { IExtensionService } from '../../../services/extensions/common/extensions.js'; import { IWorkbenchExtensionEnablementService } from '../../../services/extensionManagement/common/extensionManagement.js'; import { INotificationService } from '../../../../platform/notification/common/notification.js'; @@ -79,6 +79,7 @@ export class Renderer implements IPagedRenderer { const headerContainer = append(details, $('.header-container')); const header = append(headerContainer, $('.header')); const name = append(header, $('span.name')); + const restartRequired = append(header, $('span.restart-required')); const installCount = append(header, $('span.install-count')); const ratings = append(header, $('span.ratings')); const syncIgnore = append(header, $('span.sync-ignored')); @@ -115,7 +116,6 @@ export class Renderer implements IPagedRenderer { const actions = [ this.instantiationService.createInstance(ExtensionStatusLabelAction), this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, true), - this.instantiationService.createInstance(ExtensionRuntimeStateAction), this.instantiationService.createInstance(UpdateAction, false), this.instantiationService.createInstance(InstallDropdownAction), this.instantiationService.createInstance(InstallingLabelAction), @@ -138,6 +138,7 @@ export class Renderer implements IPagedRenderer { publisherWidget, extensionHoverWidget, this.instantiationService.createInstance(SyncIgnoredWidget, syncIgnore), + this.instantiationService.createInstance(ExtensionRestartRequiredWidget, restartRequired), this.instantiationService.createInstance(ExtensionRuntimeStatusWidget, this.extensionViewState, activationStatus), this.instantiationService.createInstance(InstallCountWidget, installCount, true), this.instantiationService.createInstance(RatingsWidget, ratings, true), diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index ae4fdd99cc5ad..4612c9570094a 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -64,12 +64,9 @@ import { createActionViewItem } from '../../../../platform/actions/browser/menuE import { SeverityIcon } from '../../../../base/browser/ui/severityIcon/severityIcon.js'; import { StandardKeyboardEvent } from '../../../../base/browser/keyboardEvent.js'; import { KeyCode } from '../../../../base/common/keyCodes.js'; -import { ThemeIcon } from '../../../../base/common/themables.js'; -import { Codicon } from '../../../../base/common/codicons.js'; import { IExtensionGalleryManifest, IExtensionGalleryManifestService, ExtensionGalleryManifestStatus } from '../../../../platform/extensionManagement/common/extensionGalleryManifest.js'; import { URI } from '../../../../base/common/uri.js'; import { DEFAULT_ACCOUNT_SIGN_IN_COMMAND } from '../../../services/accounts/browser/defaultAccount.js'; -import { IHoverService } from '../../../../platform/hover/browser/hover.js'; export const ExtensionsSortByContext = new RawContextKey('extensionsSortByValue', ''); export const SearchMarketplaceExtensionsContext = new RawContextKey('searchMarketplaceExtensions', false); @@ -86,6 +83,7 @@ export const BuiltInExtensionsContext = new RawContextKey('builtInExten const SearchBuiltInExtensionsContext = new RawContextKey('searchBuiltInExtensions', false); const SearchUnsupportedWorkspaceExtensionsContext = new RawContextKey('searchUnsupportedWorkspaceExtensions', false); const SearchDeprecatedExtensionsContext = new RawContextKey('searchDeprecatedExtensions', false); +const SearchRestartRequiredExtensionsContext = new RawContextKey('searchRestartRequiredExtensions', false); export const RecommendedExtensionsContext = new RawContextKey('recommendedExtensions', false); const SortByUpdateDateContext = new RawContextKey('sortByUpdateDate', false); export const ExtensionsSearchValueContext = new RawContextKey('extensionsSearchValue', ''); @@ -505,6 +503,13 @@ export class ExtensionsViewletViewsContribution extends Disposable implements IW when: ContextKeyExpr.and(SearchDeprecatedExtensionsContext), }); + viewDescriptors.push({ + id: 'workbench.views.extensions.restartRequired', + name: localize2('restart required', "Restart Required"), + ctorDescriptor: new SyncDescriptor(ExtensionsListView, [{}]), + when: ContextKeyExpr.and(SearchRestartRequiredExtensionsContext), + }); + return viewDescriptors; } @@ -531,6 +536,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer; private readonly searchWorkspaceUnsupportedExtensionsContextKey: IContextKey; private readonly searchDeprecatedExtensionsContextKey: IContextKey; + private readonly searchRestartRequiredExtensionsContextKey: IContextKey; private readonly recommendedExtensionsContextKey: IContextKey; private searchDelayer: Delayer; @@ -563,7 +569,6 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer `@id:${extension.identifier.id}`).join(' '); + const query = status?.query ?? status?.extensions.map(extension => `@id:${extension.identifier.id}`).join(' '); if (status && (query === this.searchBox?.getValue() || !this.searchMarketplaceExtensionsContextKey.get())) { this.notificationContainer.setAttribute('aria-label', status.message); this.notificationContainer.classList.remove('hidden'); const messageContainer = append(this.notificationContainer, $('.message-container')); append(messageContainer, $('span')).className = SeverityIcon.className(status.severity); - append(messageContainer, $('span.message', undefined, status.message)); - const showAction = append(messageContainer, + const messageText = append(messageContainer, $('span.message-text')); + append(messageText, $('span.message', undefined, status.message)); + const showAction = append(messageText, $('span.message-text-action', { 'tabindex': '0', 'role': 'button', @@ -781,24 +788,29 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer status.action!.run())); + this.notificationDisposables.value.add(addDisposableListener(actionButton, EventType.KEY_DOWN, (e: KeyboardEvent) => { + const standardKeyboardEvent = new StandardKeyboardEvent(e); + if (standardKeyboardEvent.keyCode === KeyCode.Enter || standardKeyboardEvent.keyCode === KeyCode.Space) { + status.action!.run(); + } + standardKeyboardEvent.stopPropagation(); })); - this.notificationDisposables.value.add(this.hoverService.setupDelayedHover(dismissAction, { content: localize('dismiss hover', "Dismiss") })); - this.notificationDisposables.value.add(addDisposableListener(dismissAction, EventType.CLICK, () => status.dismiss())); - this.notificationDisposables.value.add(addDisposableListener(dismissAction, EventType.KEY_DOWN, (e: KeyboardEvent) => { - const standardKeyboardEvent = new StandardKeyboardEvent(e); - if (standardKeyboardEvent.keyCode === KeyCode.Enter || standardKeyboardEvent.keyCode === KeyCode.Space) { - status.dismiss(); - } - standardKeyboardEvent.stopPropagation(); - })); + } } else { this.notificationContainer.removeAttribute('aria-label'); this.notificationContainer.classList.add('hidden'); + if (this.searchBox && ExtensionsListView.isRestartRequiredQuery(this.searchBox.getValue())) { + this.search(''); + } } if (this._dimension) { @@ -853,6 +865,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer { extensions = this.filterRecentlyUpdatedExtensions(local, query, options); } + else if (/@restartrequired/i.test(query.value)) { + extensions = this.filterRestartRequiredExtensions(local, query, options); + } + else if (/@contribute:/i.test(query.value)) { extensions = this.filterExtensionsByFeature(local, query); } @@ -661,6 +665,19 @@ export class ExtensionsListView extends AbstractExtensionsListView { return this.sortExtensions(result, options); } + private filterRestartRequiredExtensions(local: IExtension[], query: Query, options: IQueryOptions): IExtension[] { + let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); + local = local.filter(e => e.runtimeState !== undefined); + + value = value.replace(/@restartrequired/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); + + const result = local.filter(e => + (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) + && this.filterExtensionByCategory(e, includedCategories, excludedCategories)); + + return this.sortExtensions(result, options); + } + private filterExtensionsByFeature(local: IExtension[], query: Query): IExtension[] { const value = query.value.replace(/@contribute:/g, '').trim(); const featureId = value.split(' ')[0]; @@ -1157,6 +1174,7 @@ export class ExtensionsListView extends AbstractExtensionsListView { || this.isSearchDeprecatedExtensionsQuery(query) || this.isSearchWorkspaceUnsupportedExtensionsQuery(query) || this.isSearchRecentlyUpdatedQuery(query) + || this.isRestartRequiredQuery(query) || this.isSearchExtensionUpdatesQuery(query) || this.isSortInstalledExtensionsQuery(query, sortBy) || this.isFeatureExtensionsQuery(query); @@ -1246,6 +1264,10 @@ export class ExtensionsListView extends AbstractExtensionsListView { return /@recentlyUpdated/i.test(query); } + static isRestartRequiredQuery(query: string): boolean { + return /@restartrequired/i.test(query); + } + static isSearchExtensionUpdatesQuery(query: string): boolean { return /@updates/i.test(query); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts index 7131a2bc88706..1f4760ad9e46c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts @@ -22,7 +22,7 @@ import { IInstantiationService } from '../../../../platform/instantiation/common import { CountBadge } from '../../../../base/browser/ui/countBadge/countBadge.js'; import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js'; import { IUserDataSyncEnablementService } from '../../../../platform/userDataSync/common/userDataSync.js'; -import { activationTimeIcon, errorIcon, infoIcon, installCountIcon, preReleaseIcon, privateExtensionIcon, ratingIcon, remoteIcon, sponsorIcon, starEmptyIcon, starFullIcon, starHalfIcon, syncIgnoredIcon, warningIcon } from './extensionsIcons.js'; +import { activationTimeIcon, errorIcon, infoIcon, installCountIcon, preReleaseIcon, privateExtensionIcon, ratingIcon, remoteIcon, restartRequiredIcon, sponsorIcon, starEmptyIcon, starFullIcon, starHalfIcon, syncIgnoredIcon, warningIcon } from './extensionsIcons.js'; import { registerColor, textLinkForeground } from '../../../../platform/theme/common/colorRegistry.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; import { HoverPosition } from '../../../../base/browser/ui/hover/hoverWidget.js'; @@ -700,6 +700,29 @@ export class SyncIgnoredWidget extends ExtensionWidget { } } +export class ExtensionRestartRequiredWidget extends ExtensionWidget { + + private readonly disposables = this._register(new DisposableStore()); + + constructor( + private readonly container: HTMLElement, + @IHoverService private readonly hoverService: IHoverService, + ) { + super(); + } + + render(): void { + this.disposables.clear(); + this.container.innerText = ''; + + if (this.extension?.runtimeState) { + const element = append(this.container, $('span.extension-restart-required' + ThemeIcon.asCSSSelector(restartRequiredIcon))); + append(this.container, $('span.extension-restart-required-label', undefined, localize('restart required', "Restart Required"))); + this.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), element, this.extension.runtimeState.reason)); + } + } +} + export class ExtensionRuntimeStatusWidget extends ExtensionWidget { constructor( diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 3773741743fab..a505524944134 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -1449,6 +1449,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension message: computedNotificiations[0].message, severity: computedNotificiations[0].severity, extensions: computedNotificiations[0].extensions, + query: computedNotificiations[0].query, + action: computedNotificiations[0].action, key: computedNotificiations[0].key, dismiss: () => { this.setDismissedNotifications([...this.getDismissedNotifications(), computedNotificiations[0].key]); @@ -1501,6 +1503,34 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } } + if (!this.configurationService.getValue(AutoRestartConfigurationKey)) { + const restartRequiredExtensions = this.local.filter(e => e.runtimeState !== undefined && (e.runtimeState.action === ExtensionRuntimeActionType.RestartExtensions || e.runtimeState.action === ExtensionRuntimeActionType.ReloadWindow)); + if (restartRequiredExtensions.length) { + const needsReload = restartRequiredExtensions.some(e => e.runtimeState?.action === ExtensionRuntimeActionType.ReloadWindow); + computedNotificiations.push({ + message: needsReload + ? nls.localize('extensions need reload', "Extensions require a window reload to take effect.") + : nls.localize('extensions need restart', "Extensions require a restart to take effect."), + severity: Severity.Info, + extensions: restartRequiredExtensions, + query: '@restartrequired', + action: { + label: needsReload + ? nls.localize('reload window', "Reload Window") + : nls.localize('restart extensions action', "Restart Extensions"), + run: () => { + if (needsReload) { + this.hostService.reload(); + } else { + this.updateRunningExtensions(); + } + } + }, + key: 'restartRequired:' + restartRequiredExtensions.sort((a, b) => a.identifier.id.localeCompare(b.identifier.id)).map(e => e.identifier.id.toLowerCase()).join('-'), + }); + } + } + const deprecatedExtensions = this.local.filter(e => !!e.deprecationInfo && e.local && this.extensionEnablementService.isEnabled(e.local)); if (deprecatedExtensions.length) { computedNotificiations.push({ diff --git a/src/vs/workbench/contrib/extensions/browser/media/extension.css b/src/vs/workbench/contrib/extensions/browser/media/extension.css index d581283187e26..8454447913129 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extension.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extension.css @@ -73,10 +73,27 @@ .extension-list-item > .details > .header-container > .header > .name { font-weight: bold; - flex: 1; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; + min-width: 0; +} + +.extension-list-item > .details > .header-container > .header > .restart-required { + display: flex; + flex-shrink: 0; + margin-left: 8px; + align-items: center; +} + +.extension-list-item > .details > .header-container > .header > .restart-required > .codicon { + font-size: 100%; +} + +.extension-list-item > .details > .header-container > .header > .restart-required > .extension-restart-required-label { + font-size: 11px; + white-space: nowrap; + color: var(--vscode-descriptionForeground); } .extension-list-item.deprecated > .details > .header-container > .header > .name { @@ -91,6 +108,10 @@ align-items: center; } +.extension-list-item > .details > .header-container > .header > .install-count { + margin-left: auto; +} + .extension-list-item > .details > .header-container > .header .extension-kind-indicator { font-size: 11px; margin-left: 4px; @@ -98,7 +119,7 @@ .extension-list-item > .details > .header-container > .header > .install-count:not(:empty) { font-size: 11px; - margin: 0 6px; + margin: 0 6px 0 auto; } .extension-list-item > .details > .header-container > .header > .activation-status:not(:empty) { diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css b/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css index 2f88d73cd84da..06d5c19f6ee4a 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css @@ -55,16 +55,27 @@ .extensions-viewlet > .header > .notification-container { margin-top: 10px; display: flex; - justify-content: space-between; + flex-wrap: wrap; + align-items: flex-start; + gap: 4px 0; } .extensions-viewlet > .header .notification-container .message-container { + display: flex; padding-left: 4px; + flex: 1 1 0; + min-width: 200px; } .extensions-viewlet > .header .notification-container .message-container .codicon { - vertical-align: text-top; + flex-shrink: 0; padding-right: 5px; + padding-top: 2px; +} + +.extensions-viewlet > .header .notification-container .message-container .message-text { + flex: 1; + min-width: 0; } .extensions-viewlet .notification-container .message-text-action { @@ -79,16 +90,24 @@ color: var(--vscode-textLink-activeForeground); } -.extensions-viewlet .notification-container .message-action { +.extensions-viewlet .notification-container .message-action-button { cursor: pointer; - padding: 2px; - border-radius: 5px; - height: 16px; + padding: 1px 6px; + border-radius: 2px; + color: var(--vscode-button-foreground); + background-color: var(--vscode-button-background); + white-space: nowrap; +} + +.extensions-viewlet .notification-container .message-action-button:hover { + background-color: var(--vscode-button-hoverBackground); } -.extensions-viewlet .notification-container .message-action:hover { - background-color: var(--vscode-toolbar-hoverBackground); - outline: 1px dashed var(--vscode-toolbar-hoverOutline); +.extensions-viewlet .notification-container .notification-actions { + display: flex; + align-items: center; + gap: 4px; + margin-left: 24px; } .extensions-viewlet > .extensions { diff --git a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts index 87a67e96fb6ea..5eb399af1ffcd 100644 --- a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts @@ -28,7 +28,7 @@ export class Query { commands.push('category'); } - commands.push(...['tag', 'ext', 'id', 'outdated', 'recentlyUpdated']); + commands.push(...['tag', 'ext', 'id', 'outdated', 'recentlyUpdated', 'restartrequired']); const sortCommands = []; if (galleryManifest?.capabilities.extensionQuery?.sorting?.some(c => c.name === SortBy.InstallCount)) { sortCommands.push('installs'); diff --git a/src/vs/workbench/contrib/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts index b249453646804..520353b121ffb 100644 --- a/src/vs/workbench/contrib/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -124,6 +124,8 @@ export interface IExtensionsNotification { readonly message: string; readonly severity: Severity; readonly extensions: IExtension[]; + readonly query?: string; + readonly action?: { readonly label: string; run(): void }; dismiss(): void; } From 4751c69937d5145236ec6f5f7399e9b368319734 Mon Sep 17 00:00:00 2001 From: mrleemurray Date: Mon, 9 Feb 2026 12:45:08 +0000 Subject: [PATCH 02/51] Add stubs for canAddExtension and canRemoveExtension in ExtensionsWorkbenchService test --- .../test/electron-browser/extensionsWorkbenchService.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index 857a9db45e5df..d001254307dda 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -138,6 +138,8 @@ suite('ExtensionsWorkbenchServiceTest', () => { instantiationService.stub(IExtensionService, { onDidChangeExtensions: Event.None, extensions: [], + canAddExtension(extension: any) { return false; }, + canRemoveExtension(extension: any) { return false; }, async whenInstalledExtensionsRegistered() { return true; } }); From 198a7a32136fb42851b91cebe808628c463778a7 Mon Sep 17 00:00:00 2001 From: mrleemurray Date: Mon, 9 Feb 2026 14:51:17 +0000 Subject: [PATCH 03/51] Update notification button styles in extensions viewlet --- .../contrib/extensions/browser/media/extensionsViewlet.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css b/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css index 06d5c19f6ee4a..fd3aa7ae144bd 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css @@ -93,7 +93,8 @@ .extensions-viewlet .notification-container .message-action-button { cursor: pointer; padding: 1px 6px; - border-radius: 2px; + border-radius: var(--vscode-cornerRadius-small); + font-size: 11px; color: var(--vscode-button-foreground); background-color: var(--vscode-button-background); white-space: nowrap; From cc663d79c62631c313e9c513ddc793e627b7863c Mon Sep 17 00:00:00 2001 From: mrleemurray Date: Mon, 9 Feb 2026 15:02:40 +0000 Subject: [PATCH 04/51] Refactor StatusUpdater to simplify badge assignment logic --- .../contrib/extensions/browser/extensionsViewlet.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 4612c9570094a..7bde4ba5596a4 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -1001,13 +1001,11 @@ export class StatusUpdater extends Disposable implements IWorkbenchContribution let badge: IBadge | undefined; const extensionsNotification = this.extensionsWorkbenchService.getExtensionsNotification(); - if (extensionsNotification) { - if (extensionsNotification.severity === Severity.Warning) { - badge = new WarningBadge(() => extensionsNotification.message); - } + if (extensionsNotification && extensionsNotification.severity === Severity.Warning) { + badge = new WarningBadge(() => extensionsNotification.message); } - else { + if (!badge) { const actionRequired = this.configurationService.getValue(AutoRestartConfigurationKey) === true ? [] : this.extensionsWorkbenchService.installed.filter(e => e.runtimeState !== undefined); const outdated = this.extensionsWorkbenchService.outdated.reduce((r, e) => r + (this.extensionEnablementService.isEnabled(e.local!) && !actionRequired.includes(e) ? 1 : 0), 0); const newBadgeNumber = outdated + actionRequired.length; From 0426332d90f3b9411c7f543e5cefec8ac857a22a Mon Sep 17 00:00:00 2001 From: Lee Murray Date: Tue, 10 Feb 2026 10:57:37 +0000 Subject: [PATCH 05/51] Update src/vs/workbench/contrib/extensions/browser/extensionsViews.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/vs/workbench/contrib/extensions/browser/extensionsViews.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts index b4bbb91a2b1b7..ff48f40cbed19 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts @@ -669,7 +669,7 @@ export class ExtensionsListView extends AbstractExtensionsListView { let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); local = local.filter(e => e.runtimeState !== undefined); - value = value.replace(/@restartrequired/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); + value = value.replace(/@restartrequired/gi, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); const result = local.filter(e => (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) From 845804b284539040a9bd61497ba2874153e42b7c Mon Sep 17 00:00:00 2001 From: Lee Murray Date: Tue, 10 Feb 2026 10:59:00 +0000 Subject: [PATCH 06/51] Update src/vs/workbench/contrib/extensions/common/extensionQuery.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/vs/workbench/contrib/extensions/common/extensionQuery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts index 5eb399af1ffcd..50b9e2c78d161 100644 --- a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts @@ -28,7 +28,7 @@ export class Query { commands.push('category'); } - commands.push(...['tag', 'ext', 'id', 'outdated', 'recentlyUpdated', 'restartrequired']); + commands.push(...['tag', 'ext', 'id', 'outdated', 'recentlyUpdated', 'restartRequired']); const sortCommands = []; if (galleryManifest?.capabilities.extensionQuery?.sorting?.some(c => c.name === SortBy.InstallCount)) { sortCommands.push('installs'); From 1d3c7b0175fd02d3997d2e79b7ebb7950aa4d494 Mon Sep 17 00:00:00 2001 From: Lee Murray Date: Tue, 10 Feb 2026 10:59:49 +0000 Subject: [PATCH 07/51] Update src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../contrib/extensions/browser/extensionsWidgets.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts index 1f4760ad9e46c..f71143c24f575 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts @@ -715,10 +715,15 @@ export class ExtensionRestartRequiredWidget extends ExtensionWidget { this.disposables.clear(); this.container.innerText = ''; - if (this.extension?.runtimeState) { + const runtimeState = this.extension?.runtimeState; + const reason = typeof runtimeState?.reason === 'string' ? runtimeState.reason : ''; + + // Only show "Restart Required" when the runtime state reason clearly indicates + // a restart or reload is needed, to avoid mislabeling other runtime actions. + if (runtimeState && /restart|reload/i.test(reason)) { const element = append(this.container, $('span.extension-restart-required' + ThemeIcon.asCSSSelector(restartRequiredIcon))); append(this.container, $('span.extension-restart-required-label', undefined, localize('restart required', "Restart Required"))); - this.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), element, this.extension.runtimeState.reason)); + this.disposables.add(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), element, reason)); } } } From 7d74751508e58b99e65795d87a0c7fc7654ca940 Mon Sep 17 00:00:00 2001 From: Lee Murray Date: Tue, 10 Feb 2026 11:02:43 +0000 Subject: [PATCH 08/51] Update src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../contrib/extensions/browser/extensionsViewlet.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 7bde4ba5596a4..cd72a3ded8a79 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -796,11 +796,13 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer status.action!.run())); + this.notificationDisposables.value.add(addDisposableListener(actionButton, EventType.CLICK, () => { + Promise.resolve(status.action!.run()).catch(error => this.notificationService.error(error)); + })); this.notificationDisposables.value.add(addDisposableListener(actionButton, EventType.KEY_DOWN, (e: KeyboardEvent) => { const standardKeyboardEvent = new StandardKeyboardEvent(e); if (standardKeyboardEvent.keyCode === KeyCode.Enter || standardKeyboardEvent.keyCode === KeyCode.Space) { - status.action!.run(); + Promise.resolve(status.action!.run()).catch(error => this.notificationService.error(error)); } standardKeyboardEvent.stopPropagation(); })); From 9601f8e345f17bf8a0940dd1e28d343512952775 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:26:18 +0000 Subject: [PATCH 09/51] Initial plan From 0413172b7dd517e98b26c777b2798916bb67619d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:34:56 +0000 Subject: [PATCH 10/51] Update chat setup contributions to match extension's new menu structure - Move Fix, Code Review, Generate Docs, Generate Tests from ChatTextEditorMenu submenu to EditorContext directly in chatSetupContributions.ts - Add hasNonEmptySelection.negate() to AttachFileToChatAction's EditorContext condition so 'Add File to Chat' is hidden when there's a selection Co-authored-by: jrieken <1794099+jrieken@users.noreply.github.com> --- .../chat/browser/actions/chatContextActions.ts | 1 + .../browser/chatSetup/chatSetupContributions.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts index 45fe30497775d..8627fcad2f383 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts @@ -166,6 +166,7 @@ class AttachFileToChatAction extends AttachResourceAction { order: 2, when: ContextKeyExpr.and( ChatContextKeys.enabled, + EditorContextKeys.hasNonEmptySelection.negate(), ContextKeyExpr.or( ResourceContextKey.Scheme.isEqualTo(Schemas.file), ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote), diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts index d6b80ecc2d36d..e97a40ed9c667 100644 --- a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts @@ -525,30 +525,30 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr when: internalGenerateCodeContext }); - MenuRegistry.appendMenuItem(MenuId.ChatTextEditorMenu, { + MenuRegistry.appendMenuItem(MenuId.EditorContext, { command: { id: 'chat.internal.fix', title: localize('fix', "Fix"), }, - group: '1_action', - order: 1, + group: '1_chat', + order: 5, when: ContextKeyExpr.and( internalGenerateCodeContext, EditorContextKeys.readOnly.negate() ) }); - MenuRegistry.appendMenuItem(MenuId.ChatTextEditorMenu, { + MenuRegistry.appendMenuItem(MenuId.EditorContext, { command: { id: 'chat.internal.review', title: localize('review', "Code Review"), }, - group: '1_action', - order: 2, + group: '1_chat', + order: 6, when: internalGenerateCodeContext }); - MenuRegistry.appendMenuItem(MenuId.ChatTextEditorMenu, { + MenuRegistry.appendMenuItem(MenuId.EditorContext, { command: { id: 'chat.internal.generateDocs', title: localize('generateDocs', "Generate Docs"), @@ -561,7 +561,7 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr ) }); - MenuRegistry.appendMenuItem(MenuId.ChatTextEditorMenu, { + MenuRegistry.appendMenuItem(MenuId.EditorContext, { command: { id: 'chat.internal.generateTests', title: localize('generateTests', "Generate Tests"), From aa5fe8ac97492a74e77410f8b4101a1a4a092f3d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:40:06 +0000 Subject: [PATCH 11/51] Remove Generate Docs and Generate Tests from chat setup editor context menu Co-authored-by: jrieken <1794099+jrieken@users.noreply.github.com> --- .../chatSetup/chatSetupContributions.ts | 33 ++----------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts index e97a40ed9c667..587713e58b667 100644 --- a/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts +++ b/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.ts @@ -465,7 +465,7 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr //#region Editor Context Menu - function registerGenerateCodeCommand(coreCommand: 'chat.internal.explain' | 'chat.internal.fix' | 'chat.internal.review' | 'chat.internal.generateDocs' | 'chat.internal.generateTests', actualCommand: string): void { + function registerGenerateCodeCommand(coreCommand: 'chat.internal.explain' | 'chat.internal.fix' | 'chat.internal.review', actualCommand: string): void { CommandsRegistry.registerCommand(coreCommand, async accessor => { const commandService = accessor.get(ICommandService); @@ -492,9 +492,7 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr break; } - case 'chat.internal.review': - case 'chat.internal.generateDocs': - case 'chat.internal.generateTests': { + case 'chat.internal.review': { const result = await commandService.executeCommand(CHAT_SETUP_SUPPORT_ANONYMOUS_ACTION_ID); if (result) { await commandService.executeCommand(actualCommand); @@ -506,8 +504,6 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr registerGenerateCodeCommand('chat.internal.explain', 'github.copilot.chat.explain'); registerGenerateCodeCommand('chat.internal.fix', 'github.copilot.chat.fix'); registerGenerateCodeCommand('chat.internal.review', 'github.copilot.chat.review'); - registerGenerateCodeCommand('chat.internal.generateDocs', 'github.copilot.chat.generateDocs'); - registerGenerateCodeCommand('chat.internal.generateTests', 'github.copilot.chat.generateTests'); const internalGenerateCodeContext = ContextKeyExpr.and( ChatContextKeys.Setup.hidden.negate(), @@ -548,31 +544,6 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr when: internalGenerateCodeContext }); - MenuRegistry.appendMenuItem(MenuId.EditorContext, { - command: { - id: 'chat.internal.generateDocs', - title: localize('generateDocs', "Generate Docs"), - }, - group: '2_generate', - order: 1, - when: ContextKeyExpr.and( - internalGenerateCodeContext, - EditorContextKeys.readOnly.negate() - ) - }); - - MenuRegistry.appendMenuItem(MenuId.EditorContext, { - command: { - id: 'chat.internal.generateTests', - title: localize('generateTests', "Generate Tests"), - }, - group: '2_generate', - order: 2, - when: ContextKeyExpr.and( - internalGenerateCodeContext, - EditorContextKeys.readOnly.negate() - ) - }); } private registerUrlLinkHandler(): void { From 926c77f66555f877b61f47f73caa5c5238cf3c35 Mon Sep 17 00:00:00 2001 From: BeniBenj Date: Mon, 23 Feb 2026 17:31:20 +0100 Subject: [PATCH 12/51] sessions tasks support and agent feedback improvements --- .../browser/agentFeedback.contribution.ts | 1 + .../agentFeedbackEditorInputContribution.ts | 27 +- .../browser/agentFeedbackHover.ts | 5 +- .../agentFeedbackOverviewRulerContribution.ts | 100 +++++ .../browser/agentFeedbackService.ts | 6 +- .../media/agentFeedbackEditorWidget.css | 1 + .../contrib/chat/browser/chat.contribution.ts | 25 +- .../contrib/chat/browser/runScriptAction.ts | 190 ++++---- .../browser/sessionsConfigurationService.ts | 415 +++++++++++++----- .../sessionsConfigurationService.test.ts | 366 +++++++++++++++ .../contrib/tasks/common/jsonSchema_v2.ts | 8 + .../contrib/tasks/common/taskConfiguration.ts | 14 +- .../contrib/tasks/common/taskService.ts | 1 + .../workbench/contrib/tasks/common/tasks.ts | 5 + 14 files changed, 916 insertions(+), 248 deletions(-) create mode 100644 src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackOverviewRulerContribution.ts create mode 100644 src/vs/sessions/contrib/chat/test/browser/sessionsConfigurationService.test.ts diff --git a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedback.contribution.ts b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedback.contribution.ts index 3b062517e4754..7f5708a85d8d0 100644 --- a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedback.contribution.ts +++ b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedback.contribution.ts @@ -6,6 +6,7 @@ import './agentFeedbackEditorInputContribution.js'; import './agentFeedbackEditorWidgetContribution.js'; import './agentFeedbackLineDecorationContribution.js'; +import './agentFeedbackOverviewRulerContribution.js'; import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js'; import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; import { registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js'; diff --git a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackEditorInputContribution.ts b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackEditorInputContribution.ts index 2b690a82bad95..6e733fd5a1015 100644 --- a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackEditorInputContribution.ts +++ b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackEditorInputContribution.ts @@ -106,7 +106,7 @@ class AgentFeedbackInputWidget implements IOverlayWidget { // Reset height to auto then expand to fit all content, with a minimum of 1 line this._inputElement.style.height = 'auto'; - const newHeight = Math.max(this._inputElement.scrollHeight, this._lineHeight + 4 /* padding */); + const newHeight = Math.max(this._inputElement.scrollHeight, this._lineHeight); this._inputElement.style.height = `${newHeight}px`; } } @@ -358,18 +358,35 @@ export class AgentFeedbackEditorInputContribution extends Disposable implements } const lineHeight = this._editor.getOption(EditorOption.lineHeight); - const left = scrolledPosition.left; + const layoutInfo = this._editor.getLayoutInfo(); + const widgetDom = this._widget.getDomNode(); + const widgetHeight = widgetDom.offsetHeight || 30; + const widgetWidth = widgetDom.offsetWidth || 150; + // Compute vertical position, flipping if out of bounds let top: number; if (selection.getDirection() === SelectionDirection.LTR) { - // Cursor at end (bottom) of selection → place widget below the cursor line + // Cursor at end (bottom) of selection → prefer below the cursor line top = scrolledPosition.top + lineHeight; + if (top + widgetHeight > layoutInfo.height) { + // Not enough space below → place above the cursor line + top = scrolledPosition.top - widgetHeight; + } } else { - // Cursor at start (top) of selection → place widget above the cursor line - const widgetHeight = this._widget.getDomNode().offsetHeight || 30; + // Cursor at start (top) of selection → prefer above the cursor line top = scrolledPosition.top - widgetHeight; + if (top < 0) { + // Not enough space above → place below the cursor line + top = scrolledPosition.top + lineHeight; + } } + // Clamp vertical position within editor bounds + top = Math.max(0, Math.min(top, layoutInfo.height - widgetHeight)); + + // Clamp horizontal position so the widget stays within the editor + const left = Math.max(0, Math.min(scrolledPosition.left, layoutInfo.width - widgetWidth)); + this._widget.setPosition({ preference: { top, left } }); } diff --git a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackHover.ts b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackHover.ts index c5ee181fa94b5..d02c9725cd1b8 100644 --- a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackHover.ts +++ b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackHover.ts @@ -227,11 +227,8 @@ export class AgentFeedbackHover extends Disposable { const opts = this._buildHoverContent(); this._register(opts); this._hoverService.showInstantHover({ - content: opts.content, + ...opts, target: this._element, - style: opts.style, - position: opts.position, - trapFocus: opts.trapFocus, }); } diff --git a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackOverviewRulerContribution.ts b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackOverviewRulerContribution.ts new file mode 100644 index 0000000000000..ecbca6154b3df --- /dev/null +++ b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackOverviewRulerContribution.ts @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { ICodeEditor } from '../../../../editor/browser/editorBrowser.js'; +import { IEditorContribution, IEditorDecorationsCollection } from '../../../../editor/common/editorCommon.js'; +import { EditorContributionInstantiation, registerEditorContribution } from '../../../../editor/browser/editorExtensions.js'; +import { overviewRulerInfo } from '../../../../editor/common/core/editorColorRegistry.js'; +import { OverviewRulerLane } from '../../../../editor/common/model.js'; +import { themeColorFromId } from '../../../../platform/theme/common/themeService.js'; +import { registerColor } from '../../../../platform/theme/common/colorRegistry.js'; +import { localize } from '../../../../nls.js'; +import { URI } from '../../../../base/common/uri.js'; +import { IAgentFeedbackService } from './agentFeedbackService.js'; +import { IChatEditingService } from '../../../../workbench/contrib/chat/common/editing/chatEditingService.js'; +import { IAgentSessionsService } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessionsService.js'; +import { getSessionForResource } from './agentFeedbackEditorUtils.js'; + +const overviewRulerAgentFeedbackForeground = registerColor( + 'editorOverviewRuler.agentFeedbackForeground', + overviewRulerInfo, + localize('editorOverviewRuler.agentFeedbackForeground', 'Editor overview ruler decoration color for agent feedback. This color should be opaque.') +); + +export class AgentFeedbackOverviewRulerContribution extends Disposable implements IEditorContribution { + + static readonly ID = 'agentFeedback.overviewRulerContribution'; + + private readonly _decorations: IEditorDecorationsCollection; + private _sessionResource: URI | undefined; + + constructor( + private readonly _editor: ICodeEditor, + @IAgentFeedbackService private readonly _agentFeedbackService: IAgentFeedbackService, + @IChatEditingService private readonly _chatEditingService: IChatEditingService, + @IAgentSessionsService private readonly _agentSessionsService: IAgentSessionsService, + ) { + super(); + + this._decorations = this._editor.createDecorationsCollection(); + + this._store.add(this._agentFeedbackService.onDidChangeFeedback(() => this._updateDecorations())); + this._store.add(this._editor.onDidChangeModel(() => { + this._resolveSession(); + this._updateDecorations(); + })); + + this._resolveSession(); + this._updateDecorations(); + } + + private _resolveSession(): void { + const model = this._editor.getModel(); + if (!model) { + this._sessionResource = undefined; + return; + } + this._sessionResource = getSessionForResource(model.uri, this._chatEditingService, this._agentSessionsService); + } + + private _updateDecorations(): void { + if (!this._sessionResource) { + this._decorations.clear(); + return; + } + + const model = this._editor.getModel(); + if (!model) { + this._decorations.clear(); + return; + } + + const feedbackItems = this._agentFeedbackService.getFeedback(this._sessionResource); + const modelUri = model.uri.toString(); + + this._decorations.set( + feedbackItems + .filter(item => item.resourceUri.toString() === modelUri) + .map(item => ({ + range: item.range, + options: { + description: 'agent-feedback-overview-ruler', + overviewRuler: { + color: themeColorFromId(overviewRulerAgentFeedbackForeground), + position: OverviewRulerLane.Center, + } + } + })) + ); + } + + override dispose(): void { + this._decorations.clear(); + super.dispose(); + } +} + +registerEditorContribution(AgentFeedbackOverviewRulerContribution.ID, AgentFeedbackOverviewRulerContribution, EditorContributionInstantiation.Eventually); diff --git a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackService.ts b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackService.ts index c324cca0f1afd..03c6e09a1757c 100644 --- a/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackService.ts +++ b/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackService.ts @@ -257,8 +257,10 @@ export class AgentFeedbackService extends Disposable implements IAgentFeedbackSe revealIfVisible: true, } }); - this._navigationAnchorBySession.set(key, feedbackId); - this._onDidChangeNavigation.fire(sessionResource); + setTimeout(() => { + this._navigationAnchorBySession.set(key, feedbackId); + this._onDidChangeNavigation.fire(sessionResource); + }, 50); // delay to ensure editor has revealed the correct position before firing navigation event } getNextFeedback(sessionResource: URI, next: boolean): IAgentFeedback | undefined { diff --git a/src/vs/sessions/contrib/agentFeedback/browser/media/agentFeedbackEditorWidget.css b/src/vs/sessions/contrib/agentFeedback/browser/media/agentFeedbackEditorWidget.css index c74d158efffbf..3ca674d2cf444 100644 --- a/src/vs/sessions/contrib/agentFeedback/browser/media/agentFeedbackEditorWidget.css +++ b/src/vs/sessions/contrib/agentFeedback/browser/media/agentFeedbackEditorWidget.css @@ -74,6 +74,7 @@ .agent-feedback-widget.collapsed .agent-feedback-widget-header { border-bottom: none; + border-radius: 8px 8px 8px 8px; } .agent-feedback-widget-header:hover { diff --git a/src/vs/sessions/contrib/chat/browser/chat.contribution.ts b/src/vs/sessions/contrib/chat/browser/chat.contribution.ts index e85e6824b5fc9..3e94d9fe849c6 100644 --- a/src/vs/sessions/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/sessions/contrib/chat/browser/chat.contribution.ts @@ -19,7 +19,8 @@ import { SyncDescriptor } from '../../../../platform/instantiation/common/descri import { AgentSessionProviders } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessions.js'; import { isAgentSession } from '../../../../workbench/contrib/chat/browser/agentSessions/agentSessionsModel.js'; import { ISessionsManagementService, IsNewChatSessionContext } from '../../sessions/browser/sessionsManagementService.js'; -import { ITerminalService } from '../../../../workbench/contrib/terminal/browser/terminal.js'; +import { ITerminalInstance, ITerminalService } from '../../../../workbench/contrib/terminal/browser/terminal.js'; +import { IPathService } from '../../../../workbench/services/path/common/pathService.js'; import { Menus } from '../../../browser/menus.js'; import { BranchChatSessionAction } from './branchChatSessionAction.js'; import { RunScriptContribution } from './runScriptAction.js'; @@ -131,13 +132,27 @@ export class OpenSessionInTerminalAction extends Action2 { override async run(accessor: ServicesAccessor,): Promise { const terminalService = accessor.get(ITerminalService); const sessionsManagementService = accessor.get(ISessionsManagementService); + const pathService = accessor.get(IPathService); const activeSession = sessionsManagementService.activeSession.get(); - const repository = isAgentSession(activeSession) && activeSession.providerType !== AgentSessionProviders.Cloud + const cwd = (isAgentSession(activeSession) && activeSession.providerType !== AgentSessionProviders.Cloud ? activeSession.worktree - : undefined; - if (repository) { - const instance = await terminalService.createTerminal({ config: { cwd: repository } }); + : undefined) ?? await pathService.userHome(); + + // Try to reuse an existing idle terminal with the same cwd + const cwdPath = cwd.fsPath; + let reusable: ITerminalInstance | undefined; + for (const instance of terminalService.instances) { + if (instance.cwd && instance.cwd.toLowerCase() === cwdPath.toLowerCase() && !instance.hasChildProcesses) { + reusable = instance; + break; + } + } + + if (reusable) { + terminalService.setActiveInstance(reusable); + } else { + const instance = await terminalService.createTerminal({ config: { cwd } }); if (instance) { terminalService.setActiveInstance(instance); } diff --git a/src/vs/sessions/contrib/chat/browser/runScriptAction.ts b/src/vs/sessions/contrib/chat/browser/runScriptAction.ts index b59fefb3bde30..232c7ab342c2a 100644 --- a/src/vs/sessions/contrib/chat/browser/runScriptAction.ts +++ b/src/vs/sessions/contrib/chat/browser/runScriptAction.ts @@ -7,20 +7,15 @@ import { equals } from '../../../../base/common/arrays.js'; import { Codicon } from '../../../../base/common/codicons.js'; import { Disposable } from '../../../../base/common/lifecycle.js'; import { autorun, derivedOpts, IObservable } from '../../../../base/common/observable.js'; -import { isMacintosh, isWindows } from '../../../../base/common/platform.js'; -import { URI } from '../../../../base/common/uri.js'; import { localize, localize2 } from '../../../../nls.js'; import { MenuId, registerAction2, Action2, MenuRegistry } from '../../../../platform/actions/common/actions.js'; -import { IQuickInputService, IQuickPickItem } from '../../../../platform/quickinput/common/quickInput.js'; -import { TerminalLocation } from '../../../../platform/terminal/common/terminal.js'; +import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from '../../../../platform/quickinput/common/quickInput.js'; import { IWorkbenchContribution } from '../../../../workbench/common/contributions.js'; import { IActiveSessionItem, ISessionsManagementService } from '../../sessions/browser/sessionsManagementService.js'; -import { ITerminalInstance, ITerminalService } from '../../../../workbench/contrib/terminal/browser/terminal.js'; import { Menus } from '../../../browser/menus.js'; -import { ISessionsConfigurationService, ISessionScript, ScriptStorageTarget } from './sessionsConfigurationService.js'; +import { ISessionsConfigurationService, ITaskEntry, TaskStorageTarget } from './sessionsConfigurationService.js'; import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js'; import { IsAuxiliaryWindowContext } from '../../../../workbench/common/contextkeys.js'; -import { isEqual } from '../../../../base/common/resources.js'; @@ -33,13 +28,13 @@ const CONFIGURE_DEFAULT_RUN_ACTION_ID = 'workbench.action.agentSessions.configur interface IRunScriptActionContext { readonly session: IActiveSessionItem; - readonly scripts: readonly ISessionScript[]; - readonly cwd: URI; + readonly tasks: readonly ITaskEntry[]; + readonly lastRunTaskLabel: string | undefined; } /** * Workbench contribution that adds a split dropdown action to the auxiliary bar title - * for running a custom command. + * for running a task via tasks.json. */ export class RunScriptContribution extends Disposable implements IWorkbenchContribution { @@ -47,11 +42,7 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr private readonly _activeRunState: IObservable; - /** Maps `cwd.toString() + '\n' + script.command` to the terminal instance for reuse. */ - private readonly _scriptTerminals = new Map(); - constructor( - @ITerminalService private readonly _terminalService: ITerminalService, @ISessionsManagementService private readonly _activeSessionService: ISessionsManagementService, @IQuickInputService private readonly _quickInputService: IQuickInputService, @ISessionsConfigurationService private readonly _sessionsConfigService: ISessionsConfigurationService, @@ -64,29 +55,21 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr if (a === b) { return true; } if (!a || !b) { return false; } return a.session === b.session - && isEqual(a.cwd, b.cwd) - && equals(a.scripts, b.scripts, (s1, s2) => s1.name === s2.name && s1.command === s2.command); + && a.lastRunTaskLabel === b.lastRunTaskLabel + && equals(a.tasks, b.tasks, (t1, t2) => + t1.label === t2.label && t1.command === t2.command); } }, reader => { const activeSession = this._activeSessionService.activeSession.read(reader); - const cwd = activeSession?.worktree ?? activeSession?.repository; - if (!activeSession || !cwd) { + if (!activeSession) { return undefined; } - const scripts = this._sessionsConfigService.getScripts(activeSession).read(reader); - return { session: activeSession, scripts, cwd }; + const tasks = this._sessionsConfigService.getSessionTasks(activeSession).read(reader); + const lastRunTaskLabel = this._sessionsConfigService.getLastRunTaskLabel(activeSession.repository).read(reader); + return { session: activeSession, tasks, lastRunTaskLabel }; }).recomputeInitiallyAndOnChange(this._store); - this._register(this._terminalService.onDidDisposeInstance(instance => { - for (const [key, id] of this._scriptTerminals) { - if (id === instance.instanceId) { - this._scriptTerminals.delete(key); - break; - } - } - })); - this._registerActions(); } @@ -94,39 +77,43 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr const that = this; this._register(autorun(reader => { - const activeSession = this._activeRunState.read(reader); - if (!activeSession) { + const activeState = this._activeRunState.read(reader); + if (!activeState) { return; } - const { scripts, cwd, session } = activeSession; + const { tasks, session, lastRunTaskLabel } = activeState; const configureScriptPrecondition = session.worktree ? ContextKeyExpr.true() : ContextKeyExpr.false(); const addRunActionDisabledTooltip = session.worktree ? undefined : localize('configureScriptTooltipDisabled', "Actions can not be added in empty sessions"); - if (scripts.length > 0) { - // Register an action for each script - for (let i = 0; i < scripts.length; i++) { - const script = scripts[i]; + const mruIndex = lastRunTaskLabel !== undefined + ? tasks.findIndex(t => t.label === lastRunTaskLabel) + : -1; + + if (tasks.length > 0) { + // Register an action for each session task + for (let i = 0; i < tasks.length; i++) { + const task = tasks[i]; const actionId = `${RUN_SCRIPT_ACTION_ID}.${i}`; reader.store.add(registerAction2(class extends Action2 { constructor() { super({ id: actionId, - title: script.name, - tooltip: localize('runActionTooltip', "Run '{0}' in terminal", script.name), + title: task.label, + tooltip: localize('runActionTooltip', "Run '{0}' in terminal", task.label), icon: Codicon.play, category: localize2('agentSessions', 'Agent Sessions'), menu: [{ id: RunScriptDropdownMenuId, group: '0_scripts', - order: i, + order: i === mruIndex ? -1 : i, }] }); } async run(): Promise { - await that._runScript(cwd, script); + await that._sessionsConfigService.runTask(task, session); } })); } @@ -144,23 +131,69 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr precondition: configureScriptPrecondition, menu: [{ id: RunScriptDropdownMenuId, - group: scripts.length === 0 ? 'navigation' : '1_configure', + group: tasks.length === 0 ? 'navigation' : '1_configure', order: 0 }] }); } async run(): Promise { - await that._showConfigureQuickPick(session, cwd); + await that._showConfigureQuickPick(session); } })); })); } - private async _showConfigureQuickPick(session: IActiveSessionItem, cwd: URI): Promise { + private async _showConfigureQuickPick(session: IActiveSessionItem): Promise { + const nonSessionTasks = await this._sessionsConfigService.getNonSessionTasks(session); + + interface ITaskPickItem extends IQuickPickItem { + readonly task?: ITaskEntry; + readonly source?: TaskStorageTarget; + } + + const items: (ITaskPickItem | IQuickPickSeparator)[] = []; + + if (nonSessionTasks.length > 0) { + items.push({ type: 'separator', label: localize('existingTasks', "Existing Tasks") }); + for (const task of nonSessionTasks) { + items.push({ + label: task.label, + description: task.command, + task, + source: 'workspace', + }); + } + } + + items.push({ type: 'separator', label: localize('custom', "Custom") }); + items.push({ + label: localize('enterCustomCommand', "Enter Custom Command..."), + description: localize('enterCustomCommandDesc', "Create a new shell task"), + }); + + const picked = await this._quickInputService.pick(items, { + placeHolder: localize('pickRunAction', "Select a task or enter a custom command"), + }); + + if (!picked) { + return; + } + + const pickedItem = picked as ITaskPickItem; + if (pickedItem.task) { + // Existing task — set inSessions: true + await this._sessionsConfigService.addTaskToSessions(pickedItem.task, session, pickedItem.source ?? 'workspace'); + } else { + // Custom command path + await this._showCustomCommandInput(session); + } + } + + private async _showCustomCommandInput(session: IActiveSessionItem): Promise { const command = await this._quickInputService.input({ placeHolder: localize('enterCommandPlaceholder', "Enter command (e.g., npm run dev)"), - prompt: localize('enterCommandPrompt', "This command will be run in the integrated terminal") + prompt: localize('enterCommandPrompt', "This command will be run as a task in the integrated terminal") }); if (!command) { @@ -172,16 +205,14 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr return; } - const script: ISessionScript = { name: command, command }; - await this._sessionsConfigService.addScript(script, session, target); - await this._runScript(cwd, script); + await this._sessionsConfigService.createAndAddTask(command, session, target); } - private async _pickStorageTarget(session: IActiveSessionItem): Promise { + private async _pickStorageTarget(session: IActiveSessionItem): Promise { const hasWorktree = !!session.worktree; interface IStorageTargetItem extends IQuickPickItem { - target: ScriptStorageTarget; + target: TaskStorageTarget; } const items: IStorageTargetItem[] = [ @@ -201,7 +232,7 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr }, ]; - return new Promise(resolve => { + return new Promise(resolve => { const picker = this._quickInputService.createQuickPick({ useSeparators: true }); picker.placeholder = localize('pickStorageTarget', "Where should this action be saved?"); picker.items = items; @@ -220,65 +251,6 @@ export class RunScriptContribution extends Disposable implements IWorkbenchContr picker.show(); }); } - - private async _runScript(cwd: URI, script: ISessionScript): Promise { - const command = this._resolveCommand(script); - const key = this._terminalKey(cwd, command); - let terminal = this._getReusableTerminal(key); - - if (!terminal) { - terminal = await this._terminalService.createTerminal({ - location: TerminalLocation.Panel, - config: { - name: script.name - }, - cwd - }); - this._scriptTerminals.set(key, terminal.instanceId); - } - - await terminal.sendText(command, true); - this._terminalService.setActiveInstance(terminal); - await this._terminalService.revealActiveTerminal(); - } - - private _resolveCommand(script: ISessionScript): string { - if (isWindows && script.commandWindows) { - return script.commandWindows; - } - if (isMacintosh && script.commandMacOS) { - return script.commandMacOS; - } - if (!isWindows && !isMacintosh && script.commandLinux) { - return script.commandLinux; - } - return script.command; - } - - private _terminalKey(cwd: URI, command: string): string { - return `${cwd.toString()}\n${command}`; - } - - private _getReusableTerminal(key: string): ITerminalInstance | undefined { - const instanceId = this._scriptTerminals.get(key); - if (instanceId === undefined) { - return undefined; - } - - const instance = this._terminalService.getInstanceFromId(instanceId); - if (!instance || instance.isDisposed || instance.exitCode !== undefined) { - this._scriptTerminals.delete(key); - return undefined; - } - - // Only reuse if the cwd hasn't changed from the initial cwd and nothing is actively running - if (instance.cwd !== instance.initialCwd || instance.hasChildProcesses) { - this._scriptTerminals.delete(key); - return undefined; - } - - return instance; - } } // Register the Run split button submenu on the workbench title bar diff --git a/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts b/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts index f2fb9fd1f640f..b11982b7d406c 100644 --- a/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts +++ b/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts @@ -3,177 +3,352 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable } from '../../../../base/common/lifecycle.js'; -import { observableFromEvent, IObservable } from '../../../../base/common/observable.js'; -import { joinPath } from '../../../../base/common/resources.js'; -import { localize } from '../../../../nls.js'; -import { IConfigurationService, ConfigurationTarget } from '../../../../platform/configuration/common/configuration.js'; -import { Extensions, IConfigurationRegistry } from '../../../../platform/configuration/common/configurationRegistry.js'; +import { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js'; +import { IObservable, observableValue, transaction } from '../../../../base/common/observable.js'; +import { joinPath, dirname } from '../../../../base/common/resources.js'; +import { parse } from '../../../../base/common/jsonc.js'; +import { isMacintosh, isWindows } from '../../../../base/common/platform.js'; +import { URI } from '../../../../base/common/uri.js'; import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js'; -import { Registry } from '../../../../platform/registry/common/platform.js'; +import { IFileService } from '../../../../platform/files/common/files.js'; +import { TerminalLocation } from '../../../../platform/terminal/common/terminal.js'; import { IActiveSessionItem, ISessionsManagementService } from '../../sessions/browser/sessionsManagementService.js'; +import { IJSONEditingService } from '../../../../workbench/services/configuration/common/jsonEditing.js'; +import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; +import { IPreferencesService } from '../../../../workbench/services/preferences/common/preferences.js'; +import { ITerminalInstance, ITerminalService } from '../../../../workbench/contrib/terminal/browser/terminal.js'; -export const agentSessionsRunScriptsSettingId = 'agentSessions.runScripts'; +export type TaskStorageTarget = 'user' | 'workspace'; -export type ScriptStorageTarget = 'user' | 'workspace'; - -export interface ISessionScript { - readonly name: string; - readonly command: string; - readonly commandWindows?: string; - readonly commandLinux?: string; - readonly commandMacOS?: string; -} - -function isISessionScript(s: unknown): s is ISessionScript { - return typeof s === 'object' && s !== null && - typeof (s as ISessionScript).name === 'string' && - typeof (s as ISessionScript).command === 'string'; +/** + * Shape of a single task entry inside tasks.json. + */ +export interface ITaskEntry { + readonly label: string; + readonly type?: string; + readonly command?: string; + readonly inSessions?: boolean; + readonly windows?: { command?: string }; + readonly osx?: { command?: string }; + readonly linux?: { command?: string }; + readonly [key: string]: unknown; } -function parseScripts(value: unknown): readonly ISessionScript[] { - if (Array.isArray(value)) { - return value.filter(isISessionScript); - } - return []; +interface ITasksJson { + version?: string; + tasks?: ITaskEntry[]; } export interface ISessionsConfigurationService { readonly _serviceBrand: undefined; /** - * Observable list of scripts from user and workspace configuration merged. - * Automatically updates when the setting changes. + * Observable list of tasks with `inSessions: true`, automatically + * updated when the tasks.json file changes. + */ + getSessionTasks(session: IActiveSessionItem): IObservable; + + /** + * Returns tasks that do NOT have `inSessions: true` — used as + * suggestions in the "Add Run Action" picker. + */ + getNonSessionTasks(session: IActiveSessionItem): Promise; + + /** + * Sets `inSessions: true` on an existing task (identified by label), + * updating it in place in its tasks.json. */ - getScripts(session: IActiveSessionItem): IObservable; + addTaskToSessions(task: ITaskEntry, session: IActiveSessionItem, target: TaskStorageTarget): Promise; - /** Append a script to the configuration at the given target scope. */ - addScript(script: ISessionScript, session: IActiveSessionItem, target: ScriptStorageTarget): Promise; + /** + * Creates a new shell task with `inSessions: true` and writes it to + * the appropriate tasks.json (user or workspace). + */ + createAndAddTask(command: string, session: IActiveSessionItem, target: TaskStorageTarget): Promise; - /** Remove a script from the configuration (checks workspace first, then user). */ - removeScript(script: ISessionScript, session: IActiveSessionItem): Promise; + /** + * Runs a task entry in a terminal, resolving the correct platform + * command and using the session worktree as cwd. + */ + runTask(task: ITaskEntry, session: IActiveSessionItem): Promise; + + /** + * Observable label of the most recently run task for the given repository. + */ + getLastRunTaskLabel(repository: URI | undefined): IObservable; } export const ISessionsConfigurationService = createDecorator('sessionsConfigurationService'); -Registry.as(Extensions.Configuration).registerConfiguration({ - id: 'agentSessions', - title: localize('agentSessionsConfigurationTitle', "Agent Sessions"), - type: 'object', - properties: { - [agentSessionsRunScriptsSettingId]: { - type: 'array', - description: localize('agentSessions.runScripts', "Configures the scripts available in the Run Action dropdown."), - items: { - type: 'object', - properties: { - name: { - type: 'string', - description: localize('agentSessions.runScripts.name', "Display name for the script."), - }, - command: { - type: 'string', - description: localize('agentSessions.runScripts.command', "The default command to run in the terminal."), - }, - commandWindows: { - type: 'string', - description: localize('agentSessions.runScripts.commandWindows', "Command override for Windows."), - }, - commandLinux: { - type: 'string', - description: localize('agentSessions.runScripts.commandLinux', "Command override for Linux."), - }, - commandMacOS: { - type: 'string', - description: localize('agentSessions.runScripts.commandMacOS', "Command override for macOS."), - }, - }, - required: ['name', 'command'], - }, - default: [], - }, - }, -}); - export class SessionsConfigurationService extends Disposable implements ISessionsConfigurationService { declare readonly _serviceBrand: undefined; - private readonly _scripts: IObservable; + private static readonly _LAST_RUN_TASK_LABELS_KEY = 'agentSessions.lastRunTaskLabels'; + + private readonly _sessionTasks = observableValue(this, []); + private readonly _fileWatcher = this._register(new MutableDisposable()); + /** Maps `cwd.toString() + command` to the terminal `instanceId`. */ + private readonly _taskTerminals = new Map(); + private readonly _lastRunTaskLabels: Map; + private readonly _lastRunTaskObservables = new Map>>(); + + private _watchedResource: URI | undefined; constructor( - @IConfigurationService private readonly _configurationService: IConfigurationService, + @IFileService private readonly _fileService: IFileService, + @IJSONEditingService private readonly _jsonEditingService: IJSONEditingService, + @IPreferencesService private readonly _preferencesService: IPreferencesService, + @ITerminalService private readonly _terminalService: ITerminalService, @ISessionsManagementService private readonly _sessionsManagementService: ISessionsManagementService, + @IStorageService private readonly _storageService: IStorageService, ) { super(); + this._lastRunTaskLabels = this._loadLastRunTaskLabels(); + } - this._scripts = observableFromEvent( - this, - this._configurationService.onDidChangeConfiguration, - () => this._readAllScripts(), - ); + getSessionTasks(session: IActiveSessionItem): IObservable { + const worktree = session.worktree; + if (worktree) { + this._ensureFileWatch(worktree); + } + // Trigger initial read + this._refreshSessionTasks(worktree); + return this._sessionTasks; + } + + async getNonSessionTasks(session: IActiveSessionItem): Promise { + const allTasks = await this._readAllTasks(session); + return allTasks.filter(t => !t.inSessions); } - getScripts(_session: IActiveSessionItem): IObservable { - return this._scripts; + async addTaskToSessions(task: ITaskEntry, session: IActiveSessionItem, target: TaskStorageTarget): Promise { + const tasksJsonUri = this._getTasksJsonUri(session, target); + if (!tasksJsonUri) { + return; + } + + const tasksJson = await this._readTasksJson(tasksJsonUri); + const tasks = tasksJson.tasks ?? []; + const index = tasks.findIndex(t => t.label === task.label); + if (index === -1) { + return; + } + + await this._jsonEditingService.write(tasksJsonUri, [ + { path: ['tasks', index, 'inSessions'], value: true } + ], true); + + if (target === 'workspace') { + await this._commitTasksFile(session); + } } - async addScript(script: ISessionScript, session: IActiveSessionItem, target: ScriptStorageTarget): Promise { - const configTarget = target === 'user' ? ConfigurationTarget.USER_LOCAL : ConfigurationTarget.WORKSPACE; - const current = this._readScriptsForTarget(target); - const updated = [...current, script]; - await this._configurationService.updateValue(agentSessionsRunScriptsSettingId, updated, configTarget); + async createAndAddTask(command: string, session: IActiveSessionItem, target: TaskStorageTarget): Promise { + const tasksJsonUri = this._getTasksJsonUri(session, target); + if (!tasksJsonUri) { + return; + } + + const tasksJson = await this._readTasksJson(tasksJsonUri); + const tasks = tasksJson.tasks ?? []; + const newTask: ITaskEntry = { + label: command, + type: 'shell', + command, + inSessions: true, + }; + + await this._jsonEditingService.write(tasksJsonUri, [ + { path: ['version'], value: tasksJson.version ?? '2.0.0' }, + { path: ['tasks'], value: [...tasks, newTask] } + ], true); if (target === 'workspace') { - await this._commitSettingsFile(session); + await this._commitTasksFile(session); } } - async removeScript(script: ISessionScript, session: IActiveSessionItem): Promise { - const matches = (s: ISessionScript) => s.name === script.name && s.command === script.command; + async runTask(task: ITaskEntry, session: IActiveSessionItem): Promise { + const command = this._resolveCommand(task); + if (!command) { + return; + } - // Try workspace first - const workspaceScripts = this._readScriptsForTarget('workspace'); - if (workspaceScripts.some(matches)) { - const updated = workspaceScripts.filter(s => !matches(s)); - await this._configurationService.updateValue( - agentSessionsRunScriptsSettingId, - updated.length ? updated : undefined, - ConfigurationTarget.WORKSPACE, - ); - await this._commitSettingsFile(session); + const cwd = session.worktree ?? session.repository; + if (!cwd) { return; } - // Fall back to user - const userScripts = this._readScriptsForTarget('user'); - const updated = userScripts.filter(s => !matches(s)); - await this._configurationService.updateValue( - agentSessionsRunScriptsSettingId, - updated.length ? updated : undefined, - ConfigurationTarget.USER_LOCAL, - ); + const terminalKey = `${cwd.toString()}${command}`; + let terminal = this._getExistingTerminalInstance(terminalKey); + if (!terminal) { + terminal = await this._terminalService.createTerminal({ + location: TerminalLocation.Panel, + config: { name: task.label }, + cwd + }); + this._taskTerminals.set(terminalKey, terminal.instanceId); + } + await terminal.sendText(command, true); + this._terminalService.setActiveInstance(terminal); + await this._terminalService.revealActiveTerminal(); + + if (session.repository) { + const key = session.repository.toString(); + this._lastRunTaskLabels.set(key, task.label); + this._saveLastRunTaskLabels(); + const obs = this._lastRunTaskObservables.get(key); + if (obs) { + transaction(tx => obs.set(task.label, tx)); + } + } } - private _readScriptsForTarget(target: ScriptStorageTarget): readonly ISessionScript[] { - const inspected = this._configurationService.inspect(agentSessionsRunScriptsSettingId); - const value = target === 'user' ? inspected.userLocalValue : inspected.workspaceValue; - return parseScripts(value); + getLastRunTaskLabel(repository: URI | undefined): IObservable { + if (!repository) { + return observableValue('lastRunTaskLabel', undefined); + } + const key = repository.toString(); + let obs = this._lastRunTaskObservables.get(key); + if (!obs) { + obs = observableValue('lastRunTaskLabel', this._lastRunTaskLabels.get(key)); + this._lastRunTaskObservables.set(key, obs); + } + return obs; + } + + // --- private helpers --- + + private _getExistingTerminalInstance(terminalKey: string): ITerminalInstance | undefined { + const instanceId = this._taskTerminals.get(terminalKey); + if (instanceId === undefined) { + return undefined; + } + const instance = this._terminalService.instances.find(i => i.instanceId === instanceId); + if (!instance || instance.hasChildProcesses) { + this._taskTerminals.delete(terminalKey); + return undefined; + } + return instance; + } + + private _getTasksJsonUri(session: IActiveSessionItem, target: TaskStorageTarget): URI | undefined { + if (target === 'workspace') { + const worktree = session.worktree; + return worktree ? joinPath(worktree, '.vscode', 'tasks.json') : undefined; + } + return joinPath(dirname(this._preferencesService.userSettingsResource), 'tasks.json'); + } + + private async _readTasksJson(uri: URI): Promise { + try { + const content = await this._fileService.readFile(uri); + return parse(content.value.toString()); + } catch { + return {}; + } + } + + private async _readAllTasks(session: IActiveSessionItem): Promise { + const result: ITaskEntry[] = []; + + // Read workspace tasks + const workspaceUri = this._getTasksJsonUri(session, 'workspace'); + if (workspaceUri) { + const workspaceJson = await this._readTasksJson(workspaceUri); + if (workspaceJson.tasks) { + result.push(...workspaceJson.tasks); + } + } + + // Read user tasks + const userUri = this._getTasksJsonUri(session, 'user'); + if (userUri) { + const userJson = await this._readTasksJson(userUri); + if (userJson.tasks) { + result.push(...userJson.tasks); + } + } + + return result; + } + + private _resolveCommand(task: ITaskEntry): string | undefined { + if (isWindows && task.windows?.command) { + return task.windows.command; + } + if (isMacintosh && task.osx?.command) { + return task.osx.command; + } + if (!isWindows && !isMacintosh && task.linux?.command) { + return task.linux.command; + } + return task.command; } - private _readAllScripts(): readonly ISessionScript[] { - const inspected = this._configurationService.inspect(agentSessionsRunScriptsSettingId); - const userScripts = parseScripts(inspected.userLocalValue); - const workspaceScripts = parseScripts(inspected.workspaceValue); - return [...userScripts, ...workspaceScripts]; + private _ensureFileWatch(worktree: URI): void { + const tasksUri = joinPath(worktree, '.vscode', 'tasks.json'); + if (this._watchedResource && this._watchedResource.toString() === tasksUri.toString()) { + return; + } + this._watchedResource = tasksUri; + + const watcher = this._fileService.watch(tasksUri); + this._fileWatcher.value = watcher; + + this._register(this._fileService.onDidFilesChange(e => { + if (e.affects(tasksUri)) { + this._refreshSessionTasks(worktree); + } + })); + } + + private async _refreshSessionTasks(worktree: URI | undefined): Promise { + if (!worktree) { + transaction(tx => this._sessionTasks.set([], tx)); + return; + } + + const tasksUri = joinPath(worktree, '.vscode', 'tasks.json'); + const tasksJson = await this._readTasksJson(tasksUri); + const sessionTasks = (tasksJson.tasks ?? []).filter(t => t.inSessions); + + // Also include user-level session tasks + const userUri = joinPath(dirname(this._preferencesService.userSettingsResource), 'tasks.json'); + const userJson = await this._readTasksJson(userUri); + const userSessionTasks = (userJson.tasks ?? []).filter(t => t.inSessions); + + transaction(tx => this._sessionTasks.set([...sessionTasks, ...userSessionTasks], tx)); } - private async _commitSettingsFile(session: IActiveSessionItem): Promise { + private async _commitTasksFile(session: IActiveSessionItem): Promise { const worktree = session.worktree; if (!worktree) { return; } - const settingsUri = joinPath(worktree, '.vscode/settings.json'); - await this._sessionsManagementService.commitWorktreeFiles(session, [settingsUri]); + const tasksUri = joinPath(worktree, '.vscode', 'tasks.json'); + await this._sessionsManagementService.commitWorktreeFiles(session, [tasksUri]); + } + + private _loadLastRunTaskLabels(): Map { + const raw = this._storageService.get(SessionsConfigurationService._LAST_RUN_TASK_LABELS_KEY, StorageScope.APPLICATION); + if (raw) { + try { + return new Map(Object.entries(JSON.parse(raw))); + } catch { + // ignore corrupt data + } + } + return new Map(); + } + + private _saveLastRunTaskLabels(): void { + this._storageService.store( + SessionsConfigurationService._LAST_RUN_TASK_LABELS_KEY, + JSON.stringify(Object.fromEntries(this._lastRunTaskLabels)), + StorageScope.APPLICATION, + StorageTarget.USER + ); } } diff --git a/src/vs/sessions/contrib/chat/test/browser/sessionsConfigurationService.test.ts b/src/vs/sessions/contrib/chat/test/browser/sessionsConfigurationService.test.ts new file mode 100644 index 0000000000000..1961977de7cea --- /dev/null +++ b/src/vs/sessions/contrib/chat/test/browser/sessionsConfigurationService.test.ts @@ -0,0 +1,366 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import assert from 'assert'; +import { DisposableStore } from '../../../../../base/common/lifecycle.js'; +import { URI } from '../../../../../base/common/uri.js'; +import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js'; +import { mock } from '../../../../../base/test/common/mock.js'; +import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js'; +import { IFileContent, IFileService } from '../../../../../platform/files/common/files.js'; +import { InMemoryStorageService, IStorageService } from '../../../../../platform/storage/common/storage.js'; +import { IJSONEditingService, IJSONValue } from '../../../../../workbench/services/configuration/common/jsonEditing.js'; +import { IPreferencesService } from '../../../../../workbench/services/preferences/common/preferences.js'; +import { ITerminalInstance, ITerminalService } from '../../../../../workbench/contrib/terminal/browser/terminal.js'; +import { IActiveSessionItem, ISessionsManagementService } from '../../../sessions/browser/sessionsManagementService.js'; +import { ISessionsConfigurationService, SessionsConfigurationService, ITaskEntry } from '../../browser/sessionsConfigurationService.js'; +import { VSBuffer } from '../../../../../base/common/buffer.js'; +import { observableValue } from '../../../../../base/common/observable.js'; + +function makeSession(opts: { repository?: URI; worktree?: URI } = {}): IActiveSessionItem { + return { + repository: opts.repository, + worktree: opts.worktree, + } as IActiveSessionItem; +} + +function makeTask(label: string, command?: string, inSessions?: boolean): ITaskEntry { + return { label, type: 'shell', command: command ?? label, inSessions }; +} + +function tasksJsonContent(tasks: ITaskEntry[]): string { + return JSON.stringify({ version: '2.0.0', tasks }); +} + +suite('SessionsConfigurationService', () => { + + const store = new DisposableStore(); + let service: ISessionsConfigurationService; + let fileContents: Map; + let jsonEdits: { uri: URI; values: IJSONValue[] }[]; + let createdTerminals: { name: string | undefined; cwd: URI | string | undefined }[]; + let sentCommands: { command: string }[]; + let committedFiles: { session: IActiveSessionItem; fileUris: URI[] }[]; + let storageService: InMemoryStorageService; + + const userSettingsUri = URI.parse('file:///user/settings.json'); + const repoUri = URI.parse('file:///repo'); + const worktreeUri = URI.parse('file:///worktree'); + + setup(() => { + fileContents = new Map(); + jsonEdits = []; + createdTerminals = []; + sentCommands = []; + committedFiles = []; + + const instantiationService = store.add(new TestInstantiationService()); + + instantiationService.stub(IFileService, new class extends mock() { + override async readFile(resource: URI) { + const content = fileContents.get(resource.toString()); + if (content === undefined) { + throw new Error('file not found'); + } + return { value: VSBuffer.fromString(content) } as IFileContent; + } + override watch() { return { dispose() { } }; } + override onDidFilesChange: any = () => ({ dispose() { } }); + }); + + instantiationService.stub(IJSONEditingService, new class extends mock() { + override async write(resource: URI, values: IJSONValue[], _save: boolean) { + jsonEdits.push({ uri: resource, values }); + } + }); + + instantiationService.stub(IPreferencesService, new class extends mock() { + override userSettingsResource = userSettingsUri; + }); + + let nextInstanceId = 1; + const terminalInstances: (Partial & { instanceId: number })[] = []; + + const terminalServiceMock = new class extends mock() { + override get instances(): readonly ITerminalInstance[] { return terminalInstances as ITerminalInstance[]; } + override async createTerminal(opts?: { config?: { name?: string }; cwd?: URI }) { + const instance: Partial & { instanceId: number } = { + instanceId: nextInstanceId++, + initialCwd: opts?.cwd?.fsPath, + cwd: opts?.cwd?.fsPath, + hasChildProcesses: false, + sendText: async (text: string) => { sentCommands.push({ command: text }); }, + }; + createdTerminals.push({ name: opts?.config?.name, cwd: opts?.cwd }); + terminalInstances.push(instance); + return instance as ITerminalInstance; + } + override setActiveInstance() { } + override async revealActiveTerminal() { } + }; + + instantiationService.stub(ITerminalService, terminalServiceMock); + + instantiationService.stub(ISessionsManagementService, new class extends mock() { + override activeSession = observableValue('activeSession', undefined); + override async commitWorktreeFiles(session: IActiveSessionItem, fileUris: URI[]) { committedFiles.push({ session, fileUris }); } + }); + + storageService = store.add(new InMemoryStorageService()); + instantiationService.stub(IStorageService, storageService); + + service = store.add(instantiationService.createInstance(SessionsConfigurationService)); + }); + + teardown(() => { + store.clear(); + }); + + ensureNoDisposablesAreLeakedInTestSuite(); + + // --- getSessionTasks --- + + test('getSessionTasks returns tasks with inSessions: true from worktree', async () => { + const worktreeTasksUri = URI.parse('file:///worktree/.vscode/tasks.json'); + fileContents.set(worktreeTasksUri.toString(), tasksJsonContent([ + makeTask('build', 'npm run build', true), + makeTask('lint', 'npm run lint', false), + makeTask('test', 'npm test', true), + ])); + // user tasks.json — empty + const userTasksUri = URI.from({ scheme: userSettingsUri.scheme, path: '/user/tasks.json' }); + fileContents.set(userTasksUri.toString(), tasksJsonContent([])); + + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + const obs = service.getSessionTasks(session); + + // Let async refresh settle + await new Promise(r => setTimeout(r, 10)); + const tasks = obs.get(); + + assert.deepStrictEqual(tasks.map(t => t.label), ['build', 'test']); + }); + + test('getSessionTasks returns empty array when no worktree', async () => { + const session = makeSession({ repository: repoUri }); + const obs = service.getSessionTasks(session); + + await new Promise(r => setTimeout(r, 10)); + assert.deepStrictEqual(obs.get(), []); + }); + + // --- getNonSessionTasks --- + + test('getNonSessionTasks returns only tasks without inSessions', async () => { + const worktreeTasksUri = URI.parse('file:///worktree/.vscode/tasks.json'); + fileContents.set(worktreeTasksUri.toString(), tasksJsonContent([ + makeTask('build', 'npm run build', true), + makeTask('lint', 'npm run lint', false), + makeTask('test', 'npm test'), + ])); + const userTasksUri = URI.from({ scheme: userSettingsUri.scheme, path: '/user/tasks.json' }); + fileContents.set(userTasksUri.toString(), tasksJsonContent([])); + + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + const nonSessionTasks = await service.getNonSessionTasks(session); + + assert.deepStrictEqual(nonSessionTasks.map(t => t.label), ['lint', 'test']); + }); + + // --- addTaskToSessions --- + + test('addTaskToSessions writes inSessions: true to the matching task index', async () => { + const worktreeTasksUri = URI.parse('file:///worktree/.vscode/tasks.json'); + fileContents.set(worktreeTasksUri.toString(), tasksJsonContent([ + makeTask('build', 'npm run build'), + makeTask('test', 'npm test'), + ])); + + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + const task = makeTask('test', 'npm test'); + await service.addTaskToSessions(task, session, 'workspace'); + + assert.strictEqual(jsonEdits.length, 1); + assert.deepStrictEqual(jsonEdits[0].values, [{ path: ['tasks', 1, 'inSessions'], value: true }]); + assert.strictEqual(committedFiles.length, 1); + assert.strictEqual(committedFiles[0].fileUris[0].path, '/worktree/.vscode/tasks.json'); + }); + + test('addTaskToSessions does nothing when task label not found', async () => { + const worktreeTasksUri = URI.parse('file:///worktree/.vscode/tasks.json'); + fileContents.set(worktreeTasksUri.toString(), tasksJsonContent([ + makeTask('build', 'npm run build'), + ])); + + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + await service.addTaskToSessions(makeTask('nonexistent'), session, 'workspace'); + + assert.strictEqual(jsonEdits.length, 0); + }); + + // --- createAndAddTask --- + + test('createAndAddTask writes new task with inSessions: true', async () => { + const worktreeTasksUri = URI.parse('file:///worktree/.vscode/tasks.json'); + fileContents.set(worktreeTasksUri.toString(), tasksJsonContent([ + makeTask('existing', 'echo hi'), + ])); + + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + await service.createAndAddTask('npm run dev', session, 'workspace'); + + assert.strictEqual(jsonEdits.length, 1); + const edit = jsonEdits[0]; + assert.strictEqual(edit.uri.toString(), worktreeTasksUri.toString()); + const tasksValue = edit.values.find(v => v.path[0] === 'tasks'); + assert.ok(tasksValue); + const tasks = tasksValue!.value as ITaskEntry[]; + assert.strictEqual(tasks.length, 2); + assert.strictEqual(tasks[1].label, 'npm run dev'); + assert.strictEqual(tasks[1].inSessions, true); + assert.strictEqual(committedFiles.length, 1); + assert.strictEqual(committedFiles[0].fileUris[0].path, '/worktree/.vscode/tasks.json'); + }); + + // --- runTask --- + + test('runTask creates terminal and sends command', async () => { + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + const task = makeTask('build', 'npm run build'); + + await service.runTask(task, session); + + assert.strictEqual(createdTerminals.length, 1); + assert.strictEqual(createdTerminals[0].name, 'build'); + assert.strictEqual(sentCommands.length, 1); + assert.strictEqual(sentCommands[0].command, 'npm run build'); + }); + + test('runTask does nothing when no cwd available', async () => { + const session = makeSession({ repository: undefined, worktree: undefined }); + await service.runTask(makeTask('build', 'npm run build'), session); + + assert.strictEqual(createdTerminals.length, 0); + assert.strictEqual(sentCommands.length, 0); + }); + + test('runTask reuses the same terminal for the same command and worktree', async () => { + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + const task = makeTask('build', 'npm run build'); + + await service.runTask(task, session); + await service.runTask(task, session); + + assert.strictEqual(createdTerminals.length, 1, 'should create only one terminal'); + assert.strictEqual(sentCommands.length, 2, 'should send command twice'); + assert.strictEqual(sentCommands[0].command, 'npm run build'); + assert.strictEqual(sentCommands[1].command, 'npm run build'); + }); + + test('runTask creates different terminals for different commands', async () => { + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + + await service.runTask(makeTask('build', 'npm run build'), session); + await service.runTask(makeTask('test', 'npm test'), session); + + assert.strictEqual(createdTerminals.length, 2, 'should create two terminals'); + assert.strictEqual(createdTerminals[0].name, 'build'); + assert.strictEqual(createdTerminals[1].name, 'test'); + }); + + test('runTask creates different terminals for same command in different worktrees', async () => { + const wt1 = URI.parse('file:///worktree1'); + const wt2 = URI.parse('file:///worktree2'); + const session1 = makeSession({ worktree: wt1, repository: repoUri }); + const session2 = makeSession({ worktree: wt2, repository: repoUri }); + + await service.runTask(makeTask('build', 'npm run build'), session1); + await service.runTask(makeTask('build', 'npm run build'), session2); + + assert.strictEqual(createdTerminals.length, 2, 'should create two terminals for different worktrees'); + }); + + // --- getLastRunTaskLabel (MRU) --- + + test('getLastRunTaskLabel returns undefined when no task has been run', () => { + const obs = service.getLastRunTaskLabel(repoUri); + assert.strictEqual(obs.get(), undefined); + }); + + test('getLastRunTaskLabel returns label after runTask', async () => { + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + const obs = service.getLastRunTaskLabel(repoUri); + + await service.runTask(makeTask('build', 'npm run build'), session); + assert.strictEqual(obs.get(), 'build'); + + await service.runTask(makeTask('test', 'npm test'), session); + assert.strictEqual(obs.get(), 'test'); + }); + + test('getLastRunTaskLabel returns undefined for undefined repository', () => { + const obs = service.getLastRunTaskLabel(undefined); + assert.strictEqual(obs.get(), undefined); + }); + + test('getLastRunTaskLabel tracks separate repositories independently', async () => { + const repo1 = URI.parse('file:///repo1'); + const repo2 = URI.parse('file:///repo2'); + const wt1 = URI.parse('file:///wt1'); + const wt2 = URI.parse('file:///wt2'); + + const session1 = makeSession({ worktree: wt1, repository: repo1 }); + const session2 = makeSession({ worktree: wt2, repository: repo2 }); + + const obs1 = service.getLastRunTaskLabel(repo1); + const obs2 = service.getLastRunTaskLabel(repo2); + + await service.runTask(makeTask('build', 'npm run build'), session1); + await service.runTask(makeTask('test', 'npm test'), session2); + + assert.strictEqual(obs1.get(), 'build'); + assert.strictEqual(obs2.get(), 'test'); + }); + + test('getLastRunTaskLabel returns same observable for same repository', () => { + const obs1 = service.getLastRunTaskLabel(repoUri); + const obs2 = service.getLastRunTaskLabel(repoUri); + assert.strictEqual(obs1, obs2); + }); + + test('getLastRunTaskLabel persists across service instances', async () => { + const session = makeSession({ worktree: worktreeUri, repository: repoUri }); + await service.runTask(makeTask('build', 'npm run build'), session); + + // Create a second service instance using the same storage + const instantiationService = store.add(new TestInstantiationService()); + instantiationService.stub(IFileService, new class extends mock() { + override async readFile(): Promise { throw new Error('not found'); } + override watch() { return { dispose() { } }; } + override onDidFilesChange: any = () => ({ dispose() { } }); + }); + instantiationService.stub(IJSONEditingService, new class extends mock() { + override async write() { } + }); + instantiationService.stub(IPreferencesService, new class extends mock() { + override userSettingsResource = userSettingsUri; + }); + instantiationService.stub(ITerminalService, new class extends mock() { + override instances: readonly ITerminalInstance[] = []; + override async createTerminal() { return {} as ITerminalInstance; } + override setActiveInstance() { } + override async revealActiveTerminal() { } + }); + instantiationService.stub(ISessionsManagementService, new class extends mock() { + override activeSession = observableValue('activeSession', undefined); + override async commitWorktreeFiles() { } + }); + instantiationService.stub(IStorageService, storageService); + + const service2 = store.add(instantiationService.createInstance(SessionsConfigurationService)); + const obs = service2.getLastRunTaskLabel(repoUri); + assert.strictEqual(obs.get(), 'build'); + }); +}); diff --git a/src/vs/workbench/contrib/tasks/common/jsonSchema_v2.ts b/src/vs/workbench/contrib/tasks/common/jsonSchema_v2.ts index bdc6eb09448f0..8d937a1e5b5fc 100644 --- a/src/vs/workbench/contrib/tasks/common/jsonSchema_v2.ts +++ b/src/vs/workbench/contrib/tasks/common/jsonSchema_v2.ts @@ -56,6 +56,12 @@ const hide: IJSONSchema = { default: true }; +const inSessions: IJSONSchema = { + type: 'boolean', + description: nls.localize('JsonSchema.inSessions', 'Show this task in the Agent Sessions run action dropdown'), + default: false +}; + const taskIdentifier: IJSONSchema = { type: 'object', additionalProperties: true, @@ -437,6 +443,7 @@ const taskConfiguration: IJSONSchema = { presentation: Objects.deepClone(presentation), icon: Objects.deepClone(icon), hide: Objects.deepClone(hide), + inSessions: Objects.deepClone(inSessions), options: options, problemMatcher: { $ref: '#/definitions/problemMatcherType', @@ -510,6 +517,7 @@ taskDescriptionProperties.args = Objects.deepClone(args); taskDescriptionProperties.isShellCommand = Objects.deepClone(shellCommand); taskDescriptionProperties.dependsOn = dependsOn; taskDescriptionProperties.hide = Objects.deepClone(hide); +taskDescriptionProperties.inSessions = Objects.deepClone(inSessions); taskDescriptionProperties.dependsOrder = dependsOrder; taskDescriptionProperties.identifier = Objects.deepClone(identifier); taskDescriptionProperties.type = Objects.deepClone(taskType); diff --git a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts index 8751c6333804c..e90a90ea3b9de 100644 --- a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts @@ -374,6 +374,11 @@ export interface IConfigurationProperties { * Do not show this task in the run task quickpick */ hide?: boolean; + + /** + * Show this task in the Agent Sessions run action dropdown + */ + inSessions?: boolean; } export interface ICustomTask extends ICommandProperties, IConfigurationProperties { @@ -1363,7 +1368,8 @@ namespace ConfigurationProperties { { property: 'problemMatchers' }, { property: 'options' }, { property: 'icon' }, - { property: 'hide' } + { property: 'hide' }, + { property: 'inSessions' } ]; export function from(this: void, external: IConfigurationProperties & { [key: string]: unknown }, context: IParseContext, @@ -1392,6 +1398,7 @@ namespace ConfigurationProperties { } result.icon = external.icon; result.hide = external.hide; + result.inSessions = external.inSessions; if (external.isBackground !== undefined) { result.isBackground = !!external.isBackground; } @@ -1525,7 +1532,7 @@ namespace ConfiguringTask { type, taskIdentifier, RunOptions.fromConfiguration(external.runOptions), - { hide: external.hide } + { hide: external.hide, inSessions: external.inSessions } ); const configuration = ConfigurationProperties.from(external as IConfigurationProperties & { [key: string]: unknown }, context, true, source, typeDeclaration.properties); result.addTaskLoadMessages(configuration.errors); @@ -1678,7 +1685,8 @@ namespace CustomTask { name: configuredProps.configurationProperties.name || contributedTask.configurationProperties.name, identifier: configuredProps.configurationProperties.identifier || contributedTask.configurationProperties.identifier, icon: configuredProps.configurationProperties.icon, - hide: configuredProps.configurationProperties.hide + hide: configuredProps.configurationProperties.hide, + inSessions: configuredProps.configurationProperties.inSessions }, ); diff --git a/src/vs/workbench/contrib/tasks/common/taskService.ts b/src/vs/workbench/contrib/tasks/common/taskService.ts index 97f2ae8f30b0d..c3aa7462af51a 100644 --- a/src/vs/workbench/contrib/tasks/common/taskService.ts +++ b/src/vs/workbench/contrib/tasks/common/taskService.ts @@ -42,6 +42,7 @@ export interface ICustomizationProperties { isBackground?: boolean; color?: string; icon?: string; + inSessions?: boolean; } export interface ITaskFilter { diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index e44d7c915f9e6..c7b6427e5510e 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -577,6 +577,11 @@ export interface IConfigurationProperties { * Do not show this task in the run task quickpick */ hide?: boolean; + + /** + * Show this task in the Agent Sessions run action dropdown + */ + inSessions?: boolean; } export enum RunOnOptions { From 57118ce1d60bcdb270a2f79bbe81d7fca190fd04 Mon Sep 17 00:00:00 2001 From: BeniBenj Date: Mon, 23 Feb 2026 17:48:11 +0100 Subject: [PATCH 13/51] fix leak --- .../chat/browser/sessionsConfigurationService.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts b/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts index b11982b7d406c..c714df20efb8b 100644 --- a/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts +++ b/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js'; +import { Disposable, DisposableStore, MutableDisposable } from '../../../../base/common/lifecycle.js'; import { IObservable, observableValue, transaction } from '../../../../base/common/observable.js'; import { joinPath, dirname } from '../../../../base/common/resources.js'; import { parse } from '../../../../base/common/jsonc.js'; @@ -294,14 +294,16 @@ export class SessionsConfigurationService extends Disposable implements ISession } this._watchedResource = tasksUri; - const watcher = this._fileService.watch(tasksUri); - this._fileWatcher.value = watcher; + const disposables = new DisposableStore(); - this._register(this._fileService.onDidFilesChange(e => { + disposables.add(this._fileService.watch(tasksUri)); + disposables.add(this._fileService.onDidFilesChange(e => { if (e.affects(tasksUri)) { this._refreshSessionTasks(worktree); } })); + + this._fileWatcher.value = disposables; } private async _refreshSessionTasks(worktree: URI | undefined): Promise { From eeed167f0791dc84555b53130d83758054188d3e Mon Sep 17 00:00:00 2001 From: digitarald Date: Mon, 23 Feb 2026 08:48:14 -0800 Subject: [PATCH 14/51] Plan prompt is now built-in --- .github/prompts/plan.prompt.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .github/prompts/plan.prompt.md diff --git a/.github/prompts/plan.prompt.md b/.github/prompts/plan.prompt.md deleted file mode 100644 index e94ee7b24ebc5..0000000000000 --- a/.github/prompts/plan.prompt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -agent: Plan -description: 'Start planning' ---- -Start planning. From 62028559c1ca63edaa7fd32d3845ea502af07ab2 Mon Sep 17 00:00:00 2001 From: Kyle Cutler <67761731+kycutler@users.noreply.github.com> Date: Mon, 23 Feb 2026 08:52:41 -0800 Subject: [PATCH 15/51] Browser: better handling of pages without favicons or titles (#297024) * Browser: better handling of pages without favicons * titles * feedback --- .../browserView/common/browserView.ts | 3 +- .../browserView/electron-main/browserView.ts | 52 +++++++++---------- .../contrib/browserView/common/browserView.ts | 1 + .../electron-browser/browserEditor.ts | 1 + 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/vs/platform/browserView/common/browserView.ts b/src/vs/platform/browserView/common/browserView.ts index f22fd39e70b0c..28161016f83a3 100644 --- a/src/vs/platform/browserView/common/browserView.ts +++ b/src/vs/platform/browserView/common/browserView.ts @@ -38,6 +38,7 @@ export interface IBrowserViewState { export interface IBrowserViewNavigationEvent { url: string; + title: string; canGoBack: boolean; canGoForward: boolean; } @@ -81,7 +82,7 @@ export interface IBrowserViewTitleChangeEvent { } export interface IBrowserViewFaviconChangeEvent { - favicon: string; + favicon: string | undefined; } export enum BrowserNewPageLocation { diff --git a/src/vs/platform/browserView/electron-main/browserView.ts b/src/vs/platform/browserView/electron-main/browserView.ts index 3d49bdf13eaba..45e5d838d277c 100644 --- a/src/vs/platform/browserView/electron-main/browserView.ts +++ b/src/vs/platform/browserView/electron-main/browserView.ts @@ -175,42 +175,38 @@ export class BrowserView extends Disposable implements ICDPTarget { // Favicon events webContents.on('page-favicon-updated', async (_event, favicons) => { - if (!favicons || favicons.length === 0) { - return; - } - - const found = favicons.find(f => this._faviconRequestCache.get(f)); - if (found) { - // already have a cached request for this favicon, use it - this._lastFavicon = await this._faviconRequestCache.get(found)!; - this._onDidChangeFavicon.fire({ favicon: this._lastFavicon }); - return; - } - // try each url in order until one works for (const url of favicons) { - const request = (async () => { - const response = await webContents.session.fetch(url, { - cache: 'force-cache' - }); - const type = await response.headers.get('content-type'); - const buffer = await response.arrayBuffer(); - - return `data:${type};base64,${Buffer.from(buffer).toString('base64')}`; - })(); - - this._faviconRequestCache.set(url, request); + if (!this._faviconRequestCache.has(url)) { + this._faviconRequestCache.set(url, (async () => { + const response = await webContents.session.fetch(url, { + cache: 'force-cache' + }); + if (!response.ok) { + throw new Error(`Failed to fetch favicon: ${response.status} ${response.statusText}`); + } + const type = await response.headers.get('content-type'); + const buffer = await response.arrayBuffer(); + + return `data:${type};base64,${Buffer.from(buffer).toString('base64')}`; + })()); + } try { - this._lastFavicon = await request; + this._lastFavicon = await this._faviconRequestCache.get(url)!; this._onDidChangeFavicon.fire({ favicon: this._lastFavicon }); - // On success, leave the promise in the cache and stop looping + // On success, stop searching return; } catch (e) { - this._faviconRequestCache.delete(url); - // On failure, try the next one + // On failure, just try the next one } } + + // If we searched all favicons and none worked, clear the favicon + if (this._lastFavicon) { + this._lastFavicon = undefined; + this._onDidChangeFavicon.fire({ favicon: this._lastFavicon }); + } }); // Title events @@ -221,6 +217,7 @@ export class BrowserView extends Disposable implements ICDPTarget { const fireNavigationEvent = () => { this._onDidNavigate.fire({ url: webContents.getURL(), + title: webContents.getTitle(), canGoBack: webContents.navigationHistory.canGoBack(), canGoForward: webContents.navigationHistory.canGoForward() }); @@ -253,6 +250,7 @@ export class BrowserView extends Disposable implements ICDPTarget { fireLoadingEvent(false); this._onDidNavigate.fire({ url: validatedURL, + title: '', canGoBack: webContents.navigationHistory.canGoBack(), canGoForward: webContents.navigationHistory.canGoForward() }); diff --git a/src/vs/workbench/contrib/browserView/common/browserView.ts b/src/vs/workbench/contrib/browserView/common/browserView.ts index c231150b6030a..76f04a67f829d 100644 --- a/src/vs/workbench/contrib/browserView/common/browserView.ts +++ b/src/vs/workbench/contrib/browserView/common/browserView.ts @@ -278,6 +278,7 @@ export class BrowserViewModel extends Disposable implements IBrowserViewModel { } this._url = e.url; + this._title = e.title; this._canGoBack = e.canGoBack; this._canGoForward = e.canGoForward; })); diff --git a/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts b/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts index 4adcebc35a11f..234991e440b54 100644 --- a/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts +++ b/src/vs/workbench/contrib/browserView/electron-browser/browserEditor.ts @@ -413,6 +413,7 @@ export class BrowserEditor extends EditorPane { // Initialize UI state and context keys from model this.updateNavigationState({ url: this._model.url, + title: this._model.title, canGoBack: this._model.canGoBack, canGoForward: this._model.canGoForward }); From 24a712e9c0aabe45b8724eb3a4412ca04d2865af Mon Sep 17 00:00:00 2001 From: Jainam Patel <59076689+jainampatel27@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:19:50 +0530 Subject: [PATCH 16/51] fix: correct spelling mistakes in nls.localize strings in debug.ts (#296730) - 'internaly' -> 'internally' (callStackItemStopped) - 'refrence' -> 'reference' (canViewMemory) - 'exceptionBreakppint' -> 'exceptionBreakpoint' (breakpointItemType) - 'evalauteName' -> 'evaluateName' (variableEvaluateNamePresent) --- src/vs/workbench/contrib/debug/common/debug.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 0b6c80a8fb0d4..2aaeed0888847 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -59,12 +59,12 @@ export const CONTEXT_EXPRESSION_SELECTED = new RawContextKey('expressio export const CONTEXT_BREAKPOINT_INPUT_FOCUSED = new RawContextKey('breakpointInputFocused', false, { type: 'boolean', description: nls.localize('breakpointInputFocused', "True when the input box has focus in the BREAKPOINTS view.") }); export const CONTEXT_CALLSTACK_ITEM_TYPE = new RawContextKey('callStackItemType', undefined, { type: 'string', description: nls.localize('callStackItemType', "Represents the item type of the focused element in the CALL STACK view. For example: 'session', 'thread', 'stackFrame'") }); export const CONTEXT_CALLSTACK_SESSION_IS_ATTACH = new RawContextKey('callStackSessionIsAttach', false, { type: 'boolean', description: nls.localize('callStackSessionIsAttach', "True when the session in the CALL STACK view is attach, false otherwise. Used internally for inline menus in the CALL STACK view.") }); -export const CONTEXT_CALLSTACK_ITEM_STOPPED = new RawContextKey('callStackItemStopped', false, { type: 'boolean', description: nls.localize('callStackItemStopped', "True when the focused item in the CALL STACK is stopped. Used internaly for inline menus in the CALL STACK view.") }); +export const CONTEXT_CALLSTACK_ITEM_STOPPED = new RawContextKey('callStackItemStopped', false, { type: 'boolean', description: nls.localize('callStackItemStopped', "True when the focused item in the CALL STACK is stopped. Used internally for inline menus in the CALL STACK view.") }); export const CONTEXT_CALLSTACK_SESSION_HAS_ONE_THREAD = new RawContextKey('callStackSessionHasOneThread', false, { type: 'boolean', description: nls.localize('callStackSessionHasOneThread', "True when the focused session in the CALL STACK view has exactly one thread. Used internally for inline menus in the CALL STACK view.") }); export const CONTEXT_CALLSTACK_FOCUSED = new RawContextKey('callStackFocused', true, { type: 'boolean', description: nls.localize('callStackFocused', "True when the CALLSTACK view is focused, false otherwise.") }); export const CONTEXT_WATCH_ITEM_TYPE = new RawContextKey('watchItemType', undefined, { type: 'string', description: nls.localize('watchItemType', "Represents the item type of the focused element in the WATCH view. For example: 'expression', 'variable'") }); -export const CONTEXT_CAN_VIEW_MEMORY = new RawContextKey('canViewMemory', undefined, { type: 'boolean', description: nls.localize('canViewMemory', "Indicates whether the item in the view has an associated memory refrence.") }); -export const CONTEXT_BREAKPOINT_ITEM_TYPE = new RawContextKey('breakpointItemType', undefined, { type: 'string', description: nls.localize('breakpointItemType', "Represents the item type of the focused element in the BREAKPOINTS view. For example: 'breakpoint', 'exceptionBreakppint', 'functionBreakpoint', 'dataBreakpoint'") }); +export const CONTEXT_CAN_VIEW_MEMORY = new RawContextKey('canViewMemory', undefined, { type: 'boolean', description: nls.localize('canViewMemory', "Indicates whether the item in the view has an associated memory reference.") }); +export const CONTEXT_BREAKPOINT_ITEM_TYPE = new RawContextKey('breakpointItemType', undefined, { type: 'string', description: nls.localize('breakpointItemType', "Represents the item type of the focused element in the BREAKPOINTS view. For example: 'breakpoint', 'exceptionBreakpoint', 'functionBreakpoint', 'dataBreakpoint'") }); export const CONTEXT_BREAKPOINT_ITEM_IS_DATA_BYTES = new RawContextKey('breakpointItemBytes', undefined, { type: 'boolean', description: nls.localize('breakpointItemIsDataBytes', "Whether the breakpoint item is a data breakpoint on a byte range.") }); export const CONTEXT_BREAKPOINT_HAS_MODES = new RawContextKey('breakpointHasModes', false, { type: 'boolean', description: nls.localize('breakpointHasModes', "Whether the breakpoint has multiple modes it can switch to.") }); export const CONTEXT_BREAKPOINT_SUPPORTS_CONDITION = new RawContextKey('breakpointSupportsCondition', false, { type: 'boolean', description: nls.localize('breakpointSupportsCondition', "True when the focused breakpoint supports conditions.") }); @@ -90,7 +90,7 @@ export const CONTEXT_BREAK_WHEN_VALUE_IS_READ_SUPPORTED = new RawContextKey('terminateDebuggeeSupported', false, { type: 'boolean', description: nls.localize('terminateDebuggeeSupported', "True when the focused session supports the terminate debuggee capability.") }); export const CONTEXT_SUSPEND_DEBUGGEE_SUPPORTED = new RawContextKey('suspendDebuggeeSupported', false, { type: 'boolean', description: nls.localize('suspendDebuggeeSupported', "True when the focused session supports the suspend debuggee capability.") }); export const CONTEXT_TERMINATE_THREADS_SUPPORTED = new RawContextKey('terminateThreadsSupported', false, { type: 'boolean', description: nls.localize('terminateThreadsSupported', "True when the focused session supports the terminate threads capability.") }); -export const CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT = new RawContextKey('variableEvaluateNamePresent', false, { type: 'boolean', description: nls.localize('variableEvaluateNamePresent', "True when the focused variable has an 'evalauteName' field set.") }); +export const CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT = new RawContextKey('variableEvaluateNamePresent', false, { type: 'boolean', description: nls.localize('variableEvaluateNamePresent', "True when the focused variable has an 'evaluateName' field set.") }); export const CONTEXT_VARIABLE_IS_READONLY = new RawContextKey('variableIsReadonly', false, { type: 'boolean', description: nls.localize('variableIsReadonly', "True when the focused variable is read-only.") }); export const CONTEXT_VARIABLE_VALUE = new RawContextKey('variableValue', false, { type: 'string', description: nls.localize('variableValue', "Value of the variable, present for debug visualization clauses.") }); export const CONTEXT_VARIABLE_TYPE = new RawContextKey('variableType', false, { type: 'string', description: nls.localize('variableType', "Type of the variable, present for debug visualization clauses.") }); From ecef992abb4237b4ff1ab78cefa9fd1a46d2a7bd Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 19:05:08 +0100 Subject: [PATCH 17/51] sessions - more settings default tweaks (#297046) --- .../contrib/configuration/browser/configuration.contribution.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/sessions/contrib/configuration/browser/configuration.contribution.ts b/src/vs/sessions/contrib/configuration/browser/configuration.contribution.ts index 060a1b2e7d39c..1b9b03fdedf87 100644 --- a/src/vs/sessions/contrib/configuration/browser/configuration.contribution.ts +++ b/src/vs/sessions/contrib/configuration/browser/configuration.contribution.ts @@ -14,6 +14,8 @@ Registry.as(Extensions.Configuration).registerDefaultCon 'chat.unifiedAgentsBar.enabled': true, 'chat.viewSessions.enabled': false, + 'breadcrumbs.enabled': false, + 'diffEditor.renderSideBySide': false, 'diffEditor.hideUnchangedRegions.enabled': true, From e5a12acf361eff92a7a68719e6516fea0811a0bb Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 23 Feb 2026 12:06:08 -0600 Subject: [PATCH 18/51] tip improvements, cleanup (#297040) --- .../contrib/chat/browser/chatTipService.ts | 113 +++++++++++----- .../chat/test/browser/chatTipService.test.ts | 123 +++++++++++++++++- 2 files changed, 203 insertions(+), 33 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatTipService.ts b/src/vs/workbench/contrib/chat/browser/chatTipService.ts index d6c1702645bab..0584204fdb876 100644 --- a/src/vs/workbench/contrib/chat/browser/chatTipService.ts +++ b/src/vs/workbench/contrib/chat/browser/chatTipService.ts @@ -159,11 +159,6 @@ export interface ITipDefinition { /** If true, exclude the tip until the async file check completes. Default: false. */ readonly excludeUntilChecked?: boolean; }; - /** - * Setting keys that, if changed from their default value, make this tip ineligible. - * The tip won't be shown if the user has already customized the setting it describes. - */ - readonly excludeWhenSettingsChanged?: string[]; } /** @@ -211,6 +206,7 @@ const TIP_CATALOG: ITipDefinition[] = [ message: localize('tip.planMode', "Tip: Try the [Plan agent](command:workbench.action.chat.openPlan) to research and plan before implementing changes."), when: ChatContextKeys.chatModeName.notEqualsTo('Plan'), enabledCommands: ['workbench.action.chat.openPlan'], + excludeWhenCommandsExecuted: ['workbench.action.chat.openPlan'], excludeWhenModesUsed: ['Plan'], }, { @@ -239,6 +235,7 @@ const TIP_CATALOG: ITipDefinition[] = [ id: 'tip.customInstructions', message: localize('tip.customInstructions', "Tip: [Generate workspace instructions](command:workbench.action.chat.generateInstructions) apply coding conventions across all agent sessions."), enabledCommands: ['workbench.action.chat.generateInstructions'], + excludeWhenCommandsExecuted: ['workbench.action.chat.generateInstructions'], excludeWhenPromptFilesExist: { promptType: PromptsType.instructions, agentFileType: AgentFileType.copilotInstructionsMd, excludeUntilChecked: true }, }, { @@ -284,26 +281,11 @@ const TIP_CATALOG: ITipDefinition[] = [ when: ChatContextKeys.chatModeKind.isEqualTo(ChatModeKind.Agent), excludeWhenToolsInvoked: ['runSubagent'], }, - { - id: 'tip.sendToNewChat', - message: localize('tip.sendToNewChat', "Tip: Use [Send to New Chat](command:workbench.action.chat.sendToNewChat) to start a new conversation with a clean context window."), - when: ChatContextKeys.chatSessionIsEmpty.negate(), - enabledCommands: ['workbench.action.chat.sendToNewChat'], - excludeWhenCommandsExecuted: ['workbench.action.chat.sendToNewChat'], - }, - { - id: 'tip.thinkingStyle', - message: localize('tip.thinkingStyle', "Tip: Change how the agent's reasoning is displayed with the [thinking style](command:workbench.action.openSettings?%5B%22chat.agent.thinking.style%22%5D) setting."), - when: ChatContextKeys.chatModeKind.isEqualTo(ChatModeKind.Agent), - enabledCommands: ['workbench.action.openSettings'], - excludeWhenSettingsChanged: ['chat.agent.thinking.style'], - }, { id: 'tip.thinkingPhrases', message: localize('tip.thinkingPhrases', "Tip: Customize the loading messages shown while the agent works with [thinking phrases](command:workbench.action.openSettings?%5B%22chat.agent.thinking.phrases%22%5D)."), when: ChatContextKeys.chatModeKind.isEqualTo(ChatModeKind.Agent), enabledCommands: ['workbench.action.openSettings'], - excludeWhenSettingsChanged: ['chat.agent.thinking.phrases'], }, ]; @@ -317,6 +299,7 @@ export class TipEligibilityTracker extends Disposable { private static readonly _COMMANDS_STORAGE_KEY = 'chat.tips.executedCommands'; private static readonly _MODES_STORAGE_KEY = 'chat.tips.usedModes'; private static readonly _TOOLS_STORAGE_KEY = 'chat.tips.invokedTools'; + private static readonly _INSTRUCTION_FILES_EVER_DETECTED_KEY = 'chat.tips.instructionFilesEverDetected'; private readonly _executedCommands: Set; private readonly _usedModes: Set; @@ -340,6 +323,8 @@ export class TipEligibilityTracker extends Disposable { /** Generation counter per tip ID to discard stale async file-check results. */ private readonly _fileCheckGeneration = new Map(); + private readonly _fileChecksInFlight = new Map>(); + private _instructionFilesEverDetected: boolean; constructor( tips: readonly ITipDefinition[], @@ -362,6 +347,8 @@ export class TipEligibilityTracker extends Disposable { const storedTools = this._readApplicationWithProfileFallback(TipEligibilityTracker._TOOLS_STORAGE_KEY); this._invokedTools = new Set(storedTools ? JSON.parse(storedTools) : []); + this._instructionFilesEverDetected = this._storageService.getBoolean(TipEligibilityTracker._INSTRUCTION_FILES_EVER_DETECTED_KEY, StorageScope.APPLICATION, false); + // --- Derive what still needs tracking ---------------------------------- this._pendingCommands = new Set(); @@ -429,6 +416,11 @@ export class TipEligibilityTracker extends Disposable { this._tipsWithFileExclusions = tips.filter(t => t.excludeWhenPromptFilesExist); for (const tip of this._tipsWithFileExclusions) { + if (this._instructionFilesEverDetected && tip.id === 'tip.customInstructions') { + this._excludedByFiles.add(tip.id); + continue; + } + if (tip.excludeWhenPromptFilesExist!.excludeUntilChecked) { this._excludedByFiles.add(tip.id); } @@ -508,7 +500,43 @@ export class TipEligibilityTracker extends Disposable { return false; } + /** + * Revalidates all file-based tip exclusions. Tips with `excludeUntilChecked` + * are conservatively hidden until the re-check completes. + */ + refreshPromptFileExclusions(): void { + for (const tip of this._tipsWithFileExclusions) { + if (this._instructionFilesEverDetected && tip.id === 'tip.customInstructions') { + this._excludedByFiles.add(tip.id); + continue; + } + + if (tip.excludeWhenPromptFilesExist!.excludeUntilChecked) { + this._excludedByFiles.add(tip.id); + } + this._checkForPromptFiles(tip); + } + } + private async _checkForPromptFiles(tip: ITipDefinition): Promise { + const inFlight = this._fileChecksInFlight.get(tip.id); + if (inFlight) { + await inFlight; + return; + } + + const checkPromise = this._doCheckForPromptFiles(tip); + this._fileChecksInFlight.set(tip.id, checkPromise); + try { + await checkPromise; + } finally { + if (this._fileChecksInFlight.get(tip.id) === checkPromise) { + this._fileChecksInFlight.delete(tip.id); + } + } + } + + private async _doCheckForPromptFiles(tip: ITipDefinition): Promise { const config = tip.excludeWhenPromptFilesExist!; const generation = (this._fileCheckGeneration.get(tip.id) ?? 0) + 1; this._fileCheckGeneration.set(tip.id, generation); @@ -528,8 +556,14 @@ export class TipEligibilityTracker extends Disposable { const hasAgentFile = config.agentFileType ? agentInstructions.some(f => f.type === config.agentFileType) : false; + const hasPromptFilesOrAgentFile = hasPromptFiles || hasAgentFile; - if (hasPromptFiles || hasAgentFile) { + if (tip.id === 'tip.customInstructions' && hasPromptFilesOrAgentFile) { + this._instructionFilesEverDetected = true; + this._storageService.store(TipEligibilityTracker._INSTRUCTION_FILES_EVER_DETECTED_KEY, true, StorageScope.APPLICATION, StorageTarget.MACHINE); + } + + if (hasPromptFilesOrAgentFile) { this._excludedByFiles.add(tip.id); } else { this._excludedByFiles.delete(tip.id); @@ -598,9 +632,11 @@ export class ChatTipService extends Disposable implements IChatTipService { private static readonly _DISMISSED_TIP_KEY = 'chat.tip.dismissed'; private static readonly _LAST_TIP_ID_KEY = 'chat.tip.lastTipId'; private static readonly _YOLO_EVER_ENABLED_KEY = 'chat.tip.yoloModeEverEnabled'; + private static readonly _THINKING_PHRASES_EVER_MODIFIED_KEY = 'chat.tip.thinkingPhrasesEverModified'; private readonly _tracker: TipEligibilityTracker; private readonly _createSlashCommandsUsageTracker: CreateSlashCommandsUsageTracker; private _yoloModeEverEnabled: boolean; + private _thinkingPhrasesEverModified: boolean; private readonly _tipCommandListener = this._register(new MutableDisposable()); constructor( @@ -641,6 +677,20 @@ export class ChatTipService extends Disposable implements IChatTipService { } }); } + + this._thinkingPhrasesEverModified = this._storageService.getBoolean(ChatTipService._THINKING_PHRASES_EVER_MODIFIED_KEY, StorageScope.APPLICATION, false); + if (!this._thinkingPhrasesEverModified && this._isSettingModified(ChatConfiguration.ThinkingPhrases)) { + this._thinkingPhrasesEverModified = true; + this._storageService.store(ChatTipService._THINKING_PHRASES_EVER_MODIFIED_KEY, true, StorageScope.APPLICATION, StorageTarget.MACHINE); + } + if (!this._thinkingPhrasesEverModified) { + this._register(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(ChatConfiguration.ThinkingPhrases)) { + this._thinkingPhrasesEverModified = true; + this._storageService.store(ChatTipService._THINKING_PHRASES_EVER_MODIFIED_KEY, true, StorageScope.APPLICATION, StorageTarget.MACHINE); + } + })); + } } resetSession(): void { @@ -718,6 +768,7 @@ export class ChatTipService extends Disposable implements IChatTipService { getWelcomeTip(contextKeyService: IContextKeyService): IChatTip | undefined { this._createSlashCommandsUsageTracker.syncContextKey(contextKeyService); + this._tracker.refreshPromptFileExclusions(); // Check if tips are enabled if (!this._configurationService.getValue('chat.tips.enabled')) { return undefined; @@ -892,19 +943,23 @@ export class ChatTipService extends Disposable implements IChatTipService { return false; } } - if (tip.excludeWhenSettingsChanged) { - for (const key of tip.excludeWhenSettingsChanged) { - const inspected = this._configurationService.inspect(key); - if (inspected.userValue !== undefined || inspected.userLocalValue !== undefined || inspected.userRemoteValue !== undefined || inspected.workspaceValue !== undefined || inspected.workspaceFolderValue !== undefined) { - this._logService.debug('#ChatTips: tip excluded because setting was changed from default', tip.id, key); - return false; - } - } + if (tip.id === 'tip.thinkingPhrases' && this._thinkingPhrasesEverModified) { + this._logService.debug('#ChatTips: tip excluded because thinking phrases setting was previously modified', tip.id); + return false; } this._logService.debug('#ChatTips: tip is eligible', tip.id); return true; } + private _isSettingModified(key: string): boolean { + const inspected = this._configurationService.inspect(key); + return inspected.userValue !== undefined + || inspected.userLocalValue !== undefined + || inspected.userRemoteValue !== undefined + || inspected.workspaceValue !== undefined + || inspected.workspaceFolderValue !== undefined; + } + private _getCurrentChatModelId(contextKeyService: IContextKeyService): string { const normalize = (modelId: string | undefined): string => { const normalizedModelId = modelId?.toLowerCase() ?? ''; diff --git a/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts b/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts index 831a6292bae74..6f8a3d8e9a59b 100644 --- a/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts @@ -535,6 +535,29 @@ suite('ChatTipService', () => { assert.strictEqual(tracker.isExcluded(tip), false, 'Should not be excluded when no instruction files exist'); }); + test('excludes tip.customInstructions when generate instructions command has been executed', () => { + const tip: ITipDefinition = { + id: 'tip.customInstructions', + message: 'test', + excludeWhenCommandsExecuted: ['workbench.action.chat.generateInstructions'], + }; + + const tracker = testDisposables.add(new TipEligibilityTracker( + [tip], + { onDidExecuteCommand: commandExecutedEmitter.event, onWillExecuteCommand: Event.None } as Partial as ICommandService, + storageService, + createMockPromptsService() as IPromptsService, + createMockToolsService(), + new NullLogService(), + )); + + assert.strictEqual(tracker.isExcluded(tip), false, 'Should not be excluded before command is executed'); + + commandExecutedEmitter.fire({ commandId: 'workbench.action.chat.generateInstructions', args: [] }); + + assert.strictEqual(tracker.isExcluded(tip), true, 'Should be excluded after generate instructions command is executed'); + }); + test('excludes tip.agentMode when agent mode has been used in workspace', () => { const tip: ITipDefinition = { id: 'tip.agentMode', @@ -587,6 +610,29 @@ suite('ChatTipService', () => { assert.strictEqual(tracker.isExcluded(tip), true, 'Should be excluded after Plan mode has been recorded'); }); + test('excludes tip.planMode when open plan command has been executed', () => { + const tip: ITipDefinition = { + id: 'tip.planMode', + message: 'test', + excludeWhenCommandsExecuted: ['workbench.action.chat.openPlan'], + }; + + const tracker = testDisposables.add(new TipEligibilityTracker( + [tip], + { onDidExecuteCommand: commandExecutedEmitter.event, onWillExecuteCommand: Event.None } as Partial as ICommandService, + storageService, + createMockPromptsService() as IPromptsService, + createMockToolsService(), + new NullLogService(), + )); + + assert.strictEqual(tracker.isExcluded(tip), false, 'Should not be excluded before command is executed'); + + commandExecutedEmitter.fire({ commandId: 'workbench.action.chat.openPlan', args: [] }); + + assert.strictEqual(tracker.isExcluded(tip), true, 'Should be excluded after open plan command is executed'); + }); + test('persists command exclusions to workspace storage across tracker instances', () => { const tip: ITipDefinition = { id: 'tip.undoChanges', @@ -920,7 +966,6 @@ suite('ChatTipService', () => { } for (const { tipId, settingKey } of [ - { tipId: 'tip.thinkingStyle', settingKey: 'chat.agent.thinking.style' }, { tipId: 'tip.thinkingPhrases', settingKey: 'chat.agent.thinking.phrases' }, ]) { test(`shows ${tipId} with correct setting link when setting is at default`, async () => { @@ -1073,11 +1118,11 @@ suite('ChatTipService', () => { assert.strictEqual(disabledEvents[0].data.tipId, tip.id); }); - test('excludeWhenSettingsChanged checks workspaceValue', () => { + test('thinking phrases ever-modified seed checks workspaceValue', () => { const workspaceConfigService = new TestConfigurationService(); const originalInspect = workspaceConfigService.inspect.bind(workspaceConfigService); workspaceConfigService.inspect = (key: string, overrides?: any) => { - if (key === 'chat.agent.thinking.style') { + if (key === 'chat.agent.thinking.phrases') { return { ...originalInspect(key, overrides), userValue: undefined, userLocalValue: undefined, workspaceValue: 'compact' } as unknown as T; } return originalInspect(key, overrides); @@ -1088,7 +1133,16 @@ suite('ChatTipService', () => { const service = createService(); contextKeyService.createKey(ChatContextKeys.chatModeKind.key, ChatModeKind.Agent); - assertTipNeverShown(service, 'tip.thinkingStyle'); + assertTipNeverShown(service, 'tip.thinkingPhrases'); + }); + + test('does not show tip.thinkingPhrases when previous modification is persisted', () => { + storageService.store('chat.tip.thinkingPhrasesEverModified', true, StorageScope.APPLICATION, StorageTarget.MACHINE); + + const service = createService(); + contextKeyService.createKey(ChatContextKeys.chatModeKind.key, ChatModeKind.Agent); + + assertTipNeverShown(service, 'tip.thinkingPhrases'); }); test('re-checks agent file exclusion when onDidChangeCustomAgents fires', async () => { @@ -1124,6 +1178,67 @@ suite('ChatTipService', () => { assert.strictEqual(tracker.isExcluded(tip), true, 'Should be excluded after onDidChangeCustomAgents fires and agent files exist'); }); + + test('refreshPromptFileExclusions re-checks instruction files after startup', async () => { + let instructionFiles: IPromptPath[] = []; + + const tip: ITipDefinition = { + id: 'tip.customInstructions', + message: 'test', + excludeWhenPromptFilesExist: { promptType: PromptsType.instructions, agentFileType: AgentFileType.copilotInstructionsMd, excludeUntilChecked: true }, + }; + + const tracker = testDisposables.add(new TipEligibilityTracker( + [tip], + { onDidExecuteCommand: Event.None, onWillExecuteCommand: Event.None } as Partial as ICommandService, + storageService, + createMockPromptsService([], [], { + listPromptFiles: async () => instructionFiles, + }) as IPromptsService, + createMockToolsService(), + new NullLogService(), + )); + + await new Promise(r => setTimeout(r, 0)); + assert.strictEqual(tracker.isExcluded(tip), false, 'Should not be excluded after initial check finds no files'); + + instructionFiles = [{ uri: URI.file('/.github/instructions/coding.instructions.md'), storage: PromptsStorage.local, type: PromptsType.instructions }]; + tracker.refreshPromptFileExclusions(); + await new Promise(r => setTimeout(r, 0)); + + assert.strictEqual(tracker.isExcluded(tip), true, 'Should be excluded after refresh finds instruction files'); + }); + + test('keeps tip.customInstructions excluded after instruction files were detected once', async () => { + const tip: ITipDefinition = { + id: 'tip.customInstructions', + message: 'test', + excludeWhenPromptFilesExist: { promptType: PromptsType.instructions, agentFileType: AgentFileType.copilotInstructionsMd, excludeUntilChecked: true }, + }; + + const tracker1 = testDisposables.add(new TipEligibilityTracker( + [tip], + { onDidExecuteCommand: Event.None, onWillExecuteCommand: Event.None } as Partial as ICommandService, + storageService, + createMockPromptsService([], [{ uri: URI.file('/.github/instructions/coding.instructions.md'), storage: PromptsStorage.local, type: PromptsType.instructions }]) as IPromptsService, + createMockToolsService(), + new NullLogService(), + )); + + await new Promise(r => setTimeout(r, 0)); + assert.strictEqual(tracker1.isExcluded(tip), true, 'Should be excluded when instruction files exist'); + + const tracker2 = testDisposables.add(new TipEligibilityTracker( + [tip], + { onDidExecuteCommand: Event.None, onWillExecuteCommand: Event.None } as Partial as ICommandService, + storageService, + createMockPromptsService() as IPromptsService, + createMockToolsService(), + new NullLogService(), + )); + + assert.strictEqual(tracker2.isExcluded(tip), true, 'Should remain excluded based on persisted detection signal'); + }); }); suite('CreateSlashCommandsUsageTracker', () => { From 63c371856d8887b766f7fe539bc1d8773a482545 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 23 Feb 2026 19:11:29 +0100 Subject: [PATCH 19/51] remember selected model in sessions window (#297037) * feat: implement storage for last picked model in NewChatWidget * fix: update storage key for last picked model in NewChatWidget --- .../contrib/chat/browser/newChatViewPane.ts | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts b/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts index 8c8617ccd9b93..b9607129ef8d8 100644 --- a/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts +++ b/src/vs/sessions/contrib/chat/browser/newChatViewPane.ts @@ -27,6 +27,7 @@ import { IInstantiationService } from '../../../../platform/instantiation/common import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js'; import { ILogService } from '../../../../platform/log/common/log.js'; import { IOpenerService } from '../../../../platform/opener/common/opener.js'; +import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; import { IThemeService } from '../../../../platform/theme/common/themeService.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; import { getDefaultHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegateFactory.js'; @@ -58,6 +59,8 @@ import { BranchPicker } from './branchPicker.js'; import { INewSession } from './newSession.js'; import { getErrorMessage } from '../../../../base/common/errors.js'; +const STORAGE_KEY_LAST_MODEL = 'sessions.selectedModel'; + // #region --- Chat Welcome Widget --- /** @@ -134,6 +137,7 @@ class NewChatWidget extends Disposable { @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, @ISessionsManagementService private readonly sessionsManagementService: ISessionsManagementService, @IGitService private readonly gitService: IGitService, + @IStorageService private readonly storageService: IStorageService, ) { super(); this._contextAttachments = this._register(this.instantiationService.createInstance(NewChatContextAttachments)); @@ -468,6 +472,7 @@ class NewChatWidget extends Disposable { currentModel: this._currentLanguageModel, setModel: (model: ILanguageModelChatMetadataAndIdentifier) => { this._currentLanguageModel.set(model, undefined); + this.storageService.store(STORAGE_KEY_LAST_MODEL, model.identifier, StorageScope.PROFILE, StorageTarget.MACHINE); this._newSession.value?.setModelId(model.identifier); this._focusEditor(); }, @@ -490,16 +495,24 @@ class NewChatWidget extends Disposable { } private _initDefaultModel(): void { + const lastModelId = this.storageService.get(STORAGE_KEY_LAST_MODEL, StorageScope.PROFILE); const models = this._getAvailableModels(); - if (models.length > 0) { + const lastModel = lastModelId ? models.find(m => m.identifier === lastModelId) : undefined; + if (lastModel) { + this._currentLanguageModel.set(lastModel, undefined); + } else if (models.length > 0) { this._currentLanguageModel.set(models[0], undefined); } this._register(this.languageModelsService.onDidChangeLanguageModels(() => { if (!this._currentLanguageModel.get()) { - const models = this._getAvailableModels(); - if (models.length > 0) { - this._currentLanguageModel.set(models[0], undefined); + const storedId = this.storageService.get(STORAGE_KEY_LAST_MODEL, StorageScope.PROFILE); + const updated = this._getAvailableModels(); + const stored = storedId ? updated.find(m => m.identifier === storedId) : undefined; + if (stored) { + this._currentLanguageModel.set(stored, undefined); + } else if (updated.length > 0) { + this._currentLanguageModel.set(updated[0], undefined); } } })); From 0ccdf144369d8110b525d4c554c0f8b21c0ceef1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 23 Feb 2026 19:16:09 +0100 Subject: [PATCH 20/51] fix: conditionally attach diagnostics based on configuration setting (#297049) --- .../contrib/inlineChat/browser/inlineChatController.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 5b9416ce49d40..8fd374d6ac322 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -508,6 +508,10 @@ export class InlineChatController implements IEditorContribution { try { await this._applyModelDefaults(session, sessionStore); + if (arg) { + arg.attachDiagnostics ??= this._configurationService.getValue(InlineChatConfigKeys.RenderMode) === 'zone'; + } + // ADD diagnostics (only when explicitly requested) if (arg?.attachDiagnostics) { const entries: IChatRequestVariableEntry[] = []; From b7238ce5bc466eb8bec2883dae92dad07022059c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 23 Feb 2026 19:28:33 +0100 Subject: [PATCH 21/51] Add CancelSessionAction and integrate into inline chat actions (#297048) * Add CancelSessionAction and integrate into inline chat actions fixes pressing Cancel not doing anything * ccr --- .../browser/actions/chatExecuteActions.ts | 2 ++ .../browser/inlineChat.contribution.ts | 1 + .../inlineChat/browser/inlineChatActions.ts | 25 +++++++++++++++++++ .../browser/inlineChatController.ts | 2 ++ .../browser/inlineChatOverlayWidget.ts | 3 +-- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts index a9e08c350c5db..0fd03576d084d 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts @@ -39,6 +39,7 @@ import { getEditingSessionContext } from '../chatEditing/chatEditingActions.js'; import { ctxHasEditorModification, ctxHasRequestInProgress, ctxIsGlobalEditingSession } from '../chatEditing/chatEditingEditorContextKeys.js'; import { ACTION_ID_NEW_CHAT, CHAT_CATEGORY, clearChatSessionPreservingType, handleCurrentEditingSession, handleModeSwitch } from './chatActions.js'; import { CreateRemoteAgentJobAction } from './chatContinueInAction.js'; +import { CTX_HOVER_MODE } from '../../../inlineChat/common/inlineChat.js'; export interface IVoiceChatExecuteActionContext { readonly disableTimeout?: boolean; @@ -859,6 +860,7 @@ export class CancelAction extends Action2 { when: ContextKeyExpr.and( ctxIsGlobalEditingSession.negate(), ctxHasRequestInProgress, + CTX_HOVER_MODE.negate(), ), order: 4, group: 'navigation', diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts index def506dfd1a66..2220f7d147462 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts @@ -29,6 +29,7 @@ registerEditorContribution(InlineChatController.ID, InlineChatController, Editor registerAction2(InlineChatActions.KeepSessionAction2); registerAction2(InlineChatActions.UndoSessionAction2); registerAction2(InlineChatActions.UndoAndCloseSessionAction2); +registerAction2(InlineChatActions.CancelSessionAction); // --- browser diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index 882525d9900af..3007bac0d9158 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -386,6 +386,31 @@ export class UndoAndCloseSessionAction2 extends KeepOrUndoSessionAction { } } +export class CancelSessionAction extends KeepOrUndoSessionAction { + + constructor() { + super(false, { + id: 'inlineChat2.cancel', + title: localize2('cancel', "Cancel"), + precondition: ContextKeyExpr.and(CTX_INLINE_CHAT_VISIBLE, ctxHasRequestInProgress), + keybinding: [{ + when: ContextKeyExpr.or( + EditorContextKeys.focus, + ChatContextKeys.inputHasFocus, + ), + weight: KeybindingWeight.WorkbenchContrib + 1, + primary: KeyCode.Escape, + }], + menu: [{ + id: MenuId.ChatEditorInlineExecute, + group: 'navigation', + order: 100, + when: ctxHasRequestInProgress + }] + }); + } +} + export class SubmitInlineChatInputAction extends AbstractInlineChatAction { constructor() { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 8fd374d6ac322..8cbb1326de4e2 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -151,6 +151,7 @@ export class InlineChatController implements IEditorContribution { @ILanguageModelsService private readonly _languageModelService: ILanguageModelsService, @ILogService private readonly _logService: ILogService, @IChatEditingService private readonly _chatEditingService: IChatEditingService, + @IChatService private readonly _chatService: IChatService, ) { const editorObs = observableCodeEditor(_editor); @@ -599,6 +600,7 @@ export class InlineChatController implements IEditorContribution { if (!session) { return; } + this._chatService.cancelCurrentRequestForSession(session.chatModel.sessionResource); await session.editingSession.reject(); session.dispose(); } diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts index 2a997e1555fdb..486d0bc4442b1 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatOverlayWidget.ts @@ -36,7 +36,6 @@ import { IConfigurationService } from '../../../../platform/configuration/common import { getSimpleEditorOptions } from '../../codeEditor/browser/simpleEditorOptions.js'; import { PlaceholderTextContribution } from '../../../../editor/contrib/placeholderText/browser/placeholderTextContribution.js'; import { IInlineChatSession2 } from './inlineChatSessionService.js'; -import { CancelChatActionId } from '../../chat/browser/actions/chatExecuteActions.js'; import { assertType } from '../../../../base/common/types.js'; /** @@ -476,7 +475,7 @@ export class InlineChatSessionOverlayWidget extends Disposable { }, menuOptions: { renderShortTitle: true }, actionViewItemProvider: (action, options) => { - const primaryActions = [CancelChatActionId, 'inlineChat2.keep']; + const primaryActions = ['inlineChat2.cancel', 'inlineChat2.keep']; const labeledActions = primaryActions.concat(['inlineChat2.undo']); if (!labeledActions.includes(action.id)) { From 52dbada6fce60211d64f4ab25b849a7eb2b0fe32 Mon Sep 17 00:00:00 2001 From: David Dossett <25163139+daviddossett@users.noreply.github.com> Date: Mon, 23 Feb 2026 10:28:50 -0800 Subject: [PATCH 22/51] Revert extra line in chat input (#297052) Revert extra line in chat input, add 8px toolbar spacing - Remove INPUT_EDITOR_MIN_VISIBLE_LINES constant that forced 2-line minimum - Revert input editor height to content-based sizing - Add 8px margin-top on chat-input-toolbars for spacing between editor and toolbar --- .../contrib/chat/browser/widget/input/chatInputPart.ts | 8 ++------ .../workbench/contrib/chat/browser/widget/media/chat.css | 1 + 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts index 7e52aae50849e..442b4e0510222 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts @@ -35,7 +35,7 @@ import { URI } from '../../../../../../base/common/uri.js'; import { IEditorConstructionOptions } from '../../../../../../editor/browser/config/editorConfiguration.js'; import { EditorExtensionsRegistry } from '../../../../../../editor/browser/editorExtensions.js'; import { CodeEditorWidget } from '../../../../../../editor/browser/widget/codeEditor/codeEditorWidget.js'; -import { EditorLayoutInfo, EditorOption, EditorOptions, IEditorOptions } from '../../../../../../editor/common/config/editorOptions.js'; +import { EditorLayoutInfo, EditorOptions, IEditorOptions } from '../../../../../../editor/common/config/editorOptions.js'; import { IDimension } from '../../../../../../editor/common/core/2d/dimension.js'; import { IPosition } from '../../../../../../editor/common/core/position.js'; import { IRange, Range } from '../../../../../../editor/common/core/range.js'; @@ -131,7 +131,6 @@ import { EnhancedModelPickerActionItem } from './modelPickerActionItem2.js'; const $ = dom.$; const INPUT_EDITOR_MAX_HEIGHT = 250; -const INPUT_EDITOR_MIN_VISIBLE_LINES = 2; const CachedLanguageModelsKey = 'chat.cachedLanguageModels.v2'; export interface IChatInputStyles { @@ -2999,10 +2998,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge const initialEditorScrollWidth = this._inputEditor.getScrollWidth(); const newEditorWidth = width - data.inputPartHorizontalPadding - data.editorBorder - data.inputPartHorizontalPaddingInside - data.toolbarsWidth - data.sideToolbarWidth; - const lineHeight = this._inputEditor.getOption(EditorOption.lineHeight); - const { top, bottom } = this._inputEditor.getOption(EditorOption.padding); - const inputEditorMinHeight = this.options.renderStyle === 'compact' ? 0 : (lineHeight * INPUT_EDITOR_MIN_VISIBLE_LINES) + top + bottom; - const inputEditorHeight = Math.max(inputEditorMinHeight, Math.min(this._inputEditor.getContentHeight(), this.inputEditorMaxHeight)); + const inputEditorHeight = Math.min(this._inputEditor.getContentHeight(), this.inputEditorMaxHeight); const newDimension = { width: newEditorWidth, height: inputEditorHeight }; if (!this.previousInputEditorDimension || (this.previousInputEditorDimension.width !== newDimension.width || this.previousInputEditorDimension.height !== newDimension.height)) { // This layout call has side-effects that are hard to understand. eg if we are calling this inside a onDidChangeContent handler, this can trigger the next onDidChangeContent handler diff --git a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css index 675c91bdfcee7..3d1d38ec14eba 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css @@ -1302,6 +1302,7 @@ have to be updated for changes to the rules above, or to support more deeply nes display: flex; align-items: center; gap: 6px; + margin-top: 4px; } .interactive-session .chat-input-toolbars :not(.responsive.chat-input-toolbar) .actions-container:first-child { From 24da50806e096004fd3b159bcec513ab000ec2d0 Mon Sep 17 00:00:00 2001 From: Josh Spicer <23246594+joshspicer@users.noreply.github.com> Date: Mon, 23 Feb 2026 10:45:47 -0800 Subject: [PATCH 23/51] AI customizations: Setting and add to GlobalActivity menu (#297030) * feat: add short title and menu entry for AI Customizations action * feat: add configuration option for AI Customizations feature * feat: rename AI Customizations configuration option to reflect menu visibility * feat: adjust order of AI Customization menu entry for improved visibility * feat: update AI Customization menu entry group and order for better organization * feat: remove group and order from AI Customization menu entry for cleaner configuration * Update src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../aiCustomizationManagement.contribution.ts | 12 ++++++++++-- .../contrib/chat/browser/chat.contribution.ts | 5 +++++ src/vs/workbench/contrib/chat/common/constants.ts | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts b/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts index cc7a9fcd85a77..28e7739d0ec7d 100644 --- a/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts @@ -5,7 +5,7 @@ import { Disposable } from '../../../../../base/common/lifecycle.js'; import { localize, localize2 } from '../../../../../nls.js'; -import { Action2, MenuRegistry, registerAction2 } from '../../../../../platform/actions/common/actions.js'; +import { Action2, MenuId, MenuRegistry, registerAction2 } from '../../../../../platform/actions/common/actions.js'; import { SyncDescriptor } from '../../../../../platform/instantiation/common/descriptors.js'; import { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js'; import { Registry } from '../../../../../platform/registry/common/platform.js'; @@ -30,6 +30,7 @@ import { ICommandService } from '../../../../../platform/commands/common/command import { PromptsType } from '../../common/promptSyntax/promptTypes.js'; import { PromptsStorage } from '../../common/promptSyntax/service/promptsService.js'; import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js'; +import { ChatConfiguration } from '../../common/constants.js'; import { IFileService } from '../../../../../platform/files/common/files.js'; import { IDialogService } from '../../../../../platform/dialogs/common/dialogs.js'; import { basename } from '../../../../../base/common/resources.js'; @@ -269,9 +270,16 @@ class AICustomizationManagementActionsContribution extends Disposable implements super({ id: AICustomizationManagementCommands.OpenEditor, title: localize2('openAICustomizations', "Open AI Customizations"), + shortTitle: localize2('aiCustomizations', "AI Customizations"), category: CHAT_CATEGORY, - precondition: ChatContextKeys.enabled, + precondition: ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.has(`config.${ChatConfiguration.AICustomizationMenuEnabled}`)), f1: true, + menu: [{ + id: MenuId.GlobalActivity, + when: ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.has(`config.${ChatConfiguration.AICustomizationMenuEnabled}`)), + group: '2_configuration', + order: 4, + }], }); } diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index dc773171f9d41..6c8637588e1e7 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -1224,6 +1224,11 @@ configurationRegistry.registerConfiguration({ experiment: { mode: 'auto' } + }, + [ChatConfiguration.AICustomizationMenuEnabled]: { + type: 'boolean', + description: nls.localize('chat.aiCustomizationMenu.enabled', "Controls whether the AI Customization Menu is shown in the Manage menu and Command Palette. When disabled, the AI Customizations editor and related commands are hidden."), + default: true, } } }); diff --git a/src/vs/workbench/contrib/chat/common/constants.ts b/src/vs/workbench/contrib/chat/common/constants.ts index 4cecc2f0fae48..a2a2336a9e82d 100644 --- a/src/vs/workbench/contrib/chat/common/constants.ts +++ b/src/vs/workbench/contrib/chat/common/constants.ts @@ -54,6 +54,7 @@ export enum ChatConfiguration { AgentsControlClickBehavior = 'chat.agentsControl.clickBehavior', ExplainChangesEnabled = 'chat.editing.explainChanges.enabled', GrowthNotificationEnabled = 'chat.growthNotification.enabled', + AICustomizationMenuEnabled = 'chat.aiCustomizationMenu.enabled', } /** From 505bfe7d05ce1fb8bb52f37dbf2002273c397794 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 23 Feb 2026 10:37:20 -0800 Subject: [PATCH 24/51] plugins: add @agentPlugins to marketplace view --- .../chat/browser/actions/chatPluginActions.ts | 116 +--- .../contrib/chat/browser/agentPluginsView.ts | 515 ++++++++++++++++++ .../contrib/chat/browser/chat.contribution.ts | 2 + .../extensions/browser/extensionsViewlet.ts | 7 +- .../extensions/common/extensionQuery.ts | 2 +- .../contrib/extensions/common/extensions.ts | 1 + 6 files changed, 532 insertions(+), 111 deletions(-) create mode 100644 src/vs/workbench/contrib/chat/browser/agentPluginsView.ts diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.ts index 5eb0f3e2f0b3d..8dc3610a23e31 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.ts @@ -3,26 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CancellationTokenSource } from '../../../../../base/common/cancellation.js'; import { localize, localize2 } from '../../../../../nls.js'; import { Action2, registerAction2 } from '../../../../../platform/actions/common/actions.js'; import { ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js'; -import { IQuickInputButton, IQuickInputService, IQuickPickItem, QuickPickInput } from '../../../../../platform/quickinput/common/quickInput.js'; +import { IQuickInputService, IQuickPickItem, QuickPickInput } from '../../../../../platform/quickinput/common/quickInput.js'; import { DisposableStore } from '../../../../../base/common/lifecycle.js'; import { ILabelService } from '../../../../../platform/label/common/label.js'; import { IDialogService, IFileDialogService } from '../../../../../platform/dialogs/common/dialogs.js'; -import { IOpenerService } from '../../../../../platform/opener/common/opener.js'; import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js'; import { dirname } from '../../../../../base/common/resources.js'; import { ChatContextKeys } from '../../common/actions/chatContextKeys.js'; import { IAgentPlugin, IAgentPluginService } from '../../common/plugins/agentPluginService.js'; -import { IMarketplacePlugin, IPluginMarketplaceService } from '../../common/plugins/pluginMarketplaceService.js'; import { CHAT_CATEGORY, CHAT_CONFIG_MENU_ID } from './chatActions.js'; import { ResourceSet } from '../../../../../base/common/map.js'; -import { Codicon } from '../../../../../base/common/codicons.js'; -import { ThemeIcon } from '../../../../../base/common/themables.js'; import { ChatConfiguration } from '../../common/constants.js'; import { IConfigurationService, ConfigurationTarget } from '../../../../../platform/configuration/common/configuration.js'; +import { IPaneCompositePartService } from '../../../../services/panecomposite/browser/panecomposite.js'; +import { IExtensionsViewPaneContainer, VIEWLET_ID } from '../../../extensions/common/extensions.js'; +import { ViewContainerLocation } from '../../../../common/views.js'; const enum ManagePluginItemKind { Plugin = 'plugin', @@ -43,10 +41,6 @@ interface IAddFromFolderPickItem extends IQuickPickItem { readonly kind: ManagePluginItemKind.AddFromFolder; } -interface IMarketplacePluginPickItem extends IQuickPickItem { - marketplacePlugin: IMarketplacePlugin; -} - interface IManagePluginsPickResult { action: 'apply' | 'findMore' | 'addFromFolder'; selectedPluginItems: IPluginPickItem[]; @@ -74,10 +68,9 @@ class ManagePluginsAction extends Action2 { const labelService = accessor.get(ILabelService); const dialogService = accessor.get(IDialogService); const fileDialogService = accessor.get(IFileDialogService); - const openerService = accessor.get(IOpenerService); const configurationService = accessor.get(IConfigurationService); const workspaceContextService = accessor.get(IWorkspaceContextService); - const pluginMarketplaceService = accessor.get(IPluginMarketplaceService); + const paneCompositeService = accessor.get(IPaneCompositePartService); const allPlugins = agentPluginService.allPlugins.get(); const hasWorkspace = workspaceContextService.getWorkspace().folders.length > 0; @@ -138,7 +131,9 @@ class ManagePluginsAction extends Action2 { } if (result.action === 'findMore') { - await showMarketplaceQuickPick(quickInputService, pluginMarketplaceService, dialogService, openerService); + const viewlet = await paneCompositeService.openPaneComposite(VIEWLET_ID, ViewContainerLocation.Sidebar, true); + const view = viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer | undefined; + view?.search('@agentPlugins '); return; } @@ -249,101 +244,6 @@ async function showManagePluginsQuickPick( return result; } -async function showMarketplaceQuickPick( - quickInputService: IQuickInputService, - pluginMarketplaceService: IPluginMarketplaceService, - dialogService: IDialogService, - openerService: IOpenerService, -): Promise { - const quickPick = quickInputService.createQuickPick({ useSeparators: true }); - const disposables = new DisposableStore(); - disposables.add(quickPick); - const openReadmeButton: IQuickInputButton = { - iconClass: ThemeIcon.asClassName(Codicon.book), - tooltip: localize('openPluginReadme', 'Open README on GitHub'), - }; - quickPick.title = localize('marketplaceTitle', 'Plugin Marketplace'); - quickPick.placeholder = localize('marketplacePlaceholder', 'Select a plugin to install'); - quickPick.busy = true; - quickPick.show(); - - const cts = new CancellationTokenSource(); - disposables.add(cts); - - try { - const plugins = await pluginMarketplaceService.fetchMarketplacePlugins(cts.token); - - if (cts.token.isCancellationRequested) { - return; - } - - if (plugins.length === 0) { - quickPick.items = []; - quickPick.busy = false; - quickPick.placeholder = localize('noMarketplacePlugins', 'No plugins found in configured marketplaces'); - return; - } - - // Group by marketplace - const groups = new Map(); - for (const plugin of plugins) { - let group = groups.get(plugin.marketplace); - if (!group) { - group = []; - groups.set(plugin.marketplace, group); - } - group.push(plugin); - } - - const items: QuickPickInput[] = []; - for (const [marketplace, marketplacePlugins] of groups) { - items.push({ type: 'separator', label: marketplace }); - for (const plugin of marketplacePlugins) { - items.push({ - label: plugin.name, - detail: plugin.description, - description: plugin.version, - marketplacePlugin: plugin, - buttons: plugin.readmeUri ? [openReadmeButton] : undefined, - }); - } - } - - quickPick.items = items; - quickPick.busy = false; - } catch { - quickPick.busy = false; - quickPick.placeholder = localize('marketplaceError', 'Failed to fetch plugins from marketplaces'); - return; - } - - disposables.add(quickPick.onDidTriggerItemButton(e => { - if (e.button !== openReadmeButton || !e.item.marketplacePlugin.readmeUri) { - return; - } - void openerService.open(e.item.marketplacePlugin.readmeUri); - })); - - const selection = await new Promise(resolve => { - disposables.add(quickPick.onDidAccept(() => { - resolve(quickPick.selectedItems[0]); - quickPick.hide(); - })); - disposables.add(quickPick.onDidHide(() => { - resolve(undefined); - disposables.dispose(); - })); - }); - - if (selection) { - // TODO: Implement plugin installation - dialogService.info( - localize('installNotSupported', 'Plugin Installation'), - localize('installNotSupportedDetail', "Installing '{0}' from '{1}' is not yet supported.", selection.marketplacePlugin.name, selection.marketplacePlugin.marketplace) - ); - } -} - export function registerChatPluginActions() { registerAction2(ManagePluginsAction); } diff --git a/src/vs/workbench/contrib/chat/browser/agentPluginsView.ts b/src/vs/workbench/contrib/chat/browser/agentPluginsView.ts new file mode 100644 index 0000000000000..d04d2fc71821a --- /dev/null +++ b/src/vs/workbench/contrib/chat/browser/agentPluginsView.ts @@ -0,0 +1,515 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as dom from '../../../../base/browser/dom.js'; +import { ActionBar } from '../../../../base/browser/ui/actionbar/actionbar.js'; +import { IListContextMenuEvent } from '../../../../base/browser/ui/list/list.js'; +import { IPagedRenderer } from '../../../../base/browser/ui/list/listPaging.js'; +import { Action, IAction, Separator } from '../../../../base/common/actions.js'; +import { CancellationTokenSource } from '../../../../base/common/cancellation.js'; +import { Disposable, DisposableStore, IDisposable, isDisposable } from '../../../../base/common/lifecycle.js'; +import { autorun } from '../../../../base/common/observable.js'; +import { IPagedModel, PagedModel } from '../../../../base/common/paging.js'; +import { basename, dirname, joinPath } from '../../../../base/common/resources.js'; +import { URI } from '../../../../base/common/uri.js'; +import { localize, localize2 } from '../../../../nls.js'; +import { ConfigurationTarget, IConfigurationService } from '../../../../platform/configuration/common/configuration.js'; +import { ContextKeyExpr, IContextKeyService, RawContextKey } from '../../../../platform/contextkey/common/contextkey.js'; +import { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js'; +import { IDialogService } from '../../../../platform/dialogs/common/dialogs.js'; +import { IFileService } from '../../../../platform/files/common/files.js'; +import { IHoverService } from '../../../../platform/hover/browser/hover.js'; +import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js'; +import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; +import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js'; +import { ILabelService } from '../../../../platform/label/common/label.js'; +import { WorkbenchPagedList } from '../../../../platform/list/browser/listService.js'; +import { IOpenerService } from '../../../../platform/opener/common/opener.js'; +import { Registry } from '../../../../platform/registry/common/platform.js'; +import { IThemeService } from '../../../../platform/theme/common/themeService.js'; +import { getLocationBasedViewColors } from '../../../browser/parts/views/viewPane.js'; +import { IViewletViewOptions } from '../../../browser/parts/views/viewsViewlet.js'; +import { IWorkbenchContribution } from '../../../common/contributions.js'; +import { IViewDescriptorService, IViewsRegistry, Extensions as ViewExtensions } from '../../../common/views.js'; +import { VIEW_CONTAINER } from '../../extensions/browser/extensions.contribution.js'; +import { AbstractExtensionsListView } from '../../extensions/browser/extensionsViews.js'; +import { DefaultViewsContext, SearchAgentPluginsContext } from '../../extensions/common/extensions.js'; +import { ChatContextKeys } from '../common/actions/chatContextKeys.js'; +import { ChatConfiguration } from '../common/constants.js'; +import { IAgentPlugin, IAgentPluginService } from '../common/plugins/agentPluginService.js'; +import { IMarketplacePlugin, IPluginMarketplaceService } from '../common/plugins/pluginMarketplaceService.js'; + +export const HasInstalledAgentPluginsContext = new RawContextKey('hasInstalledAgentPlugins', false); + +//#region Item model + +const enum AgentPluginItemKind { + Installed = 'installed', + Marketplace = 'marketplace', +} + +interface IInstalledPluginItem { + readonly kind: AgentPluginItemKind.Installed; + readonly name: string; + readonly description: string; + readonly plugin: IAgentPlugin; +} + +interface IMarketplacePluginItem { + readonly kind: AgentPluginItemKind.Marketplace; + readonly name: string; + readonly description: string; + readonly marketplace: string; + readonly readmeUri?: URI; +} + +type IAgentPluginItem = IInstalledPluginItem | IMarketplacePluginItem; + +function installedPluginToItem(plugin: IAgentPlugin, labelService: ILabelService): IInstalledPluginItem { + const name = basename(plugin.uri); + const description = labelService.getUriLabel(dirname(plugin.uri), { relative: true }); + return { kind: AgentPluginItemKind.Installed, name, description, plugin }; +} + +function marketplacePluginToItem(plugin: IMarketplacePlugin): IMarketplacePluginItem { + return { + kind: AgentPluginItemKind.Marketplace, + name: plugin.name, + description: plugin.description, + marketplace: plugin.marketplace, + readmeUri: plugin.readmeUri, + }; +} + +//#endregion + +//#region Actions + +class InstallPluginAction extends Action { + static readonly ID = 'agentPlugin.install'; + + constructor( + private readonly item: IMarketplacePluginItem, + @IDialogService private readonly dialogService: IDialogService, + ) { + super(InstallPluginAction.ID, localize('install', "Install"), 'extension-action label prominent install'); + } + + override async run(): Promise { + // TODO: implement actual plugin installation + this.dialogService.info( + localize('installNotSupported', "Plugin Installation"), + localize('installNotSupportedDetail', "Installing '{0}' from '{1}' is not yet supported.", this.item.name, this.item.marketplace) + ); + } +} + +class EnablePluginAction extends Action { + static readonly ID = 'agentPlugin.enable'; + + constructor( + private readonly plugin: IAgentPlugin, + @IAgentPluginService private readonly agentPluginService: IAgentPluginService, + ) { + super(EnablePluginAction.ID, localize('enable', "Enable")); + } + + override async run(): Promise { + this.agentPluginService.setPluginEnabled(this.plugin.uri, true); + } +} + +class DisablePluginAction extends Action { + static readonly ID = 'agentPlugin.disable'; + + constructor( + private readonly plugin: IAgentPlugin, + @IAgentPluginService private readonly agentPluginService: IAgentPluginService, + ) { + super(DisablePluginAction.ID, localize('disable', "Disable")); + } + + override async run(): Promise { + this.agentPluginService.setPluginEnabled(this.plugin.uri, false); + } +} + +class UninstallPluginAction extends Action { + static readonly ID = 'agentPlugin.uninstall'; + + constructor( + private readonly plugin: IAgentPlugin, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IDialogService private readonly dialogService: IDialogService, + ) { + super(UninstallPluginAction.ID, localize('uninstall', "Uninstall")); + } + + override async run(): Promise { + const { confirmed } = await this.dialogService.confirm({ + message: localize('confirmUninstall', "Are you sure you want to uninstall the plugin '{0}'?", basename(this.plugin.uri)), + detail: localize('confirmUninstallDetail', "This will remove the plugin path from your settings. The plugin files will not be deleted."), + }); + + if (!confirmed) { + return; + } + + const currentPaths = this.configurationService.getValue(ChatConfiguration.PluginPaths) ?? []; + const pluginFsPath = this.plugin.uri.fsPath; + const filteredPaths = currentPaths.filter( + p => typeof p === 'string' && p !== pluginFsPath + ); + await this.configurationService.updateValue(ChatConfiguration.PluginPaths, filteredPaths, ConfigurationTarget.USER_LOCAL); + } +} + +class OpenPluginFolderAction extends Action { + static readonly ID = 'agentPlugin.openFolder'; + + constructor( + private readonly plugin: IAgentPlugin, + @IOpenerService private readonly openerService: IOpenerService, + ) { + super(OpenPluginFolderAction.ID, localize('openContainingFolder', "Open Containing Folder")); + } + + override async run(): Promise { + await this.openerService.open(dirname(this.plugin.uri)); + } +} + +class OpenPluginReadmeAction extends Action { + static readonly ID = 'agentPlugin.openReadme'; + + constructor( + private readonly readmeUri: URI, + @IOpenerService private readonly openerService: IOpenerService, + ) { + super(OpenPluginReadmeAction.ID, localize('openReadme', "Open README")); + } + + override async run(): Promise { + await this.openerService.open(this.readmeUri); + } +} + +//#endregion + +//#region Renderer + +interface IAgentPluginTemplateData { + root: HTMLElement; + name: HTMLElement; + description: HTMLElement; + detail: HTMLElement; + actionbar: ActionBar; + disposables: IDisposable[]; + elementDisposables: IDisposable[]; +} + +class AgentPluginRenderer implements IPagedRenderer { + + static readonly templateId = 'agentPlugin'; + readonly templateId = AgentPluginRenderer.templateId; + + constructor( + @IInstantiationService private readonly instantiationService: IInstantiationService, + ) { } + + renderTemplate(root: HTMLElement): IAgentPluginTemplateData { + const element = dom.append(root, dom.$('.agent-plugin-item.extension-list-item')); + const details = dom.append(element, dom.$('.details')); + const headerContainer = dom.append(details, dom.$('.header-container')); + const header = dom.append(headerContainer, dom.$('.header')); + const name = dom.append(header, dom.$('span.name')); + const description = dom.append(details, dom.$('.description.ellipsis')); + const footer = dom.append(details, dom.$('.footer')); + const detailContainer = dom.append(footer, dom.$('.publisher-container')); + const detail = dom.append(detailContainer, dom.$('span.publisher-name')); + const actionbar = new ActionBar(footer, { focusOnlyEnabledItems: true }); + actionbar.setFocusable(false); + return { root, name, description, detail, actionbar, disposables: [actionbar], elementDisposables: [] }; + } + + renderPlaceholder(_index: number, data: IAgentPluginTemplateData): void { + data.name.textContent = ''; + data.description.textContent = ''; + data.detail.textContent = ''; + data.actionbar.clear(); + this.disposeElement(undefined, 0, data); + } + + renderElement(element: IAgentPluginItem, _index: number, data: IAgentPluginTemplateData): void { + this.disposeElement(undefined, 0, data); + + data.name.textContent = element.name; + data.description.textContent = element.description; + + data.elementDisposables.push(autorun(reader => { + data.root.classList.toggle('disabled', element.kind === AgentPluginItemKind.Installed && !element.plugin.enabled.read(reader)); + })); + + data.actionbar.clear(); + if (element.kind === AgentPluginItemKind.Marketplace) { + data.detail.textContent = element.marketplace; + const installAction = this.instantiationService.createInstance(InstallPluginAction, element); + data.elementDisposables.push(installAction); + data.actionbar.push([installAction], { icon: true, label: true }); + } else { + data.detail.textContent = ''; + } + } + + disposeElement(_element: IAgentPluginItem | undefined, _index: number, data: IAgentPluginTemplateData): void { + for (const d of data.elementDisposables) { + d.dispose(); + } + data.elementDisposables = []; + } + + disposeTemplate(data: IAgentPluginTemplateData): void { + for (const d of data.disposables) { + d.dispose(); + } + this.disposeElement(undefined, 0, data); + } +} + +//#endregion + +//#region List View + +export class AgentPluginsListView extends AbstractExtensionsListView { + + private readonly actionStore = this._register(new DisposableStore()); + private list: WorkbenchPagedList | null = null; + private listContainer: HTMLElement | null = null; + private bodyTemplate: { + messageContainer: HTMLElement; + messageBox: HTMLElement; + pluginsList: HTMLElement; + } | undefined; + + constructor( + options: IViewletViewOptions, + @IKeybindingService keybindingService: IKeybindingService, + @IContextMenuService contextMenuService: IContextMenuService, + @IInstantiationService instantiationService: IInstantiationService, + @IThemeService themeService: IThemeService, + @IHoverService hoverService: IHoverService, + @IConfigurationService configurationService: IConfigurationService, + @IContextKeyService contextKeyService: IContextKeyService, + @IViewDescriptorService viewDescriptorService: IViewDescriptorService, + @IOpenerService openerService: IOpenerService, + @IAgentPluginService private readonly agentPluginService: IAgentPluginService, + @IPluginMarketplaceService private readonly pluginMarketplaceService: IPluginMarketplaceService, + @ILabelService private readonly labelService: ILabelService, + @IFileService private readonly fileService: IFileService, + ) { + super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, hoverService); + } + + protected override renderBody(container: HTMLElement): void { + super.renderBody(container); + + const messageContainer = dom.append(container, dom.$('.message-container')); + const messageBox = dom.append(messageContainer, dom.$('.message')); + const pluginsList = dom.$('.agent-plugins-list'); + + this.bodyTemplate = { pluginsList, messageBox, messageContainer }; + + this.listContainer = dom.append(container, pluginsList); + this.list = this._register(this.instantiationService.createInstance(WorkbenchPagedList, + `${this.id}-Agent-Plugins`, + this.listContainer, + { + getHeight() { return 72; }, + getTemplateId: () => AgentPluginRenderer.templateId, + }, + [this.instantiationService.createInstance(AgentPluginRenderer)], + { + multipleSelectionSupport: false, + setRowLineHeight: false, + horizontalScrolling: false, + accessibilityProvider: { + getAriaLabel(item: IAgentPluginItem | null): string { + return item?.name ?? ''; + }, + getWidgetAriaLabel(): string { + return localize('agentPlugins', "Agent Plugins"); + } + }, + overrideStyles: getLocationBasedViewColors(this.viewDescriptorService.getViewLocationById(this.id)).listOverrideStyles, + }) as WorkbenchPagedList); + + this._register(this.list.onContextMenu(e => this.onContextMenu(e), this)); + } + + private onContextMenu(e: IListContextMenuEvent): void { + if (!e.element) { + return; + } + + const actions = this.getContextMenuActions(e.element); + if (actions.length === 0) { + return; + } + + this.contextMenuService.showContextMenu({ + getAnchor: () => e.anchor, + getActions: () => actions, + }); + } + + private getContextMenuActions(item: IAgentPluginItem): IAction[] { + const actions: IAction[] = []; + if (item.kind === AgentPluginItemKind.Installed) { + if (item.plugin.enabled.get()) { + actions.push(this.instantiationService.createInstance(DisablePluginAction, item.plugin)); + } else { + actions.push(this.instantiationService.createInstance(EnablePluginAction, item.plugin)); + } + + actions.push(new Separator()); + actions.push(this.instantiationService.createInstance(OpenPluginFolderAction, item.plugin)); + this.addReadmeAction(actions, item.plugin.uri); + actions.push(new Separator()); + actions.push(this.instantiationService.createInstance(UninstallPluginAction, item.plugin)); + } else { + if (item.readmeUri) { + actions.push(this.instantiationService.createInstance(OpenPluginReadmeAction, item.readmeUri)); + } + actions.push(this.instantiationService.createInstance(InstallPluginAction, item)); + } + + this.actionStore.clear(); + for (const action of actions) { + if (isDisposable(action)) { + this.actionStore.add(action); + } + } + + return actions; + } + + private addReadmeAction(actions: IAction[], pluginUri: URI): void { + const readmeUri = joinPath(pluginUri, 'README.md'); + this.fileService.exists(readmeUri).then(exists => { + // Best effort — too late for this context menu, but will be available next time + }); + actions.push(this.instantiationService.createInstance(OpenPluginReadmeAction, joinPath(pluginUri, 'README.md'))); + } + + protected override layoutBody(height: number, width: number): void { + super.layoutBody(height, width); + this.list?.layout(height, width); + } + + async show(query: string): Promise> { + const text = query.replace(/@agentPlugins/i, '').trim(); + + const items = await Promise.all([ + this.queryInstalled(), + this.queryMarketplace(text), + ]); + + const model = new PagedModel(items.flat()); + if (this.list) { + this.list.model = model; + } + this.updateBody(model.length); + return model; + } + + private queryInstalled(): IInstalledPluginItem[] { + const allPlugins = this.agentPluginService.allPlugins.get(); + return allPlugins.map(p => installedPluginToItem(p, this.labelService)); + } + + private async queryMarketplace(text: string): Promise { + const cts = new CancellationTokenSource(); + try { + const plugins = await this.pluginMarketplaceService.fetchMarketplacePlugins(cts.token); + const lowerText = text.toLowerCase(); + return plugins + .filter(p => p.name.toLowerCase().includes(lowerText) || p.description.toLowerCase().includes(lowerText)) + .map(marketplacePluginToItem); + } catch { + return []; + } + } + + private updateBody(count: number): void { + if (this.bodyTemplate) { + this.bodyTemplate.pluginsList.classList.toggle('hidden', count === 0); + this.bodyTemplate.messageContainer.classList.toggle('hidden', count > 0); + if (count === 0 && this.isBodyVisible()) { + this.bodyTemplate.messageBox.textContent = localize('noAgentPlugins', "No agent plugins found."); + } + } + } +} + +//#endregion + +//#region Default browse view + +class DefaultBrowseAgentPluginsView extends AgentPluginsListView { + override async show(_query: string): Promise> { + return super.show('@agentPlugins'); + } +} + +//#endregion + +//#region Views contribution + +export class AgentPluginsViewsContribution extends Disposable implements IWorkbenchContribution { + + static ID = 'workbench.chat.agentPlugins.views.contribution'; + + constructor( + @IContextKeyService contextKeyService: IContextKeyService, + @IAgentPluginService agentPluginService: IAgentPluginService, + ) { + super(); + + const hasInstalledKey = HasInstalledAgentPluginsContext.bindTo(contextKeyService); + this._register(autorun(reader => { + hasInstalledKey.set(agentPluginService.allPlugins.read(reader).length > 0); + })); + + Registry.as(ViewExtensions.ViewsRegistry).registerViews([ + { + id: 'workbench.views.agentPlugins.installed', + name: localize2('agent-plugins-installed', "Agent Plugins - Installed"), + ctorDescriptor: new SyncDescriptor(AgentPluginsListView), + when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledAgentPluginsContext, ChatContextKeys.Setup.hidden.negate()), + weight: 30, + order: 5, + canToggleVisibility: true, + }, + { + id: 'workbench.views.agentPlugins.default.marketplace', + name: localize2('agent-plugins', "Agent Plugins"), + ctorDescriptor: new SyncDescriptor(DefaultBrowseAgentPluginsView), + when: ContextKeyExpr.and(DefaultViewsContext, HasInstalledAgentPluginsContext.toNegated(), ChatContextKeys.Setup.hidden.negate()), + weight: 30, + order: 5, + canToggleVisibility: true, + hideByDefault: true, + }, + { + id: 'workbench.views.agentPlugins.marketplace', + name: localize2('agent-plugins', "Agent Plugins"), + ctorDescriptor: new SyncDescriptor(AgentPluginsListView), + when: ContextKeyExpr.and(SearchAgentPluginsContext, ChatContextKeys.Setup.hidden.negate()), + }, + ], VIEW_CONTAINER); + } +} + +//#endregion diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index dc773171f9d41..13e7a6c80c9cc 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -137,6 +137,7 @@ import { LanguageModelToolsConfirmationService } from './tools/languageModelTool import { LanguageModelToolsService, globalAutoApproveDescription } from './tools/languageModelToolsService.js'; import { AgentPluginService, ConfiguredAgentPluginDiscovery } from '../common/plugins/agentPluginServiceImpl.js'; import { IPluginMarketplaceService, PluginMarketplaceService } from '../common/plugins/pluginMarketplaceService.js'; +import { AgentPluginsViewsContribution } from './agentPluginsView.js'; import './promptSyntax/promptCodingAgentActionContribution.js'; import './promptSyntax/promptToolsCodeLensProvider.js'; import { ChatSlashCommandsContribution } from './chatSlashCommands.js'; @@ -1560,6 +1561,7 @@ registerWorkbenchContribution2(UserToolSetsContributions.ID, UserToolSetsContrib registerWorkbenchContribution2(PromptLanguageFeaturesProvider.ID, PromptLanguageFeaturesProvider, WorkbenchPhase.Eventually); registerWorkbenchContribution2(ChatWindowNotifier.ID, ChatWindowNotifier, WorkbenchPhase.AfterRestored); registerWorkbenchContribution2(ChatRepoInfoContribution.ID, ChatRepoInfoContribution, WorkbenchPhase.Eventually); +registerWorkbenchContribution2(AgentPluginsViewsContribution.ID, AgentPluginsViewsContribution, WorkbenchPhase.AfterRestored); registerChatActions(); registerChatAccessibilityActions(); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 6b637992f4fe8..7d2bf0e932060 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -16,7 +16,7 @@ import { append, $, Dimension, hide, show, DragAndDropObserver, trackFocus, addD import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; import { IInstantiationService, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js'; import { IExtensionService } from '../../../services/extensions/common/extensions.js'; -import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, AutoCheckUpdatesConfigurationKey, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu, AutoRestartConfigurationKey, ExtensionRuntimeActionType, SearchMcpServersContext, DefaultViewsContext, CONTEXT_EXTENSIONS_GALLERY_STATUS } from '../common/extensions.js'; +import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, WORKSPACE_RECOMMENDATIONS_VIEW_ID, AutoCheckUpdatesConfigurationKey, OUTDATED_EXTENSIONS_VIEW_ID, CONTEXT_HAS_GALLERY, extensionsSearchActionsMenu, AutoRestartConfigurationKey, ExtensionRuntimeActionType, SearchMcpServersContext, SearchAgentPluginsContext, DefaultViewsContext, CONTEXT_EXTENSIONS_GALLERY_STATUS } from '../common/extensions.js'; import { InstallLocalExtensionsInRemoteAction, InstallRemoteExtensionsInLocalAction } from './extensionsActions.js'; import { IExtensionManagementService, ILocalExtension } from '../../../../platform/extensionManagement/common/extensionManagement.js'; import { IWorkbenchExtensionEnablementService, IExtensionManagementServerService, IExtensionManagementServer } from '../../../services/extensionManagement/common/extensionManagement.js'; @@ -516,6 +516,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer; private readonly searchMarketplaceExtensionsContextKey: IContextKey; private readonly searchMcpServersContextKey: IContextKey; + private readonly searchAgentPluginsContextKey: IContextKey; private readonly searchHasTextContextKey: IContextKey; private readonly sortByUpdateDateContextKey: IContextKey; private readonly installedExtensionsContextKey: IContextKey; @@ -572,6 +573,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer c.name === FilterType.Category); if (isCategoriesEnabled) { commands.push('category'); diff --git a/src/vs/workbench/contrib/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts index b249453646804..7b1d55618b9de 100644 --- a/src/vs/workbench/contrib/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -258,6 +258,7 @@ export const CONTEXT_HAS_GALLERY = new RawContextKey('hasGallery', fals export const CONTEXT_EXTENSIONS_GALLERY_STATUS = new RawContextKey('extensionsGalleryStatus', ExtensionGalleryManifestStatus.Unavailable); export const ExtensionResultsListFocused = new RawContextKey('extensionResultListFocused ', true); export const SearchMcpServersContext = new RawContextKey('searchMcpServers', false); +export const SearchAgentPluginsContext = new RawContextKey('searchAgentPlugins', false); // Context Menu Groups export const THEME_ACTIONS_GROUP = '_theme_'; From 44a2e1ecdb1c81ee55fd2a1b6ce61e30b5abbda5 Mon Sep 17 00:00:00 2001 From: dileepyavan <52841896+dileepyavan@users.noreply.github.com> Date: Mon, 23 Feb 2026 10:48:01 -0800 Subject: [PATCH 25/51] Fixing issue with rg path for sandboxed commands (#297047) * testing * Use VS Code's bundled ripgrep for sandboxed execution Fixes #294982 This change makes the sandboxed terminal execution use VS Code's bundled ripgrep binary instead of requiring users to manually install it. Changes: - Compute the ripgrep bin directory path from @vscode/ripgrep package - Add the ripgrep directory to PATH when wrapping sandbox commands - Update setting descriptions to remove ripgrep installation requirement * adding unit test * code review changes * fixing test case failure * fixing rg path issue * fixing rg path issue --- .../chatAgentTools/common/terminalSandboxService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.ts b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.ts index dce52f4d69ce3..54d5a7899a809 100644 --- a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.ts +++ b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.ts @@ -106,7 +106,7 @@ export class TerminalSandboxService extends Disposable implements ITerminalSandb // Use ELECTRON_RUN_AS_NODE=1 to make Electron executable behave as Node.js // TMPDIR must be set as environment variable before the command // Use -c to pass the command string directly (like sh -c), avoiding argument parsing issues - const wrappedCommand = `PATH=$PATH:${dirname(this._rgPath)} "${this._execPath}" "${this._srtPath}" TMPDIR=${this._tempDir.path} --settings "${this._sandboxConfigPath}" -c "${command}"`; + const wrappedCommand = `PATH="$PATH:${dirname(this._rgPath)}" TMPDIR="${this._tempDir.path}" "${this._execPath}" "${this._srtPath}" --settings "${this._sandboxConfigPath}" -c "${command}"`; if (this._remoteEnvDetails) { return `${wrappedCommand}`; } From d14c1d8bc385e5c926b89309dd0bdde9ed9d876b Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 23 Feb 2026 10:56:00 -0800 Subject: [PATCH 26/51] fix test --- .../test/node/policyExport.integrationTest.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts b/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts index a405426a5950f..b7b46fd716bd0 100644 --- a/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts +++ b/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts @@ -32,6 +32,14 @@ suite('PolicyExport Integration Tests', () => { const checkedInFile = join(rootPath, 'build/lib/policies/policyData.jsonc'); const tempFile = join(os.tmpdir(), `policyData-test-${Date.now()}.jsonc`); + function normalizeContent(content: string) { + const data = JSON.parse(content); + if (data && Array.isArray(data.policies)) { + data.policies.sort((a: any, b: any) => a.name.localeCompare(b.name)); + } + return JSON.stringify(data, null, 2); + } + try { // Launch VS Code with --export-policy-data flag const scriptPath = isWindows @@ -46,8 +54,8 @@ suite('PolicyExport Integration Tests', () => { // Read both files const [exportedContent, checkedInContent] = await Promise.all([ - fs.readFile(tempFile, 'utf-8'), - fs.readFile(checkedInFile, 'utf-8') + fs.readFile(tempFile, 'utf-8').then(normalizeContent), + fs.readFile(checkedInFile, 'utf-8').then(normalizeContent) ]); // Compare contents From 3a9f5a40639eeb9a99d3b5b210a6b35794ca2386 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 23 Feb 2026 11:00:14 -0800 Subject: [PATCH 27/51] comments --- .../contrib/chat/browser/agentPluginsView.ts | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/agentPluginsView.ts b/src/vs/workbench/contrib/chat/browser/agentPluginsView.ts index d04d2fc71821a..8808d371f0af9 100644 --- a/src/vs/workbench/contrib/chat/browser/agentPluginsView.ts +++ b/src/vs/workbench/contrib/chat/browser/agentPluginsView.ts @@ -9,7 +9,7 @@ import { IListContextMenuEvent } from '../../../../base/browser/ui/list/list.js' import { IPagedRenderer } from '../../../../base/browser/ui/list/listPaging.js'; import { Action, IAction, Separator } from '../../../../base/common/actions.js'; import { CancellationTokenSource } from '../../../../base/common/cancellation.js'; -import { Disposable, DisposableStore, IDisposable, isDisposable } from '../../../../base/common/lifecycle.js'; +import { Disposable, DisposableStore, IDisposable, isDisposable, MutableDisposable } from '../../../../base/common/lifecycle.js'; import { autorun } from '../../../../base/common/observable.js'; import { IPagedModel, PagedModel } from '../../../../base/common/paging.js'; import { basename, dirname, joinPath } from '../../../../base/common/resources.js'; @@ -19,7 +19,6 @@ import { ConfigurationTarget, IConfigurationService } from '../../../../platform import { ContextKeyExpr, IContextKeyService, RawContextKey } from '../../../../platform/contextkey/common/contextkey.js'; import { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js'; import { IDialogService } from '../../../../platform/dialogs/common/dialogs.js'; -import { IFileService } from '../../../../platform/files/common/files.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js'; import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; @@ -285,6 +284,7 @@ class AgentPluginRenderer implements IPagedRenderer { private readonly actionStore = this._register(new DisposableStore()); + private readonly queryCts = new MutableDisposable(); private list: WorkbenchPagedList | null = null; private listContainer: HTMLElement | null = null; private bodyTemplate: { @@ -307,7 +307,6 @@ export class AgentPluginsListView extends AbstractExtensionsListView { - // Best effort — too late for this context menu, but will be available next time - }); - actions.push(this.instantiationService.createInstance(OpenPluginReadmeAction, joinPath(pluginUri, 'README.md'))); - } - protected override layoutBody(height: number, width: number): void { super.layoutBody(height, width); this.list?.layout(height, width); @@ -430,7 +421,10 @@ export class AgentPluginsListView extends AbstractExtensionsListView { + this.queryCts.value?.cancel(); const cts = new CancellationTokenSource(); + this.queryCts.value = cts; + try { const plugins = await this.pluginMarketplaceService.fetchMarketplacePlugins(cts.token); const lowerText = text.toLowerCase(); From a7ce2331c0a7de8d136c0d08d52bf4fcf27b0cf7 Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:13:10 -0800 Subject: [PATCH 28/51] make sure to flush and remove hidden tool calls (#297045) * make sure to flush and remove hidden tool calls * make sure to dispose --- .../chatThinkingContentPart.ts | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts index 1efc93fcac096..fdd6614bec78c 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts @@ -172,6 +172,7 @@ export class ChatThinkingContentPart extends ChatCollapsibleContentPart implemen private readonly toolWrappersByCallId = new Map(); private readonly toolDisposables = this._register(new DisposableMap()); private pendingRemovals: { toolCallId: string; toolLabel: string }[] = []; + private pendingRemovalFlushDisposable: IDisposable | undefined; private pendingScrollDisposable: IDisposable | undefined; private mutationObserverDisposable: IDisposable | undefined; private isUpdatingDimensions: boolean = false; @@ -1106,10 +1107,34 @@ ${this.hookCount > 0 ? `EXAMPLES WITH BLOCKED CONTENT (from hooks): } private processPendingRemovals(): void { - for (const pending of this.pendingRemovals) { - this.removeStreamingToolEntry(pending.toolCallId, pending.toolLabel); + this.pendingRemovalFlushDisposable?.dispose(); + this.pendingRemovalFlushDisposable = undefined; + + if (this.pendingRemovals.length === 0) { + return; } + + const pendingRemovals = this.pendingRemovals; this.pendingRemovals = []; + + for (const pending of pendingRemovals) { + this.removeStreamingToolEntry(pending.toolCallId, pending.toolLabel); + } + } + + private schedulePendingRemovalsFlush(): void { + if (this.pendingRemovalFlushDisposable) { + return; + } + + this.pendingRemovalFlushDisposable = scheduleAtNextAnimationFrame(getWindow(this.domNode), () => { + this.pendingRemovalFlushDisposable = undefined; + if (this._store.isDisposed) { + return; + } + + this.processPendingRemovals(); + }); } // removes the tool entry that was previously streaming and now is not. removes item from dom and internal tracking. @@ -1222,6 +1247,7 @@ ${this.hookCount > 0 ? `EXAMPLES WITH BLOCKED CONTENT (from hooks): isStreaming = false; if (toolInvocationOrMarkdown.presentation === 'hidden') { this.pendingRemovals.push({ toolCallId: toolInvocationOrMarkdown.toolCallId, toolLabel: currentToolLabel }); + this.schedulePendingRemovalsFlush(); isComplete = true; return; } @@ -1513,6 +1539,8 @@ ${this.hookCount > 0 ? `EXAMPLES WITH BLOCKED CONTENT (from hooks): this.workingSpinnerElement = undefined; this.workingSpinnerLabel = undefined; } + this.pendingRemovalFlushDisposable?.dispose(); + this.pendingRemovalFlushDisposable = undefined; this.pendingScrollDisposable?.dispose(); super.dispose(); } From b204273c41b49b2f6994862eb7b49efadd6b8133 Mon Sep 17 00:00:00 2001 From: David Dossett <25163139+daviddossett@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:16:17 -0800 Subject: [PATCH 29/51] Align expanded chat entry border-radius with cornerRadius-medium (#297058) Replace hardcoded 4px/6px border-radius values in chat expanded entries (thinking collapsible, terminal content, confirmation widgets, tool output) with var(--vscode-cornerRadius-medium) to match codeblocks, markdown tables, and confirmation widget2. --- .../chatContentParts/media/chatConfirmationWidget.css | 6 +++--- .../chatContentParts/media/chatTerminalToolProgressPart.css | 6 +++--- .../widget/chatContentParts/media/chatThinkingContent.css | 2 +- src/vs/workbench/contrib/chat/browser/widget/media/chat.css | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css index c54b75574b128..84b55dfef0752 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css +++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css @@ -5,7 +5,7 @@ .chat-confirmation-widget { border: none; - border-radius: 4px; + border-radius: var(--vscode-cornerRadius-medium); display: flex; flex-wrap: wrap; align-items: center; @@ -124,7 +124,7 @@ .chat-confirmation-widget .chat-confirmation-widget-message-container { border: 1px solid var(--vscode-chat-requestBorder); - border-radius: 4px; + border-radius: var(--vscode-cornerRadius-medium); font-size: var(--vscode-chat-font-size-body-s); } @@ -305,7 +305,7 @@ .chat-confirmation-widget-message { margin: 2px 0 0 0; border: 1px solid var(--vscode-chat-requestBorder); - border-radius: 4px; + border-radius: var(--vscode-cornerRadius-medium); font-size: var(--vscode-chat-font-size-body-s); } diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css index 2daea7046ef47..4447aa118e69d 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css +++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css @@ -10,7 +10,7 @@ .chat-terminal-content-part .chat-terminal-content-title { border: 1px solid var(--vscode-chat-requestBorder); - border-radius: 4px; + border-radius: var(--vscode-cornerRadius-medium); padding: 0px 9px 0px 5px; max-width: 100%; box-sizing: border-box; @@ -135,8 +135,8 @@ .chat-terminal-output-container.collapsed { display: none; } .chat-terminal-output-container { border: 1px solid var(--vscode-chat-requestBorder); - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; + border-bottom-left-radius: var(--vscode-cornerRadius-medium); + border-bottom-right-radius: var(--vscode-cornerRadius-medium); max-height: 300px; box-sizing: border-box; overflow: hidden; diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css index 817fe3945b42f..4574cbbfa1d08 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css +++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css @@ -90,7 +90,7 @@ .chat-used-context-list.chat-thinking-collapsible { border: 1px solid var(--vscode-chat-requestBorder); - border-radius: 4px; + border-radius: var(--vscode-cornerRadius-medium); margin-bottom: 0; position: relative; overflow: hidden; diff --git a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css index 3d1d38ec14eba..357fff8866c53 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css @@ -558,7 +558,7 @@ .tool-output-part { border: 1px solid var(--vscode-widget-border); - border-radius: 6px; + border-radius: var(--vscode-cornerRadius-medium); background: var(--vscode-editor-background); margin: 4px 0; overflow: hidden; From 11a5279976768c4a76bb78df9600b0eb5fb45a2c Mon Sep 17 00:00:00 2001 From: Matt Bierner <12821956+mjbvz@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:20:52 -0800 Subject: [PATCH 30/51] Switch remaining settings to use js/ts prefix For #292934 Also renames some of the server settings to have a more consistent naming scheme. This is going to be annoying but is the best time to do this since we are already changing the full setting id --- .../typescript-language-features/package.json | 459 +++++++++++++++--- .../package.nls.json | 27 +- .../src/commands/useTsgo.ts | 14 +- .../configuration/configuration.electron.ts | 18 +- .../src/configuration/configuration.ts | 97 ++-- .../src/extension.ts | 4 +- .../src/filesystems/ata.ts | 4 +- .../src/languageFeatures/completions.ts | 3 +- .../fileConfigurationManager.ts | 7 +- .../languageFeatures/updatePathsOnRename.ts | 6 +- .../util/dependentRegistration.ts | 13 - .../src/languageProvider.ts | 18 +- .../src/logging/logLevelMonitor.ts | 22 +- .../src/task/taskProvider.ts | 3 +- .../src/tsServer/versionManager.ts | 7 +- .../src/typescriptServiceClient.ts | 4 +- .../src/ui/typingsStatus.ts | 9 +- 17 files changed, 523 insertions(+), 192 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 156003c26cda3..51446da2325b6 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -24,9 +24,13 @@ "description": "%workspaceTrust%", "restrictedConfigurations": [ "typescript.tsdk", + "js/ts.tsdk.path", "typescript.tsserver.pluginPaths", + "js/ts.tsserver.pluginPaths", "typescript.npm", - "typescript.tsserver.nodePath" + "js/ts.tsserver.npm.path", + "typescript.tsserver.nodePath", + "js/ts.tsserver.node.path" ] } }, @@ -156,22 +160,80 @@ { "type": "object", "properties": { + "js/ts.tsdk.path": { + "type": "string", + "markdownDescription": "%typescript.tsdk.desc%", + "scope": "window", + "order": 1, + "keywords": [ + "TypeScript" + ] + }, "typescript.tsdk": { "type": "string", "markdownDescription": "%typescript.tsdk.desc%", + "markdownDeprecationMessage": "%typescript.tsdk.unifiedDeprecationMessage%", "scope": "window", "order": 1 }, + "js/ts.experimental.useTsgo": { + "type": "boolean", + "default": false, + "markdownDescription": "%typescript.useTsgo%", + "scope": "window", + "order": 2, + "keywords": [ + "TypeScript", + "experimental" + ] + }, "typescript.experimental.useTsgo": { "type": "boolean", "default": false, "markdownDescription": "%typescript.useTsgo%", + "markdownDeprecationMessage": "%typescript.useTsgo.unifiedDeprecationMessage%", "scope": "window", "order": 2, - "tags": [ + "keywords": [ "experimental" ] }, + "js/ts.locale": { + "type": "string", + "default": "auto", + "enum": [ + "auto", + "de", + "es", + "en", + "fr", + "it", + "ja", + "ko", + "ru", + "zh-CN", + "zh-TW" + ], + "enumDescriptions": [ + "%typescript.locale.auto%", + "Deutsch", + "español", + "English", + "français", + "italiano", + "日本語", + "한국어", + "русский", + "中文(简体)", + "中文(繁體)" + ], + "markdownDescription": "%typescript.locale%", + "scope": "window", + "order": 3, + "keywords": [ + "TypeScript" + ] + }, "typescript.locale": { "type": "string", "default": "auto", @@ -202,9 +264,32 @@ "中文(繁體)" ], "markdownDescription": "%typescript.locale%", + "markdownDeprecationMessage": "%typescript.locale.unifiedDeprecationMessage%", "scope": "window", "order": 3 }, + "js/ts.tsc.autoDetect": { + "type": "string", + "default": "on", + "enum": [ + "on", + "off", + "build", + "watch" + ], + "markdownEnumDescriptions": [ + "%typescript.tsc.autoDetect.on%", + "%typescript.tsc.autoDetect.off%", + "%typescript.tsc.autoDetect.build%", + "%typescript.tsc.autoDetect.watch%" + ], + "description": "%typescript.tsc.autoDetect%", + "scope": "window", + "order": 4, + "keywords": [ + "TypeScript" + ] + }, "typescript.tsc.autoDetect": { "type": "string", "default": "on", @@ -221,6 +306,7 @@ "%typescript.tsc.autoDetect.watch%" ], "description": "%typescript.tsc.autoDetect%", + "markdownDeprecationMessage": "%typescript.tsc.autoDetect.unifiedDeprecationMessage%", "scope": "window", "order": 4 } @@ -245,7 +331,7 @@ "%typescript.preferences.quoteStyle.double%" ], "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -301,7 +387,7 @@ "default": "shortest", "description": "%typescript.preferences.importModuleSpecifier%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -367,7 +453,7 @@ "default": "auto", "description": "%typescript.preferences.importModuleSpecifierEnding%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -437,7 +523,7 @@ "default": "auto", "description": "%typescript.preferences.jsxAttributeCompletionStyle%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -491,7 +577,7 @@ "default": "auto", "markdownDescription": "%typescript.preferences.includePackageJsonAutoImports%", "scope": "window", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -519,7 +605,7 @@ }, "markdownDescription": "%typescript.preferences.autoImportFileExcludePatterns%", "scope": "resource", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -549,7 +635,7 @@ }, "markdownDescription": "%typescript.preferences.autoImportSpecifierExcludeRegexes%", "scope": "resource", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -577,7 +663,7 @@ "default": false, "markdownDescription": "%typescript.preferences.preferTypeOnlyAutoImports%", "scope": "resource", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -593,7 +679,7 @@ "default": true, "description": "%typescript.preferences.useAliasesForRenames%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -617,7 +703,7 @@ "default": true, "description": "%typescript.preferences.renameMatchingJsxTags%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -713,7 +799,7 @@ "default": "default" } }, - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -887,7 +973,7 @@ "default": true, "description": "%format.enable%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -911,7 +997,7 @@ "default": true, "description": "%format.insertSpaceAfterCommaDelimiter%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -935,7 +1021,7 @@ "default": false, "description": "%format.insertSpaceAfterConstructor%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -959,7 +1045,7 @@ "default": true, "description": "%format.insertSpaceAfterSemicolonInForStatements%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -983,7 +1069,7 @@ "default": true, "description": "%format.insertSpaceBeforeAndAfterBinaryOperators%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1007,7 +1093,7 @@ "default": true, "description": "%format.insertSpaceAfterKeywordsInControlFlowStatements%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1031,7 +1117,7 @@ "default": true, "description": "%format.insertSpaceAfterFunctionKeywordForAnonymousFunctions%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1055,7 +1141,7 @@ "default": false, "description": "%format.insertSpaceBeforeFunctionParenthesis%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1079,7 +1165,7 @@ "default": false, "description": "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1103,7 +1189,7 @@ "default": false, "description": "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1127,7 +1213,7 @@ "default": true, "description": "%format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1151,7 +1237,7 @@ "default": true, "description": "%format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1175,7 +1261,7 @@ "default": false, "description": "%format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1199,7 +1285,7 @@ "default": false, "description": "%format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1223,7 +1309,7 @@ "default": false, "description": "%format.insertSpaceAfterTypeAssertion%", "scope": "language-overridable", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -1239,7 +1325,7 @@ "default": false, "description": "%format.placeOpenBraceOnNewLineForFunctions%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1263,7 +1349,7 @@ "default": false, "description": "%format.placeOpenBraceOnNewLineForControlBlocks%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1297,7 +1383,7 @@ "%format.semicolons.insert%", "%format.semicolons.remove%" ], - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1341,7 +1427,7 @@ "default": true, "description": "%format.indentSwitchCase%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1371,7 +1457,7 @@ "default": true, "description": "%configuration.validate.enable%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1395,7 +1481,7 @@ "default": true, "description": "%typescript.reportStyleChecksAsWarnings%", "scope": "window", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -1411,7 +1497,7 @@ "default": true, "description": "%configuration.suggestionActions.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1430,12 +1516,24 @@ "markdownDeprecationMessage": "%configuration.suggestionActions.enabled.unifiedDeprecationMessage%", "scope": "resource" }, + "js/ts.tsserver.experimental.enableProjectDiagnostics": { + "type": "boolean", + "default": false, + "description": "%configuration.tsserver.experimental.enableProjectDiagnostics%", + "scope": "window", + "keywords": [ + "JavaScript", + "TypeScript", + "experimental" + ] + }, "typescript.tsserver.experimental.enableProjectDiagnostics": { "type": "boolean", "default": false, "description": "%configuration.tsserver.experimental.enableProjectDiagnostics%", + "markdownDeprecationMessage": "%configuration.tsserver.experimental.enableProjectDiagnostics.unifiedDeprecationMessage%", "scope": "window", - "tags": [ + "keywords": [ "experimental" ] } @@ -1538,7 +1636,7 @@ "default": "prompt", "description": "%typescript.updateImportsOnFileMove.enabled%", "scope": "resource", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1582,7 +1680,7 @@ "default": true, "description": "%typescript.autoClosingTags%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1614,7 +1712,7 @@ "default": "allOpenProjects", "markdownDescription": "%typescript.workspaceSymbols.scope%", "scope": "window", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -1638,7 +1736,7 @@ "default": false, "description": "%configuration.preferGoToSourceDefinition%", "scope": "window", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1662,7 +1760,7 @@ "default": true, "markdownDescription": "%typescript.workspaceSymbols.excludeLibrarySymbols%", "scope": "window", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -1678,7 +1776,7 @@ "type": "boolean", "default": true, "markdownDescription": "%configuration.updateImportsOnPaste%", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1714,7 +1812,7 @@ "default": true, "description": "%typescript.suggest.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1738,7 +1836,7 @@ "default": true, "description": "%configuration.suggest.autoImports%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1762,7 +1860,7 @@ "default": true, "markdownDescription": "%configuration.suggest.names%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript" ] }, @@ -1778,7 +1876,7 @@ "default": false, "description": "%configuration.suggest.completeFunctionCalls%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1802,7 +1900,7 @@ "default": true, "description": "%configuration.suggest.paths%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1826,7 +1924,7 @@ "default": true, "description": "%configuration.suggest.completeJSDocs%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1850,7 +1948,7 @@ "default": true, "markdownDescription": "%configuration.suggest.jsdoc.generateReturns%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1874,7 +1972,7 @@ "default": true, "description": "%configuration.suggest.includeAutomaticOptionalChainCompletions%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1898,7 +1996,7 @@ "default": true, "description": "%configuration.suggest.includeCompletionsForImportStatements%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1922,7 +2020,7 @@ "default": true, "description": "%configuration.suggest.classMemberSnippets.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1946,7 +2044,7 @@ "default": true, "description": "%configuration.suggest.objectLiteralMethodSnippets.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -1968,7 +2066,7 @@ "default": false, "description": "%configuration.referencesCodeLens.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -1992,7 +2090,7 @@ "default": false, "markdownDescription": "%configuration.referencesCodeLens.showOnAllFunctions%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2016,7 +2114,7 @@ "default": false, "description": "%configuration.implementationsCodeLens.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -2032,7 +2130,7 @@ "default": false, "markdownDescription": "%configuration.implementationsCodeLens.showOnInterfaceMethods%", "scope": "language-overridable", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -2048,7 +2146,7 @@ "default": false, "markdownDescription": "%configuration.implementationsCodeLens.showOnAllClassMethods%", "scope": "language-overridable", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -2080,7 +2178,7 @@ "default": "none", "markdownDescription": "%configuration.inlayHints.parameterNames.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2124,7 +2222,7 @@ "default": true, "markdownDescription": "%configuration.inlayHints.parameterNames.suppressWhenArgumentMatchesName%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2148,7 +2246,7 @@ "default": false, "markdownDescription": "%configuration.inlayHints.parameterTypes.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2172,7 +2270,7 @@ "default": false, "markdownDescription": "%configuration.inlayHints.variableTypes.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2196,7 +2294,7 @@ "default": true, "markdownDescription": "%configuration.inlayHints.variableTypes.suppressWhenTypeMatchesName%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2220,7 +2318,7 @@ "default": false, "markdownDescription": "%configuration.inlayHints.propertyDeclarationTypes.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2244,7 +2342,7 @@ "default": false, "markdownDescription": "%configuration.inlayHints.functionLikeReturnTypes.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "JavaScript", "TypeScript" ] @@ -2268,7 +2366,7 @@ "default": false, "markdownDescription": "%configuration.inlayHints.enumMemberValues.enabled%", "scope": "language-overridable", - "tags": [ + "keywords": [ "TypeScript" ] }, @@ -2285,55 +2383,153 @@ "type": "object", "title": "%configuration.serverAdvanced%", "properties": { + "js/ts.tsdk.promptToUseWorkspaceVersion": { + "type": "boolean", + "default": false, + "description": "%typescript.enablePromptUseWorkspaceTsdk%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.enablePromptUseWorkspaceTsdk": { "type": "boolean", "default": false, "description": "%typescript.enablePromptUseWorkspaceTsdk%", + "markdownDeprecationMessage": "%typescript.enablePromptUseWorkspaceTsdk.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.automaticTypeAcquisition.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "%configuration.automaticTypeAcquisition.enabled%", + "scope": "window", + "keywords": [ + "TypeScript", + "usesOnlineServices" + ] + }, "typescript.disableAutomaticTypeAcquisition": { "type": "boolean", "default": false, "markdownDescription": "%typescript.disableAutomaticTypeAcquisition%", + "markdownDeprecationMessage": "%typescript.disableAutomaticTypeAcquisition.unifiedDeprecationMessage%", "scope": "window", - "tags": [ + "keywords": [ "usesOnlineServices" ] }, + "js/ts.tsserver.node.path": { + "type": "string", + "description": "%configuration.tsserver.nodePath%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.nodePath": { "type": "string", "description": "%configuration.tsserver.nodePath%", + "markdownDeprecationMessage": "%configuration.tsserver.nodePath.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.npm.path": { + "type": "string", + "markdownDescription": "%typescript.npm%", + "scope": "machine", + "keywords": [ + "TypeScript" + ] + }, "typescript.npm": { "type": "string", "markdownDescription": "%typescript.npm%", + "markdownDeprecationMessage": "%typescript.npm.unifiedDeprecationMessage%", "scope": "machine" }, + "js/ts.tsserver.checkNpmIsInstalled": { + "type": "boolean", + "default": true, + "markdownDescription": "%typescript.check.npmIsInstalled%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.check.npmIsInstalled": { "type": "boolean", "default": true, "markdownDescription": "%typescript.check.npmIsInstalled%", + "markdownDeprecationMessage": "%typescript.check.npmIsInstalled.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.web.projectWideIntellisense.enabled": { + "type": "boolean", + "default": true, + "description": "%configuration.tsserver.web.projectWideIntellisense.enabled%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.web.projectWideIntellisense.enabled": { "type": "boolean", "default": true, "description": "%configuration.tsserver.web.projectWideIntellisense.enabled%", + "markdownDeprecationMessage": "%configuration.tsserver.web.projectWideIntellisense.enabled.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.web.projectWideIntellisense.suppressSemanticErrors": { + "type": "boolean", + "default": false, + "description": "%configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors": { "type": "boolean", "default": false, "description": "%configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors%", + "markdownDeprecationMessage": "%configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.web.typeAcquisition.enabled": { + "type": "boolean", + "default": true, + "description": "%configuration.tsserver.web.typeAcquisition.enabled%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.web.typeAcquisition.enabled": { "type": "boolean", "default": true, "description": "%configuration.tsserver.web.typeAcquisition.enabled%", + "markdownDeprecationMessage": "%configuration.tsserver.web.typeAcquisition.enabled.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.useSyntaxServer": { + "type": "string", + "scope": "window", + "description": "%configuration.tsserver.useSyntaxServer%", + "default": "auto", + "enum": [ + "always", + "never", + "auto" + ], + "enumDescriptions": [ + "%configuration.tsserver.useSyntaxServer.always%", + "%configuration.tsserver.useSyntaxServer.never%", + "%configuration.tsserver.useSyntaxServer.auto%" + ], + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.useSyntaxServer": { "type": "string", "scope": "window", @@ -2348,18 +2544,106 @@ "%configuration.tsserver.useSyntaxServer.always%", "%configuration.tsserver.useSyntaxServer.never%", "%configuration.tsserver.useSyntaxServer.auto%" + ], + "markdownDeprecationMessage": "%configuration.tsserver.useSyntaxServer.unifiedDeprecationMessage%" + }, + "js/ts.tsserver.maxMemory": { + "type": "number", + "default": 3072, + "markdownDescription": "%configuration.tsserver.maxMemory%", + "scope": "window", + "keywords": [ + "TypeScript" ] }, "typescript.tsserver.maxTsServerMemory": { "type": "number", "default": 3072, "markdownDescription": "%configuration.tsserver.maxTsServerMemory%", + "markdownDeprecationMessage": "%configuration.tsserver.maxTsServerMemory.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.watchOptions": { + "description": "%configuration.tsserver.watchOptions%", + "scope": "window", + "default": "vscode", + "oneOf": [ + { + "type": "string", + "const": "vscode", + "description": "%configuration.tsserver.watchOptions.vscode%" + }, + { + "type": "object", + "properties": { + "watchFile": { + "type": "string", + "description": "%configuration.tsserver.watchOptions.watchFile%", + "enum": [ + "fixedChunkSizePolling", + "fixedPollingInterval", + "priorityPollingInterval", + "dynamicPriorityPolling", + "useFsEvents", + "useFsEventsOnParentDirectory" + ], + "enumDescriptions": [ + "%configuration.tsserver.watchOptions.watchFile.fixedChunkSizePolling%", + "%configuration.tsserver.watchOptions.watchFile.fixedPollingInterval%", + "%configuration.tsserver.watchOptions.watchFile.priorityPollingInterval%", + "%configuration.tsserver.watchOptions.watchFile.dynamicPriorityPolling%", + "%configuration.tsserver.watchOptions.watchFile.useFsEvents%", + "%configuration.tsserver.watchOptions.watchFile.useFsEventsOnParentDirectory%" + ], + "default": "useFsEvents" + }, + "watchDirectory": { + "type": "string", + "description": "%configuration.tsserver.watchOptions.watchDirectory%", + "enum": [ + "fixedChunkSizePolling", + "fixedPollingInterval", + "dynamicPriorityPolling", + "useFsEvents" + ], + "enumDescriptions": [ + "%configuration.tsserver.watchOptions.watchDirectory.fixedChunkSizePolling%", + "%configuration.tsserver.watchOptions.watchDirectory.fixedPollingInterval%", + "%configuration.tsserver.watchOptions.watchDirectory.dynamicPriorityPolling%", + "%configuration.tsserver.watchOptions.watchDirectory.useFsEvents%" + ], + "default": "useFsEvents" + }, + "fallbackPolling": { + "type": "string", + "description": "%configuration.tsserver.watchOptions.fallbackPolling%", + "enum": [ + "fixedPollingInterval", + "priorityPollingInterval", + "dynamicPriorityPolling" + ], + "enumDescriptions": [ + "configuration.tsserver.watchOptions.fallbackPolling.fixedPollingInterval", + "configuration.tsserver.watchOptions.fallbackPolling.priorityPollingInterval", + "configuration.tsserver.watchOptions.fallbackPolling.dynamicPriorityPolling" + ] + }, + "synchronousWatchDirectory": { + "type": "boolean", + "description": "%configuration.tsserver.watchOptions.synchronousWatchDirectory%" + } + } + } + ], + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.watchOptions": { "description": "%configuration.tsserver.watchOptions%", "scope": "window", "default": "vscode", + "markdownDeprecationMessage": "%configuration.tsserver.watchOptions.unifiedDeprecationMessage%", "oneOf": [ { "type": "string", @@ -2429,12 +2713,38 @@ } ] }, + "js/ts.tsserver.tracing.enabled": { + "type": "boolean", + "default": false, + "description": "%typescript.tsserver.enableTracing%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.enableTracing": { "type": "boolean", "default": false, "description": "%typescript.tsserver.enableTracing%", + "markdownDeprecationMessage": "%typescript.tsserver.enableTracing.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.log": { + "type": "string", + "enum": [ + "off", + "terse", + "normal", + "verbose", + "requestTime" + ], + "default": "off", + "description": "%typescript.tsserver.log%", + "scope": "window", + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.log": { "type": "string", "enum": [ @@ -2446,8 +2756,22 @@ ], "default": "off", "description": "%typescript.tsserver.log%", + "markdownDeprecationMessage": "%typescript.tsserver.log.unifiedDeprecationMessage%", "scope": "window" }, + "js/ts.tsserver.pluginPaths": { + "type": "array", + "items": { + "type": "string", + "description": "%typescript.tsserver.pluginPaths.item%" + }, + "default": [], + "description": "%typescript.tsserver.pluginPaths%", + "scope": "machine", + "keywords": [ + "TypeScript" + ] + }, "typescript.tsserver.pluginPaths": { "type": "array", "items": { @@ -2456,6 +2780,7 @@ }, "default": [], "description": "%typescript.tsserver.pluginPaths%", + "markdownDeprecationMessage": "%typescript.tsserver.pluginPaths.unifiedDeprecationMessage%", "scope": "machine" } } diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index 21d974fcaf2dd..7cd88f9bf609b 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -20,13 +20,21 @@ "configuration.suggest.includeCompletionsForImportStatements": "Enable/disable auto-import-style completions on partially-typed import statements.", "configuration.suggest.includeCompletionsForImportStatements.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.suggest.includeCompletionsForImportStatements#` instead.", "typescript.useTsgo": "Disables TypeScript and JavaScript language features to allow usage of the TypeScript Go experimental extension. Requires TypeScript Go to be installed and configured. Requires reloading extensions after changing this setting.", + "typescript.useTsgo.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.experimental.useTsgo#` instead.", "typescript.tsdk.desc": "Specifies the folder path to the tsserver and `lib*.d.ts` files under a TypeScript install to use for IntelliSense, for example: `./node_modules/typescript/lib`.\n\n- When specified as a user setting, the TypeScript version from `typescript.tsdk` automatically replaces the built-in TypeScript version.\n- When specified as a workspace setting, `typescript.tsdk` allows you to switch to use that workspace version of TypeScript for IntelliSense with the `TypeScript: Select TypeScript version` command.\n\nSee the [TypeScript documentation](https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-newer-typescript-versions) for more detail about managing TypeScript versions.", + "typescript.tsdk.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsdk.path#` instead.", "typescript.disableAutomaticTypeAcquisition": "Disables [automatic type acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition). Automatic type acquisition fetches `@types` packages from npm to improve IntelliSense for external libraries.", + "typescript.disableAutomaticTypeAcquisition.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.automaticTypeAcquisition.enabled#` instead.", + "configuration.automaticTypeAcquisition.enabled": "Enable [automatic type acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition). Automatic type acquisition fetches `@types` packages from npm to improve IntelliSense for external libraries.", "typescript.enablePromptUseWorkspaceTsdk": "Enables prompting of users to use the TypeScript version configured in the workspace for Intellisense.", + "typescript.enablePromptUseWorkspaceTsdk.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsdk.promptToUseWorkspaceVersion#` instead.", "typescript.tsserver.enableTracing": "Enables tracing TS server performance to a directory. These trace files can be used to diagnose TS Server performance issues. The log may contain file paths, source code, and other potentially sensitive information from your project.", + "typescript.tsserver.enableTracing.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.tracing.enabled#` instead.", "typescript.tsserver.log": "Enables logging of the TS server to a file. This log can be used to diagnose TS Server issues. The log may contain file paths, source code, and other potentially sensitive information from your project.", + "typescript.tsserver.log.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.log#` instead.", "typescript.tsserver.pluginPaths": "Additional paths to discover TypeScript Language Service plugins.", "typescript.tsserver.pluginPaths.item": "Either an absolute or relative path. Relative path will be resolved against workspace folder(s).", + "typescript.tsserver.pluginPaths.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.pluginPaths#` instead.", "typescript.tsserver.trace": "Enables tracing of messages sent to the TS server. This trace can be used to diagnose TS Server issues. The trace may contain file paths, source code, and other potentially sensitive information from your project.", "typescript.validate.enable": "Enable/disable TypeScript validation.", "javascript.validate.enable": "Enable/disable JavaScript validation.", @@ -93,10 +101,13 @@ "typescript.reportStyleChecksAsWarnings": "Report style checks as warnings.", "configuration.reportStyleChecksAsWarnings.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.reportStyleChecksAsWarnings#` instead.", "typescript.npm": "Specifies the path to the npm executable used for [Automatic Type Acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition).", + "typescript.npm.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.npm.path#` instead.", "typescript.check.npmIsInstalled": "Check if npm is installed for [Automatic Type Acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition).", + "typescript.check.npmIsInstalled.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.checkNpmIsInstalled#` instead.", "configuration.suggest.names": "Enable/disable including unique names from the file in JavaScript suggestions. Note that name suggestions are always disabled in JavaScript code that is semantically checked using `@ts-check` or `checkJs`.", "configuration.suggest.names.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.suggest.names#` instead.", "typescript.tsc.autoDetect": "Controls auto detection of tsc tasks.", + "typescript.tsc.autoDetect.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsc.autoDetect#` instead.", "typescript.tsc.autoDetect.off": "Disable this feature.", "typescript.tsc.autoDetect.on": "Create both build and watch tasks.", "typescript.tsc.autoDetect.build": "Only create single run compile tasks.", @@ -108,12 +119,17 @@ "configuration.suggest.paths.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.suggest.paths#` instead.", "configuration.tsserver.useSeparateSyntaxServer": "Enable/disable spawning a separate TypeScript server that can more quickly respond to syntax related operations, such as calculating folding or computing document symbols.", "configuration.tsserver.useSyntaxServer": "Controls if TypeScript launches a dedicated server to more quickly handle syntax related operations, such as computing code folding.", + "configuration.tsserver.useSyntaxServer.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.useSyntaxServer#` instead.", "configuration.tsserver.useSyntaxServer.always": "Use a lighter weight syntax server to handle all IntelliSense operations. This disables project-wide features including auto-imports, cross-file completions, and go to definition for symbols in other files. Only use this for very large projects where performance is critical.", "configuration.tsserver.useSyntaxServer.never": "Don't use a dedicated syntax server. Use a single server to handle all IntelliSense operations.", "configuration.tsserver.useSyntaxServer.auto": "Spawn both a full server and a lighter weight server dedicated to syntax operations. The syntax server is used to speed up syntax operations and provide IntelliSense while projects are loading.", - "configuration.tsserver.maxTsServerMemory": "The maximum amount of memory (in MB) to allocate to the TypeScript server process. To use a memory limit greater than 4 GB, use `#typescript.tsserver.nodePath#` to run TS Server with a custom Node installation.", + "configuration.tsserver.maxTsServerMemory": "The maximum amount of memory (in MB) to allocate to the TypeScript server process. To use a memory limit greater than 4 GB, use `#js/ts.tsserver.node.path#` to run TS Server with a custom Node installation.", + "configuration.tsserver.maxTsServerMemory.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.maxMemory#` instead.", + "configuration.tsserver.maxMemory": "The maximum amount of memory (in MB) to allocate to the TypeScript server process. To use a memory limit greater than 4 GB, use `#js/ts.tsserver.node.path#` to run TS Server with a custom Node installation.", "configuration.tsserver.experimental.enableProjectDiagnostics": "Enables project wide error reporting.", + "configuration.tsserver.experimental.enableProjectDiagnostics.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.experimental.enableProjectDiagnostics#` instead.", "typescript.locale": "Sets the locale used to report JavaScript and TypeScript errors. Defaults to use VS Code's locale.", + "typescript.locale.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.locale#` instead.", "typescript.locale.auto": "Use VS Code's configured display language.", "configuration.implicitProjectConfig.module": "Sets the module system for the program. See more: https://www.typescriptlang.org/tsconfig#module.", "configuration.implicitProjectConfig.target": "Set target JavaScript language version for emitted JavaScript and include library declarations. See more: https://www.typescriptlang.org/tsconfig#target.", @@ -290,9 +306,14 @@ "configuration.suggest.objectLiteralMethodSnippets.enabled": "Enable/disable snippet completions for methods in object literals.", "configuration.suggest.objectLiteralMethodSnippets.enabled.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.suggest.objectLiteralMethodSnippets.enabled#` instead.", "configuration.tsserver.web.projectWideIntellisense.enabled": "Enable/disable project-wide IntelliSense on web. Requires that VS Code is running in a trusted context.", - "configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors": "Suppresses semantic errors on web even when project wide IntelliSense is enabled. This is always on when project wide IntelliSense is not enabled or available. See `#typescript.tsserver.web.projectWideIntellisense.enabled#`", - "configuration.tsserver.web.typeAcquisition.enabled": "Enable/disable package acquisition on the web. This enables IntelliSense for imported packages. Requires `#typescript.tsserver.web.projectWideIntellisense.enabled#`. Currently not supported for Safari.", + "configuration.tsserver.web.projectWideIntellisense.enabled.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.web.projectWideIntellisense.enabled#` instead.", + "configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors": "Suppresses semantic errors on web even when project wide IntelliSense is enabled. This is always on when project wide IntelliSense is not enabled or available. See `#js/ts.tsserver.web.projectWideIntellisense.enabled#`", + "configuration.tsserver.web.projectWideIntellisense.suppressSemanticErrors.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.web.projectWideIntellisense.suppressSemanticErrors#` instead.", + "configuration.tsserver.web.typeAcquisition.enabled": "Enable/disable package acquisition on the web. This enables IntelliSense for imported packages. Requires `#js/ts.tsserver.web.projectWideIntellisense.enabled#`. Currently not supported for Safari.", + "configuration.tsserver.web.typeAcquisition.enabled.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.web.typeAcquisition.enabled#` instead.", "configuration.tsserver.nodePath": "Run TS Server on a custom Node installation. This can be a path to a Node executable, or 'node' if you want VS Code to detect a Node installation.", + "configuration.tsserver.nodePath.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.node.path#` instead.", + "configuration.tsserver.watchOptions.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.tsserver.watchOptions#` instead.", "configuration.updateImportsOnPaste": "Automatically update imports when pasting code. Requires TypeScript 5.6+.", "configuration.updateImportsOnPaste.enabled.unifiedDeprecationMessage": "This setting is deprecated. Use `#js/ts.updateImportsOnPaste.enabled#` instead.", "configuration.hover.maximumLength": "The maximum number of characters in a hover. If the hover is longer than this, it will be truncated. Requires TypeScript 5.9+.", diff --git a/extensions/typescript-language-features/src/commands/useTsgo.ts b/extensions/typescript-language-features/src/commands/useTsgo.ts index d537cff3da6ce..765d46d8b09e3 100644 --- a/extensions/typescript-language-features/src/commands/useTsgo.ts +++ b/extensions/typescript-language-features/src/commands/useTsgo.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; +import { readUnifiedConfig, unifiedConfigSection } from '../utils/configuration'; import { Command } from './commandManager'; export const tsNativeExtensionId = 'typescriptteam.native-preview'; @@ -45,18 +46,19 @@ async function updateTsgoSetting(enable: boolean): Promise { } } - const tsConfig = vscode.workspace.getConfiguration('typescript'); - const currentValue = tsConfig.get('experimental.useTsgo', false); + const currentValue = readUnifiedConfig('experimental.useTsgo', false, { fallbackSection: 'typescript' }); if (currentValue === enable) { return; } // Determine the target scope for the configuration update let target = vscode.ConfigurationTarget.Global; - const inspect = tsConfig.inspect('experimental.useTsgo'); - if (inspect?.workspaceValue !== undefined) { + const unifiedConfig = vscode.workspace.getConfiguration(unifiedConfigSection); + const inspect = unifiedConfig.inspect('experimental.useTsgo'); + const legacyInspect = vscode.workspace.getConfiguration('typescript').inspect('experimental.useTsgo'); + if (inspect?.workspaceValue !== undefined || legacyInspect?.workspaceValue !== undefined) { target = vscode.ConfigurationTarget.Workspace; - } else if (inspect?.workspaceFolderValue !== undefined) { + } else if (inspect?.workspaceFolderValue !== undefined || legacyInspect?.workspaceFolderValue !== undefined) { target = vscode.ConfigurationTarget.WorkspaceFolder; } else { // If setting is not defined yet, use the same scope as typescript-go.executablePath @@ -70,5 +72,5 @@ async function updateTsgoSetting(enable: boolean): Promise { } } - await tsConfig.update('experimental.useTsgo', enable, target); + await unifiedConfig.update('experimental.useTsgo', enable, target); } diff --git a/extensions/typescript-language-features/src/configuration/configuration.electron.ts b/extensions/typescript-language-features/src/configuration/configuration.electron.ts index 0c2a7ab12f780..6f5bbd356ce23 100644 --- a/extensions/typescript-language-features/src/configuration/configuration.electron.ts +++ b/extensions/typescript-language-features/src/configuration/configuration.electron.ts @@ -24,6 +24,10 @@ export class ElectronServiceConfigurationProvider extends BaseServiceConfigurati } protected readGlobalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { + const unifiedInspect = configuration.inspect('js/ts.tsdk.path'); + if (unifiedInspect && typeof unifiedInspect.globalValue === 'string') { + return this.fixPathPrefixes(unifiedInspect.globalValue); + } const inspect = configuration.inspect('typescript.tsdk'); if (inspect && typeof inspect.globalValue === 'string') { return this.fixPathPrefixes(inspect.globalValue); @@ -32,6 +36,10 @@ export class ElectronServiceConfigurationProvider extends BaseServiceConfigurati } protected readLocalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { + const unifiedInspect = configuration.inspect('js/ts.tsdk.path'); + if (unifiedInspect && typeof unifiedInspect.workspaceValue === 'string') { + return this.fixPathPrefixes(unifiedInspect.workspaceValue); + } const inspect = configuration.inspect('typescript.tsdk'); if (inspect && typeof inspect.workspaceValue === 'string') { return this.fixPathPrefixes(inspect.workspaceValue); @@ -44,7 +52,10 @@ export class ElectronServiceConfigurationProvider extends BaseServiceConfigurati } private readLocalNodePathWorker(configuration: vscode.WorkspaceConfiguration): string | null { - const inspect = configuration.inspect('typescript.tsserver.nodePath'); + const unifiedInspect = configuration.inspect('js/ts.tsserver.node.path'); + const inspect = (unifiedInspect?.workspaceValue && typeof unifiedInspect.workspaceValue === 'string') + ? unifiedInspect + : configuration.inspect('typescript.tsserver.nodePath'); if (inspect?.workspaceValue && typeof inspect.workspaceValue === 'string') { if (inspect.workspaceValue === 'node') { return this.findNodePath(); @@ -64,7 +75,10 @@ export class ElectronServiceConfigurationProvider extends BaseServiceConfigurati } private readGlobalNodePathWorker(configuration: vscode.WorkspaceConfiguration): string | null { - const inspect = configuration.inspect('typescript.tsserver.nodePath'); + const unifiedInspect = configuration.inspect('js/ts.tsserver.node.path'); + const inspect = (unifiedInspect?.globalValue && typeof unifiedInspect.globalValue === 'string') + ? unifiedInspect + : configuration.inspect('typescript.tsserver.nodePath'); if (inspect?.globalValue && typeof inspect.globalValue === 'string') { if (inspect.globalValue === 'node') { return this.findNodePath(); diff --git a/extensions/typescript-language-features/src/configuration/configuration.ts b/extensions/typescript-language-features/src/configuration/configuration.ts index 22601ead8eac2..a557f08c0246b 100644 --- a/extensions/typescript-language-features/src/configuration/configuration.ts +++ b/extensions/typescript-language-features/src/configuration/configuration.ts @@ -153,29 +153,29 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu public loadFromWorkspace(): TypeScriptServiceConfiguration { const configuration = vscode.workspace.getConfiguration(); return { - locale: this.readLocale(configuration), + locale: this.readLocale(), globalTsdk: this.readGlobalTsdk(configuration), localTsdk: this.readLocalTsdk(configuration), - npmLocation: this.readNpmLocation(configuration), - tsServerLogLevel: this.readTsServerLogLevel(configuration), - tsServerPluginPaths: this.readTsServerPluginPaths(configuration), + npmLocation: this.readNpmLocation(), + tsServerLogLevel: this.readTsServerLogLevel(), + tsServerPluginPaths: this.readTsServerPluginPaths(), implicitProjectConfiguration: new ImplicitProjectConfiguration(configuration), disableAutomaticTypeAcquisition: this.readDisableAutomaticTypeAcquisition(configuration), useSyntaxServer: this.readUseSyntaxServer(configuration), - webProjectWideIntellisenseEnabled: this.readWebProjectWideIntellisenseEnable(configuration), - webProjectWideIntellisenseSuppressSemanticErrors: this.readWebProjectWideIntellisenseSuppressSemanticErrors(configuration), - webTypeAcquisitionEnabled: this.readWebTypeAcquisition(configuration), - enableDiagnosticsTelemetry: this.readEnableDiagnosticsTelemetry(configuration), - enableProjectDiagnostics: this.readEnableProjectDiagnostics(configuration), - maxTsServerMemory: this.readMaxTsServerMemory(configuration), - enablePromptUseWorkspaceTsdk: this.readEnablePromptUseWorkspaceTsdk(configuration), + webProjectWideIntellisenseEnabled: this.readWebProjectWideIntellisenseEnable(), + webProjectWideIntellisenseSuppressSemanticErrors: this.readWebProjectWideIntellisenseSuppressSemanticErrors(), + webTypeAcquisitionEnabled: this.readWebTypeAcquisition(), + enableDiagnosticsTelemetry: this.readEnableDiagnosticsTelemetry(), + enableProjectDiagnostics: this.readEnableProjectDiagnostics(), + maxTsServerMemory: this.readMaxTsServerMemory(), + enablePromptUseWorkspaceTsdk: this.readEnablePromptUseWorkspaceTsdk(), useVsCodeWatcher: this.readUseVsCodeWatcher(configuration), - watchOptions: this.readWatchOptions(configuration), - includePackageJsonAutoImports: this.readIncludePackageJsonAutoImports(configuration), - enableTsServerTracing: this.readEnableTsServerTracing(configuration), + watchOptions: this.readWatchOptions(), + includePackageJsonAutoImports: this.readIncludePackageJsonAutoImports(), + enableTsServerTracing: this.readEnableTsServerTracing(), localNodePath: this.readLocalNodePath(configuration), globalNodePath: this.readGlobalNodePath(configuration), - workspaceSymbolsExcludeLibrarySymbols: this.readWorkspaceSymbolsExcludeLibrarySymbols(configuration), + workspaceSymbolsExcludeLibrarySymbols: this.readWorkspaceSymbolsExcludeLibrarySymbols(), }; } @@ -184,30 +184,35 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu protected abstract readLocalNodePath(configuration: vscode.WorkspaceConfiguration): string | null; protected abstract readGlobalNodePath(configuration: vscode.WorkspaceConfiguration): string | null; - protected readTsServerLogLevel(configuration: vscode.WorkspaceConfiguration): TsServerLogLevel { - const setting = configuration.get('typescript.tsserver.log', 'off'); + protected readTsServerLogLevel(): TsServerLogLevel { + const setting = readUnifiedConfig('tsserver.log', 'off', { fallbackSection: 'typescript' }); return TsServerLogLevel.fromString(setting); } - protected readTsServerPluginPaths(configuration: vscode.WorkspaceConfiguration): string[] { - return configuration.get('typescript.tsserver.pluginPaths', []); + protected readTsServerPluginPaths(): string[] { + return readUnifiedConfig('tsserver.pluginPaths', [], { fallbackSection: 'typescript' }); } - protected readNpmLocation(configuration: vscode.WorkspaceConfiguration): string | null { - return configuration.get('typescript.npm', null); + protected readNpmLocation(): string | null { + return readUnifiedConfig('tsserver.npm.path', null, { fallbackSection: 'typescript', fallbackSubSectionNameOverride: 'npm' }); } protected readDisableAutomaticTypeAcquisition(configuration: vscode.WorkspaceConfiguration): boolean { + const enabled = readUnifiedConfig('tsserver.automaticTypeAcquisition.enabled', undefined, { fallbackSection: 'typescript' }); + if (enabled !== undefined) { + return !enabled; + } + // Fall back to the old deprecated setting return configuration.get('typescript.disableAutomaticTypeAcquisition', false); } - protected readLocale(configuration: vscode.WorkspaceConfiguration): string | null { - const value = configuration.get('typescript.locale', 'auto'); + protected readLocale(): string | null { + const value = readUnifiedConfig('locale', 'auto', { fallbackSection: 'typescript' }); return !value || value === 'auto' ? null : value; } protected readUseSyntaxServer(configuration: vscode.WorkspaceConfiguration): SyntaxServerConfiguration { - const value = configuration.get('typescript.tsserver.useSyntaxServer'); + const value = readUnifiedConfig('tsserver.useSyntaxServer', undefined, { fallbackSection: 'typescript' }); switch (value) { case 'never': return SyntaxServerConfiguration.Never; case 'always': return SyntaxServerConfiguration.Always; @@ -225,13 +230,13 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu return SyntaxServerConfiguration.Never; } - protected readEnableDiagnosticsTelemetry(configuration: vscode.WorkspaceConfiguration): boolean { + protected readEnableDiagnosticsTelemetry(): boolean { // This setting does not appear in the settings view, as it is not to be enabled by users outside the team - return configuration.get('typescript.enableDiagnosticsTelemetry', false); + return readUnifiedConfig('enableDiagnosticsTelemetry', false, { fallbackSection: 'typescript' }); } - protected readEnableProjectDiagnostics(configuration: vscode.WorkspaceConfiguration): boolean { - return configuration.get('typescript.tsserver.experimental.enableProjectDiagnostics', false); + protected readEnableProjectDiagnostics(): boolean { + return readUnifiedConfig('tsserver.experimental.enableProjectDiagnostics', false, { fallbackSection: 'typescript' }); } private readUseVsCodeWatcher(configuration: vscode.WorkspaceConfiguration): boolean { @@ -256,12 +261,12 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu return experimentalConfig.workspaceFolderValue; } - return configuration.get('typescript.tsserver.watchOptions', vscodeWatcherName) === vscodeWatcherName; + return readUnifiedConfig('tsserver.watchOptions', vscodeWatcherName, { fallbackSection: 'typescript' }) === vscodeWatcherName; } - private readWatchOptions(configuration: vscode.WorkspaceConfiguration): Proto.WatchOptions | undefined { - const watchOptions = configuration.get('typescript.tsserver.watchOptions'); - if (watchOptions === vscodeWatcherName) { + private readWatchOptions(): Proto.WatchOptions | undefined { + const watchOptions = readUnifiedConfig('tsserver.watchOptions', undefined, { fallbackSection: 'typescript' }); + if (!watchOptions || watchOptions === vscodeWatcherName) { return undefined; } @@ -269,41 +274,41 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu return { ...(watchOptions ?? {}) }; } - protected readIncludePackageJsonAutoImports(_configuration: vscode.WorkspaceConfiguration): 'auto' | 'on' | 'off' | undefined { + protected readIncludePackageJsonAutoImports(): 'auto' | 'on' | 'off' | undefined { return readUnifiedConfig<'auto' | 'on' | 'off' | undefined>('preferences.includePackageJsonAutoImports', undefined, { fallbackSection: 'typescript' }); } - protected readMaxTsServerMemory(configuration: vscode.WorkspaceConfiguration): number { + protected readMaxTsServerMemory(): number { const defaultMaxMemory = 3072; const minimumMaxMemory = 128; - const memoryInMB = configuration.get('typescript.tsserver.maxTsServerMemory', defaultMaxMemory); + const memoryInMB = readUnifiedConfig('tsserver.maxMemory', defaultMaxMemory, { fallbackSection: 'typescript', fallbackSubSectionNameOverride: 'tsserver.maxTsServerMemory' }); if (!Number.isSafeInteger(memoryInMB)) { return defaultMaxMemory; } return Math.max(memoryInMB, minimumMaxMemory); } - protected readEnablePromptUseWorkspaceTsdk(configuration: vscode.WorkspaceConfiguration): boolean { - return configuration.get('typescript.enablePromptUseWorkspaceTsdk', false); + protected readEnablePromptUseWorkspaceTsdk(): boolean { + return readUnifiedConfig('tsdk.promptToUseWorkspaceVersion', false, { fallbackSection: 'typescript', fallbackSubSectionNameOverride: 'enablePromptUseWorkspaceTsdk' }); } - protected readEnableTsServerTracing(configuration: vscode.WorkspaceConfiguration): boolean { - return configuration.get('typescript.tsserver.enableTracing', false); + protected readEnableTsServerTracing(): boolean { + return readUnifiedConfig('tsserver.tracing.enabled', false, { fallbackSection: 'typescript', fallbackSubSectionNameOverride: 'tsserver.enableTracing' }); } - private readWorkspaceSymbolsExcludeLibrarySymbols(_configuration: vscode.WorkspaceConfiguration): boolean { + private readWorkspaceSymbolsExcludeLibrarySymbols(): boolean { return readUnifiedConfig('workspaceSymbols.excludeLibrarySymbols', true, { scope: null, fallbackSection: 'typescript' }); } - private readWebProjectWideIntellisenseEnable(configuration: vscode.WorkspaceConfiguration): boolean { - return configuration.get('typescript.tsserver.web.projectWideIntellisense.enabled', true); + private readWebProjectWideIntellisenseEnable(): boolean { + return readUnifiedConfig('tsserver.web.projectWideIntellisense.enabled', true, { fallbackSection: 'typescript' }); } - private readWebProjectWideIntellisenseSuppressSemanticErrors(configuration: vscode.WorkspaceConfiguration): boolean { - return this.readWebTypeAcquisition(configuration) && configuration.get('typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors', false); + private readWebProjectWideIntellisenseSuppressSemanticErrors(): boolean { + return this.readWebTypeAcquisition() && readUnifiedConfig('tsserver.web.projectWideIntellisense.suppressSemanticErrors', false, { fallbackSection: 'typescript' }); } - private readWebTypeAcquisition(configuration: vscode.WorkspaceConfiguration): boolean { - return configuration.get('typescript.tsserver.web.typeAcquisition.enabled', true); + private readWebTypeAcquisition(): boolean { + return readUnifiedConfig('tsserver.web.typeAcquisition.enabled', true, { fallbackSection: 'typescript' }); } } diff --git a/extensions/typescript-language-features/src/extension.ts b/extensions/typescript-language-features/src/extension.ts index 6f51fe1b59777..83492c95ad101 100644 --- a/extensions/typescript-language-features/src/extension.ts +++ b/extensions/typescript-language-features/src/extension.ts @@ -25,7 +25,7 @@ import { onCaseInsensitiveFileSystem } from './utils/fs.electron'; import { Lazy } from './utils/lazy'; import { getPackageInfo } from './utils/packageInfo'; import * as temp from './utils/temp.electron'; -import { conditionalRegistration, requireGlobalConfiguration, requireHasVsCodeExtension } from './languageFeatures/util/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration, requireGlobalUnifiedConfig, requireHasVsCodeExtension } from './languageFeatures/util/dependentRegistration'; import { DisposableStore } from './utils/dispose'; export function activate( @@ -60,7 +60,7 @@ export function activate( // Conditionally register features based on whether TSGO is enabled context.subscriptions.push(conditionalRegistration([ - requireGlobalConfiguration('typescript', 'experimental.useTsgo'), + requireGlobalUnifiedConfig('experimental.useTsgo', { fallbackSection: 'typescript' }), requireHasVsCodeExtension(tsNativeExtensionId), ], () => { // TSGO. Only register a small set of features that don't use TS Server diff --git a/extensions/typescript-language-features/src/filesystems/ata.ts b/extensions/typescript-language-features/src/filesystems/ata.ts index b5e43244e1bfe..bec0217114fa9 100644 --- a/extensions/typescript-language-features/src/filesystems/ata.ts +++ b/extensions/typescript-language-features/src/filesystems/ata.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { conditionalRegistration, requireGlobalConfiguration } from '../languageFeatures/util/dependentRegistration'; +import { conditionalRegistration, requireGlobalUnifiedConfig } from '../languageFeatures/util/dependentRegistration'; import { supportsReadableByteStreams } from '../utils/platform'; import { AutoInstallerFs } from './autoInstallerFs'; import { MemFs } from './memFs'; @@ -16,7 +16,7 @@ export function registerAtaSupport(logger: Logger): vscode.Disposable { } return conditionalRegistration([ - requireGlobalConfiguration('typescript', 'tsserver.web.typeAcquisition.enabled'), + requireGlobalUnifiedConfig('tsserver.web.typeAcquisition.enabled', { fallbackSection: 'typescript' }), ], () => { return vscode.Disposable.from( // Ata diff --git a/extensions/typescript-language-features/src/languageFeatures/completions.ts b/extensions/typescript-language-features/src/languageFeatures/completions.ts index 030bb84ea0034..a633368da40d6 100644 --- a/extensions/typescript-language-features/src/languageFeatures/completions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/completions.ts @@ -669,13 +669,12 @@ namespace CompletionConfiguration { modeId: string, scope: UnifiedConfigurationScope ): CompletionConfiguration { - const config = vscode.workspace.getConfiguration(modeId, scope); return { completeFunctionCalls: readUnifiedConfig(CompletionConfiguration.completeFunctionCalls, false, { scope: scope, fallbackSection: modeId }), pathSuggestions: readUnifiedConfig(CompletionConfiguration.pathSuggestions, true, { scope: scope, fallbackSection: modeId }), autoImportSuggestions: readUnifiedConfig(CompletionConfiguration.autoImportSuggestions, true, { scope: scope, fallbackSection: modeId }), nameSuggestions: readUnifiedConfig(CompletionConfiguration.nameSuggestions, true, { scope: scope, fallbackSection: modeId }), - importStatementSuggestions: config.get(CompletionConfiguration.importStatementSuggestions, true), + importStatementSuggestions: readUnifiedConfig(CompletionConfiguration.importStatementSuggestions, true, { scope: scope, fallbackSection: modeId }), }; } } diff --git a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts index 21f48f20d632e..915de13e13cf4 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts @@ -172,14 +172,11 @@ export default class FileConfigurationManager extends Disposable { } private getPreferences(document: vscode.TextDocument): Proto.UserPreferences { - const config = vscode.workspace.getConfiguration( - isTypeScriptDocument(document) ? 'typescript' : 'javascript', - document); - const fallbackSection = isTypeScriptDocument(document) ? 'typescript' : 'javascript'; + const oldConfig = vscode.workspace.getConfiguration(fallbackSection, document); const preferences: Proto.UserPreferences = { - ...config.get('unstable'), + ...oldConfig.get('unstable'), quotePreference: getQuoteStylePreference(document, fallbackSection), importModuleSpecifierPreference: getImportModuleSpecifierPreference(document, fallbackSection), importModuleSpecifierEnding: getImportModuleSpecifierEndingPreference(document, fallbackSection), diff --git a/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts b/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts index 761b13957e271..95dd8fd4d4cfe 100644 --- a/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts +++ b/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts @@ -12,7 +12,7 @@ import * as typeConverters from '../typeConverters'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; import { Delayer } from '../utils/async'; import { nulToken } from '../utils/cancellation'; -import { readUnifiedConfig } from '../utils/configuration'; +import { readUnifiedConfig, unifiedConfigSection } from '../utils/configuration'; import { Disposable } from '../utils/dispose'; import FileConfigurationManager from './fileConfigurationManager'; import { conditionalRegistration, requireSomeCapability } from './util/dependentRegistration'; @@ -174,7 +174,7 @@ class UpdateImportsOnFileRenameHandler extends Disposable { return false; } case alwaysItem: { - const config = vscode.workspace.getConfiguration('js/ts'); + const config = vscode.workspace.getConfiguration(unifiedConfigSection); config.update( updateImportsOnFileMoveName, UpdateImportsOnFileMoveSetting.Always, @@ -182,7 +182,7 @@ class UpdateImportsOnFileRenameHandler extends Disposable { return true; } case neverItem: { - const config = vscode.workspace.getConfiguration('js/ts'); + const config = vscode.workspace.getConfiguration(unifiedConfigSection); config.update( updateImportsOnFileMoveName, UpdateImportsOnFileMoveSetting.Never, diff --git a/extensions/typescript-language-features/src/languageFeatures/util/dependentRegistration.ts b/extensions/typescript-language-features/src/languageFeatures/util/dependentRegistration.ts index e390d9a29fa7b..4c0b7b5069ca0 100644 --- a/extensions/typescript-language-features/src/languageFeatures/util/dependentRegistration.ts +++ b/extensions/typescript-language-features/src/languageFeatures/util/dependentRegistration.ts @@ -90,19 +90,6 @@ export function requireMinVersion( ); } -export function requireGlobalConfiguration( - section: string, - configValue: string, -) { - return new Condition( - () => { - const config = vscode.workspace.getConfiguration(section, null); - return !!config.get(configValue); - }, - vscode.workspace.onDidChangeConfiguration - ); -} - /** * Requires that a configuration value has been modified from its default value in either the global or workspace scope * diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index b70b21280d6bc..afafc9b27a231 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -162,23 +162,7 @@ export default class LanguageProvider extends Disposable { return; } - const config = vscode.workspace.getConfiguration(this.id, file); - const reportUnnecessary = config.get('showUnused', true); - const reportDeprecated = config.get('showDeprecated', true); - this.client.diagnosticsManager.updateDiagnostics(file, this._diagnosticLanguage, diagnosticsKind, diagnostics.filter(diag => { - // Don't bother reporting diagnostics we know will not be rendered - if (!reportUnnecessary) { - if (diag.reportUnnecessary && diag.severity === vscode.DiagnosticSeverity.Hint) { - return false; - } - } - if (!reportDeprecated) { - if (diag.reportDeprecated && diag.severity === vscode.DiagnosticSeverity.Hint) { - return false; - } - } - return true; - }), ranges); + this.client.diagnosticsManager.updateDiagnostics(file, this._diagnosticLanguage, diagnosticsKind, diagnostics, ranges); } public configFileDiagnosticsReceived(file: vscode.Uri, diagnostics: vscode.Diagnostic[]): void { diff --git a/extensions/typescript-language-features/src/logging/logLevelMonitor.ts b/extensions/typescript-language-features/src/logging/logLevelMonitor.ts index 09d566b05bfea..09ba03672c901 100644 --- a/extensions/typescript-language-features/src/logging/logLevelMonitor.ts +++ b/extensions/typescript-language-features/src/logging/logLevelMonitor.ts @@ -5,35 +5,33 @@ import * as vscode from 'vscode'; import { TsServerLogLevel } from '../configuration/configuration'; +import { UnifiedConfigValue, unifiedConfigSection } from '../utils/configuration'; import { Disposable } from '../utils/dispose'; export class LogLevelMonitor extends Disposable { - private static readonly logLevelConfigKey = 'typescript.tsserver.log'; private static readonly logLevelChangedStorageKey = 'typescript.tsserver.logLevelChanged'; private static readonly doNotPromptLogLevelStorageKey = 'typescript.tsserver.doNotPromptLogLevel'; + private readonly _logLevel: UnifiedConfigValue; + constructor(private readonly context: vscode.ExtensionContext) { super(); - this._register(vscode.workspace.onDidChangeConfiguration(this.onConfigurationChange, this, this._disposables)); + this._logLevel = this._register(new UnifiedConfigValue('tsserver.log', 'off', { fallbackSection: 'typescript' })); + + this._register(this._logLevel.onDidChange(() => { + this.context.globalState.update(LogLevelMonitor.logLevelChangedStorageKey, new Date()); + })); if (this.shouldNotifyExtendedLogging()) { this.notifyExtendedLogging(); } } - private onConfigurationChange(event: vscode.ConfigurationChangeEvent) { - const logLevelChanged = event.affectsConfiguration(LogLevelMonitor.logLevelConfigKey); - if (!logLevelChanged) { - return; - } - this.context.globalState.update(LogLevelMonitor.logLevelChangedStorageKey, new Date()); - } - private get logLevel(): TsServerLogLevel { - return TsServerLogLevel.fromString(vscode.workspace.getConfiguration().get(LogLevelMonitor.logLevelConfigKey, 'off')); + return TsServerLogLevel.fromString(this._logLevel.getValue()); } /** @@ -90,7 +88,7 @@ export class LogLevelMonitor extends Disposable { return; } if (selection.choice === Choice.DisableLogging) { - return vscode.workspace.getConfiguration().update(LogLevelMonitor.logLevelConfigKey, 'off', true); + return vscode.workspace.getConfiguration().update(`${unifiedConfigSection}.tsserver.log`, 'off', true); } else if (selection.choice === Choice.DoNotShowAgain) { return this.context.globalState.update(LogLevelMonitor.doNotPromptLogLevelStorageKey, true); } diff --git a/extensions/typescript-language-features/src/task/taskProvider.ts b/extensions/typescript-language-features/src/task/taskProvider.ts index 5242dd1e2ac77..b38469ba58d73 100644 --- a/extensions/typescript-language-features/src/task/taskProvider.ts +++ b/extensions/typescript-language-features/src/task/taskProvider.ts @@ -9,6 +9,7 @@ import * as vscode from 'vscode'; import { wait } from '../test/testUtils'; import { ITypeScriptServiceClient, ServerResponse } from '../typescriptService'; import { coalesce } from '../utils/arrays'; +import { readUnifiedConfig } from '../utils/configuration'; import { Disposable } from '../utils/dispose'; import { exists } from '../utils/fs'; import { isTsConfigFileName } from '../configuration/languageDescription'; @@ -289,7 +290,7 @@ class TscTaskProvider extends Disposable implements vscode.TaskProvider { } private onConfigurationChanged(): void { - const type = vscode.workspace.getConfiguration('typescript.tsc').get('autoDetect'); + const type = readUnifiedConfig('tsc.autoDetect', undefined, { fallbackSection: 'typescript' }); this.autoDetect = typeof type === 'undefined' ? AutoDetect.on : type; } } diff --git a/extensions/typescript-language-features/src/tsServer/versionManager.ts b/extensions/typescript-language-features/src/tsServer/versionManager.ts index dcfee493f43aa..8d99637dadcd6 100644 --- a/extensions/typescript-language-features/src/tsServer/versionManager.ts +++ b/extensions/typescript-language-features/src/tsServer/versionManager.ts @@ -6,6 +6,7 @@ import * as vscode from 'vscode'; import { TypeScriptServiceConfiguration } from '../configuration/configuration'; import { tsNativeExtensionId } from '../commands/useTsgo'; +import { readUnifiedConfig, unifiedConfigSection } from '../utils/configuration'; import { setImmediate } from '../utils/async'; import { Disposable } from '../utils/dispose'; import { ITypeScriptVersionProvider, TypeScriptVersion } from './versionProvider'; @@ -131,8 +132,7 @@ export class TypeScriptVersionManager extends Disposable { const trusted = await vscode.workspace.requestWorkspaceTrust(); if (trusted) { await this.workspaceState.update(useWorkspaceTsdkStorageKey, true); - const tsConfig = vscode.workspace.getConfiguration('typescript'); - await tsConfig.update('tsdk', version.pathLabel, false); + await vscode.workspace.getConfiguration(unifiedConfigSection).update('tsdk.path', version.pathLabel, false); this.updateActiveVersion(version); } }, @@ -146,8 +146,7 @@ export class TypeScriptVersionManager extends Disposable { return undefined; } - const tsConfig = vscode.workspace.getConfiguration('typescript'); - const isUsingTsgo = tsConfig.get('experimental.useTsgo', false); + const isUsingTsgo = readUnifiedConfig('experimental.useTsgo', false, { fallbackSection: 'typescript' }); return { label: (isUsingTsgo ? '• ' : '') + vscode.l10n.t("Use TypeScript Native Preview (Experimental)"), diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index dfd72176e1f44..507f9e6628a61 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -536,13 +536,13 @@ export default class TypeScriptServiceClient extends Disposable implements IType public async openTsServerLogFile(): Promise { if (this._configuration.tsServerLogLevel === TsServerLogLevel.Off) { vscode.window.showErrorMessage( - vscode.l10n.t("TS Server logging is off. Please set 'typescript.tsserver.log' and restart the TS server to enable logging"), + vscode.l10n.t("TS Server logging is off. Please set 'js/ts.tsserver.log' and restart the TS server to enable logging"), { title: vscode.l10n.t("Enable logging and restart TS server"), }) .then(selection => { if (selection) { - return vscode.workspace.getConfiguration().update('typescript.tsserver.log', 'verbose', true).then(() => { + return vscode.workspace.getConfiguration().update('js/ts.tsserver.log', 'verbose', true).then(() => { this.restartTsServer(); }); } diff --git a/extensions/typescript-language-features/src/ui/typingsStatus.ts b/extensions/typescript-language-features/src/ui/typingsStatus.ts index 3e8d7c4efac4c..9e9b130f691fe 100644 --- a/extensions/typescript-language-features/src/ui/typingsStatus.ts +++ b/extensions/typescript-language-features/src/ui/typingsStatus.ts @@ -5,6 +5,7 @@ import * as vscode from 'vscode'; import { ITypeScriptServiceClient } from '../typescriptService'; +import { readUnifiedConfig } from '../utils/configuration'; import { Disposable } from '../utils/dispose'; @@ -95,21 +96,19 @@ export class AtaProgressReporter extends Disposable { } private async onTypesInstallerInitializationFailed() { - const config = vscode.workspace.getConfiguration('typescript'); - - if (config.get('check.npmIsInstalled', true)) { + if (readUnifiedConfig('tsserver.checkNpmIsInstalled', true, { fallbackSection: 'typescript', fallbackSubSectionNameOverride: 'check.npmIsInstalled' })) { const dontShowAgain: vscode.MessageItem = { title: vscode.l10n.t("Don't Show Again"), }; const selected = await vscode.window.showWarningMessage( vscode.l10n.t( - "Could not install typings files for JavaScript language features. Please ensure that NPM is installed, or configure 'typescript.npm' in your user settings. Alternatively, check the [documentation]({0}) to learn more.", + "Could not install typings files for JavaScript language features. Please ensure that NPM is installed, or configure 'js/ts.tsserver.npm.path' in your user settings. Alternatively, check the [documentation]({0}) to learn more.", 'https://go.microsoft.com/fwlink/?linkid=847635' ), dontShowAgain); if (selected === dontShowAgain) { - config.update('check.npmIsInstalled', false, true); + vscode.workspace.getConfiguration('js/ts').update('tsserver.checkNpmIsInstalled', false, true); } } } From 36fda9ce917d1e2180f2ea7cd68e8d80329baa93 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 23 Feb 2026 11:22:42 -0800 Subject: [PATCH 31/51] tests --- .../policyExport/test/node/policyExport.integrationTest.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts b/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts index b7b46fd716bd0..c9cc8881d246b 100644 --- a/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts +++ b/src/vs/workbench/contrib/policyExport/test/node/policyExport.integrationTest.ts @@ -12,6 +12,7 @@ import { isWindows } from '../../../../../base/common/platform.js'; import { dirname, join } from '../../../../../base/common/path.js'; import { FileAccess } from '../../../../../base/common/network.js'; import * as util from 'util'; +import { stripComments } from '../../../../../base/common/jsonc.js'; const exec = util.promisify(cp.exec); @@ -33,7 +34,7 @@ suite('PolicyExport Integration Tests', () => { const tempFile = join(os.tmpdir(), `policyData-test-${Date.now()}.jsonc`); function normalizeContent(content: string) { - const data = JSON.parse(content); + const data = JSON.parse(stripComments(content)); if (data && Array.isArray(data.policies)) { data.policies.sort((a: any, b: any) => a.name.localeCompare(b.name)); } From 59a40215da7e3ebcde925b8540c0d58d14f0e0d0 Mon Sep 17 00:00:00 2001 From: Josh Spicer <23246594+joshspicer@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:24:26 -0800 Subject: [PATCH 32/51] Add entrypoint to 'AI Customizations' from customization markrdown (#297061) merge --- .../aiCustomizationManagement.contribution.ts | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts b/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts index 28e7739d0ec7d..ace3b949dfaff 100644 --- a/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.ts @@ -27,7 +27,7 @@ import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase import { Codicon } from '../../../../../base/common/codicons.js'; import { URI } from '../../../../../base/common/uri.js'; import { ICommandService } from '../../../../../platform/commands/common/commands.js'; -import { PromptsType } from '../../common/promptSyntax/promptTypes.js'; +import { PROMPT_LANGUAGE_ID, INSTRUCTIONS_LANGUAGE_ID, AGENT_LANGUAGE_ID, SKILL_LANGUAGE_ID, PromptsType } from '../../common/promptSyntax/promptTypes.js'; import { PromptsStorage } from '../../common/promptSyntax/service/promptsService.js'; import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js'; import { ChatConfiguration } from '../../common/constants.js'; @@ -36,6 +36,7 @@ import { IDialogService } from '../../../../../platform/dialogs/common/dialogs.j import { basename } from '../../../../../base/common/resources.js'; import { Schemas } from '../../../../../base/common/network.js'; import { isWindows, isMacintosh } from '../../../../../base/common/platform.js'; +import { ResourceContextKey } from '../../../../common/contextkeys.js'; //#region Editor Registration @@ -274,12 +275,25 @@ class AICustomizationManagementActionsContribution extends Disposable implements category: CHAT_CATEGORY, precondition: ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.has(`config.${ChatConfiguration.AICustomizationMenuEnabled}`)), f1: true, - menu: [{ - id: MenuId.GlobalActivity, - when: ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.has(`config.${ChatConfiguration.AICustomizationMenuEnabled}`)), - group: '2_configuration', - order: 4, - }], + menu: [ + { + id: MenuId.GlobalActivity, + when: ContextKeyExpr.and(ChatContextKeys.enabled, ContextKeyExpr.has(`config.${ChatConfiguration.AICustomizationMenuEnabled}`)), + group: '2_configuration', + order: 4, + }, + { + id: MenuId.EditorContent, + when: ContextKeyExpr.and( + ChatContextKeys.enabled, + ContextKeyExpr.or( + ContextKeyExpr.equals(ResourceContextKey.LangId.key, PROMPT_LANGUAGE_ID), + ContextKeyExpr.equals(ResourceContextKey.LangId.key, INSTRUCTIONS_LANGUAGE_ID), + ContextKeyExpr.equals(ResourceContextKey.LangId.key, AGENT_LANGUAGE_ID), + ContextKeyExpr.equals(ResourceContextKey.LangId.key, SKILL_LANGUAGE_ID), + ), + ), + }], }); } From f0257c5d41edab3f2a89d630bac8a38a51753120 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 20:25:31 +0100 Subject: [PATCH 33/51] debt - tweaks to experimental settings (#297065) --- src/vs/workbench/browser/workbench.contribution.ts | 2 +- src/vs/workbench/contrib/chat/browser/chat.contribution.ts | 7 +++++-- .../contrib/extensions/browser/extensions.contribution.ts | 2 +- src/vs/workbench/electron-browser/desktop.contribution.ts | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 08d679c5990c8..36923cbd8191f 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -359,7 +359,7 @@ const registry = Registry.as(ConfigurationExtensions.Con localize('useModal.all', "All editors open in a centered modal overlay."), ], 'description': localize('useModal', "Controls whether editors open in a modal overlay."), - 'default': product.quality !== 'stable' ? 'some' : 'off', + 'default': 'off', // TODO@bpasero figure out the default tags: ['experimental'], experiment: { mode: 'auto' diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 6c8637588e1e7..4b2a9047a51e2 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -214,8 +214,11 @@ configurationRegistry.registerConfiguration({ nls.localize('chat.agentsControl.clickBehavior.cycle', "Clicking chat icon cycles through: show chat, maximize chat, hide chat. This requires chat to be contained in the secondary sidebar."), ], markdownDescription: nls.localize('chat.agentsControl.clickBehavior', "Controls the behavior when clicking on the chat icon in the command center."), - default: product.quality !== 'stable' ? AgentsControlClickBehavior.Cycle : AgentsControlClickBehavior.Default, - tags: ['experimental'] + default: AgentsControlClickBehavior.Default, // TODO@bpasero figure out the default + tags: ['experimental'], + experiment: { + mode: 'auto' + } }, [ChatConfiguration.AgentStatusEnabled]: { type: 'boolean', diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 1d28ae56418f0..37e6e916e167c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -268,7 +268,7 @@ Registry.as(ConfigurationExtensions.Configuration) 'extensions.allowOpenInModalEditor': { type: 'boolean', description: localize('extensions.allowOpenInModalEditor', "Controls whether extensions and MCP servers open in a modal editor overlay."), - default: product.quality !== 'stable', // TODO@bpasero figure out the default for stable and retire this setting + default: false, // TODO@bpasero figure out the default for stable and retire this setting tags: ['experimental'], experiment: { mode: 'auto' diff --git a/src/vs/workbench/electron-browser/desktop.contribution.ts b/src/vs/workbench/electron-browser/desktop.contribution.ts index 5d1a61c840118..fd09050e5333c 100644 --- a/src/vs/workbench/electron-browser/desktop.contribution.ts +++ b/src/vs/workbench/electron-browser/desktop.contribution.ts @@ -277,7 +277,7 @@ import product from '../../platform/product/common/product.js'; localize(`window.menuStyle.native`, "Use the native menu. This is ignored when {0} is set to {1}.", '`#window.titleBarStyle#`', '`custom`'), localize(`window.menuStyle.inherit`, "Matches the menu style to the title bar style defined in {0}.", '`#window.titleBarStyle#`'), ], - 'default': product.quality !== 'stable' ? 'inherit' : (isMacintosh ? 'native' : 'inherit'), + 'default': product.quality !== 'stable' ? 'inherit' : (isMacintosh ? 'native' : 'inherit'), // TODO@bpasero figure out the default 'scope': ConfigurationScope.APPLICATION, 'markdownDescription': isMacintosh ? localize('window.menuStyle.mac', "Adjust the context menu appearances to either be native by the OS, custom, or inherited from the title bar style defined in {0}.", '`#window.titleBarStyle#`') : From ac609e0108a7f00ad402ec38d20522136183149b Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:25:53 +0000 Subject: [PATCH 34/51] Fix: aborted steering prompt incorrectly terminates agent response (#297020) * Initial plan * Fix: reset yieldRequested when aborted steering prompt is removed from queue Co-authored-by: connor4312 <2230985+connor4312@users.noreply.github.com> * Fix: propagate yieldRequested reset to extension host when steering prompt is aborted Co-authored-by: connor4312 <2230985+connor4312@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: connor4312 <2230985+connor4312@users.noreply.github.com> --- .../api/browser/mainThreadChatAgents2.ts | 4 ++-- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- .../workbench/api/common/extHostChatAgents2.ts | 4 ++-- .../chat/common/chatService/chatServiceImpl.ts | 16 ++++++++++++++-- .../chat/common/participants/chatAgents.ts | 12 ++++++------ .../test/common/chatService/chatService.test.ts | 2 +- .../chat/test/common/voiceChatService.test.ts | 4 ++-- 7 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadChatAgents2.ts b/src/vs/workbench/api/browser/mainThreadChatAgents2.ts index 994c8c8010ffc..a8089d43ed381 100644 --- a/src/vs/workbench/api/browser/mainThreadChatAgents2.ts +++ b/src/vs/workbench/api/browser/mainThreadChatAgents2.ts @@ -230,8 +230,8 @@ export class MainThreadChatAgents2 extends Disposable implements MainThreadChatA setRequestTools: (requestId, tools) => { this._proxy.$setRequestTools(requestId, tools); }, - setYieldRequested: (requestId) => { - this._proxy.$setYieldRequested(requestId); + setYieldRequested: (requestId, value) => { + this._proxy.$setYieldRequested(requestId, value); }, provideFollowups: async (request, result, history, token): Promise => { if (!this._agents.get(handle)?.hasFollowups) { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index bf2039fe59c1c..6770d6b49e26d 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1481,7 +1481,7 @@ export interface ExtHostChatAgentsShape2 { $detectChatParticipant(handle: number, request: Dto, context: { history: IChatAgentHistoryEntryDto[] }, options: { participants: IChatParticipantMetadata[]; location: ChatAgentLocation }, token: CancellationToken): Promise; $providePromptFiles(handle: number, type: PromptsType, context: IPromptFileContext, token: CancellationToken): Promise[] | undefined>; $setRequestTools(requestId: string, tools: UserSelectedTools): void; - $setYieldRequested(requestId: string): void; + $setYieldRequested(requestId: string, value: boolean): void; $acceptActiveChatSession(sessionResource: UriComponents | undefined): void; } export interface IChatParticipantMetadata { diff --git a/src/vs/workbench/api/common/extHostChatAgents2.ts b/src/vs/workbench/api/common/extHostChatAgents2.ts index 888128faa32fd..06553d2cb0fad 100644 --- a/src/vs/workbench/api/common/extHostChatAgents2.ts +++ b/src/vs/workbench/api/common/extHostChatAgents2.ts @@ -703,10 +703,10 @@ export class ExtHostChatAgents2 extends Disposable implements ExtHostChatAgentsS this._onDidChangeChatRequestTools.fire(request.extRequest); } - $setYieldRequested(requestId: string): void { + $setYieldRequested(requestId: string, value: boolean): void { const request = [...this._inFlightRequests].find(r => r.requestId === requestId); if (request) { - request.yieldRequested = true; + request.yieldRequested = value; } } diff --git a/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.ts b/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.ts index 08318697312a4..ce0b330603c88 100644 --- a/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.ts @@ -84,6 +84,10 @@ class CancellableRequest implements IDisposable { setYieldRequested(): void { this._yieldRequested.set(true, undefined); } + + resetYieldRequested(): void { + this._yieldRequested.set(false, undefined); + } } export class ChatService extends Disposable implements IChatService { @@ -1081,8 +1085,9 @@ export class ChatService extends Disposable implements IChatService { const pendingRequest = this._pendingRequests.get(sessionResource); if (pendingRequest) { store.add(autorun(reader => { - if (pendingRequest.yieldRequested.read(reader) && request) { - this.chatAgentService.setYieldRequested(agent.id, request.id); + const yieldRequested = pendingRequest.yieldRequested.read(reader); + if (request) { + this.chatAgentService.setYieldRequested(agent.id, request.id, yieldRequested); } })); pendingRequest.requestId ??= requestProps.requestId; @@ -1456,6 +1461,13 @@ export class ChatService extends Disposable implements IChatService { const model = this._sessionModels.get(sessionResource) as ChatModel | undefined; if (model) { model.removePendingRequest(requestId); + + // If there are no more steering requests pending, reset yieldRequested on the active request + const hasSteeringRequests = model.getPendingRequests().some(r => r.kind === ChatRequestQueueKind.Steering); + if (!hasSteeringRequests) { + const pendingRequest = this._pendingRequests.get(sessionResource); + pendingRequest?.resetYieldRequested(); + } } // Reject the deferred promise for the removed request diff --git a/src/vs/workbench/contrib/chat/common/participants/chatAgents.ts b/src/vs/workbench/contrib/chat/common/participants/chatAgents.ts index c3c760b5d6a64..a5dbf7f25c50e 100644 --- a/src/vs/workbench/contrib/chat/common/participants/chatAgents.ts +++ b/src/vs/workbench/contrib/chat/common/participants/chatAgents.ts @@ -87,7 +87,7 @@ export interface IChatWelcomeMessageContent { export interface IChatAgentImplementation { invoke(request: IChatAgentRequest, progress: (parts: IChatProgress[]) => void, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise; setRequestTools?(requestId: string, tools: UserSelectedTools): void; - setYieldRequested?(requestId: string): void; + setYieldRequested?(requestId: string, value: boolean): void; provideFollowups?(request: IChatAgentRequest, result: IChatAgentResult, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise; provideChatTitle?: (history: IChatAgentHistoryEntry[], token: CancellationToken) => Promise; provideChatSummary?: (history: IChatAgentHistoryEntry[], token: CancellationToken) => Promise; @@ -225,7 +225,7 @@ export interface IChatAgentService { hasChatParticipantDetectionProviders(): boolean; invokeAgent(agent: string, request: IChatAgentRequest, progress: (parts: IChatProgress[]) => void, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise; setRequestTools(agent: string, requestId: string, tools: UserSelectedTools): void; - setYieldRequested(agent: string, requestId: string): void; + setYieldRequested(agent: string, requestId: string, value: boolean): void; getFollowups(id: string, request: IChatAgentRequest, result: IChatAgentResult, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise; getChatTitle(id: string, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise; getChatSummary(id: string, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise; @@ -515,13 +515,13 @@ export class ChatAgentService extends Disposable implements IChatAgentService { data.impl.setRequestTools?.(requestId, tools); } - setYieldRequested(id: string, requestId: string): void { + setYieldRequested(id: string, requestId: string, value: boolean): void { const data = this._agents.get(id); if (!data?.impl) { return; } - data.impl.setYieldRequested?.(requestId); + data.impl.setYieldRequested?.(requestId, value); } async getFollowups(id: string, request: IChatAgentRequest, result: IChatAgentResult, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise { @@ -638,8 +638,8 @@ export class MergedChatAgent implements IChatAgent { this.impl.setRequestTools?.(requestId, tools); } - setYieldRequested(requestId: string): void { - this.impl.setYieldRequested?.(requestId); + setYieldRequested(requestId: string, value: boolean): void { + this.impl.setYieldRequested?.(requestId, value); } async provideFollowups(request: IChatAgentRequest, result: IChatAgentResult, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise { diff --git a/src/vs/workbench/contrib/chat/test/common/chatService/chatService.test.ts b/src/vs/workbench/contrib/chat/test/common/chatService/chatService.test.ts index ca738af3fb20c..982d7caf40902 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatService/chatService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatService/chatService.test.ts @@ -440,7 +440,7 @@ suite('ChatService', () => { await completeRequest.p; return {}; }, - setYieldRequested(requestId: string) { + setYieldRequested(requestId: string, value: boolean) { setYieldRequestedCalled = true; }, }; diff --git a/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts b/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts index ad9447d067237..fa3bc455cb15e 100644 --- a/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/voiceChatService.test.ts @@ -49,7 +49,7 @@ suite('VoiceChat', () => { } setRequestTools(requestId: string, tools: UserSelectedTools): void { } - setYieldRequested(requestId: string): void { + setYieldRequested(requestId: string, value: boolean): void { } invoke(request: IChatAgentRequest, progress: (part: IChatProgress[]) => void, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise { throw new Error('Method not implemented.'); } metadata = {}; @@ -72,7 +72,7 @@ suite('VoiceChat', () => { registerDynamicAgent(data: IChatAgentData, agentImpl: IChatAgentImplementation): IDisposable { throw new Error('Method not implemented.'); } invokeAgent(id: string, request: IChatAgentRequest, progress: (part: IChatProgress[]) => void, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise { throw new Error(); } setRequestTools(agent: string, requestId: string, tools: UserSelectedTools): void { } - setYieldRequested(agent: string, requestId: string): void { } + setYieldRequested(agent: string, requestId: string, value: boolean): void { } getFollowups(id: string, request: IChatAgentRequest, result: IChatAgentResult, history: IChatAgentHistoryEntry[], token: CancellationToken): Promise { throw new Error(); } getActivatedAgents(): IChatAgent[] { return agents; } getAgents(): IChatAgent[] { return agents; } From 3fd60590464d55cb67acce73d970b27f6b6fa19c Mon Sep 17 00:00:00 2001 From: Matt Bierner <12821956+mjbvz@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:26:21 -0800 Subject: [PATCH 35/51] Remove unused --- extensions/typescript-language-features/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/extension.ts b/extensions/typescript-language-features/src/extension.ts index 83492c95ad101..fb1ae1967d4bd 100644 --- a/extensions/typescript-language-features/src/extension.ts +++ b/extensions/typescript-language-features/src/extension.ts @@ -25,7 +25,7 @@ import { onCaseInsensitiveFileSystem } from './utils/fs.electron'; import { Lazy } from './utils/lazy'; import { getPackageInfo } from './utils/packageInfo'; import * as temp from './utils/temp.electron'; -import { conditionalRegistration, requireGlobalConfiguration, requireGlobalUnifiedConfig, requireHasVsCodeExtension } from './languageFeatures/util/dependentRegistration'; +import { conditionalRegistration, requireGlobalUnifiedConfig, requireHasVsCodeExtension } from './languageFeatures/util/dependentRegistration'; import { DisposableStore } from './utils/dispose'; export function activate( From eadc9a8ca60c2b665724ebc9999bb53546ef3f42 Mon Sep 17 00:00:00 2001 From: David Dossett <25163139+daviddossett@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:27:32 -0800 Subject: [PATCH 36/51] Fix chat input padding (#297067) Add padding to chat-editor-container --- .../workbench/contrib/chat/browser/widget/media/chat.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css index 357fff8866c53..c05582fd11e05 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +++ b/src/vs/workbench/contrib/chat/browser/widget/media/chat.css @@ -1263,6 +1263,10 @@ have to be updated for changes to the rules above, or to support more deeply nes border-color: var(--vscode-focusBorder); } +.chat-editor-container { + padding: 0 4px; +} + .chat-editor-container .monaco-editor .mtk1 { color: var(--vscode-input-foreground); } @@ -1294,10 +1298,6 @@ have to be updated for changes to the rules above, or to support more deeply nes padding-left: 4px; } -.interactive-session .chat-editor-container .monaco-editor .view-lines { - padding-left: 4px; -} - .interactive-session .chat-input-toolbars { display: flex; align-items: center; From 096c9b74c70e27e319d5760dbccc0fe239b9159f Mon Sep 17 00:00:00 2001 From: Justin Chen <54879025+justschen@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:54:36 -0800 Subject: [PATCH 37/51] simple terminal tools on surface level of chat (#296870) * simple terminal tools on surface level of chat * Set SimpleTerminalCollapsible default true for Insiders, false for Stable (#296911) * Initial plan * Set SimpleTerminalCollapsible default true for insiders, false for stable Co-authored-by: justschen <54879025+justschen@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: justschen <54879025+justschen@users.noreply.github.com> * make sure it is initialized the right way --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> --- .../contrib/chat/browser/chat.contribution.ts | 6 ++++++ .../chatTerminalToolProgressPart.ts | 15 +++++++++------ src/vs/workbench/contrib/chat/common/constants.ts | 1 + 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts index 4cbd83f4605b0..e27de51ed0cde 100644 --- a/src/vs/workbench/contrib/chat/browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/browser/chat.contribution.ts @@ -1129,6 +1129,12 @@ configurationRegistry.registerConfiguration({ markdownDescription: nls.localize('chat.agent.thinking.terminalTools', "When enabled, terminal tool calls are displayed inside the thinking dropdown with a simplified view."), tags: ['experimental'], }, + [ChatConfiguration.SimpleTerminalCollapsible]: { + type: 'boolean', + default: product.quality !== 'stable', + markdownDescription: nls.localize('chat.tools.terminal.simpleCollapsible', "When enabled, terminal tool calls are always displayed in a collapsible container with a simplified view."), + tags: ['experimental'], + }, 'chat.tools.usagesTool.enabled': { type: 'boolean', default: true, diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts index 1cc7ae425003e..f0b5c5e35162e 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts @@ -222,6 +222,7 @@ export class ChatTerminalToolProgressPart extends BaseChatToolInvocationSubPart private readonly _decoration: TerminalCommandDecoration; private _userToggledOutput: boolean = false; private _isInThinkingContainer: boolean = false; + private _usesCollapsibleWrapper: boolean = false; private _thinkingCollapsibleWrapper: ChatTerminalThinkingCollapsibleWrapper | undefined; private markdownPart: ChatMarkdownContentPart | undefined; @@ -360,12 +361,14 @@ export class ChatTerminalToolProgressPart extends BaseChatToolInvocationSubPart const progressPart = this._register(_instantiationService.createInstance(ChatProgressSubPart, elements.container, this.getIcon(), terminalData.autoApproveInfo)); this._decoration.update(); - // wrap terminal when thinking setting enabled + // Keep thinking-container semantics separate from wrapper semantics. const terminalToolsInThinking = this._configurationService.getValue(ChatConfiguration.TerminalToolsInThinking); + const isSimpleTerminal = this._configurationService.getValue(ChatConfiguration.SimpleTerminalCollapsible); const requiresConfirmation = toolInvocation.kind === 'toolInvocation' && IChatToolInvocation.getConfirmationMessages(toolInvocation); + this._isInThinkingContainer = terminalToolsInThinking && !requiresConfirmation; + this._usesCollapsibleWrapper = this._isInThinkingContainer || isSimpleTerminal; - if (terminalToolsInThinking && !requiresConfirmation) { - this._isInThinkingContainer = true; + if (this._usesCollapsibleWrapper) { this.domNode = this._createCollapsibleWrapper(progressPart.domNode, displayCommand, toolInvocation, context); } else { this.domNode = progressPart.domNode; @@ -520,8 +523,8 @@ export class ChatTerminalToolProgressPart extends BaseChatToolInvocationSubPart if (this._store.isDisposed) { return; } - // don't show dropdown when in thinking container - if (this._isInThinkingContainer) { + // don't show dropdown when rendered with the simplified/collapsible wrapper + if (this._usesCollapsibleWrapper) { return; } const resolvedCommand = command ?? this._getResolvedCommand(); @@ -624,7 +627,7 @@ export class ChatTerminalToolProgressPart extends BaseChatToolInvocationSubPart hasRealOutput, })); store.add(autoExpand.onDidRequestExpand(() => { - if (this._isInThinkingContainer) { + if (this._usesCollapsibleWrapper) { this.expandCollapsibleWrapper(); } this._toggleOutput(true); diff --git a/src/vs/workbench/contrib/chat/common/constants.ts b/src/vs/workbench/contrib/chat/common/constants.ts index a2a2336a9e82d..d896d8751878d 100644 --- a/src/vs/workbench/contrib/chat/common/constants.ts +++ b/src/vs/workbench/contrib/chat/common/constants.ts @@ -37,6 +37,7 @@ export enum ChatConfiguration { ThinkingStyle = 'chat.agent.thinkingStyle', ThinkingGenerateTitles = 'chat.agent.thinking.generateTitles', TerminalToolsInThinking = 'chat.agent.thinking.terminalTools', + SimpleTerminalCollapsible = 'chat.tools.terminal.simpleCollapsible', ThinkingPhrases = 'chat.agent.thinking.phrases', AutoExpandToolFailures = 'chat.tools.autoExpandFailures', TodosShowWidget = 'chat.tools.todos.showWidget', From e492669c52eba593835422bb7aa51b248f63d50c Mon Sep 17 00:00:00 2001 From: David Dossett <25163139+daviddossett@users.noreply.github.com> Date: Mon, 23 Feb 2026 12:02:39 -0800 Subject: [PATCH 38/51] Fix hidden `+` button in inline chat (#297072) Fix inline chat + button hidden in overflow menu --- .../chat/browser/actions/chatContextActions.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts index 8627fcad2f383..352a49a0e1c46 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.ts @@ -476,10 +476,7 @@ export class AttachContextAction extends Action2 { menu: [{ when: ContextKeyExpr.and( ChatContextKeys.inQuickChat.negate(), - ContextKeyExpr.or( - ChatContextKeys.location.isEqualTo(ChatAgentLocation.Chat), - ContextKeyExpr.and(ChatContextKeys.location.isEqualTo(ChatAgentLocation.EditorInline), CTX_INLINE_CHAT_V2_ENABLED) - ), + ChatContextKeys.location.isEqualTo(ChatAgentLocation.Chat), ContextKeyExpr.or( ChatContextKeys.lockedToCodingAgent.negate(), ChatContextKeys.agentSupportsAttachments @@ -488,6 +485,19 @@ export class AttachContextAction extends Action2 { id: MenuId.ChatInput, group: 'navigation', order: 101 + }, { + when: ContextKeyExpr.and( + ChatContextKeys.inQuickChat.negate(), + ChatContextKeys.location.isEqualTo(ChatAgentLocation.EditorInline), + CTX_INLINE_CHAT_V2_ENABLED, + ContextKeyExpr.or( + ChatContextKeys.lockedToCodingAgent.negate(), + ChatContextKeys.agentSupportsAttachments + ) + ), + id: MenuId.ChatInput, + group: 'navigation', + order: 2 }, { when: ContextKeyExpr.and( ChatContextKeys.inQuickChat, From d37a00c7864a61bc29f715dd6d93c113657c41c1 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:22:19 +0000 Subject: [PATCH 39/51] Fix: disposed ChatThinkingContentPart returned by getLastThinkingPart causing DisposableStore error (#296927) * Initial plan * fix: set isActive=false on ChatThinkingContentPart dispose to prevent DisposableStore error Co-authored-by: jrieken <1794099+jrieken@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jrieken <1794099+jrieken@users.noreply.github.com> --- .../chatThinkingContentPart.ts | 1 + .../chatThinkingContentPart.test.ts | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts index fdd6614bec78c..a27a48951c00d 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts @@ -1526,6 +1526,7 @@ ${this.hookCount > 0 ? `EXAMPLES WITH BLOCKED CONTENT (from hooks): } override dispose(): void { + this.isActive = false; if (this.markdownResult) { this.markdownResult.dispose(); this.markdownResult = undefined; diff --git a/src/vs/workbench/contrib/chat/test/browser/widget/chatContentParts/chatThinkingContentPart.test.ts b/src/vs/workbench/contrib/chat/test/browser/widget/chatContentParts/chatThinkingContentPart.test.ts index eeaac1a46c705..15aa7762d9f3e 100644 --- a/src/vs/workbench/contrib/chat/test/browser/widget/chatContentParts/chatThinkingContentPart.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/widget/chatContentParts/chatThinkingContentPart.test.ts @@ -983,6 +983,25 @@ suite('ChatThinkingContentPart', () => { assert.strictEqual(part.getIsActive(), false, 'Should be inactive after markAsInactive'); }); + test('dispose should set isActive to false', () => { + const content = createThinkingPart('**Active thinking**'); + const context = createMockRenderContext(false); + + const part = instantiationService.createInstance( + ChatThinkingContentPart, + content, + context, + mockMarkdownRenderer, + false + ); + + assert.strictEqual(part.getIsActive(), true, 'Should start as active'); + + part.dispose(); + + assert.strictEqual(part.getIsActive(), false, 'Should be inactive after dispose'); + }); + test('collapseContent should collapse the part', () => { const content = createThinkingPart('**Content**\nSome detailed reasoning that differs from the title'); const context = createMockRenderContext(false); From 9af784c8931956b30a41392fcc22270645b313e4 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 23 Feb 2026 12:32:01 -0800 Subject: [PATCH 40/51] plugins: add support for hooks Opted to do the parsing in the agent plugin service for these because they can be inlined into the manifest plugin.json --- .../chat/common/plugins/agentPluginService.ts | 6 +- .../common/plugins/agentPluginServiceImpl.ts | 135 +++++++++++++++--- .../service/promptsServiceImpl.ts | 23 ++- 3 files changed, 138 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.ts b/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.ts index c2101984e3bb0..2698d168c452c 100644 --- a/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.ts +++ b/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.ts @@ -10,12 +10,14 @@ import { URI } from '../../../../../base/common/uri.js'; import { SyncDescriptor0 } from '../../../../../platform/instantiation/common/descriptors.js'; import { createDecorator } from '../../../../../platform/instantiation/common/instantiation.js'; import { IMcpServerConfiguration } from '../../../../../platform/mcp/common/mcpPlatformTypes.js'; +import { HookType, IHookCommand } from '../promptSyntax/hookSchema.js'; export const IAgentPluginService = createDecorator('agentPluginService'); export interface IAgentPluginHook { - readonly event: string; - readonly command: string; + readonly type: HookType; + readonly hooks: readonly IHookCommand[]; + readonly originalId: string; } export interface IAgentPluginCommand { diff --git a/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts b/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts index e458d7cce607d..6b173f575df0a 100644 --- a/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts @@ -25,10 +25,59 @@ import { IMcpServerConfiguration, IMcpStdioServerConfiguration, McpServerType } import { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js'; import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js'; import { ChatConfiguration } from '../constants.js'; +import { parseCopilotHooks } from '../promptSyntax/hookCompatibility.js'; +import { parseClaudeHooks } from '../promptSyntax/hookClaudeCompat.js'; import { agentPluginDiscoveryRegistry, IAgentPlugin, IAgentPluginCommand, IAgentPluginDiscovery, IAgentPluginHook, IAgentPluginMcpServerDefinition, IAgentPluginService, IAgentPluginSkill } from './agentPluginService.js'; +import { cloneAndChange } from '../../../../../base/common/objects.js'; const COMMAND_FILE_SUFFIX = '.md'; +const enum AgentPluginFormat { + Copilot, + Claude, +} + +interface IAgentPluginFormatAdapter { + readonly format: AgentPluginFormat; + readonly manifestPaths: readonly string[]; + readonly hookConfigPaths: readonly string[]; + readonly hookWatchPaths: readonly string[]; + parseHooks(json: unknown, pluginUri: URI): IAgentPluginHook[]; +} + +function mapParsedHooks(parsed: Map): IAgentPluginHook[] { + return [...parsed.entries()].map(([type, { hooks, originalId }]) => ({ type, hooks, originalId })); +} + +const copilotPluginFormatAdapter: IAgentPluginFormatAdapter = { + format: AgentPluginFormat.Copilot, + manifestPaths: ['plugin.json'], + hookConfigPaths: ['hooks.json'], + hookWatchPaths: ['hooks.json'], + parseHooks: json => mapParsedHooks(parseCopilotHooks(json, undefined, '')), +}; + +const claudePluginFormatAdapter: IAgentPluginFormatAdapter = { + format: AgentPluginFormat.Claude, + manifestPaths: ['.claude-plugin/plugin.json'], + hookConfigPaths: ['hooks/hooks.json'], + hookWatchPaths: ['hooks'], + parseHooks: (json, pluginUri) => { + const replacer = (v: unknown): unknown => { + return typeof v === 'string' + ? v.replaceAll('${CLAUDE_PLUGIN_ROOT}', pluginUri.fsPath) + : undefined; + }; + + const { hooks, disabledAllHooks } = parseClaudeHooks(cloneAndChange(json, replacer), undefined, ''); + if (disabledAllHooks) { + return []; + } + + return mapParsedHooks(hooks); + }, +}; + export class AgentPluginService extends Disposable implements IAgentPluginService { declare readonly _serviceBrand: undefined; @@ -88,7 +137,7 @@ type PluginEntry = IAgentPlugin & { enabled: ISettableObservable }; export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgentPluginDiscovery { private readonly _pluginPathsConfig: IObservable>; - private readonly _pluginEntries = new Map(); + private readonly _pluginEntries = new Map(); private readonly _plugins = observableValue('discoveredAgentPlugins', []); public readonly plugins: IObservable = this._plugins; @@ -151,8 +200,9 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent const key = stat.resource.toString(); if (!seenPluginUris.has(key)) { + const adapter = await this._detectPluginFormatAdapter(stat.resource); seenPluginUris.add(key); - plugins.push(this._toPlugin(stat.resource, path, enabled)); + plugins.push(this._toPlugin(stat.resource, path, enabled, adapter)); } } } @@ -215,17 +265,41 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent ); } - private _toPlugin(uri: URI, configKey: string, initialEnabled: boolean): IAgentPlugin { + private async _detectPluginFormatAdapter(pluginUri: URI): Promise { + const isInClaudeDirectory = pluginUri.path.split('/').includes('.claude'); + if (isInClaudeDirectory || await this._pathExists(joinPath(pluginUri, '.claude-plugin', 'plugin.json'))) { + return claudePluginFormatAdapter; + } + + return copilotPluginFormatAdapter; + } + + private async _pathExists(resource: URI): Promise { + try { + await this._fileService.resolve(resource); + return true; + } catch { + return false; + } + } + + private _toPlugin(uri: URI, configKey: string, initialEnabled: boolean, adapter: IAgentPluginFormatAdapter): IAgentPlugin { const key = uri.toString(); const existing = this._pluginEntries.get(key); if (existing) { - existing.plugin.enabled.set(initialEnabled, undefined); - return existing.plugin; + if (existing.adapter.format !== adapter.format) { + existing.store.dispose(); + this._pluginEntries.delete(key); + } else { + existing.plugin.enabled.set(initialEnabled, undefined); + return existing.plugin; + } } const store = new DisposableStore(); const commands = observableValue('agentPluginCommands', []); const skills = observableValue('agentPluginSkills', []); + const hooks = observableValue('agentPluginHooks', []); const mcpServerDefinitions = observableValue('agentPluginMcpServerDefinitions', []); const enabled = observableValue('agentPluginEnabled', initialEnabled); @@ -238,8 +312,11 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent const skillsScheduler = store.add(new RunOnceScheduler(async () => { skills.set(await this._readSkills(uri), undefined); }, 200)); + const hooksScheduler = store.add(new RunOnceScheduler(async () => { + hooks.set(await this._readHooks(uri, adapter), undefined); + }, 200)); const mcpScheduler = store.add(new RunOnceScheduler(async () => { - mcpServerDefinitions.set(await this._readMcpDefinitions(uri), undefined); + mcpServerDefinitions.set(await this._readMcpDefinitions(uri, adapter), undefined); }, 200)); store.add(this._fileService.watch(uri, { recursive: true, excludes: [] })); @@ -250,14 +327,18 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent if (e.affects(skillsDir)) { skillsScheduler.schedule(); } - // MCP definitions come from .mcp.json, plugin.json, or .claude-plugin/plugin.json - if (e.affects(joinPath(uri, '.mcp.json')) || e.affects(joinPath(uri, 'plugin.json')) || e.affects(joinPath(uri, '.claude-plugin'))) { + if (adapter.hookWatchPaths.some(path => e.affects(joinPath(uri, path)))) { + hooksScheduler.schedule(); + } + if (e.affects(joinPath(uri, '.mcp.json')) || adapter.manifestPaths.some(path => e.affects(joinPath(uri, path)))) { mcpScheduler.schedule(); + hooksScheduler.schedule(); } })); commandsScheduler.schedule(); skillsScheduler.schedule(); + hooksScheduler.schedule(); mcpScheduler.schedule(); const plugin: PluginEntry = { @@ -266,24 +347,24 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent setEnabled: (value: boolean) => { this._updatePluginPathEnabled(configKey, value); }, - hooks: observableValue('agentPluginHooks', []), + hooks, commands, skills, mcpServerDefinitions, }; - this._pluginEntries.set(key, { store, plugin }); + this._pluginEntries.set(key, { store, plugin, adapter }); return plugin; } - private async _readMcpDefinitions(pluginUri: URI): Promise { + private async _readMcpDefinitions(pluginUri: URI, adapter: IAgentPluginFormatAdapter): Promise { const mcpUri = joinPath(pluginUri, '.mcp.json'); const mcpFileConfig = await this._readJsonFile(mcpUri); const fileDefinitions = this._parseMcpServerDefinitionMap(mcpFileConfig); - const pluginJsonDefinitions = await this._readInlinePluginJsonMcpDefinitions(pluginUri); + const pluginJsonDefinitions = await this._readInlinePluginJsonMcpDefinitions(pluginUri, adapter); const merged = new Map(); for (const definition of fileDefinitions) { @@ -302,13 +383,8 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent return definitions; } - private async _readInlinePluginJsonMcpDefinitions(pluginUri: URI): Promise { - const manifestPaths = [ - joinPath(pluginUri, 'plugin.json'), - joinPath(pluginUri, '.claude-plugin', 'plugin.json'), - ]; - - for (const manifestPath of manifestPaths) { + private async _readInlinePluginJsonMcpDefinitions(pluginUri: URI, adapter: IAgentPluginFormatAdapter): Promise { + for (const manifestPath of adapter.manifestPaths.map(path => joinPath(pluginUri, path))) { const manifest = await this._readJsonFile(manifestPath); if (!manifest || typeof manifest !== 'object') { continue; @@ -404,6 +480,27 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent return undefined; } + private async _readHooks(pluginUri: URI, adapter: IAgentPluginFormatAdapter): Promise { + for (const hooksUri of adapter.hookConfigPaths.map(path => joinPath(pluginUri, path))) { + const json = await this._readJsonFile(hooksUri); + if (json) { + return adapter.parseHooks(json, pluginUri); + } + } + + for (const manifestPath of adapter.manifestPaths.map(path => joinPath(pluginUri, path))) { + const manifest = await this._readJsonFile(manifestPath); + if (manifest && typeof manifest === 'object') { + const hooks = (manifest as Record)['hooks']; + if (hooks && typeof hooks === 'object') { + return adapter.parseHooks({ hooks }, pluginUri); + } + } + } + + return []; + } + private async _readJsonFile(uri: URI): Promise { try { const fileContents = await this._fileService.readFile(uri); diff --git a/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.ts b/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.ts index e2c34070d07f0..505d761a3c4ef 100644 --- a/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.ts @@ -143,6 +143,7 @@ export class PromptsService extends Disposable implements IPromptsService { private readonly _contributedWhenClauses = new Map(); private readonly _onDidContributedWhenChange = this._register(new Emitter()); private readonly _onDidPluginPromptFilesChange = this._register(new Emitter()); + private readonly _onDidPluginHooksChange = this._register(new Emitter()); private _pluginPromptFilesByType = new Map(); constructor( @@ -205,6 +206,7 @@ export class PromptsService extends Disposable implements IPromptsService { () => Event.any( this.getFileLocatorEvent(PromptsType.hook), Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration(PromptsConfig.USE_CHAT_HOOKS) || e.affectsConfiguration(PromptsConfig.USE_CLAUDE_HOOKS)), + this._onDidPluginHooksChange.event, ) )); @@ -220,6 +222,14 @@ export class PromptsService extends Disposable implements IPromptsService { PromptsType.skill, (plugin, reader) => plugin.skills.read(reader), )); + + this._register(autorun(reader => { + const plugins = this.agentPluginService.plugins.read(reader); + for (const plugin of plugins) { + plugin.hooks.read(reader); + } + this._onDidPluginHooksChange.fire(); + })); } private watchPluginPromptFilesForType( @@ -1082,11 +1092,6 @@ export class PromptsService extends Disposable implements IPromptsService { const useClaudeHooks = this.configurationService.getValue(PromptsConfig.USE_CLAUDE_HOOKS); const hookFiles = await this.listPromptFiles(PromptsType.hook, token); - if (hookFiles.length === 0) { - this.logger.trace('[PromptsService] No hook files found.'); - return undefined; - } - this.logger.trace(`[PromptsService] Found ${hookFiles.length} hook file(s).`); // Get user home for tilde expansion @@ -1147,6 +1152,14 @@ export class PromptsService extends Disposable implements IPromptsService { } } + // Collect hooks from agent plugins + const plugins = this.agentPluginService.plugins.get(); + for (const plugin of plugins) { + for (const hook of plugin.hooks.get()) { + collectedHooks[hook.type].push(...hook.hooks); + } + } + // Check if any hooks were collected const hasHooks = Object.values(collectedHooks).some(arr => arr.length > 0); if (!hasHooks) { From 0552a36fb47f596179f5606cba3af6d2f644f942 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 21:33:16 +0100 Subject: [PATCH 41/51] chat - hide outline on chat response except for HC themes (#297075) * chat - hide outline on chat response except for HC themes * ccr --- .../contrib/chat/browser/widget/chatListRenderer.ts | 4 +++- .../workbench/contrib/chat/browser/widget/media/chat.css | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.ts index af007671fe963..dbd3f45d2fdec 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.ts @@ -779,7 +779,9 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.monaco-list-row.focused.request { + .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused.request { outline: none !important; } @@ -3139,3 +3139,8 @@ have to be updated for changes to the rules above, or to support more deeply nes letter-spacing: 0.5px; color: var(--vscode-descriptionForeground); } + +/* Outline removal except for HC themes */ +.monaco-workbench:not(.hc-black):not(.hc-light) .interactive-list > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused.response { + outline: none !important; +} From c1cba6fbcc934fd9d94ff01cf5971f814acda6f2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 23 Feb 2026 21:43:27 +0100 Subject: [PATCH 42/51] Fix theming for sessions window (#297080) * Refactor titlebar colors to use sidebar theme variables * Add chat bar color variables and update titlebar styles * Rename chat bar color variables to reflect header usage and update references in titlebarPart * Rename chat bar header color variables to chat bar title colors and update references * Update chat bar title color variables to use sidebar theme colors * Add chat bar color variables and implement location-based color retrieval in ChatViewPane * Refactor chat bar title colors to use editor background and foreground instead of sidebar colors * Update chat bar title colors to use sidebar theme colors and remove unused color registrations * Remove unused location-based color retrieval from ChatViewPane * Refactor chat bar title colors to use sessions-specific header colors in SidebarPart and TitlebarPart * Remove unused session sidebar header color registrations from chatColors.ts * Add sessions sidebar background color and integrate into AgenticSessionsViewPane * Add sessions sidebar border color and update SidebarPart to use it * Update sessions sidebar border color to use contrastBorder for accessibility * Update sessions sidebar border color to use specific hex values for better visibility * Remove title bar border color from TitlebarPart to simplify styling --- src/vs/sessions/browser/parts/sidebarPart.ts | 15 ++++-- src/vs/sessions/browser/parts/titlebarPart.ts | 10 ++-- src/vs/sessions/common/theme.ts | 50 +++++++++++++++++++ .../sessions/browser/sessionsViewPane.ts | 15 +++++- 4 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 src/vs/sessions/common/theme.ts diff --git a/src/vs/sessions/browser/parts/sidebarPart.ts b/src/vs/sessions/browser/parts/sidebarPart.ts index f669616ce1780..5f8cce31cf807 100644 --- a/src/vs/sessions/browser/parts/sidebarPart.ts +++ b/src/vs/sessions/browser/parts/sidebarPart.ts @@ -12,8 +12,9 @@ import { IContextMenuService } from '../../../platform/contextview/browser/conte import { IKeybindingService } from '../../../platform/keybinding/common/keybinding.js'; import { IInstantiationService } from '../../../platform/instantiation/common/instantiation.js'; import { IThemeService } from '../../../platform/theme/common/themeService.js'; -import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_TITLE_BORDER, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND, SIDE_BAR_BORDER, SIDE_BAR_DRAG_AND_DROP_BACKGROUND, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_TOP_FOREGROUND, ACTIVITY_BAR_TOP_ACTIVE_BORDER, ACTIVITY_BAR_TOP_INACTIVE_FOREGROUND, ACTIVITY_BAR_TOP_DRAG_AND_DROP_BORDER } from '../../../workbench/common/theme.js'; +import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_TITLE_BORDER, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND, SIDE_BAR_DRAG_AND_DROP_BACKGROUND, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_TOP_FOREGROUND, ACTIVITY_BAR_TOP_ACTIVE_BORDER, ACTIVITY_BAR_TOP_INACTIVE_FOREGROUND, ACTIVITY_BAR_TOP_DRAG_AND_DROP_BORDER } from '../../../workbench/common/theme.js'; import { contrastBorder } from '../../../platform/theme/common/colorRegistry.js'; +import { sessionsSidebarBorder, sessionsSidebarHeaderBackground, sessionsSidebarHeaderForeground } from '../../common/theme.js'; import { INotificationService } from '../../../platform/notification/common/notification.js'; import { IContextKeyService } from '../../../platform/contextkey/common/contextkey.js'; import { AnchorAlignment } from '../../../base/browser/ui/contextview/contextview.js'; @@ -58,6 +59,7 @@ export class SidebarPart extends AbstractPaneCompositePart { private static readonly FOOTER_VERTICAL_PADDING = 6; private footerContainer: HTMLElement | undefined; + private sideBarTitleArea: HTMLElement | undefined; private footerToolbar: MenuWorkbenchToolBar | undefined; private previousLayoutDimensions: { width: number; height: number; top: number; left: number } | undefined; @@ -104,7 +106,7 @@ export class SidebarPart extends AbstractPaneCompositePart { ) { super( Parts.SIDEBAR_PART, - { hasTitle: true, trailingSeparator: false, borderWidth: () => (this.getColor(SIDE_BAR_BORDER) || this.getColor(contrastBorder)) ? 1 : 0 }, + { hasTitle: true, trailingSeparator: false, borderWidth: () => (this.getColor(sessionsSidebarBorder) || this.getColor(contrastBorder)) ? 1 : 0 }, SidebarPart.activeViewletSettingsKey, ActiveViewletContext.bindTo(contextKeyService), SidebarFocusContext.bindTo(contextKeyService), @@ -138,6 +140,7 @@ export class SidebarPart extends AbstractPaneCompositePart { protected override createTitleArea(parent: HTMLElement): HTMLElement | undefined { const titleArea = super.createTitleArea(parent); + this.sideBarTitleArea = titleArea; if (titleArea) { // Add a drag region so the sidebar title area can be used to move the window, @@ -219,10 +222,16 @@ export class SidebarPart extends AbstractPaneCompositePart { container.style.outlineColor = this.getColor(SIDE_BAR_DRAG_AND_DROP_BACKGROUND) ?? ''; // Right border to separate from the right section - const borderColor = this.getColor(SIDE_BAR_BORDER) || this.getColor(contrastBorder) || ''; + const borderColor = this.getColor(sessionsSidebarBorder) || this.getColor(contrastBorder) || ''; container.style.borderRightWidth = borderColor ? '1px' : ''; container.style.borderRightStyle = borderColor ? 'solid' : ''; container.style.borderRightColor = borderColor; + + // Title area uses sessions-specific header colors + if (this.sideBarTitleArea) { + this.sideBarTitleArea.style.backgroundColor = this.getColor(sessionsSidebarHeaderBackground) || ''; + this.sideBarTitleArea.style.color = this.getColor(sessionsSidebarHeaderForeground) || ''; + } } override layout(width: number, height: number, top: number, left: number): void { diff --git a/src/vs/sessions/browser/parts/titlebarPart.ts b/src/vs/sessions/browser/parts/titlebarPart.ts index 37716ece0bf74..8eab246ab644e 100644 --- a/src/vs/sessions/browser/parts/titlebarPart.ts +++ b/src/vs/sessions/browser/parts/titlebarPart.ts @@ -14,7 +14,8 @@ import { StandardMouseEvent } from '../../../base/browser/mouseEvent.js'; import { IConfigurationService } from '../../../platform/configuration/common/configuration.js'; import { DisposableStore } from '../../../base/common/lifecycle.js'; import { IThemeService } from '../../../platform/theme/common/themeService.js'; -import { TITLE_BAR_ACTIVE_BACKGROUND, TITLE_BAR_ACTIVE_FOREGROUND, TITLE_BAR_INACTIVE_FOREGROUND, TITLE_BAR_INACTIVE_BACKGROUND, TITLE_BAR_BORDER, WORKBENCH_BACKGROUND } from '../../../workbench/common/theme.js'; +import { WORKBENCH_BACKGROUND } from '../../../workbench/common/theme.js'; +import { chatBarTitleBackground, chatBarTitleForeground } from '../../common/theme.js'; import { isMacintosh, isWeb, isNative, platformLocale } from '../../../base/common/platform.js'; import { Color } from '../../../base/common/color.js'; import { EventType, EventHelper, Dimension, append, $, addDisposableListener, prepend, getWindow, getWindowId } from '../../../base/browser/dom.js'; @@ -227,7 +228,7 @@ export class TitlebarPart extends Part implements ITitlebarPart { if (this.element) { this.element.classList.toggle('inactive', this.isInactive); - const titleBackground = this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_BACKGROUND : TITLE_BAR_ACTIVE_BACKGROUND, (color, theme) => { + const titleBackground = this.getColor(chatBarTitleBackground, (color, theme) => { return color.isOpaque() ? color : color.makeOpaque(WORKBENCH_BACKGROUND(theme)); }) || ''; this.element.style.backgroundColor = titleBackground; @@ -238,11 +239,8 @@ export class TitlebarPart extends Part implements ITitlebarPart { this.element.classList.remove('light'); } - const titleForeground = this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_FOREGROUND : TITLE_BAR_ACTIVE_FOREGROUND); + const titleForeground = this.getColor(chatBarTitleForeground); this.element.style.color = titleForeground || ''; - - const titleBorder = this.getColor(TITLE_BAR_BORDER); - this.element.style.borderBottom = titleBorder ? `1px solid ${titleBorder}` : ''; } } diff --git a/src/vs/sessions/common/theme.ts b/src/vs/sessions/common/theme.ts new file mode 100644 index 0000000000000..4d17842818037 --- /dev/null +++ b/src/vs/sessions/common/theme.ts @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { localize } from '../../nls.js'; +import { registerColor } from '../../platform/theme/common/colorUtils.js'; +import { contrastBorder } from '../../platform/theme/common/colorRegistry.js'; +import { Color } from '../../base/common/color.js'; +import { SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from '../../workbench/common/theme.js'; + +// Sessions sidebar background color +export const sessionsSidebarBackground = registerColor( + 'sessionsSidebar.background', + SIDE_BAR_BACKGROUND, + localize('sessionsSidebar.background', 'Background color of the sidebar view in the agent sessions window.') +); + +// Sessions sidebar border color +export const sessionsSidebarBorder = registerColor( + 'sessionsSidebar.border', + { dark: Color.fromHex('#808080').transparent(0.35), light: Color.fromHex('#808080').transparent(0.35), hcDark: contrastBorder, hcLight: contrastBorder }, + localize('sessionsSidebar.border', 'Border color of the sidebar in the agent sessions window.') +); + +// Sessions sidebar header colors +export const sessionsSidebarHeaderBackground = registerColor( + 'sessionsSidebarHeader.background', + SIDE_BAR_BACKGROUND, + localize('sessionsSidebarHeader.background', 'Background color of the sidebar header area in the agent sessions window.') +); + +export const sessionsSidebarHeaderForeground = registerColor( + 'sessionsSidebarHeader.foreground', + SIDE_BAR_FOREGROUND, + localize('sessionsSidebarHeader.foreground', 'Foreground color of the sidebar header area in the agent sessions window.') +); + +// Chat bar title colors +export const chatBarTitleBackground = registerColor( + 'chatBarTitle.background', + SIDE_BAR_BACKGROUND, + localize('chatBarTitle.background', 'Background color of the chat bar title area in the agent sessions window.') +); + +export const chatBarTitleForeground = registerColor( + 'chatBarTitle.foreground', + SIDE_BAR_FOREGROUND, + localize('chatBarTitle.foreground', 'Foreground color of the chat bar title area in the agent sessions window.') +); diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts b/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts index 367ee4382c68a..97a81092388e0 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsViewPane.ts @@ -18,8 +18,9 @@ import { IInstantiationService, ServicesAccessor } from '../../../../platform/in import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js'; import { IOpenerService } from '../../../../platform/opener/common/opener.js'; import { IThemeService } from '../../../../platform/theme/common/themeService.js'; -import { IViewPaneOptions, ViewPane } from '../../../../workbench/browser/parts/views/viewPane.js'; +import { IViewPaneOptions, IViewPaneLocationColors, ViewPane } from '../../../../workbench/browser/parts/views/viewPane.js'; import { IViewDescriptorService, ViewContainerLocation } from '../../../../workbench/common/views.js'; +import { sessionsSidebarBackground } from '../../../common/theme.js'; import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; import { localize, localize2 } from '../../../../nls.js'; @@ -85,6 +86,18 @@ export class AgenticSessionsViewPane extends ViewPane { this.createControls(parent); } + protected override getLocationBasedColors(): IViewPaneLocationColors { + const colors = super.getLocationBasedColors(); + return { + ...colors, + background: sessionsSidebarBackground, + listOverrideStyles: { + ...colors.listOverrideStyles, + listBackground: sessionsSidebarBackground, + } + }; + } + private createControls(parent: HTMLElement): void { const sessionsContainer = DOM.append(parent, $('.agent-sessions-container')); From 36470b4122004baa3916856cdf4ecf090a5fb182 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 21:44:11 +0100 Subject: [PATCH 43/51] sessions - more predictable sessions sorting (#297083) fix - update `getAgentSessionTime` logic for timing --- .../contrib/chat/browser/agentSessions/agentSessions.ts | 2 +- .../browser/agentSessions/agentSessionsDataSource.test.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.ts b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.ts index 7fc854738a297..a8be72f98ff29 100644 --- a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.ts +++ b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.ts @@ -170,5 +170,5 @@ export const AGENT_SESSION_RENAME_ACTION_ID = 'agentSession.rename'; export const AGENT_SESSION_DELETE_ACTION_ID = 'agentSession.delete'; export function getAgentSessionTime(timing: IChatSessionTiming): number { - return timing.lastRequestEnded ?? timing.lastRequestStarted ?? timing.created; + return timing.lastRequestStarted ?? timing.created; } diff --git a/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts b/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts index 7936c84a83e5f..863ef9534237f 100644 --- a/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts @@ -20,16 +20,16 @@ suite('getAgentSessionTime', () => { ensureNoDisposablesAreLeakedInTestSuite(); - test('returns lastRequestEnded when available', () => { + test('returns lastRequestStarted when available', () => { const timing: IChatSessionTiming = { created: 1000, lastRequestStarted: 2000, lastRequestEnded: 3000, }; - assert.strictEqual(getAgentSessionTime(timing), 3000); + assert.strictEqual(getAgentSessionTime(timing), 2000); }); - test('returns lastRequestStarted when lastRequestEnded is undefined', () => { + test('returns lastRequestStarted even when lastRequestEnded is undefined', () => { const timing: IChatSessionTiming = { created: 1000, lastRequestStarted: 2000, @@ -38,7 +38,7 @@ suite('getAgentSessionTime', () => { assert.strictEqual(getAgentSessionTime(timing), 2000); }); - test('returns created when both lastRequestEnded and lastRequestStarted are undefined', () => { + test('returns created when lastRequestStarted is undefined', () => { const timing: IChatSessionTiming = { created: 1000, lastRequestStarted: undefined, From 6d85206e6448a1a4b783c637631732c4de0044f4 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 23 Feb 2026 12:54:26 -0800 Subject: [PATCH 44/51] comments --- .../common/plugins/agentPluginServiceImpl.ts | 15 ++-- .../service/promptsService.test.ts | 84 ++++++++++++++++++- 2 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts b/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts index 6b173f575df0a..5a9f9d4c0a818 100644 --- a/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts +++ b/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.ts @@ -24,6 +24,7 @@ import { ILogService } from '../../../../../platform/log/common/log.js'; import { IMcpServerConfiguration, IMcpStdioServerConfiguration, McpServerType } from '../../../../../platform/mcp/common/mcpPlatformTypes.js'; import { observableConfigValue } from '../../../../../platform/observable/common/platformObservableUtils.js'; import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js'; +import { IPathService } from '../../../../services/path/common/pathService.js'; import { ChatConfiguration } from '../constants.js'; import { parseCopilotHooks } from '../promptSyntax/hookCompatibility.js'; import { parseClaudeHooks } from '../promptSyntax/hookClaudeCompat.js'; @@ -42,7 +43,7 @@ interface IAgentPluginFormatAdapter { readonly manifestPaths: readonly string[]; readonly hookConfigPaths: readonly string[]; readonly hookWatchPaths: readonly string[]; - parseHooks(json: unknown, pluginUri: URI): IAgentPluginHook[]; + parseHooks(json: unknown, pluginUri: URI, userHome: string): IAgentPluginHook[]; } function mapParsedHooks(parsed: Map): IAgentPluginHook[] { @@ -54,7 +55,7 @@ const copilotPluginFormatAdapter: IAgentPluginFormatAdapter = { manifestPaths: ['plugin.json'], hookConfigPaths: ['hooks.json'], hookWatchPaths: ['hooks.json'], - parseHooks: json => mapParsedHooks(parseCopilotHooks(json, undefined, '')), + parseHooks: (json, pluginUri, userHome) => mapParsedHooks(parseCopilotHooks(json, pluginUri, userHome)), }; const claudePluginFormatAdapter: IAgentPluginFormatAdapter = { @@ -62,14 +63,14 @@ const claudePluginFormatAdapter: IAgentPluginFormatAdapter = { manifestPaths: ['.claude-plugin/plugin.json'], hookConfigPaths: ['hooks/hooks.json'], hookWatchPaths: ['hooks'], - parseHooks: (json, pluginUri) => { + parseHooks: (json, pluginUri, userHome) => { const replacer = (v: unknown): unknown => { return typeof v === 'string' ? v.replaceAll('${CLAUDE_PLUGIN_ROOT}', pluginUri.fsPath) : undefined; }; - const { hooks, disabledAllHooks } = parseClaudeHooks(cloneAndChange(json, replacer), undefined, ''); + const { hooks, disabledAllHooks } = parseClaudeHooks(cloneAndChange(json, replacer), pluginUri, userHome); if (disabledAllHooks) { return []; } @@ -148,6 +149,7 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent @IConfigurationService private readonly _configurationService: IConfigurationService, @IFileService private readonly _fileService: IFileService, @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, + @IPathService private readonly _pathService: IPathService, @ILogService private readonly _logService: ILogService, ) { super(); @@ -481,10 +483,11 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent } private async _readHooks(pluginUri: URI, adapter: IAgentPluginFormatAdapter): Promise { + const userHome = (await this._pathService.userHome()).fsPath; for (const hooksUri of adapter.hookConfigPaths.map(path => joinPath(pluginUri, path))) { const json = await this._readJsonFile(hooksUri); if (json) { - return adapter.parseHooks(json, pluginUri); + return adapter.parseHooks(json, pluginUri, userHome); } } @@ -493,7 +496,7 @@ export class ConfiguredAgentPluginDiscovery extends Disposable implements IAgent if (manifest && typeof manifest === 'object') { const hooks = (manifest as Record)['hooks']; if (hooks && typeof hooks === 'object') { - return adapter.parseHooks({ hooks }, pluginUri); + return adapter.parseHooks({ hooks }, pluginUri, userHome); } } } diff --git a/src/vs/workbench/contrib/chat/test/common/promptSyntax/service/promptsService.test.ts b/src/vs/workbench/contrib/chat/test/common/promptSyntax/service/promptsService.test.ts index 1efdafbe4de61..181505d2801d4 100644 --- a/src/vs/workbench/contrib/chat/test/common/promptSyntax/service/promptsService.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/promptSyntax/service/promptsService.test.ts @@ -10,7 +10,7 @@ import { Emitter, Event } from '../../../../../../../base/common/event.js'; import { match } from '../../../../../../../base/common/glob.js'; import { ResourceSet } from '../../../../../../../base/common/map.js'; import { Schemas } from '../../../../../../../base/common/network.js'; -import { observableValue } from '../../../../../../../base/common/observable.js'; +import { ISettableObservable, observableValue } from '../../../../../../../base/common/observable.js'; import { relativePath } from '../../../../../../../base/common/resources.js'; import { URI } from '../../../../../../../base/common/uri.js'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../../../base/test/common/utils.js'; @@ -53,7 +53,7 @@ import { ChatModeKind } from '../../../../common/constants.js'; import { HookType } from '../../../../common/promptSyntax/hookSchema.js'; import { IContextKeyService, IContextKeyChangeEvent } from '../../../../../../../platform/contextkey/common/contextkey.js'; import { MockContextKeyService } from '../../../../../../../platform/keybinding/test/common/mockKeybindingService.js'; -import { IAgentPluginService } from '../../../../common/plugins/agentPluginService.js'; +import { IAgentPlugin, IAgentPluginCommand, IAgentPluginHook, IAgentPluginMcpServerDefinition, IAgentPluginService, IAgentPluginSkill } from '../../../../common/plugins/agentPluginService.js'; suite('PromptsService', () => { const disposables = ensureNoDisposablesAreLeakedInTestSuite(); @@ -63,6 +63,8 @@ suite('PromptsService', () => { let workspaceContextService: TestContextService; let testConfigService: TestConfigurationService; let fileService: IFileService; + let testPluginsObservable: ISettableObservable; + let testAllPluginsObservable: ISettableObservable; setup(async () => { instaService = disposables.add(new TestInstantiationService()); @@ -164,9 +166,12 @@ suite('PromptsService', () => { instaService.stub(IContextKeyService, new MockContextKeyService()); + testPluginsObservable = observableValue('testPlugins', []); + testAllPluginsObservable = observableValue('testAllPlugins', []); + instaService.stub(IAgentPluginService, { - plugins: observableValue('testPlugins', []), - allPlugins: observableValue('testAllPlugins', []), + plugins: testPluginsObservable, + allPlugins: testAllPluginsObservable, setPluginEnabled: () => { }, }); @@ -3434,6 +3439,27 @@ suite('PromptsService', () => { }); suite('hooks', () => { + const createTestPlugin = (path: string, initialHooks: readonly IAgentPluginHook[]): { plugin: IAgentPlugin; hooks: ISettableObservable } => { + const enabled = observableValue('testPluginEnabled', true); + const hooks = observableValue('testPluginHooks', initialHooks); + const commands = observableValue('testPluginCommands', []); + const skills = observableValue('testPluginSkills', []); + const mcpServerDefinitions = observableValue('testPluginMcpServerDefinitions', []); + + return { + plugin: { + uri: URI.file(path), + enabled, + setEnabled: () => { }, + hooks, + commands, + skills, + mcpServerDefinitions, + }, + hooks, + }; + }; + test('multi-root workspace resolves cwd to per-hook-file workspace folder', async function () { const folder1Uri = URI.file('/workspace-a'); const folder2Uri = URI.file('/workspace-b'); @@ -3484,5 +3510,55 @@ suite('PromptsService', () => { assert.strictEqual(hookA.cwd?.path, folder1Uri.path, 'Hook from folder-a should have cwd pointing to workspace-a'); assert.strictEqual(hookB.cwd?.path, folder2Uri.path, 'Hook from folder-b should have cwd pointing to workspace-b'); }); + + test('includes hooks from agent plugins', async function () { + testConfigService.setUserConfiguration(PromptsConfig.USE_CHAT_HOOKS, true); + testConfigService.setUserConfiguration(PromptsConfig.HOOKS_LOCATION_KEY, {}); + + const { plugin } = createTestPlugin('/plugins/test-plugin', [{ + type: HookType.PreToolUse, + originalId: 'plugin-pre-tool-use', + hooks: [{ type: 'command', command: 'echo from-plugin' }], + }]); + + testPluginsObservable.set([plugin], undefined); + testAllPluginsObservable.set([plugin], undefined); + + const result = await service.getHooks(CancellationToken.None); + assert.ok(result, 'Expected hooks result'); + + assert.deepStrictEqual(result.hooks[HookType.PreToolUse], [{ + type: 'command', + command: 'echo from-plugin', + }], 'Expected plugin hooks to be included in computed hooks'); + }); + + test('recomputes hooks when agent plugin hooks change', async function () { + testConfigService.setUserConfiguration(PromptsConfig.USE_CHAT_HOOKS, true); + testConfigService.setUserConfiguration(PromptsConfig.HOOKS_LOCATION_KEY, {}); + + const { plugin, hooks } = createTestPlugin('/plugins/test-plugin', [{ + type: HookType.PreToolUse, + originalId: 'plugin-pre-tool-use', + hooks: [{ type: 'command', command: 'echo before' }], + }]); + + testPluginsObservable.set([plugin], undefined); + testAllPluginsObservable.set([plugin], undefined); + + const before = await service.getHooks(CancellationToken.None); + assert.ok(before, 'Expected hooks result before plugin update'); + assert.deepStrictEqual(before.hooks[HookType.PreToolUse], [{ type: 'command', command: 'echo before' }]); + + hooks.set([{ + type: HookType.PreToolUse, + originalId: 'plugin-pre-tool-use', + hooks: [{ type: 'command', command: 'echo after' }], + }], undefined); + + const after = await service.getHooks(CancellationToken.None); + assert.ok(after, 'Expected hooks result after plugin update'); + assert.deepStrictEqual(after.hooks[HookType.PreToolUse], [{ type: 'command', command: 'echo after' }]); + }); }); }); From afa003573a339d1c17849dfdcd9ad3fdef067685 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 23 Feb 2026 15:03:09 -0600 Subject: [PATCH 45/51] only show tips if a user is signed in (#297089) fix #297041 --- .../contrib/chat/browser/chatTipService.ts | 13 +++++++++---- .../chat/test/browser/chatTipService.test.ts | 15 +++++++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatTipService.ts b/src/vs/workbench/contrib/chat/browser/chatTipService.ts index 0584204fdb876..b54e9a38d7349 100644 --- a/src/vs/workbench/contrib/chat/browser/chatTipService.ts +++ b/src/vs/workbench/contrib/chat/browser/chatTipService.ts @@ -23,7 +23,7 @@ import { ILanguageModelToolsService } from '../common/tools/languageModelToolsSe import { localChatSessionType } from '../common/chatSessionsService.js'; import { IChatService } from '../common/chatService/chatService.js'; import { CreateSlashCommandsUsageTracker } from './createSlashCommandsUsageTracker.js'; -import { IChatEntitlementService } from '../../../services/chat/common/chatEntitlementService.js'; +import { ChatEntitlement, IChatEntitlementService } from '../../../services/chat/common/chatEntitlementService.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; type ChatTipEvent = { @@ -646,15 +646,15 @@ export class ChatTipService extends Disposable implements IChatTipService { @IChatService private readonly _chatService: IChatService, @IInstantiationService instantiationService: IInstantiationService, @ILogService private readonly _logService: ILogService, - @IChatEntitlementService chatEntitlementService: IChatEntitlementService, + @IChatEntitlementService private readonly _chatEntitlementService: IChatEntitlementService, @ICommandService private readonly _commandService: ICommandService, @ITelemetryService private readonly _telemetryService: ITelemetryService, ) { super(); this._tracker = this._register(instantiationService.createInstance(TipEligibilityTracker, TIP_CATALOG)); this._createSlashCommandsUsageTracker = this._register(new CreateSlashCommandsUsageTracker(this._chatService, this._storageService, () => this._contextKeyService)); - this._register(chatEntitlementService.onDidChangeQuotaExceeded(() => { - if (chatEntitlementService.quotas.chat?.percentRemaining === 0 && this._shownTip) { + this._register(this._chatEntitlementService.onDidChangeQuotaExceeded(() => { + if (this._chatEntitlementService.quotas.chat?.percentRemaining === 0 && this._shownTip) { this.hideTip(); } })); @@ -782,6 +782,11 @@ export class ChatTipService extends Disposable implements IChatTipService { return undefined; } + // Tips are only relevant after sign-in has completed. + if (this._chatEntitlementService.entitlement === ChatEntitlement.Unknown) { + return undefined; + } + // Only show tips in the main chat panel, not in terminal/editor inline chat if (!this._isChatLocation(contextKeyService)) { return undefined; diff --git a/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts b/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts index 6f8a3d8e9a59b..53b8a2e5d2ad2 100644 --- a/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/chatTipService.test.ts @@ -23,7 +23,7 @@ import { ChatAgentLocation, ChatConfiguration, ChatModeKind } from '../../common import { PromptsType } from '../../common/promptSyntax/promptTypes.js'; import { ILanguageModelToolsService } from '../../common/tools/languageModelToolsService.js'; import { MockLanguageModelToolsService } from '../common/tools/mockLanguageModelToolsService.js'; -import { IChatEntitlementService } from '../../../../services/chat/common/chatEntitlementService.js'; +import { ChatEntitlement, IChatEntitlementService } from '../../../../services/chat/common/chatEntitlementService.js'; import { TestChatEntitlementService } from '../../../../test/common/workbenchTestServices.js'; import { IChatService } from '../../common/chatService/chatService.js'; import { MockChatService } from '../common/chatService/mockChatService.js'; @@ -64,6 +64,7 @@ suite('ChatTipService', () => { let storageService: InMemoryStorageService; let mockInstructionFiles: IResolvedAgentFile[]; let mockPromptInstructionFiles: IPromptPath[]; + let chatEntitlementService: TestChatEntitlementService; function createProductService(hasCopilot: boolean): IProductService { return { @@ -100,7 +101,9 @@ suite('ChatTipService', () => { onDidChangeCustomAgents: Event.None, } as Partial as IPromptsService); instantiationService.stub(ILanguageModelToolsService, testDisposables.add(new MockLanguageModelToolsService())); - instantiationService.stub(IChatEntitlementService, new TestChatEntitlementService()); + chatEntitlementService = new TestChatEntitlementService(); + chatEntitlementService.entitlement = ChatEntitlement.Available; + instantiationService.stub(IChatEntitlementService, chatEntitlementService); instantiationService.stub(IChatService, new MockChatService()); instantiationService.stub(ITelemetryService, NullTelemetryService); }); @@ -200,6 +203,14 @@ suite('ChatTipService', () => { assert.strictEqual(tip, undefined, 'Should not return a tip when Copilot is not enabled'); }); + test('returns undefined when user is signed out', () => { + chatEntitlementService.entitlement = ChatEntitlement.Unknown; + const service = createService(); + + const tip = service.getWelcomeTip(contextKeyService); + assert.strictEqual(tip, undefined, 'Should not return a tip when the user is signed out'); + }); + test('returns undefined when tips setting is disabled', () => { const service = createService(/* hasCopilot */ true, /* tipsEnabled */ false); From 38520185b561f02da0e3998931f00fee63edd64f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 23 Feb 2026 22:04:07 +0100 Subject: [PATCH 46/51] sessions - clear active session when archiving (#297094) --- .../sessions/browser/sessionsManagementService.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts b/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts index 6aacdfccc6ce6..6def3ddd0d881 100644 --- a/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts +++ b/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.ts @@ -143,6 +143,16 @@ export class SessionsManagementService extends Disposable implements ISessionsMa // Update active session when the agent sessions model changes (e.g., metadata updates with worktree/repository info) this._register(this.agentSessionsService.model.onDidChangeSessions(() => this.refreshActiveSessionFromModel())); + + // Clear active session if the active session gets archived + this._register(this.agentSessionsService.model.onDidChangeSessionArchivedState(e => { + if (e.isArchived()) { + const currentActive = this._activeSession.get(); + if (currentActive && currentActive.resource.toString() === e.resource.toString()) { + this.openNewSessionView(); + } + } + })); } private refreshActiveSessionFromModel(): void { From 5c4204e60dbbc0bf4bc1e3733042890d83c251d0 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 23 Feb 2026 20:45:02 +0100 Subject: [PATCH 47/51] updates component explorer --- .github/workflows/screenshot-test.yml | 2 + .vscode/launch.json | 9 +- .vscode/mcp.json | 20 +- .vscode/tasks.json | 7 + .../componentFixtures/aiStats.fixture.ts | 4 +- .../componentFixtures/baseUI.fixture.ts | 32 +-- .../componentFixtures/codeEditor.fixture.ts | 4 +- .../browser/componentFixtures/fixtureUtils.ts | 12 +- .../inlineCompletions.fixture.ts | 4 +- .../promptFilePickers.fixture.ts | 53 ++++- .../component-explorer-config.schema.json | 183 ++++++++++++++++++ .../componentFixtures/component-explorer.json | 4 + 12 files changed, 282 insertions(+), 52 deletions(-) create mode 100644 test/componentFixtures/component-explorer-config.schema.json diff --git a/.github/workflows/screenshot-test.yml b/.github/workflows/screenshot-test.yml index d6f7edb1cbe88..73e5a3864ba81 100644 --- a/.github/workflows/screenshot-test.yml +++ b/.github/workflows/screenshot-test.yml @@ -24,6 +24,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + lfs: true - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.vscode/launch.json b/.vscode/launch.json index 74dfd6a3da637..d116d2c003389 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -604,12 +604,13 @@ }, { "name": "Component Explorer", - "type": "chrome", + "type": "msedge", + "port": 9230, "request": "launch", - "url": "http://localhost:5199/___explorer", - "preLaunchTask": "Launch Monaco Editor Vite", + "url": "http://localhost:5337/___explorer", + "preLaunchTask": "Launch Component Explorer", "presentation": { - "group": "monaco", + "group": "1_component_explorer", "order": 4 } }, diff --git a/.vscode/mcp.json b/.vscode/mcp.json index 08be33e519612..713ca79a4afec 100644 --- a/.vscode/mcp.json +++ b/.vscode/mcp.json @@ -3,9 +3,25 @@ "vscode-automation-mcp": { "type": "stdio", "command": "npm", - // Look at the [README](../test/mcp/README.md) to see what arguments are supported - "args": ["run", "start-stdio"], + "args": [ + "run", + "start-stdio" + ], "cwd": "${workspaceFolder}/test/mcp" + }, + "component-explorer": { + "type": "stdio", + "command": "npx", + "cwd": "${workspaceFolder}", + "args": [ + "component-explorer", + "mcp", + "-c", + "./test/componentFixtures/component-explorer.json", + "--no-daemon-autostart", + "--no-daemon-hint", + "Start the daemon by running the 'Launch Component Explorer' VS Code task (use the run_task tool). When you start the task, try up to 4 times to give the daemon enough time to start." + ] } }, "inputs": [] diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 03fe5fb263fc0..40a4b1784f48f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -357,6 +357,13 @@ "problemMatcher": [ "$tsc" ] + }, + { + "label": "Launch Component Explorer", + "type": "shell", + "command": "npx component-explorer serve -c ./test/componentFixtures/component-explorer.json", + "isBackground": true, + "problemMatcher": [] } ] } diff --git a/src/vs/workbench/test/browser/componentFixtures/aiStats.fixture.ts b/src/vs/workbench/test/browser/componentFixtures/aiStats.fixture.ts index 7df2b70d7d598..001d6010501d6 100644 --- a/src/vs/workbench/test/browser/componentFixtures/aiStats.fixture.ts +++ b/src/vs/workbench/test/browser/componentFixtures/aiStats.fixture.ts @@ -72,7 +72,7 @@ interface RenderAiStatsOptions extends ComponentFixtureContext { data: IAiStatsHoverData; } -function renderAiStatsHover({ container, disposableStore, data }: RenderAiStatsOptions): HTMLElement { +function renderAiStatsHover({ container, disposableStore, data }: RenderAiStatsOptions): void { container.style.width = '320px'; container.style.padding = '8px'; container.style.backgroundColor = 'var(--vscode-editorHoverWidget-background)'; @@ -87,6 +87,4 @@ function renderAiStatsHover({ container, disposableStore, data }: RenderAiStatsO const elem = hover.keepUpdated(disposableStore).element; container.appendChild(elem); - - return container; } diff --git a/src/vs/workbench/test/browser/componentFixtures/baseUI.fixture.ts b/src/vs/workbench/test/browser/componentFixtures/baseUI.fixture.ts index 19579a21ab1a7..0c8ab56d71f6c 100644 --- a/src/vs/workbench/test/browser/componentFixtures/baseUI.fixture.ts +++ b/src/vs/workbench/test/browser/componentFixtures/baseUI.fixture.ts @@ -113,7 +113,7 @@ const themedProgressBarOptions = { // Buttons // ============================================================================ -function renderButtons({ container, disposableStore }: ComponentFixtureContext): HTMLElement { +function renderButtons({ container, disposableStore }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.flexDirection = 'column'; @@ -162,11 +162,9 @@ function renderButtons({ container, disposableStore }: ComponentFixtureContext): const disabledSecondary = disposableStore.add(new Button(disabledSection, { ...themedButtonStyles, secondary: true, title: 'Disabled Secondary', disabled: true })); disabledSecondary.label = 'Disabled Secondary'; disabledSecondary.enabled = false; - - return container; } -function renderButtonBar({ container, disposableStore }: ComponentFixtureContext): HTMLElement { +function renderButtonBar({ container, disposableStore }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.flexDirection = 'column'; @@ -193,8 +191,6 @@ function renderButtonBar({ container, disposableStore }: ComponentFixtureContext const buttonWithDesc = disposableStore.add(new ButtonWithDescription(descContainer, { ...themedButtonStyles, title: 'Install Extension', supportIcons: true })); buttonWithDesc.label = '$(extensions) Install Extension'; buttonWithDesc.description = 'This will install the extension and enable it globally'; - - return container; } @@ -202,7 +198,7 @@ function renderButtonBar({ container, disposableStore }: ComponentFixtureContext // Toggles and Checkboxes // ============================================================================ -function renderToggles({ container, disposableStore }: ComponentFixtureContext): HTMLElement { +function renderToggles({ container, disposableStore }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.flexDirection = 'column'; @@ -266,8 +262,6 @@ function renderToggles({ container, disposableStore }: ComponentFixtureContext): checkboxSection.appendChild(createCheckboxRow('Enable auto-save', true)); checkboxSection.appendChild(createCheckboxRow('Show line numbers', true)); checkboxSection.appendChild(createCheckboxRow('Word wrap', false)); - - return container; } @@ -275,7 +269,7 @@ function renderToggles({ container, disposableStore }: ComponentFixtureContext): // Input Boxes // ============================================================================ -function renderInputBoxes({ container, disposableStore }: ComponentFixtureContext): HTMLElement { +function renderInputBoxes({ container, disposableStore }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.flexDirection = 'column'; @@ -321,8 +315,6 @@ function renderInputBoxes({ container, disposableStore }: ComponentFixtureContex })); errorInput.value = 'invalid-email'; errorInput.validate(); - - return container; } @@ -330,7 +322,7 @@ function renderInputBoxes({ container, disposableStore }: ComponentFixtureContex // Count Badges // ============================================================================ -function renderCountBadges({ container }: ComponentFixtureContext): HTMLElement { +function renderCountBadges({ container }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.gap = '12px'; @@ -353,8 +345,6 @@ function renderCountBadges({ container }: ComponentFixtureContext): HTMLElement new CountBadge(badgeContainer, { count }, themedBadgeStyles); container.appendChild(badgeContainer); } - - return container; } @@ -362,7 +352,7 @@ function renderCountBadges({ container }: ComponentFixtureContext): HTMLElement // Action Bar // ============================================================================ -function renderActionBar({ container, disposableStore }: ComponentFixtureContext): HTMLElement { +function renderActionBar({ container, disposableStore }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.flexDirection = 'column'; @@ -410,8 +400,6 @@ function renderActionBar({ container, disposableStore }: ComponentFixtureContext new Action('action.disabled', 'Disabled', ThemeIcon.asClassName(Codicon.debugPause), false, async () => { }), new Action('action.enabled2', 'Enabled', ThemeIcon.asClassName(Codicon.debugStop), true, async () => { }), ]); - - return container; } @@ -419,7 +407,7 @@ function renderActionBar({ container, disposableStore }: ComponentFixtureContext // Progress Bar // ============================================================================ -function renderProgressBars({ container, disposableStore }: ComponentFixtureContext): HTMLElement { +function renderProgressBars({ container, disposableStore }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.flexDirection = 'column'; @@ -470,8 +458,6 @@ function renderProgressBars({ container, disposableStore }: ComponentFixtureCont const doneBar = disposableStore.add(new ProgressBar(doneSection, themedProgressBarOptions)); doneBar.total(100); doneBar.worked(100); - - return container; } @@ -479,7 +465,7 @@ function renderProgressBars({ container, disposableStore }: ComponentFixtureCont // Highlighted Label // ============================================================================ -function renderHighlightedLabels({ container }: ComponentFixtureContext): HTMLElement { +function renderHighlightedLabels({ container }: ComponentFixtureContext): void { container.style.padding = '16px'; container.style.display = 'flex'; container.style.flexDirection = 'column'; @@ -511,6 +497,4 @@ function renderHighlightedLabels({ container }: ComponentFixtureContext): HTMLEl container.appendChild(createHighlightedLabel('inlineCompletionsController.ts', [{ start: 6, end: 10 }])); // "Comp" container.appendChild(createHighlightedLabel('diffEditorViewModel.ts', [{ start: 0, end: 4 }, { start: 10, end: 14 }])); // "diff" and "View" container.appendChild(createHighlightedLabel('workbenchTestServices.ts', [{ start: 9, end: 13 }])); // "Test" - - return container; } diff --git a/src/vs/workbench/test/browser/componentFixtures/codeEditor.fixture.ts b/src/vs/workbench/test/browser/componentFixtures/codeEditor.fixture.ts index af7ff83463719..c752df7da146c 100644 --- a/src/vs/workbench/test/browser/componentFixtures/codeEditor.fixture.ts +++ b/src/vs/workbench/test/browser/componentFixtures/codeEditor.fixture.ts @@ -31,7 +31,7 @@ console.log(greet('World')); console.log(\`Count: \${counter.count}\`); `; -function renderCodeEditor({ container, disposableStore, theme }: ComponentFixtureContext): HTMLElement { +function renderCodeEditor({ container, disposableStore, theme }: ComponentFixtureContext): void { container.style.width = '600px'; container.style.height = '400px'; container.style.border = '1px solid var(--vscode-editorWidget-border)'; @@ -66,8 +66,6 @@ function renderCodeEditor({ container, disposableStore, theme }: ComponentFixtur )); editor.setModel(model); - - return container; } export default defineThemedFixtureGroup({ diff --git a/src/vs/workbench/test/browser/componentFixtures/fixtureUtils.ts b/src/vs/workbench/test/browser/componentFixtures/fixtureUtils.ts index 0aa4580051806..62bbbcb65d737 100644 --- a/src/vs/workbench/test/browser/componentFixtures/fixtureUtils.ts +++ b/src/vs/workbench/test/browser/componentFixtures/fixtureUtils.ts @@ -95,6 +95,7 @@ import '../../../../platform/theme/common/colors/editorColors.js'; import '../../../../platform/theme/common/colors/listColors.js'; import '../../../../platform/theme/common/colors/miscColors.js'; import '../../../common/theme.js'; +import { isThenable } from '../../../../base/common/async.js'; /** * A storage service that never stores anything and always returns the default/fallback value. @@ -478,7 +479,7 @@ export interface ComponentFixtureContext { } export interface ComponentFixtureOptions { - render: (context: ComponentFixtureContext) => HTMLElement | Promise; + render: (context: ComponentFixtureContext) => void | Promise; } type ThemedFixtures = ReturnType; @@ -486,6 +487,10 @@ type ThemedFixtures = ReturnType; /** * Creates Dark and Light fixture variants from a single render function. * The render function receives a context with container and disposableStore. + * + * Note: If render returns a Promise, the async work will run in background. + * Component-explorer waits 2 animation frames after sync render returns, + * which should be sufficient for most async setup, but timing is not guaranteed. */ export function defineComponentFixture(options: ComponentFixtureOptions): ThemedFixtures { const createFixture = (theme: typeof darkTheme | typeof lightTheme) => defineFixture({ @@ -496,8 +501,9 @@ export function defineComponentFixture(options: ComponentFixtureOptions): Themed render: (container: HTMLElement) => { const disposableStore = new DisposableStore(); setupTheme(container, theme); - options.render({ container, disposableStore, theme }); - return disposableStore; + // Start render (may be async) - component-explorer will wait 2 rAF after this returns + const result = options.render({ container, disposableStore, theme }); + return isThenable(result) ? result.then(() => disposableStore) : disposableStore; }, }); diff --git a/src/vs/workbench/test/browser/componentFixtures/inlineCompletions.fixture.ts b/src/vs/workbench/test/browser/componentFixtures/inlineCompletions.fixture.ts index 3f30440013af6..8d4fe0ae30655 100644 --- a/src/vs/workbench/test/browser/componentFixtures/inlineCompletions.fixture.ts +++ b/src/vs/workbench/test/browser/componentFixtures/inlineCompletions.fixture.ts @@ -33,7 +33,7 @@ interface InlineEditOptions extends ComponentFixtureContext { editorOptions?: IEditorOptions; } -function renderInlineEdit(options: InlineEditOptions): HTMLElement { +function renderInlineEdit(options: InlineEditOptions): void { const { container, disposableStore, theme } = options; container.style.width = options.width ?? '500px'; container.style.height = options.height ?? '170px'; @@ -100,8 +100,6 @@ function renderInlineEdit(options: InlineEditOptions): HTMLElement { // Trigger inline completions const controller = InlineCompletionsController.get(editor); controller?.model?.get(); - - return container; } diff --git a/src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts b/src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts index 6c3b453b0a6ba..6692adf6bcdfa 100644 --- a/src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts +++ b/src/vs/workbench/test/browser/componentFixtures/promptFilePickers.fixture.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { mainWindow } from '../../../../base/browser/window.js'; import { CancellationToken } from '../../../../base/common/cancellation.js'; import { Event } from '../../../../base/common/event.js'; import { ResourceSet } from '../../../../base/common/map.js'; @@ -85,15 +86,7 @@ export default defineThemedFixtureGroup({ }), }); -async function renderPromptFilePickerFixture({ container, disposableStore, theme, type, placeholder, seedData }: RenderPromptPickerOptions): Promise { - container.style.width = 'fit-content'; - container.style.minHeight = '0'; - container.style.padding = '8px'; - container.style.boxSizing = 'border-box'; - container.style.background = 'var(--vscode-editor-background)'; - container.style.border = '1px solid var(--vscode-editorWidget-border)'; - container.style.position = 'relative'; - +async function renderPromptFilePickerFixture({ container, disposableStore, theme, type, placeholder, seedData }: RenderPromptPickerOptions): Promise { const quickInputHost = document.createElement('div'); quickInputHost.style.position = 'relative'; const hostWidth = 800; @@ -207,5 +200,45 @@ async function renderPromptFilePickerFixture({ container, disposableStore, theme type, }); - return container; + // Wait for the quickpick widget to render and have dimensions + const quickInputWidget = await waitForElement( + quickInputHost, + '.quick-input-widget', + el => el.offsetWidth > 0 && el.offsetHeight > 0 + ); + + if (quickInputWidget) { + // Reset positioning + quickInputWidget.style.position = 'relative'; + quickInputWidget.style.top = '0'; + quickInputWidget.style.left = '0'; + + // Move widget to container and remove host + container.appendChild(quickInputWidget); + quickInputHost.remove(); + + // Set explicit dimensions on container to match widget + const rect = quickInputWidget.getBoundingClientRect(); + container.style.width = `${rect.width}px`; + container.style.height = `${rect.height}px`; + } +} + +async function waitForElement( + root: HTMLElement, + selector: string, + condition: (el: T) => boolean, + timeout = 2000 +): Promise { + const start = Date.now(); + while (Date.now() - start < timeout) { + const el = root.querySelector(selector); + if (el && condition(el)) { + // Wait one more frame to ensure layout is complete + await new Promise(resolve => mainWindow.requestAnimationFrame(resolve)); + return el; + } + await new Promise(resolve => setTimeout(resolve, 10)); + } + return root.querySelector(selector); } diff --git a/test/componentFixtures/component-explorer-config.schema.json b/test/componentFixtures/component-explorer-config.schema.json new file mode 100644 index 0000000000000..3d129dc3b7e48 --- /dev/null +++ b/test/componentFixtures/component-explorer-config.schema.json @@ -0,0 +1,183 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "screenshotDir": { + "description": "Directory for storing screenshots (default: .screenshots)", + "type": "string" + }, + "sessions": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique session name" + }, + "source": { + "anyOf": [ + { + "type": "string", + "const": "current" + }, + { + "type": "object", + "properties": { + "worktree": { + "type": "object", + "properties": { + "ref": { + "type": "string", + "description": "Git ref (branch, tag, or commit) to check out" + }, + "name": { + "description": "Directory name for the worktree (default: component-explorer-baseline)", + "type": "string" + }, + "install": { + "anyOf": [ + { + "type": "string", + "const": "auto" + }, + { + "type": "string", + "const": "npm" + }, + { + "type": "string", + "const": "pnpm" + }, + { + "type": "string", + "const": "yarn" + }, + { + "type": "object", + "properties": { + "command": { + "type": "string", + "description": "Custom install command to run in the worktree" + } + }, + "required": [ + "command" + ], + "additionalProperties": false + }, + { + "type": "boolean", + "const": false + } + ], + "description": "Dependency install strategy for the worktree" + } + }, + "required": [ + "ref" + ], + "additionalProperties": false, + "description": "Git worktree configuration for a baseline session" + } + }, + "required": [ + "worktree" + ], + "additionalProperties": false + } + ], + "description": "Session source: \"current\" for the working tree, or a worktree config for a baseline" + }, + "viteConfig": { + "description": "Path to vite config file, relative to this config (overrides top-level viteConfig)", + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false, + "description": "A component explorer session" + }, + "description": "List of explorer sessions" + }, + "compare": { + "type": "object", + "properties": { + "baseline": { + "type": "string", + "description": "Session name to use as the baseline for comparisons" + }, + "current": { + "type": "string", + "description": "Session name to use as the current version for comparisons" + } + }, + "required": [ + "baseline", + "current" + ], + "additionalProperties": false, + "description": "Screenshot comparison configuration" + }, + "viteConfig": { + "description": "Default vite config file path, relative to this config (default: vite.config.ts)", + "type": "string" + }, + "vite": { + "type": "object", + "properties": { + "hmr": { + "type": "object", + "properties": { + "allowedPaths": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Glob patterns for files that keep HMR; everything else triggers a full reload" + } + }, + "required": [ + "allowedPaths" + ], + "additionalProperties": false, + "description": "Vite HMR configuration" + } + }, + "additionalProperties": false, + "description": "Vite configuration overrides" + }, + "redirection": { + "type": "object", + "properties": { + "port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "Port for the redirection HTTP server" + }, + "host": { + "description": "Host to bind the redirection server to (default: localhost)", + "type": "string" + } + }, + "required": [ + "port" + ], + "additionalProperties": false, + "description": "HTTP redirection server that redirects to the session URL" + }, + "$schema": { + "type": "string", + "description": "URL of the JSON Schema for this config file" + } + }, + "required": [ + "sessions" + ], + "additionalProperties": false, + "description": "Component Explorer configuration" +} diff --git a/test/componentFixtures/component-explorer.json b/test/componentFixtures/component-explorer.json index 12a3fd30d4234..2f24a100b0273 100644 --- a/test/componentFixtures/component-explorer.json +++ b/test/componentFixtures/component-explorer.json @@ -1,10 +1,14 @@ { + "$schema": "./component-explorer-config.schema.json", "screenshotDir": ".screenshots", "sessions": [ { "name": "current" } ], + "redirection": { + "port": 5337 + }, "viteConfig": "../../build/vite/vite.config.ts", "vite": { "hmr": { From a550ce559d8df751e71fd64fb5cbe8cf1d893de0 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 23 Feb 2026 21:16:57 +0100 Subject: [PATCH 48/51] updates component explorer --- build/vite/package-lock.json | 16 ++++++++-------- build/vite/package.json | 4 ++-- package-lock.json | 16 ++++++++-------- package.json | 6 +++--- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/build/vite/package-lock.json b/build/vite/package-lock.json index 60c863d483b6a..4179138e714c7 100644 --- a/build/vite/package-lock.json +++ b/build/vite/package-lock.json @@ -8,8 +8,8 @@ "name": "@vscode/sample-source", "version": "0.0.0", "devDependencies": { - "@vscode/component-explorer": "^0.1.1-11", - "@vscode/component-explorer-vite-plugin": "^0.1.1-10", + "@vscode/component-explorer": "^0.1.1-12", + "@vscode/component-explorer-vite-plugin": "^0.1.1-12", "@vscode/rollup-plugin-esm-url": "^1.0.1-1", "rollup": "*", "vite": "npm:rolldown-vite@latest" @@ -683,9 +683,9 @@ "license": "MIT" }, "node_modules/@vscode/component-explorer": { - "version": "0.1.1-11", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-11.tgz", - "integrity": "sha512-CP2KlhPApPh8zhFH2A2lD5/Zv/+UR02Id1hGfKgdlPQFyNLdfgTcXfVl55BHiwADGR+YRyNHocsglFuplQX8QQ==", + "version": "0.1.1-12", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-12.tgz", + "integrity": "sha512-qqbxbu3BvqWtwFdVsROLUSd1BiScCiUPP5n0sk0yV1WDATlAl6wQMX1QlmsZy3hag8iP/MXUEj5tSBjA1T7tFw==", "dev": true, "dependencies": { "react": "^18.2.0", @@ -693,9 +693,9 @@ } }, "node_modules/@vscode/component-explorer-vite-plugin": { - "version": "0.1.1-11", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer-vite-plugin/-/component-explorer-vite-plugin-0.1.1-11.tgz", - "integrity": "sha512-+rVlilTUK5oMzkU8tagfmLfzZpSbXJANLKaLPBgN6pyBuDzkuRZmH6JzQbUCqeUGbVhHwG+U1thh5ws6ncFeEQ==", + "version": "0.1.1-12", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer-vite-plugin/-/component-explorer-vite-plugin-0.1.1-12.tgz", + "integrity": "sha512-MG5ndoooX2X9PYto1WkNSwWKKmR5OJx3cBnUf7JHm8ERw+8RsZbLe+WS+hVOqnCVPxHy7t+0IYRFl7IC5cuwOQ==", "dev": true, "dependencies": { "tinyglobby": "^0.2.0" diff --git a/build/vite/package.json b/build/vite/package.json index 5998c829b2120..245bf4fc8001a 100644 --- a/build/vite/package.json +++ b/build/vite/package.json @@ -9,8 +9,8 @@ "preview": "vite preview" }, "devDependencies": { - "@vscode/component-explorer": "^0.1.1-11", - "@vscode/component-explorer-vite-plugin": "^0.1.1-10", + "@vscode/component-explorer": "^0.1.1-12", + "@vscode/component-explorer-vite-plugin": "^0.1.1-12", "@vscode/rollup-plugin-esm-url": "^1.0.1-1", "rollup": "*", "vite": "npm:rolldown-vite@latest" diff --git a/package-lock.json b/package-lock.json index 8b1b67551abd0..bf94454e49551 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,8 +84,8 @@ "@types/yazl": "^2.4.2", "@typescript-eslint/utils": "^8.45.0", "@typescript/native-preview": "^7.0.0-dev.20260130", - "@vscode/component-explorer": "^0.1.1-11", - "@vscode/component-explorer-cli": "^0.1.1-7", + "@vscode/component-explorer": "^0.1.1-12", + "@vscode/component-explorer-cli": "^0.1.1-8", "@vscode/gulp-electron": "https://github.com/microsoft/vscode-gulp-electron.git#405e3df0e4e9c37fcf549cbe6f5cef8d5ba5ddff", "@vscode/l10n-dev": "0.0.35", "@vscode/telemetry-extractor": "^1.10.2", @@ -3065,9 +3065,9 @@ "license": "CC-BY-4.0" }, "node_modules/@vscode/component-explorer": { - "version": "0.1.1-11", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-11.tgz", - "integrity": "sha512-CP2KlhPApPh8zhFH2A2lD5/Zv/+UR02Id1hGfKgdlPQFyNLdfgTcXfVl55BHiwADGR+YRyNHocsglFuplQX8QQ==", + "version": "0.1.1-12", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer/-/component-explorer-0.1.1-12.tgz", + "integrity": "sha512-qqbxbu3BvqWtwFdVsROLUSd1BiScCiUPP5n0sk0yV1WDATlAl6wQMX1QlmsZy3hag8iP/MXUEj5tSBjA1T7tFw==", "dev": true, "dependencies": { "react": "^18.2.0", @@ -3075,9 +3075,9 @@ } }, "node_modules/@vscode/component-explorer-cli": { - "version": "0.1.1-7", - "resolved": "https://registry.npmjs.org/@vscode/component-explorer-cli/-/component-explorer-cli-0.1.1-7.tgz", - "integrity": "sha512-Q+R736ZJtn96k0tClXMFQaa3KUWoqC2LOR7iTaILiKjtgPa3St1d+ZztbT8OiLhk/nhTlymBavVue83068Qm/g==", + "version": "0.1.1-8", + "resolved": "https://registry.npmjs.org/@vscode/component-explorer-cli/-/component-explorer-cli-0.1.1-8.tgz", + "integrity": "sha512-Sze4SdE6zlr5Mkd/RFLmLqSmEjsjq1f2pBp4a/S5u0TDS4matrkklb3LHym8dMbYC6UjWQuFOkYFZwXnGFxZqw==", "dev": true, "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", diff --git a/package.json b/package.json index 8561680d37c23..ed33be9059f08 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "perf": "node scripts/code-perf.js", "update-build-ts-version": "npm install -D typescript@next && npm install -D @typescript/native-preview && (cd build && npm run typecheck)", "install-local-component-explorer": "npm install ../vscode-packages/js-component-explorer/dist/vscode-component-explorer-0.1.0.tgz ../vscode-packages/js-component-explorer/dist/vscode-component-explorer-cli-0.1.0.tgz --no-save && cd build/vite && npm install ../../../vscode-packages/js-component-explorer/dist/vscode-component-explorer-vite-plugin-0.1.0.tgz --no-save", - "install-latest-component-explorer": "npm install @vscode/component-explorer@next @vscode/component-explorer-cli@next && cd build/vite && npm install @vscode/component-explorer-vite-plugin@next && npm install @vscode/component-explorer" + "install-latest-component-explorer": "npm install @vscode/component-explorer@next @vscode/component-explorer-cli@next && cd build/vite && npm install @vscode/component-explorer-vite-plugin@next && npm install @vscode/component-explorer@next" }, "dependencies": { "@anthropic-ai/sandbox-runtime": "0.0.23", @@ -152,8 +152,8 @@ "@types/yazl": "^2.4.2", "@typescript-eslint/utils": "^8.45.0", "@typescript/native-preview": "^7.0.0-dev.20260130", - "@vscode/component-explorer": "^0.1.1-11", - "@vscode/component-explorer-cli": "^0.1.1-7", + "@vscode/component-explorer": "^0.1.1-12", + "@vscode/component-explorer-cli": "^0.1.1-8", "@vscode/gulp-electron": "https://github.com/microsoft/vscode-gulp-electron.git#405e3df0e4e9c37fcf549cbe6f5cef8d5ba5ddff", "@vscode/l10n-dev": "0.0.35", "@vscode/telemetry-extractor": "^1.10.2", From 5f6caceb019bfcfe1e4108df449aacb8a371cdf3 Mon Sep 17 00:00:00 2001 From: Ben Villalobos Date: Mon, 23 Feb 2026 13:51:53 -0800 Subject: [PATCH 49/51] Update endgame notebook milestone to February 2026 (#297093) --- .vscode/notebooks/api.github-issues | 2 +- .vscode/notebooks/endgame.github-issues | 2 +- .vscode/notebooks/my-endgame.github-issues | 2 +- .vscode/notebooks/my-work.github-issues | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.vscode/notebooks/api.github-issues b/.vscode/notebooks/api.github-issues index aca29690dc229..8143f807803b7 100644 --- a/.vscode/notebooks/api.github-issues +++ b/.vscode/notebooks/api.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"January 2026\"" + "value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"February 2026\"" }, { "kind": 1, diff --git a/.vscode/notebooks/endgame.github-issues b/.vscode/notebooks/endgame.github-issues index 3a6635f9e17e2..d3f716f5749cb 100644 --- a/.vscode/notebooks/endgame.github-issues +++ b/.vscode/notebooks/endgame.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$MILESTONE=milestone:\"January 2026\"" + "value": "$MILESTONE=milestone:\"February 2026\"" }, { "kind": 1, diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues index d17509b77580e..b58910ad675e5 100644 --- a/.vscode/notebooks/my-endgame.github-issues +++ b/.vscode/notebooks/my-endgame.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$MILESTONE=milestone:\"January 2026\"\n\n$MINE=assignee:@me" + "value": "$MILESTONE=milestone:\"February 2026\"\n\n$MINE=assignee:@me" }, { "kind": 2, diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues index cb001643e1543..b6c82fff3590b 100644 --- a/.vscode/notebooks/my-work.github-issues +++ b/.vscode/notebooks/my-work.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce repo:microsoft/vscode-copilot-issues repo:microsoft/vscode-extension-samples\n\n// current milestone name\n$MILESTONE=milestone:\"January 2026\"\n" + "value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce repo:microsoft/vscode-copilot-issues repo:microsoft/vscode-extension-samples\n\n// current milestone name\n$MILESTONE=milestone:\"February 2026\"\n" }, { "kind": 1, From 1db94177aefb637f5789759f051bdf1396adbea5 Mon Sep 17 00:00:00 2001 From: Ben Villalobos Date: Mon, 23 Feb 2026 13:55:06 -0800 Subject: [PATCH 50/51] Update OSS licenses and distro hash for 1.110 (#297088) --- cglicenses.json | 101 +- cli/ThirdPartyNotices.txt | 4680 +++++++++++++++++++++++++++---------- package.json | 2 +- 3 files changed, 3599 insertions(+), 1184 deletions(-) diff --git a/cglicenses.json b/cglicenses.json index 8ee75c0fb3402..2b1bc6fece5b6 100644 --- a/cglicenses.json +++ b/cglicenses.json @@ -33,11 +33,66 @@ ] }, { - // Reason: The license at https://github.com/rbuckton/reflect-metadata/blob/master/LICENSE - // does not include a clear Copyright statement (it's in https://github.com/rbuckton/reflect-metadata/blob/master/CopyrightNotice.txt). + // Reason: v0.2.1 switched to Apache-2.0. Copyright is in CopyrightNotice.txt, not LICENSE. "name": "reflect-metadata", - "prependLicenseText": [ - "Copyright (c) Microsoft Corporation. All rights reserved." + "fullLicenseText": [ + "Copyright (c) Microsoft Corporation. All rights reserved.", + "", + "Apache License", + "", + "Version 2.0, January 2004", + "", + "http://www.apache.org/licenses/", + "", + "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION", + "", + "1. Definitions.", + "", + "\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.", + "", + "\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.", + "", + "\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.", + "", + "\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.", + "", + "\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.", + "", + "\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.", + "", + "\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).", + "", + "\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.", + "", + "\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"", + "", + "\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.", + "", + "2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.", + "", + "3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.", + "", + "4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:", + "", + "You must give any other recipients of the Work or Derivative Works a copy of this License; and", + "", + "You must cause any modified files to carry prominent notices stating that You changed the files; and", + "", + "You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and", + "", + "If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.", + "", + "5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.", + "", + "6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.", + "", + "7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.", + "", + "8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.", + "", + "9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.", + "", + "END OF TERMS AND CONDITIONS" ] }, { @@ -710,6 +765,44 @@ "" ] }, + { + // Reason: License file starts with (MIT) before the copyright, tool can't parse it + "name": "balanced-match", + "prependLicenseText": [ + "Copyright (c) Julian Gruber ", + "Copyright (c) Isaac Z. Schlueter " + ] + }, + { + // Reason: mono-repo with non-standard license file names (LICENSE-APACHE, LICENSE-MIT) + // License: Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT + "name": "wit-component", + "fullLicenseTextUri": "https://raw.githubusercontent.com/bytecodealliance/wasm-tools/76927bf4bdbddf4b15f835c5eddfffbdfe3bdbd5/LICENSE-APACHE" + }, + { + // Reason: mono-repo with non-standard license file names (LICENSE-APACHE, LICENSE-MIT) + // License: Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT + "name": "wasm-metadata", + "fullLicenseTextUri": "https://raw.githubusercontent.com/bytecodealliance/wasm-tools/76927bf4bdbddf4b15f835c5eddfffbdfe3bdbd5/LICENSE-APACHE" + }, + { + // Reason: mono-repo with non-standard license file names (LICENSE-APACHE, LICENSE-MIT) + // License: Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT + "name": "wasmparser", + "fullLicenseTextUri": "https://raw.githubusercontent.com/bytecodealliance/wasm-tools/76927bf4bdbddf4b15f835c5eddfffbdfe3bdbd5/LICENSE-APACHE" + }, + { + // Reason: mono-repo with non-standard license file names (LICENSE-APACHE, LICENSE-MIT) + // License: Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT + "name": "wit-parser", + "fullLicenseTextUri": "https://raw.githubusercontent.com/bytecodealliance/wasm-tools/76927bf4bdbddf4b15f835c5eddfffbdfe3bdbd5/LICENSE-APACHE" + }, + { + // Reason: mono-repo with non-standard license file names (LICENSE-APACHE, LICENSE-MIT) + // License: Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT + "name": "wasm-encoder", + "fullLicenseTextUri": "https://raw.githubusercontent.com/bytecodealliance/wasm-tools/76927bf4bdbddf4b15f835c5eddfffbdfe3bdbd5/LICENSE-APACHE" + }, { // Reason: mono-repo "name": "@jridgewell/gen-mapping", diff --git a/cli/ThirdPartyNotices.txt b/cli/ThirdPartyNotices.txt index 07427e9894cc0..61cacaea79978 100644 --- a/cli/ThirdPartyNotices.txt +++ b/cli/ThirdPartyNotices.txt @@ -19,25 +19,8 @@ required to debug changes to any libraries licensed under the GNU Lesser General --------------------------------------------------------- -addr2line 0.21.0 - Apache-2.0 OR MIT -https://github.com/gimli-rs/addr2line - -Licensed under either of - - * Apache License, Version 2.0 ([`LICENSE-APACHE`](./LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([`LICENSE-MIT`](./LICENSE-MIT) or https://opensource.org/licenses/MIT) - -at your option. - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in the work by you, as defined in the Apache-2.0 license, shall be -dual licensed as above, without any additional terms or conditions. ---------------------------------------------------------- - ---------------------------------------------------------- - -adler 1.0.2 - 0BSD OR MIT OR Apache-2.0 -https://github.com/jonas-schievink/adler +adler2 2.0.1 - 0BSD OR MIT OR Apache-2.0 +https://github.com/oyvindln/adler2 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -66,7 +49,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -aho-corasick 1.1.3 - Unlicense OR MIT +aho-corasick 1.1.4 - Unlicense OR MIT https://github.com/BurntSushi/aho-corasick The MIT License (MIT) @@ -94,34 +77,6 @@ THE SOFTWARE. --------------------------------------------------------- -android-tzdata 0.1.1 - MIT OR Apache-2.0 -https://github.com/RumovZ/android-tzdata - -MIT License - -Copyright (c) [year] [fullname] - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - android_system_properties 0.1.5 - MIT/Apache-2.0 https://github.com/nical/android_system_properties @@ -149,7 +104,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -anstream 0.6.14 - MIT OR Apache-2.0 +anstream 0.6.21 - MIT OR Apache-2.0 https://github.com/rust-cli/anstyle This software is released under the MIT license: @@ -174,7 +129,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -anstyle 1.0.7 - MIT OR Apache-2.0 +anstyle 1.0.13 - MIT OR Apache-2.0 https://github.com/rust-cli/anstyle This software is released under the MIT license: @@ -199,7 +154,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -anstyle-parse 0.2.4 - MIT OR Apache-2.0 +anstyle-parse 0.2.7 - MIT OR Apache-2.0 https://github.com/rust-cli/anstyle This software is released under the MIT license: @@ -224,7 +179,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -anstyle-query 1.0.3 - MIT OR Apache-2.0 +anstyle-query 1.1.5 - MIT OR Apache-2.0 https://github.com/rust-cli/anstyle This software is released under the MIT license: @@ -249,7 +204,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -anstyle-wincon 3.0.3 - MIT OR Apache-2.0 +anstyle-wincon 3.0.11 - MIT OR Apache-2.0 https://github.com/rust-cli/anstyle This software is released under the MIT license: @@ -274,6 +229,36 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- +anyhow 1.0.101 - MIT OR Apache-2.0 +https://github.com/dtolnay/anyhow + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + async-broadcast 0.5.1 - MIT OR Apache-2.0 https://github.com/smol-rs/async-broadcast @@ -293,7 +278,7 @@ be dual licensed as above, without any additional terms or conditions. --------------------------------------------------------- -async-channel 2.3.1 - Apache-2.0 OR MIT +async-channel 2.5.0 - Apache-2.0 OR MIT https://github.com/smol-rs/async-channel Licensed under either of @@ -313,7 +298,7 @@ dual licensed as above, without any additional terms or conditions. --------------------------------------------------------- async-io 1.13.0 - Apache-2.0 OR MIT -async-io 2.3.2 - Apache-2.0 OR MIT +async-io 2.6.0 - Apache-2.0 OR MIT https://github.com/smol-rs/async-io Permission is hereby granted, free of charge, to any @@ -344,7 +329,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- async-lock 2.8.0 - Apache-2.0 OR MIT -async-lock 3.3.0 - Apache-2.0 OR MIT +async-lock 3.4.2 - Apache-2.0 OR MIT https://github.com/smol-rs/async-lock Licensed under either of @@ -396,7 +381,7 @@ at your option. --------------------------------------------------------- -async-signal 0.2.6 - Apache-2.0 OR MIT +async-signal 0.2.13 - Apache-2.0 OR MIT https://github.com/smol-rs/async-signal Permission is hereby granted, free of charge, to any @@ -445,7 +430,7 @@ dual licensed as above, without any additional terms or conditions. --------------------------------------------------------- -async-trait 0.1.80 - MIT OR Apache-2.0 +async-trait 0.1.89 - MIT OR Apache-2.0 https://github.com/dtolnay/async-trait Permission is hereby granted, free of charge, to any @@ -505,7 +490,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -autocfg 1.3.0 - Apache-2.0 OR MIT +autocfg 1.5.0 - Apache-2.0 OR MIT https://github.com/cuviper/autocfg Copyright (c) 2018 Josh Stone @@ -537,38 +522,6 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -backtrace 0.3.71 - MIT OR Apache-2.0 -https://github.com/rust-lang/backtrace-rs - -Copyright (c) 2014 Alex Crichton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - base64 0.21.7 - MIT OR Apache-2.0 https://github.com/marshallpierce/rust-base64 @@ -630,7 +583,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- bitflags 1.3.2 - MIT/Apache-2.0 -bitflags 2.5.0 - MIT OR Apache-2.0 +bitflags 2.10.0 - MIT OR Apache-2.0 https://github.com/bitflags/bitflags Copyright (c) 2014 The Rust Project Developers @@ -686,17 +639,18 @@ Unless you explicitly state otherwise, any contribution intentionally submitted [//]: # (crates) +[`aarch64-dit`]: ./aarch64-dit [`blobby`]: ./blobby [`block-buffer`]: ./block-buffer [`block‑padding`]: ./block-padding [`cmov`]: ./cmov -[`collectable`]: ./collectable +[`cpubits`]: ./cpubits [`cpufeatures`]: ./cpufeatures +[`ctutils`]: ./ctutils [`dbl`]: ./dbl [`digest-io`]: ./digest-io [`hex-literal`]: ./hex-literal [`inout`]: ./inout -[`opaque-debug`]: ./opaque-debug [`wycheproof2blb`]: ./wycheproof2blb [`zeroize`]: ./zeroize @@ -731,17 +685,18 @@ Unless you explicitly state otherwise, any contribution intentionally submitted [//]: # (crates) +[`aarch64-dit`]: ./aarch64-dit [`blobby`]: ./blobby [`block-buffer`]: ./block-buffer [`block‑padding`]: ./block-padding [`cmov`]: ./cmov -[`collectable`]: ./collectable +[`cpubits`]: ./cpubits [`cpufeatures`]: ./cpufeatures +[`ctutils`]: ./ctutils [`dbl`]: ./dbl [`digest-io`]: ./digest-io [`hex-literal`]: ./hex-literal [`inout`]: ./inout -[`opaque-debug`]: ./opaque-debug [`wycheproof2blb`]: ./wycheproof2blb [`zeroize`]: ./zeroize @@ -752,7 +707,48 @@ Unless you explicitly state otherwise, any contribution intentionally submitted --------------------------------------------------------- -blocking 1.6.0 - Apache-2.0 OR MIT +block2 0.6.2 - MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +blocking 1.6.2 - Apache-2.0 OR MIT https://github.com/smol-rs/blocking Permission is hereby granted, free of charge, to any @@ -782,7 +778,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -bumpalo 3.16.0 - MIT OR Apache-2.0 +bumpalo 3.19.1 - MIT OR Apache-2.0 https://github.com/fitzgen/bumpalo Copyright (c) 2019 Nick Fitzgerald @@ -842,7 +838,7 @@ THE SOFTWARE. --------------------------------------------------------- -bytes 1.6.0 - MIT +bytes 1.11.1 - MIT https://github.com/tokio-rs/bytes The MIT License (MIT) @@ -876,7 +872,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -cc 1.0.98 - MIT OR Apache-2.0 +cc 1.2.55 - MIT OR Apache-2.0 https://github.com/rust-lang/cc-rs Copyright (c) 2014 Alex Crichton @@ -908,7 +904,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -cfg-if 1.0.0 - MIT/Apache-2.0 +cfg-if 1.0.4 - MIT OR Apache-2.0 https://github.com/rust-lang/cfg-if Copyright (c) 2014 Alex Crichton @@ -940,7 +936,23 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -chrono 0.4.38 - MIT OR Apache-2.0 +cfg_aliases 0.2.1 - MIT +https://github.com/katharostech/cfg_aliases + +MIT License + +Copyright (c) 2020 Katharos Technology + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +chrono 0.4.43 - MIT OR Apache-2.0 https://github.com/chronotope/chrono Rust-chrono is dual-licensed under The MIT License [1] and @@ -1186,7 +1198,7 @@ limitations under the License. --------------------------------------------------------- -clap 4.5.4 - MIT OR Apache-2.0 +clap 4.5.58 - MIT OR Apache-2.0 https://github.com/clap-rs/clap Copyright (c) Individual contributors @@ -1212,7 +1224,7 @@ SOFTWARE. --------------------------------------------------------- -clap_builder 4.5.2 - MIT OR Apache-2.0 +clap_builder 4.5.58 - MIT OR Apache-2.0 https://github.com/clap-rs/clap Copyright (c) Individual contributors @@ -1238,7 +1250,7 @@ SOFTWARE. --------------------------------------------------------- -clap_derive 4.5.4 - MIT OR Apache-2.0 +clap_derive 4.5.55 - MIT OR Apache-2.0 https://github.com/clap-rs/clap Copyright (c) Individual contributors @@ -1264,7 +1276,8 @@ SOFTWARE. --------------------------------------------------------- -clap_lex 0.7.0 - MIT OR Apache-2.0 +clap_lex 0.7.7 - MIT OR Apache-2.0 +clap_lex 1.0.0 - MIT OR Apache-2.0 https://github.com/clap-rs/clap Copyright (c) Individual contributors @@ -1290,7 +1303,7 @@ SOFTWARE. --------------------------------------------------------- -colorchoice 1.0.1 - MIT OR Apache-2.0 +colorchoice 1.0.4 - MIT OR Apache-2.0 https://github.com/rust-cli/anstyle This software is released under the MIT license: @@ -1345,7 +1358,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -console 0.15.8 - MIT +console 0.15.11 - MIT https://github.com/console-rs/console The MIT License (MIT) @@ -1373,7 +1386,7 @@ SOFTWARE. --------------------------------------------------------- -const_format 0.2.32 - Zlib +const_format 0.2.35 - Zlib https://github.com/rodrimati1992/const_format_crates/ Copyright (c) 2020 Matias Rodriguez. @@ -1397,7 +1410,7 @@ freely, subject to the following restrictions: --------------------------------------------------------- -const_format_proc_macros 0.2.32 - Zlib +const_format_proc_macros 0.2.34 - Zlib https://github.com/rodrimati1992/const_format_crates/ Copyright (c) 2020 Matias Rodriguez. @@ -1453,7 +1466,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -core-foundation-sys 0.8.6 - MIT OR Apache-2.0 +core-foundation-sys 0.8.7 - MIT OR Apache-2.0 https://github.com/servo/core-foundation-rs Copyright (c) 2012-2013 Mozilla Foundation @@ -1485,7 +1498,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -cpufeatures 0.2.12 - MIT OR Apache-2.0 +cpufeatures 0.2.17 - MIT OR Apache-2.0 https://github.com/RustCrypto/utils All crates licensed under either of @@ -1509,17 +1522,18 @@ Unless you explicitly state otherwise, any contribution intentionally submitted [//]: # (crates) +[`aarch64-dit`]: ./aarch64-dit [`blobby`]: ./blobby [`block-buffer`]: ./block-buffer [`block‑padding`]: ./block-padding [`cmov`]: ./cmov -[`collectable`]: ./collectable +[`cpubits`]: ./cpubits [`cpufeatures`]: ./cpufeatures +[`ctutils`]: ./ctutils [`dbl`]: ./dbl [`digest-io`]: ./digest-io [`hex-literal`]: ./hex-literal [`inout`]: ./inout -[`opaque-debug`]: ./opaque-debug [`wycheproof2blb`]: ./wycheproof2blb [`zeroize`]: ./zeroize @@ -1530,7 +1544,7 @@ Unless you explicitly state otherwise, any contribution intentionally submitted --------------------------------------------------------- -crc32fast 1.4.1 - MIT OR Apache-2.0 +crc32fast 1.5.0 - MIT OR Apache-2.0 https://github.com/srijs/rust-crc32fast MIT License @@ -1592,7 +1606,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -crossbeam-utils 0.8.20 - MIT OR Apache-2.0 +crossbeam-utils 0.8.21 - MIT OR Apache-2.0 https://github.com/crossbeam-rs/crossbeam The MIT License (MIT) @@ -1626,7 +1640,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -crypto-common 0.1.6 - MIT OR Apache-2.0 +crypto-common 0.1.7 - MIT OR Apache-2.0 https://github.com/RustCrypto/traits All crates licensed under either of @@ -1679,7 +1693,7 @@ Unless you explicitly state otherwise, any contribution intentionally submitted --------------------------------------------------------- -data-encoding 2.6.0 - MIT +data-encoding 2.10.0 - MIT https://github.com/ia0/data-encoding The MIT License (MIT) @@ -1708,7 +1722,7 @@ SOFTWARE. --------------------------------------------------------- -deranged 0.3.11 - MIT OR Apache-2.0 +deranged 0.5.6 - MIT OR Apache-2.0 https://github.com/jhpratt/deranged Copyright (c) 2024 Jacob Pratt et al. @@ -1895,6 +1909,47 @@ SOFTWARE. --------------------------------------------------------- +dispatch2 0.3.0 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + displaydoc 0.2.5 - MIT OR Apache-2.0 https://github.com/yaahc/displaydoc @@ -1925,7 +1980,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -encode_unicode 0.3.6 - MIT/Apache-2.0 +encode_unicode 1.0.0 - Apache-2.0 OR MIT https://github.com/tormol/encode_unicode Permission is hereby granted, free of charge, to any person obtaining a copy @@ -1949,7 +2004,7 @@ SOFTWARE --------------------------------------------------------- -encoding_rs 0.8.34 - (Apache-2.0 OR MIT) AND BSD-3-Clause +encoding_rs 0.8.35 - (Apache-2.0 OR MIT) AND BSD-3-Clause https://github.com/hsivonen/encoding_rs Copyright Mozilla Foundation @@ -1981,7 +2036,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -enumflags2 0.7.9 - MIT OR Apache-2.0 +enumflags2 0.7.12 - MIT OR Apache-2.0 https://github.com/meithecatte/enumflags2 Copyright (c) 2017-2023 Maik Klein, Maja Kądziołka @@ -2013,7 +2068,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -enumflags2_derive 0.7.9 - MIT OR Apache-2.0 +enumflags2_derive 0.7.12 - MIT OR Apache-2.0 https://github.com/meithecatte/enumflags2 Copyright (c) 2017-2023 Maik Klein, Maja Kądziołka @@ -2045,7 +2100,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -equivalent 1.0.1 - Apache-2.0 OR MIT +equivalent 1.0.2 - Apache-2.0 OR MIT https://github.com/indexmap-rs/equivalent Copyright (c) 2016--2023 @@ -2077,7 +2132,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -errno 0.3.9 - MIT OR Apache-2.0 +errno 0.3.14 - MIT OR Apache-2.0 https://github.com/lambda-fairy/rust-errno Copyright (c) 2014 Chris Wong @@ -2111,8 +2166,7 @@ DEALINGS IN THE SOFTWARE. event-listener 2.5.3 - Apache-2.0 OR MIT event-listener 3.1.0 - Apache-2.0 OR MIT -event-listener 4.0.3 - Apache-2.0 OR MIT -event-listener 5.3.0 - Apache-2.0 OR MIT +event-listener 5.4.1 - Apache-2.0 OR MIT https://github.com/smol-rs/event-listener Permission is hereby granted, free of charge, to any @@ -2142,8 +2196,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -event-listener-strategy 0.4.0 - Apache-2.0 OR MIT -event-listener-strategy 0.5.2 - Apache-2.0 OR MIT +event-listener-strategy 0.5.4 - Apache-2.0 OR MIT https://github.com/smol-rs/event-listener-strategy Permission is hereby granted, free of charge, to any @@ -2174,7 +2227,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- fastrand 1.9.0 - Apache-2.0 OR MIT -fastrand 2.1.0 - Apache-2.0 OR MIT +fastrand 2.3.0 - Apache-2.0 OR MIT https://github.com/smol-rs/fastrand Permission is hereby granted, free of charge, to any @@ -2204,7 +2257,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -filetime 0.2.23 - MIT/Apache-2.0 +filetime 0.2.27 - MIT/Apache-2.0 https://github.com/alexcrichton/filetime Copyright (c) 2014 Alex Crichton @@ -2236,7 +2289,39 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -flate2 1.0.30 - MIT OR Apache-2.0 +find-msvc-tools 0.1.9 - MIT OR Apache-2.0 +https://github.com/rust-lang/cc-rs + +Copyright (c) 2014 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +flate2 1.1.9 - MIT OR Apache-2.0 https://github.com/rust-lang/flate2-rs Copyright (c) 2014-2026 Alex Crichton @@ -2300,6 +2385,32 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- +foldhash 0.1.5 - Zlib +https://github.com/orlp/foldhash + +Copyright (c) 2024 Orson Peters + +This software is provided 'as-is', without any express or implied warranty. In +no event will the authors be held liable for any damages arising from the use of +this software. + +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a product, + an acknowledgment in the product documentation would be appreciated but is + not required. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. +--------------------------------------------------------- + +--------------------------------------------------------- + foreign-types 0.3.2 - MIT/Apache-2.0 https://github.com/sfackler/foreign-types @@ -2352,7 +2463,7 @@ SOFTWARE. --------------------------------------------------------- -form_urlencoded 1.2.1 - MIT OR Apache-2.0 +form_urlencoded 1.2.2 - MIT OR Apache-2.0 https://github.com/servo/rust-url Copyright (c) 2013-2025 The rust-url developers @@ -2384,7 +2495,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures 0.3.30 - MIT OR Apache-2.0 +futures 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2417,7 +2528,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-channel 0.3.30 - MIT OR Apache-2.0 +futures-channel 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2450,7 +2561,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-core 0.3.30 - MIT OR Apache-2.0 +futures-core 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2483,7 +2594,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-executor 0.3.30 - MIT OR Apache-2.0 +futures-executor 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2516,7 +2627,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-io 0.3.30 - MIT OR Apache-2.0 +futures-io 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2550,7 +2661,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- futures-lite 1.13.0 - Apache-2.0 OR MIT -futures-lite 2.3.0 - Apache-2.0 OR MIT +futures-lite 2.6.1 - Apache-2.0 OR MIT https://github.com/smol-rs/futures-lite Permission is hereby granted, free of charge, to any @@ -2580,7 +2691,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-macro 0.3.30 - MIT OR Apache-2.0 +futures-macro 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2613,7 +2724,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-sink 0.3.30 - MIT OR Apache-2.0 +futures-sink 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2646,7 +2757,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-task 0.3.30 - MIT OR Apache-2.0 +futures-task 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2679,7 +2790,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -futures-util 0.3.30 - MIT OR Apache-2.0 +futures-util 0.3.31 - MIT OR Apache-2.0 https://github.com/rust-lang/futures-rs Copyright (c) 2016 Alex Crichton @@ -2949,7 +3060,9 @@ limitations under the License. --------------------------------------------------------- getrandom 0.1.16 - MIT OR Apache-2.0 -getrandom 0.2.15 - MIT OR Apache-2.0 +getrandom 0.2.17 - MIT OR Apache-2.0 +getrandom 0.3.4 - MIT OR Apache-2.0 +getrandom 0.4.1 - MIT OR Apache-2.0 https://github.com/rust-random/getrandom Copyright (c) 2018-2026 The rust-random Project Developers @@ -2982,39 +3095,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -gimli 0.28.1 - MIT OR Apache-2.0 -https://github.com/gimli-rs/gimli - -Copyright (c) 2015 The Rust Project Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -h2 0.3.26 - MIT +h2 0.3.27 - MIT https://github.com/hyperium/h2 The MIT License (MIT) @@ -3049,7 +3130,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- hashbrown 0.12.3 - MIT OR Apache-2.0 -hashbrown 0.14.5 - MIT OR Apache-2.0 +hashbrown 0.15.5 - MIT OR Apache-2.0 +hashbrown 0.16.1 - MIT OR Apache-2.0 https://github.com/rust-lang/hashbrown Copyright (c) 2016 Amanieu d'Antras @@ -3114,6 +3196,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- hermit-abi 0.3.9 - MIT OR Apache-2.0 +hermit-abi 0.5.2 - MIT OR Apache-2.0 https://github.com/hermit-os/hermit-rs Permission is hereby granted, free of charge, to any @@ -3194,17 +3277,18 @@ Unless you explicitly state otherwise, any contribution intentionally submitted [//]: # (crates) +[`aarch64-dit`]: ./aarch64-dit [`blobby`]: ./blobby [`block-buffer`]: ./block-buffer [`block‑padding`]: ./block-padding [`cmov`]: ./cmov -[`collectable`]: ./collectable +[`cpubits`]: ./cpubits [`cpufeatures`]: ./cpufeatures +[`ctutils`]: ./ctutils [`dbl`]: ./dbl [`digest-io`]: ./digest-io [`hex-literal`]: ./hex-literal [`inout`]: ./inout -[`opaque-debug`]: ./opaque-debug [`wycheproof2blb`]: ./wycheproof2blb [`zeroize`]: ./zeroize @@ -3329,7 +3413,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -httparse 1.8.0 - MIT/Apache-2.0 +httparse 1.10.1 - MIT OR Apache-2.0 https://github.com/seanmonstar/httparse Copyright (c) 2015-2026 Sean McArthur @@ -3381,7 +3465,7 @@ THE SOFTWARE. --------------------------------------------------------- -hyper 0.14.28 - MIT +hyper 0.14.32 - MIT https://github.com/hyperium/hyper The MIT License (MIT) @@ -3435,7 +3519,7 @@ THE SOFTWARE. --------------------------------------------------------- -iana-time-zone 0.1.60 - MIT OR Apache-2.0 +iana-time-zone 0.1.65 - MIT OR Apache-2.0 https://github.com/strawlab/iana-time-zone Copyright (c) 2020 Andrew D. Straw @@ -3499,7 +3583,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -icu_collections 1.5.0 - Unicode-3.0 +icu_collections 2.1.1 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -3552,7 +3636,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -icu_locid 1.5.0 - Unicode-3.0 +icu_locale_core 2.1.1 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -3605,7 +3689,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -icu_locid_transform 1.5.0 - Unicode-3.0 +icu_normalizer 2.1.1 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -3658,7 +3742,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -icu_locid_transform_data 1.5.0 - Unicode-3.0 +icu_normalizer_data 2.1.1 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -3711,7 +3795,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -icu_normalizer 1.5.0 - Unicode-3.0 +icu_properties 2.1.2 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -3764,7 +3848,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -icu_normalizer_data 1.5.0 - Unicode-3.0 +icu_properties_data 2.1.2 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -3817,7 +3901,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -icu_properties 1.5.1 - Unicode-3.0 +icu_provider 2.1.1 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -3870,166 +3954,39 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -icu_properties_data 1.5.0 - Unicode-3.0 -https://github.com/unicode-org/icu4x +id-arena 2.3.0 - MIT/Apache-2.0 +https://github.com/fitzgen/id-arena -UNICODE LICENSE V3 +Copyright (c) 2014 Alex Crichton -COPYRIGHT AND PERMISSION NOTICE +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: -Copyright © 2020-2024 Unicode, Inc. +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. -NOTICE TO USER: Carefully read the following legal agreement. BY -DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR -SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE -TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT -DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- -Permission is hereby granted, free of charge, to any person obtaining a -copy of data files and any associated documentation (the "Data Files") or -software and any associated documentation (the "Software") to deal in the -Data Files or Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, and/or sell -copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that either (a) -this copyright and permission notice appear with all copies of the Data -Files or Software, or (b) this copyright and permission notice appear in -associated Documentation. +--------------------------------------------------------- -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -THIRD PARTY RIGHTS. - -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE -BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA -FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall -not be used in advertising or otherwise to promote the sale, use or other -dealings in these Data Files or Software without prior written -authorization of the copyright holder. - -SPDX-License-Identifier: Unicode-3.0 - -— - -Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. -ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. ---------------------------------------------------------- - ---------------------------------------------------------- - -icu_provider 1.5.0 - Unicode-3.0 -https://github.com/unicode-org/icu4x - -UNICODE LICENSE V3 - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 2020-2024 Unicode, Inc. - -NOTICE TO USER: Carefully read the following legal agreement. BY -DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR -SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE -TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT -DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of data files and any associated documentation (the "Data Files") or -software and any associated documentation (the "Software") to deal in the -Data Files or Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, and/or sell -copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that either (a) -this copyright and permission notice appear with all copies of the Data -Files or Software, or (b) this copyright and permission notice appear in -associated Documentation. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -THIRD PARTY RIGHTS. - -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE -BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA -FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall -not be used in advertising or otherwise to promote the sale, use or other -dealings in these Data Files or Software without prior written -authorization of the copyright holder. - -SPDX-License-Identifier: Unicode-3.0 - -— - -Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. -ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. ---------------------------------------------------------- - ---------------------------------------------------------- - -icu_provider_macros 1.5.0 - Unicode-3.0 -https://github.com/unicode-org/icu4x - -UNICODE LICENSE V3 - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 2020-2024 Unicode, Inc. - -NOTICE TO USER: Carefully read the following legal agreement. BY -DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR -SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE -TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT -DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of data files and any associated documentation (the "Data Files") or -software and any associated documentation (the "Software") to deal in the -Data Files or Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, and/or sell -copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that either (a) -this copyright and permission notice appear with all copies of the Data -Files or Software, or (b) this copyright and permission notice appear in -associated Documentation. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -THIRD PARTY RIGHTS. - -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE -BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA -FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall -not be used in advertising or otherwise to promote the sale, use or other -dealings in these Data Files or Software without prior written -authorization of the copyright holder. - -SPDX-License-Identifier: Unicode-3.0 - -— - -Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. -ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. ---------------------------------------------------------- - ---------------------------------------------------------- - -idna 1.0.3 - MIT OR Apache-2.0 +idna 1.1.0 - MIT OR Apache-2.0 https://github.com/servo/rust-url/ Copyright (c) 2013-2025 The rust-url developers @@ -4061,7 +4018,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -idna_adapter 1.2.0 - Apache-2.0 OR MIT +idna_adapter 1.2.1 - Apache-2.0 OR MIT https://github.com/hsivonen/idna_adapter Copyright (c) The rust-url developers @@ -4094,7 +4051,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- indexmap 1.9.3 - Apache-2.0 OR MIT -indexmap 2.2.6 - Apache-2.0 OR MIT +indexmap 2.13.0 - Apache-2.0 OR MIT https://github.com/indexmap-rs/indexmap Copyright (c) 2016--2017 @@ -4126,7 +4083,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -indicatif 0.17.8 - MIT +indicatif 0.17.11 - MIT https://github.com/console-rs/indicatif The MIT License (MIT) @@ -4154,7 +4111,7 @@ SOFTWARE. --------------------------------------------------------- -inout 0.1.3 - MIT OR Apache-2.0 +inout 0.1.4 - MIT OR Apache-2.0 https://github.com/RustCrypto/utils All crates licensed under either of @@ -4178,17 +4135,18 @@ Unless you explicitly state otherwise, any contribution intentionally submitted [//]: # (crates) +[`aarch64-dit`]: ./aarch64-dit [`blobby`]: ./blobby [`block-buffer`]: ./block-buffer [`block‑padding`]: ./block-padding [`cmov`]: ./cmov -[`collectable`]: ./collectable +[`cpubits`]: ./cpubits [`cpufeatures`]: ./cpufeatures +[`ctutils`]: ./ctutils [`dbl`]: ./dbl [`digest-io`]: ./digest-io [`hex-literal`]: ./hex-literal [`inout`]: ./inout -[`opaque-debug`]: ./opaque-debug [`wycheproof2blb`]: ./wycheproof2blb [`zeroize`]: ./zeroize @@ -4263,7 +4221,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -ipnet 2.9.0 - MIT OR Apache-2.0 +ipnet 2.11.0 - MIT OR Apache-2.0 https://github.com/krisprice/ipnet Copyright 2017 Juniper Networks, Inc. @@ -4333,7 +4291,7 @@ SOFTWARE. --------------------------------------------------------- -is_terminal_polyfill 1.70.0 - MIT OR Apache-2.0 +is_terminal_polyfill 1.70.2 - MIT OR Apache-2.0 https://github.com/polyfill-rs/is_terminal_polyfill Copyright (c) Individual contributors @@ -4359,7 +4317,7 @@ SOFTWARE. --------------------------------------------------------- -itoa 1.0.11 - MIT OR Apache-2.0 +itoa 1.0.17 - MIT OR Apache-2.0 https://github.com/dtolnay/itoa Permission is hereby granted, free of charge, to any @@ -4389,7 +4347,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -js-sys 0.3.69 - MIT OR Apache-2.0 +js-sys 0.3.85 - MIT OR Apache-2.0 https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/js-sys Copyright (c) 2014 Alex Crichton @@ -4453,7 +4411,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -lazy_static 1.4.0 - MIT/Apache-2.0 +lazy_static 1.5.0 - MIT OR Apache-2.0 https://github.com/rust-lang-nursery/lazy-static.rs Permission is hereby granted, free of charge, to any @@ -4483,10 +4441,40 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -libc 0.2.155 - MIT OR Apache-2.0 +leb128fmt 0.1.0 - MIT OR Apache-2.0 +https://github.com/bluk/leb128fmt + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +libc 0.2.181 - MIT OR Apache-2.0 https://github.com/rust-lang/libc -Copyright (c) 2014-2020 The Rust Project Developers +Copyright (c) The Rust Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -4515,7 +4503,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -libredox 0.1.3 - MIT +libredox 0.1.12 - MIT https://gitlab.redox-os.org/redox-os/libredox.git MIT License @@ -4543,7 +4531,7 @@ SOFTWARE. --------------------------------------------------------- -libz-sys 1.1.16 - MIT OR Apache-2.0 +libz-sys 1.1.23 - MIT OR Apache-2.0 https://github.com/rust-lang/libz-sys Copyright (c) 2014 Alex Crichton @@ -4607,8 +4595,9 @@ additional terms or conditions. --------------------------------------------------------- +linux-raw-sys 0.11.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT linux-raw-sys 0.3.8 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT -linux-raw-sys 0.4.14 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +linux-raw-sys 0.4.15 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT https://github.com/sunfishcode/linux-raw-sys Permission is hereby granted, free of charge, to any @@ -4638,7 +4627,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -litemap 0.7.4 - Unicode-3.0 +litemap 0.8.1 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -4691,7 +4680,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -lock_api 0.4.12 - MIT OR Apache-2.0 +lock_api 0.4.14 - MIT OR Apache-2.0 https://github.com/Amanieu/parking_lot Copyright (c) 2016 The Rust Project Developers @@ -4723,7 +4712,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -log 0.4.21 - MIT OR Apache-2.0 +log 0.4.29 - MIT OR Apache-2.0 https://github.com/rust-lang/log Copyright (c) 2014 The Rust Project Developers @@ -4809,7 +4798,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -memchr 2.7.2 - Unlicense OR MIT +memchr 2.8.0 - Unlicense OR MIT https://github.com/BurntSushi/memchr The MIT License (MIT) @@ -4892,7 +4881,7 @@ THE SOFTWARE. --------------------------------------------------------- -miniz_oxide 0.7.3 - MIT OR Zlib OR Apache-2.0 +miniz_oxide 0.8.9 - MIT OR Zlib OR Apache-2.0 https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide This library (excluding the original miniz C code used for tests) is dual licensed under the MIT license and Apache 2.0 license. The library is based on the [miniz](https://github.com/richgel999/miniz) C library by Rich Geldreich which is released under the MIT license. @@ -4900,7 +4889,7 @@ This library (excluding the original miniz C code used for tests) is dual licens --------------------------------------------------------- -mio 0.8.11 - MIT +mio 1.1.1 - MIT https://github.com/tokio-rs/mio The MIT License (MIT) @@ -4928,8 +4917,8 @@ THE SOFTWARE. --------------------------------------------------------- -native-tls 0.2.11 - MIT/Apache-2.0 -https://github.com/sfackler/rust-native-tls +native-tls 0.2.15 - MIT OR Apache-2.0 +https://github.com/rust-native-tls/rust-native-tls Copyright (c) 2016 The rust-native-tls Developers @@ -4955,6 +4944,7 @@ SOFTWARE. --------------------------------------------------------- nix 0.26.4 - MIT +nix 0.30.1 - MIT https://github.com/nix-rust/nix The MIT License (MIT) @@ -4982,7 +4972,7 @@ THE SOFTWARE. --------------------------------------------------------- -ntapi 0.4.1 - Apache-2.0 OR MIT +ntapi 0.4.3 - Apache-2.0 OR MIT https://github.com/MSxDOS/ntapi Permission is hereby granted, free of charge, to any person obtaining a copy @@ -5038,7 +5028,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -num-bigint 0.4.5 - MIT OR Apache-2.0 +num-bigint 0.4.6 - MIT OR Apache-2.0 https://github.com/rust-num/num-bigint Copyright (c) 2014 The Rust Project Developers @@ -5102,7 +5092,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -num-conv 0.1.0 - MIT OR Apache-2.0 +num-conv 0.2.0 - MIT OR Apache-2.0 https://github.com/jhpratt/num-conv Copyright (c) 2023 Jacob Pratt @@ -5256,32 +5246,6 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -num_cpus 1.16.0 - MIT OR Apache-2.0 -https://github.com/seanmonstar/num_cpus - -Copyright (c) 2015-2026 Sean McArthur - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - number_prefix 0.4.0 - MIT https://github.com/ogham/rust-number-prefix @@ -5310,104 +5274,672 @@ SOFTWARE. --------------------------------------------------------- -object 0.32.2 - Apache-2.0 OR MIT -https://github.com/gimli-rs/object +objc2 0.6.3 - MIT +https://github.com/madsmtm/objc2 -Copyright (c) 2015 The Gimli Developers +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- ---------------------------------------------------------- +## Apple SDKs -once_cell 1.19.0 - MIT OR Apache-2.0 -https://github.com/matklad/once_cell +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: +https://www.apple.com/legal/sla/docs/xcode.pdf -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. +Or by typing `xcodebuild -license` in your terminal. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). --------------------------------------------------------- --------------------------------------------------------- -open 4.2.0 - MIT -https://github.com/Byron/open-rs +objc2-cloud-kit 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 -The MIT License (MIT) +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. -Copyright © `2015` `Sebastian Thiel` +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). --------------------------------------------------------- --------------------------------------------------------- -openssl 0.10.72 - Apache-2.0 -https://github.com/rust-openssl/rust-openssl +objc2-core-data 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 -Copyright 2011-2017 Google Inc. - 2013 Jack Lloyd +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-core-foundation 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-core-graphics 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-core-image 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-core-location 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-core-text 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-encode 4.1.0 - MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-foundation 0.3.2 - MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-io-surface 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-quartz-core 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-ui-kit 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +objc2-user-notifications 0.3.2 - Zlib OR Apache-2.0 OR MIT +https://github.com/madsmtm/objc2 + +The licensing in this repository is a bit complicated: +- The crates `objc2`, `block2`, `objc2-foundation` and `objc2-encode` are + [currently][#23] licensed under [the MIT license][MIT]. +- All other crates are trio-licensed under the [Zlib], [Apache-2.0] or [MIT] + license, at your option. +- Some example code may be more restrictively licensed, see each example for + details. + +Furthermore, the crates are (usually automatically) derived from Apple SDKs, +and that may have implications for licensing, see below for details. + +[#23]: https://github.com/madsmtm/objc2/issues/23 +[MIT]: https://opensource.org/license/MIT +[Zlib]: https://zlib.net/zlib_license.html +[Apache-2.0]: https://www.apache.org/licenses/LICENSE-2.0 + + +## Apple SDKs + +These crates are derived from Apple SDKs shipped with Xcode. You can obtain a +copy of the Xcode license at: + +https://www.apple.com/legal/sla/docs/xcode.pdf + +Or by typing `xcodebuild -license` in your terminal. + +From reading the license, it is unclear whether distributing derived works +such as these crates are allowed? + +But in any case, to practically use these crates, you will have to link, and +that only works when you have the correct Xcode SDK available to provide the +required `.tbd` files, which is why we choose to still use the normal SPDX +identifiers in the crates (Xcode is required to use the crates, and when using +Xcode you have already agreed to the Xcode license). +--------------------------------------------------------- + +--------------------------------------------------------- + +once_cell 1.21.3 - MIT OR Apache-2.0 +https://github.com/matklad/once_cell + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +once_cell_polyfill 1.70.2 - MIT OR Apache-2.0 +https://github.com/polyfill-rs/once_cell_polyfill + +Copyright (c) Individual contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +open 4.2.0 - MIT +https://github.com/Byron/open-rs + +The MIT License (MIT) + +Copyright © `2015` `Sebastian Thiel` + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +openssl 0.10.75 - Apache-2.0 +https://github.com/rust-openssl/rust-openssl + +Copyright 2011-2017 Google Inc. + 2013 Jack Lloyd 2013-2014 Steven Fackler Licensed under the Apache License, Version 2.0 (the "License"); @@ -5450,7 +5982,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -openssl-probe 0.1.5 - MIT/Apache-2.0 +openssl-probe 0.1.6 - MIT/Apache-2.0 https://github.com/rustls/openssl-probe Copyright (c) 2014 Alex Crichton @@ -5482,7 +6014,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -openssl-sys 0.9.107 - MIT +openssl-sys 0.9.111 - MIT https://github.com/rust-openssl/rust-openssl The MIT License (MIT) @@ -6550,7 +7082,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -os_info 3.8.2 - MIT +os_info 3.14.0 - MIT https://github.com/stanislav-tkach/os_info The MIT License (MIT) @@ -6578,7 +7110,7 @@ SOFTWARE. --------------------------------------------------------- -parking 2.2.0 - Apache-2.0 OR MIT +parking 2.2.1 - Apache-2.0 OR MIT https://github.com/smol-rs/parking Permission is hereby granted, free of charge, to any @@ -6608,7 +7140,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -parking_lot 0.12.2 - MIT OR Apache-2.0 +parking_lot 0.12.5 - MIT OR Apache-2.0 https://github.com/Amanieu/parking_lot Copyright (c) 2016 The Rust Project Developers @@ -6640,7 +7172,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -parking_lot_core 0.9.10 - MIT OR Apache-2.0 +parking_lot_core 0.9.12 - MIT OR Apache-2.0 https://github.com/Amanieu/parking_lot Copyright (c) 2016 The Rust Project Developers @@ -6672,8 +7204,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -paste 1.0.15 - MIT OR Apache-2.0 -https://github.com/dtolnay/paste +pathdiff 0.2.3 - MIT/Apache-2.0 +https://github.com/Manishearth/pathdiff Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -6702,37 +7234,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -pathdiff 0.2.1 - MIT/Apache-2.0 -https://github.com/Manishearth/pathdiff - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -percent-encoding 2.3.1 - MIT OR Apache-2.0 +percent-encoding 2.3.2 - MIT OR Apache-2.0 https://github.com/servo/rust-url/ Copyright (c) 2013-2025 The rust-url developers @@ -6764,7 +7266,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -pin-project 1.1.5 - Apache-2.0 OR MIT +pin-project 1.1.10 - Apache-2.0 OR MIT https://github.com/taiki-e/pin-project Permission is hereby granted, free of charge, to any @@ -6794,7 +7296,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -pin-project-internal 1.1.5 - Apache-2.0 OR MIT +pin-project-internal 1.1.10 - Apache-2.0 OR MIT https://github.com/taiki-e/pin-project Permission is hereby granted, free of charge, to any @@ -6824,7 +7326,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -pin-project-lite 0.2.14 - Apache-2.0 OR MIT +pin-project-lite 0.2.16 - Apache-2.0 OR MIT https://github.com/taiki-e/pin-project-lite Permission is hereby granted, free of charge, to any @@ -6886,7 +7388,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -piper 0.2.2 - MIT OR Apache-2.0 +piper 0.2.4 - MIT OR Apache-2.0 https://github.com/smol-rs/piper Permission is hereby granted, free of charge, to any @@ -6916,7 +7418,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -pkg-config 0.3.30 - MIT OR Apache-2.0 +pkg-config 0.3.32 - MIT OR Apache-2.0 https://github.com/rust-lang/pkg-config-rs Copyright (c) 2014 Alex Crichton @@ -6949,7 +7451,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- polling 2.8.0 - Apache-2.0 OR MIT -polling 3.7.0 - Apache-2.0 OR MIT +polling 3.11.0 - Apache-2.0 OR MIT https://github.com/smol-rs/polling Permission is hereby granted, free of charge, to any @@ -6979,7 +7481,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -portable-atomic 1.6.0 - Apache-2.0 OR MIT +portable-atomic 1.13.1 - Apache-2.0 OR MIT https://github.com/taiki-e/portable-atomic Permission is hereby granted, free of charge, to any @@ -7009,6 +7511,59 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- +potential_utf 0.1.4 - Unicode-3.0 +https://github.com/unicode-org/icu4x + +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 2020-2024 Unicode, Inc. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. + +SPDX-License-Identifier: Unicode-3.0 + +— + +Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. +ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. +--------------------------------------------------------- + +--------------------------------------------------------- + powerfmt 0.2.0 - MIT OR Apache-2.0 https://github.com/jhpratt/powerfmt @@ -7035,7 +7590,7 @@ SOFTWARE. --------------------------------------------------------- -ppv-lite86 0.2.17 - MIT/Apache-2.0 +ppv-lite86 0.2.21 - MIT OR Apache-2.0 https://github.com/cryptocorrosion/cryptocorrosion Copyright (c) 2019 The CryptoCorrosion Contributors @@ -7067,6 +7622,36 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- +prettyplease 0.2.37 - MIT OR Apache-2.0 +https://github.com/dtolnay/prettyplease + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + proc-macro-crate 1.3.1 - MIT OR Apache-2.0 https://github.com/bkchr/proc-macro-crate @@ -7097,7 +7682,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -proc-macro2 1.0.83 - MIT OR Apache-2.0 +proc-macro2 1.0.106 - MIT OR Apache-2.0 https://github.com/dtolnay/proc-macro2 Permission is hereby granted, free of charge, to any @@ -7127,7 +7712,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -quote 1.0.36 - MIT OR Apache-2.0 +quote 1.0.44 - MIT OR Apache-2.0 https://github.com/dtolnay/quote Permission is hereby granted, free of charge, to any @@ -7157,6 +7742,17 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- +r-efi 5.3.0 - MIT OR Apache-2.0 OR LGPL-2.1-or-later +https://github.com/r-efi/r-efi + +: + + - **MIT** OR **Apache-2.0** OR **LGPL-2.1-or-later** + - See AUTHORS file for details. +--------------------------------------------------------- + +--------------------------------------------------------- + rand 0.7.3 - MIT OR Apache-2.0 rand 0.8.5 - MIT OR Apache-2.0 https://github.com/rust-random/rand @@ -7291,8 +7887,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -redox_syscall 0.4.1 - MIT -redox_syscall 0.5.1 - MIT +redox_syscall 0.5.18 - MIT +redox_syscall 0.7.1 - MIT https://github.com/redox-os/syscall Copyright (c) 2017 Redox OS Developers @@ -7321,7 +7917,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -redox_users 0.4.5 - MIT +redox_users 0.4.6 - MIT https://gitlab.redox-os.org/redox-os/users The MIT License (MIT) @@ -7349,7 +7945,7 @@ SOFTWARE. --------------------------------------------------------- -regex 1.10.4 - MIT OR Apache-2.0 +regex 1.12.3 - MIT OR Apache-2.0 https://github.com/rust-lang/regex Copyright (c) 2014 The Rust Project Developers @@ -7381,7 +7977,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -regex-automata 0.4.6 - MIT OR Apache-2.0 +regex-automata 0.4.14 - MIT OR Apache-2.0 https://github.com/rust-lang/regex Copyright (c) 2014 The Rust Project Developers @@ -7413,7 +8009,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -regex-syntax 0.8.3 - MIT OR Apache-2.0 +regex-syntax 0.8.9 - MIT OR Apache-2.0 https://github.com/rust-lang/regex Copyright (c) 2014 The Rust Project Developers @@ -7471,7 +8067,7 @@ THE SOFTWARE. --------------------------------------------------------- -rmp 0.8.14 - MIT +rmp 0.8.15 - MIT https://github.com/3Hren/msgpack-rust MIT License @@ -7499,7 +8095,7 @@ SOFTWARE. --------------------------------------------------------- -rmp-serde 1.3.0 - MIT +rmp-serde 1.3.1 - MIT https://github.com/3Hren/msgpack-rust MIT License @@ -8151,10 +8747,10 @@ Apache License --------------------------------------------------------- -rustc-demangle 0.1.24 - MIT/Apache-2.0 -https://github.com/rust-lang/rustc-demangle - -Copyright (c) 2014 Alex Crichton +rustix 0.37.28 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +rustix 0.38.44 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +rustix 1.1.3 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/rustix Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -8183,9 +8779,24 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -rustix 0.37.27 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT -rustix 0.38.34 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT -https://github.com/bytecodealliance/rustix +rustls-pemfile 1.0.4 - Apache-2.0 OR ISC OR MIT +https://github.com/rustls/pemfile + +rustls-pemfile is distributed under the following three licenses: + +- Apache License version 2.0. +- MIT license. +- ISC license. + +These are included as LICENSE-APACHE, LICENSE-MIT and LICENSE-ISC +respectively. You may use this software under the terms of any +of these licenses, at your option. +--------------------------------------------------------- + +--------------------------------------------------------- + +rustversion 1.0.22 - MIT OR Apache-2.0 +https://github.com/dtolnay/rustversion Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -8214,23 +8825,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -rustls-pemfile 1.0.4 - Apache-2.0 OR ISC OR MIT -https://github.com/rustls/pemfile - -rustls-pemfile is distributed under the following three licenses: - -- Apache License version 2.0. -- MIT license. -- ISC license. - -These are included as LICENSE-APACHE, LICENSE-MIT and LICENSE-ISC -respectively. You may use this software under the terms of any -of these licenses, at your option. ---------------------------------------------------------- - ---------------------------------------------------------- - -ryu 1.0.18 - Apache-2.0 OR BSL-1.0 +ryu 1.0.23 - Apache-2.0 OR BSL-1.0 https://github.com/dtolnay/ryu @@ -8250,7 +8845,7 @@ be dual licensed as above, without any additional terms or conditions. --------------------------------------------------------- -schannel 0.1.23 - MIT +schannel 0.1.28 - MIT https://github.com/steffengy/schannel-rs The MIT License (MIT) @@ -8298,7 +8893,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -secret-service 3.0.1 - MIT OR Apache-2.0 +secret-service 3.1.0 - MIT OR Apache-2.0 https://github.com/hwchen/secret-service-rs Copyright (c) 2025 secret-service Developers @@ -8330,7 +8925,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -security-framework 2.11.0 - MIT OR Apache-2.0 +security-framework 2.11.1 - MIT OR Apache-2.0 https://github.com/kornelski/rust-security-framework The MIT License (MIT) @@ -8357,7 +8952,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -security-framework-sys 2.11.0 - MIT OR Apache-2.0 +security-framework-sys 2.15.0 - MIT OR Apache-2.0 https://github.com/kornelski/rust-security-framework The MIT License (MIT) @@ -8384,7 +8979,37 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -serde 1.0.202 - MIT OR Apache-2.0 +semver 1.0.27 - MIT OR Apache-2.0 +https://github.com/dtolnay/semver + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +serde 1.0.228 - MIT OR Apache-2.0 https://github.com/serde-rs/serde Permission is hereby granted, free of charge, to any @@ -8414,7 +9039,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -serde_bytes 0.11.14 - MIT OR Apache-2.0 +serde_bytes 0.11.19 - MIT OR Apache-2.0 https://github.com/serde-rs/bytes Permission is hereby granted, free of charge, to any @@ -8444,7 +9069,37 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -serde_derive 1.0.202 - MIT OR Apache-2.0 +serde_core 1.0.228 - MIT OR Apache-2.0 +https://github.com/serde-rs/serde + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +serde_derive 1.0.228 - MIT OR Apache-2.0 https://github.com/serde-rs/serde Permission is hereby granted, free of charge, to any @@ -8474,7 +9129,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -serde_json 1.0.117 - MIT OR Apache-2.0 +serde_json 1.0.149 - MIT OR Apache-2.0 https://github.com/serde-rs/json Permission is hereby granted, free of charge, to any @@ -8504,7 +9159,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -serde_repr 0.1.19 - MIT OR Apache-2.0 +serde_repr 0.1.20 - MIT OR Apache-2.0 https://github.com/dtolnay/serde-repr Permission is hereby granted, free of charge, to any @@ -8662,7 +9317,7 @@ Unless you explicitly state otherwise, any contribution intentionally submitted --------------------------------------------------------- -sha2 0.10.8 - MIT OR Apache-2.0 +sha2 0.10.9 - MIT OR Apache-2.0 https://github.com/RustCrypto/hashes All crates in this repository are licensed under either of @@ -8790,7 +9445,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -shell-words 1.1.0 - MIT/Apache-2.0 +shell-words 1.1.1 - MIT/Apache-2.0 https://github.com/tmiasko/shell-words Copyright (c) 2016 Tomasz Miąsko @@ -8822,44 +9477,38 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -signal-hook-registry 1.4.2 - Apache-2.0/MIT -https://github.com/vorner/signal-hook +shlex 1.3.0 - MIT OR Apache-2.0 +https://github.com/comex/rust-shlex -Copyright (c) 2017 tokio-jsonrpc developers +The MIT License (MIT) -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: +Copyright (c) 2015 Nicholas Allegra (comex). -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- -slab 0.4.9 - MIT -https://github.com/tokio-rs/slab +--------------------------------------------------------- -The MIT License (MIT) +signal-hook-registry 1.4.8 - MIT OR Apache-2.0 +https://github.com/vorner/signal-hook -Copyright (c) 2019 Carl Lerche +Copyright (c) 2017 tokio-jsonrpc developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -8888,10 +9537,72 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -smallvec 1.13.2 - MIT OR Apache-2.0 -https://github.com/servo/rust-smallvec +simd-adler32 0.3.8 - MIT +https://github.com/mcountryman/simd-adler32 -Copyright (c) 2018 The Servo Project Developers +MIT License + +Copyright (c) [2021] [Marvin Countryman] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +slab 0.4.12 - MIT +https://github.com/tokio-rs/slab + +The MIT License (MIT) + +Copyright (c) 2019 Carl Lerche + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +smallvec 1.15.1 - MIT OR Apache-2.0 +https://github.com/servo/rust-smallvec + +Copyright (c) 2018 The Servo Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -8921,7 +9632,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- socket2 0.4.10 - MIT OR Apache-2.0 -socket2 0.5.7 - MIT OR Apache-2.0 +socket2 0.5.10 - MIT OR Apache-2.0 +socket2 0.6.2 - MIT OR Apache-2.0 https://github.com/rust-lang/socket2 Copyright (c) 2014 Alex Crichton @@ -8953,7 +9665,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -stable_deref_trait 1.2.0 - MIT/Apache-2.0 +stable_deref_trait 1.2.1 - MIT OR Apache-2.0 https://github.com/storyyeller/stable_deref_trait Copyright (c) 2017 Robert Grosse @@ -9043,7 +9755,7 @@ SOFTWARE. --------------------------------------------------------- -subtle 2.5.0 - BSD-3-Clause +subtle 2.6.1 - BSD-3-Clause https://github.com/dalek-cryptography/subtle Copyright (c) 2016-2017 Isis Agora Lovecruft, Henry de Valence. All rights reserved. @@ -9080,7 +9792,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------- syn 1.0.109 - MIT OR Apache-2.0 -syn 2.0.65 - MIT OR Apache-2.0 +syn 2.0.115 - MIT OR Apache-2.0 https://github.com/dtolnay/syn Permission is hereby granted, free of charge, to any @@ -9293,7 +10005,7 @@ Apache License --------------------------------------------------------- -synstructure 0.13.1 - MIT +synstructure 0.13.2 - MIT https://github.com/mystor/synstructure The MIT License (MIT) @@ -9401,7 +10113,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -tar 0.4.40 - MIT/Apache-2.0 +tar 0.4.44 - MIT OR Apache-2.0 https://github.com/alexcrichton/tar-rs Copyright (c) The tar-rs Project Contributors @@ -9433,7 +10145,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -tempfile 3.10.1 - MIT OR Apache-2.0 +tempfile 3.25.0 - MIT OR Apache-2.0 https://github.com/Stebalien/tempfile Copyright (c) 2015 Steven Allen @@ -9465,7 +10177,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -thiserror 1.0.61 - MIT OR Apache-2.0 +thiserror 1.0.69 - MIT OR Apache-2.0 https://github.com/dtolnay/thiserror Permission is hereby granted, free of charge, to any @@ -9495,7 +10207,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -thiserror-impl 1.0.61 - MIT OR Apache-2.0 +thiserror-impl 1.0.69 - MIT OR Apache-2.0 https://github.com/dtolnay/thiserror Permission is hereby granted, free of charge, to any @@ -9525,7 +10237,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -time 0.3.36 - MIT OR Apache-2.0 +time 0.3.47 - MIT OR Apache-2.0 https://github.com/time-rs/time Copyright (c) Jacob Pratt et al. @@ -9551,7 +10263,7 @@ SOFTWARE. --------------------------------------------------------- -time-core 0.1.2 - MIT OR Apache-2.0 +time-core 0.1.8 - MIT OR Apache-2.0 https://github.com/time-rs/time Copyright (c) Jacob Pratt et al. @@ -9577,7 +10289,7 @@ SOFTWARE. --------------------------------------------------------- -tinystr 0.7.6 - Unicode-3.0 +tinystr 0.8.2 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -9630,7 +10342,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -tokio 1.38.2 - MIT +tokio 1.49.0 - MIT https://github.com/tokio-rs/tokio MIT License @@ -9658,7 +10370,7 @@ SOFTWARE. --------------------------------------------------------- -tokio-macros 2.3.0 - MIT +tokio-macros 2.6.0 - MIT https://github.com/tokio-rs/tokio MIT License @@ -9720,7 +10432,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -tokio-stream 0.1.15 - MIT +tokio-stream 0.1.18 - MIT https://github.com/tokio-rs/tokio MIT License @@ -9777,7 +10489,7 @@ THE SOFTWARE. --------------------------------------------------------- -tokio-util 0.7.11 - MIT +tokio-util 0.7.18 - MIT https://github.com/tokio-rs/tokio MIT License @@ -9805,7 +10517,7 @@ SOFTWARE. --------------------------------------------------------- -toml_datetime 0.6.6 - MIT OR Apache-2.0 +toml_datetime 0.6.11 - MIT OR Apache-2.0 https://github.com/toml-rs/toml ../../LICENSE-MIT @@ -9821,7 +10533,7 @@ https://github.com/toml-rs/toml --------------------------------------------------------- -tower-service 0.3.2 - MIT +tower-service 0.3.3 - MIT https://github.com/tower-rs/tower The MIT License (MIT) @@ -9855,7 +10567,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -tracing 0.1.40 - MIT +tracing 0.1.44 - MIT https://github.com/tokio-rs/tracing The MIT License (MIT) @@ -9889,7 +10601,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -tracing-attributes 0.1.27 - MIT +tracing-attributes 0.1.31 - MIT https://github.com/tokio-rs/tracing The MIT License (MIT) @@ -9923,7 +10635,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -tracing-core 0.1.32 - MIT +tracing-core 0.1.36 - MIT https://github.com/tokio-rs/tracing The MIT License (MIT) @@ -10041,7 +10753,7 @@ MIT License --------------------------------------------------------- -typenum 1.17.0 - MIT OR Apache-2.0 +typenum 1.19.0 - MIT OR Apache-2.0 https://github.com/paholg/typenum MIT OR Apache-2.0 @@ -10077,7 +10789,7 @@ MIT License --------------------------------------------------------- -unicode-ident 1.0.12 - (MIT OR Apache-2.0) AND Unicode-DFS-2016 +unicode-ident 1.0.23 - (MIT OR Apache-2.0) AND Unicode-3.0 https://github.com/dtolnay/unicode-ident Permission is hereby granted, free of charge, to any @@ -10107,7 +10819,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -unicode-width 0.1.12 - MIT OR Apache-2.0 +unicode-width 0.2.2 - MIT OR Apache-2.0 https://github.com/unicode-rs/unicode-width Copyright (c) 2015 The Rust Project Developers @@ -10139,7 +10851,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -unicode-xid 0.2.4 - MIT OR Apache-2.0 +unicode-xid 0.2.6 - MIT OR Apache-2.0 https://github.com/unicode-rs/unicode-xid Copyright (c) 2015 The Rust Project Developers @@ -10171,7 +10883,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -url 2.5.4 - MIT OR Apache-2.0 +url 2.5.8 - MIT OR Apache-2.0 https://github.com/servo/rust-url Copyright (c) 2013-2025 The rust-url developers @@ -10262,38 +10974,6 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -utf16_iter 1.0.5 - Apache-2.0 OR MIT -https://github.com/hsivonen/utf16_iter - -Copyright Mozilla Foundation - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - utf8_iter 1.0.4 - Apache-2.0 OR MIT https://github.com/hsivonen/utf8_iter @@ -10326,7 +11006,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -utf8parse 0.2.1 - Apache-2.0 OR MIT +utf8parse 0.2.2 - Apache-2.0 OR MIT https://github.com/alacritty/vte Copyright (c) 2016 Joe Wilm @@ -10358,7 +11038,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -uuid 1.8.0 - Apache-2.0 OR MIT +uuid 1.20.0 - Apache-2.0 OR MIT https://github.com/uuid-rs/uuid Copyright (c) 2014 The Rust Project Developers @@ -10423,7 +11103,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -version_check 0.9.4 - MIT/Apache-2.0 +version_check 0.9.5 - MIT/Apache-2.0 https://github.com/SergioBenitez/version_check The MIT License (MIT) @@ -10507,7 +11187,7 @@ THE SOFTWARE. --------------------------------------------------------- -wasi 0.11.0+wasi-snapshot-preview1 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +wasi 0.11.1+wasi-snapshot-preview1 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT wasi 0.9.0+wasi-snapshot-preview1 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT https://github.com/bytecodealliance/wasi-rs @@ -10538,10 +11218,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -wasm-bindgen 0.2.92 - MIT OR Apache-2.0 -https://github.com/wasm-bindgen/wasm-bindgen - -Copyright (c) 2014 Alex Crichton +wasip2 1.0.2+wasi-0.2.9 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wasi-rs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -10570,10 +11248,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -wasm-bindgen-backend 0.2.92 - MIT OR Apache-2.0 -https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/backend - -Copyright (c) 2014 Alex Crichton +wasip3 0.4.0+wasi-0.3.0-rc-2026-01-06 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wasi-rs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -10602,8 +11278,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -wasm-bindgen-futures 0.4.42 - MIT OR Apache-2.0 -https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/futures +wasm-bindgen 0.2.108 - MIT OR Apache-2.0 +https://github.com/wasm-bindgen/wasm-bindgen Copyright (c) 2014 Alex Crichton @@ -10634,8 +11310,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -wasm-bindgen-macro 0.2.92 - MIT OR Apache-2.0 -https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro +wasm-bindgen-futures 0.4.58 - MIT OR Apache-2.0 +https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/futures Copyright (c) 2014 Alex Crichton @@ -10666,8 +11342,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -wasm-bindgen-macro-support 0.2.92 - MIT OR Apache-2.0 -https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro-support +wasm-bindgen-macro 0.2.108 - MIT OR Apache-2.0 +https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro Copyright (c) 2014 Alex Crichton @@ -10698,8 +11374,8 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -wasm-bindgen-shared 0.2.92 - MIT OR Apache-2.0 -https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/shared +wasm-bindgen-macro-support 0.2.108 - MIT OR Apache-2.0 +https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro-support Copyright (c) 2014 Alex Crichton @@ -10730,8 +11406,10 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -wasm-streams 0.4.0 - MIT OR Apache-2.0 -https://github.com/MattiasBuelens/wasm-streams/ +wasm-bindgen-shared 0.2.108 - MIT OR Apache-2.0 +https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/shared + +Copyright (c) 2014 Alex Crichton Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -10760,493 +11438,1948 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -web-sys 0.3.69 - MIT OR Apache-2.0 -https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/web-sys - -Copyright (c) 2014 Alex Crichton +wasm-encoder 0.244.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-encoder -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- +1. Definitions. ---------------------------------------------------------- + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -winapi 0.3.9 - MIT/Apache-2.0 -https://github.com/retep998/winapi-rs + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Copyright (c) 2015-2018 The winapi-rs Developers + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ---------------------------------------------------------- + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. ---------------------------------------------------------- + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -winapi-i686-pc-windows-gnu 0.4.0 - MIT/Apache-2.0 -https://github.com/retep998/winapi-rs + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Copyright (c) 2015-2018 The winapi-rs Developers + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ---------------------------------------------------------- +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. ---------------------------------------------------------- +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -winapi-x86_64-pc-windows-gnu 0.4.0 - MIT/Apache-2.0 -https://github.com/retep998/winapi-rs + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -Copyright (c) 2015-2018 The winapi-rs Developers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ---------------------------------------------------------- + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and ---------------------------------------------------------- + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -windows-core 0.52.0 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -MIT License +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. - Copyright (c) Microsoft Corporation. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE ---------------------------------------------------------- +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. ---------------------------------------------------------- +END OF TERMS AND CONDITIONS -windows-sys 0.48.0 - MIT OR Apache-2.0 -windows-sys 0.52.0 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs +APPENDIX: How to apply the Apache License to your work. -MIT License + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - Copyright (c) Microsoft Corporation. +Copyright [yyyy] [name of copyright owner] - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. --------------------------------------------------------- --------------------------------------------------------- -windows-targets 0.48.5 - MIT OR Apache-2.0 -windows-targets 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs - -MIT License - - Copyright (c) Microsoft Corporation. +wasm-metadata 0.244.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-metadata - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE ---------------------------------------------------------- +1. Definitions. ---------------------------------------------------------- + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -windows_aarch64_gnullvm 0.48.5 - MIT OR Apache-2.0 -windows_aarch64_gnullvm 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -MIT License + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. - Copyright (c) Microsoft Corporation. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE ---------------------------------------------------------- + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). ---------------------------------------------------------- + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -windows_aarch64_msvc 0.48.5 - MIT OR Apache-2.0 -windows_aarch64_msvc 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -MIT License + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. - Copyright (c) Microsoft Corporation. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE ---------------------------------------------------------- + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and ---------------------------------------------------------- + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -windows_i686_gnu 0.48.5 - MIT OR Apache-2.0 -windows_i686_gnu 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -MIT License + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - Copyright (c) Microsoft Corporation. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE ---------------------------------------------------------- +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. ---------------------------------------------------------- +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -windows_i686_gnullvm 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -MIT License +END OF TERMS AND CONDITIONS - Copyright (c) Microsoft Corporation. +APPENDIX: How to apply the Apache License to your work. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Copyright [yyyy] [name of copyright owner] - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE ---------------------------------------------------------- +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at ---------------------------------------------------------- + http://www.apache.org/licenses/LICENSE-2.0 -windows_i686_msvc 0.48.5 - MIT OR Apache-2.0 -windows_i686_msvc 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--------------------------------------------------------- -MIT License +--------------------------------------------------------- - Copyright (c) Microsoft Corporation. +wasm-streams 0.4.2 - MIT OR Apache-2.0 +https://github.com/MattiasBuelens/wasm-streams/ - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -windows_x86_64_gnu 0.48.5 - MIT OR Apache-2.0 -windows_x86_64_gnu 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs - -MIT License +wasmparser 0.244.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasmparser - Copyright (c) Microsoft Corporation. +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +1. Definitions. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE ---------------------------------------------------------- + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. ---------------------------------------------------------- + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -windows_x86_64_gnullvm 0.48.5 - MIT OR Apache-2.0 -windows_x86_64_gnullvm 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -MIT License + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - Copyright (c) Microsoft Corporation. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. --------------------------------------------------------- --------------------------------------------------------- -windows_x86_64_msvc 0.48.5 - MIT OR Apache-2.0 -windows_x86_64_msvc 0.52.5 - MIT OR Apache-2.0 -https://github.com/microsoft/windows-rs +web-sys 0.3.85 - MIT OR Apache-2.0 +https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/web-sys + +Copyright (c) 2014 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +web-time 1.1.0 - MIT OR Apache-2.0 +https://github.com/daxpedda/web-time MIT License - Copyright (c) Microsoft Corporation. +Copyright (c) 2023 dAxpeDDa - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- ---------------------------------------------------------- +--------------------------------------------------------- + +winapi 0.3.9 - MIT/Apache-2.0 +https://github.com/retep998/winapi-rs + +Copyright (c) 2015-2018 The winapi-rs Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +winapi-i686-pc-windows-gnu 0.4.0 - MIT/Apache-2.0 +https://github.com/retep998/winapi-rs + +Copyright (c) 2015-2018 The winapi-rs Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +winapi-x86_64-pc-windows-gnu 0.4.0 - MIT/Apache-2.0 +https://github.com/retep998/winapi-rs + +Copyright (c) 2015-2018 The winapi-rs Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-core 0.62.2 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-implement 0.60.2 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-interface 0.59.3 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-link 0.2.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-result 0.4.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-strings 0.5.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-sys 0.48.0 - MIT OR Apache-2.0 +windows-sys 0.52.0 - MIT OR Apache-2.0 +windows-sys 0.59.0 - MIT OR Apache-2.0 +windows-sys 0.60.2 - MIT OR Apache-2.0 +windows-sys 0.61.2 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows-targets 0.48.5 - MIT OR Apache-2.0 +windows-targets 0.52.6 - MIT OR Apache-2.0 +windows-targets 0.53.5 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.48.5 - MIT OR Apache-2.0 +windows_aarch64_gnullvm 0.52.6 - MIT OR Apache-2.0 +windows_aarch64_gnullvm 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_aarch64_msvc 0.48.5 - MIT OR Apache-2.0 +windows_aarch64_msvc 0.52.6 - MIT OR Apache-2.0 +windows_aarch64_msvc 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_i686_gnu 0.48.5 - MIT OR Apache-2.0 +windows_i686_gnu 0.52.6 - MIT OR Apache-2.0 +windows_i686_gnu 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_i686_gnullvm 0.52.6 - MIT OR Apache-2.0 +windows_i686_gnullvm 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_i686_msvc 0.48.5 - MIT OR Apache-2.0 +windows_i686_msvc 0.52.6 - MIT OR Apache-2.0 +windows_i686_msvc 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_x86_64_gnu 0.48.5 - MIT OR Apache-2.0 +windows_x86_64_gnu 0.52.6 - MIT OR Apache-2.0 +windows_x86_64_gnu 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.48.5 - MIT OR Apache-2.0 +windows_x86_64_gnullvm 0.52.6 - MIT OR Apache-2.0 +windows_x86_64_gnullvm 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +windows_x86_64_msvc 0.48.5 - MIT OR Apache-2.0 +windows_x86_64_msvc 0.52.6 - MIT OR Apache-2.0 +windows_x86_64_msvc 0.53.1 - MIT OR Apache-2.0 +https://github.com/microsoft/windows-rs + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +--------------------------------------------------------- + +--------------------------------------------------------- + +winnow 0.5.40 - MIT +https://github.com/winnow-rs/winnow + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +winreg 0.50.0 - MIT +winreg 0.8.0 - MIT +https://github.com/gentoo90/winreg-rs + +The MIT License (MIT) + +Copyright (c) 2015 Igor Shaula + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +wit-bindgen 0.51.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wit-bindgen + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +wit-bindgen-core 0.51.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wit-bindgen + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +wit-bindgen-rust 0.51.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wit-bindgen + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +wit-bindgen-rust-macro 0.51.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wit-bindgen + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +wit-component 0.244.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-component + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--------------------------------------------------------- + +--------------------------------------------------------- + +wit-parser 0.244.0 - Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT +https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-parser + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--------------------------------------------------------- + +--------------------------------------------------------- + +writeable 0.6.2 - Unicode-3.0 +https://github.com/unicode-org/icu4x + +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 2020-2024 Unicode, Inc. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. -winnow 0.5.40 - MIT -https://github.com/winnow-rs/winnow +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. -The MIT License (MIT) +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +SPDX-License-Identifier: Unicode-3.0 -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +— -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. +ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. --------------------------------------------------------- --------------------------------------------------------- -winreg 0.50.0 - MIT -winreg 0.8.0 - MIT -https://github.com/gentoo90/winreg-rs - -The MIT License (MIT) +xattr 1.6.1 - MIT OR Apache-2.0 +https://github.com/Stebalien/xattr -Copyright (c) 2015 Igor Shaula +Copyright (c) 2015 Steven Allen -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -write16 1.0.0 - Apache-2.0 OR MIT -https://github.com/hsivonen/write16 +xdg-home 1.3.0 - MIT +https://github.com/zeenix/xdg-home -Copyright Mozilla Foundation +The MIT License (MIT) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -11275,7 +13408,74 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -writeable 0.5.5 - Unicode-3.0 +yasna 0.5.2 - MIT OR Apache-2.0 +https://github.com/qnighy/yasna.rs + +Copyright (c) 2016 Masaki Hara + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +yoke 0.8.1 - Unicode-3.0 +https://github.com/unicode-org/icu4x + +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 2020-2024 Unicode, Inc. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. + +SPDX-License-Identifier: Unicode-3.0 + +— + +Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. +ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. +--------------------------------------------------------- + +--------------------------------------------------------- + +yoke-derive 0.8.1 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -11328,10 +13528,112 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -xattr 1.3.1 - MIT/Apache-2.0 -https://github.com/Stebalien/xattr +zbus 3.15.2 - MIT +https://github.com/z-galaxy/zbus/ + +The MIT License (MIT) + +Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +zbus_macros 3.15.2 - MIT +https://github.com/z-galaxy/zbus/ + +The MIT License (MIT) + +Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +zbus_names 2.6.1 - MIT +https://github.com/z-galaxy/zbus/ + +The MIT License (MIT) + +Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +zerocopy 0.8.39 - BSD-2-Clause OR Apache-2.0 OR MIT +https://github.com/google/zerocopy -Copyright (c) 2015 Steven Allen +Copyright 2023 The Fuchsia Authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -11360,10 +13662,10 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -xdg-home 1.1.0 - MIT -https://github.com/zeenix/xdg-home +zerocopy-derive 0.8.39 - BSD-2-Clause OR Apache-2.0 OR MIT +https://github.com/google/zerocopy -The MIT License (MIT) +Copyright 2023 The Fuchsia Authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -11392,21 +13694,7 @@ DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -yasna 0.5.2 - MIT OR Apache-2.0 -https://github.com/qnighy/yasna.rs - -Copyright (c) 2016 Masaki Hara - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -yoke 0.7.5 - Unicode-3.0 +zerofrom 0.1.6 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -11459,7 +13747,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -yoke-derive 0.7.5 - Unicode-3.0 +zerofrom-derive 0.1.6 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -11512,84 +13800,53 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -zbus 3.15.2 - MIT -https://github.com/z-galaxy/zbus/ - -LICENSE-MIT ---------------------------------------------------------- - ---------------------------------------------------------- - -zbus_macros 3.15.2 - MIT -https://github.com/z-galaxy/zbus/ - -LICENSE-MIT ---------------------------------------------------------- - ---------------------------------------------------------- - -zbus_names 2.6.1 - MIT -https://github.com/z-galaxy/zbus/ - -LICENSE-MIT ---------------------------------------------------------- - ---------------------------------------------------------- - -zerofrom 0.1.5 - Unicode-3.0 -https://github.com/unicode-org/icu4x +zeroize 1.8.2 - Apache-2.0 OR MIT +https://github.com/RustCrypto/utils -UNICODE LICENSE V3 +All crates licensed under either of -COPYRIGHT AND PERMISSION NOTICE + * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) + * [MIT license](http://opensource.org/licenses/MIT) -Copyright © 2020-2024 Unicode, Inc. +at your option. -NOTICE TO USER: Carefully read the following legal agreement. BY -DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR -SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE -TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT -DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. +### Contribution -Permission is hereby granted, free of charge, to any person obtaining a -copy of data files and any associated documentation (the "Data Files") or -software and any associated documentation (the "Software") to deal in the -Data Files or Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, and/or sell -copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that either (a) -this copyright and permission notice appear with all copies of the Data -Files or Software, or (b) this copyright and permission notice appear in -associated Documentation. +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -THIRD PARTY RIGHTS. +[//]: # (badges) -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE -BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA -FILES OR SOFTWARE. +[chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg +[chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/260052-utils +[license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg +[deps-image]: https://deps.rs/repo/github/RustCrypto/utils/status.svg +[deps-link]: https://deps.rs/repo/github/RustCrypto/utils -Except as contained in this notice, the name of a copyright holder shall -not be used in advertising or otherwise to promote the sale, use or other -dealings in these Data Files or Software without prior written -authorization of the copyright holder. +[//]: # (crates) -SPDX-License-Identifier: Unicode-3.0 +[`aarch64-dit`]: ./aarch64-dit +[`blobby`]: ./blobby +[`block-buffer`]: ./block-buffer +[`block‑padding`]: ./block-padding +[`cmov`]: ./cmov +[`cpubits`]: ./cpubits +[`cpufeatures`]: ./cpufeatures +[`ctutils`]: ./ctutils +[`dbl`]: ./dbl +[`digest-io`]: ./digest-io +[`hex-literal`]: ./hex-literal +[`inout`]: ./inout +[`wycheproof2blb`]: ./wycheproof2blb +[`zeroize`]: ./zeroize -— +[//]: # (misc) -Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. -ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. +[Wycheproof]: https://github.com/google/wycheproof --------------------------------------------------------- --------------------------------------------------------- -zerofrom-derive 0.1.5 - Unicode-3.0 +zerotrie 0.2.3 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -11642,52 +13899,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -zeroize 1.7.0 - Apache-2.0 OR MIT -https://github.com/RustCrypto/utils - -All crates licensed under either of - - * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) - * [MIT license](http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. - -[//]: # (badges) - -[chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg -[chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/260052-utils -[license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg -[deps-image]: https://deps.rs/repo/github/RustCrypto/utils/status.svg -[deps-link]: https://deps.rs/repo/github/RustCrypto/utils - -[//]: # (crates) - -[`blobby`]: ./blobby -[`block-buffer`]: ./block-buffer -[`block‑padding`]: ./block-padding -[`cmov`]: ./cmov -[`collectable`]: ./collectable -[`cpufeatures`]: ./cpufeatures -[`dbl`]: ./dbl -[`digest-io`]: ./digest-io -[`hex-literal`]: ./hex-literal -[`inout`]: ./inout -[`opaque-debug`]: ./opaque-debug -[`wycheproof2blb`]: ./wycheproof2blb -[`zeroize`]: ./zeroize - -[//]: # (misc) - -[Wycheproof]: https://github.com/google/wycheproof ---------------------------------------------------------- - ---------------------------------------------------------- - -zerovec 0.10.4 - Unicode-3.0 +zerovec 0.11.5 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -11740,7 +13952,7 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a --------------------------------------------------------- -zerovec-derive 0.10.3 - Unicode-3.0 +zerovec-derive 0.11.2 - Unicode-3.0 https://github.com/unicode-org/icu4x UNICODE LICENSE V3 @@ -11824,10 +14036,68 @@ licences; see files named LICENSE.*.txt for details. --------------------------------------------------------- +zmij 1.0.21 - MIT +https://github.com/dtolnay/zmij + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + zvariant 3.15.2 - MIT https://github.com/z-galaxy/zbus/ -LICENSE-MIT +The MIT License (MIT) + +Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- @@ -11835,7 +14105,33 @@ LICENSE-MIT zvariant_derive 3.15.2 - MIT https://github.com/z-galaxy/zbus/ -LICENSE-MIT +The MIT License (MIT) + +Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- @@ -11843,5 +14139,31 @@ LICENSE-MIT zvariant_utils 1.0.1 - MIT https://github.com/z-galaxy/zbus/ -LICENSE-MIT +The MIT License (MIT) + +Copyright (c) 2024 Zeeshan Ali Khan & zbus contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. --------------------------------------------------------- \ No newline at end of file diff --git a/package.json b/package.json index ed33be9059f08..4978fb523e483 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.110.0", - "distro": "7314fffcb02a8ca77b33f974f69256250bed190e", + "distro": "1f2dfeb39feaf6ddf8e15132c1e49fcf8be5b796", "author": { "name": "Microsoft Corporation" }, From 36d424971f329ff7fd60d1edc573054f46663e69 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 23 Feb 2026 23:17:23 +0100 Subject: [PATCH 51/51] [html/css/json] update services (#297113) --- .../css-language-features/package-lock.json | 26 +++--- extensions/css-language-features/package.json | 2 +- .../server/package-lock.json | 32 ++++---- .../css-language-features/server/package.json | 4 +- .../client/src/autoInsertion.ts | 2 +- .../client/src/htmlClient.ts | 4 +- .../html-language-features/package-lock.json | 2 +- .../html-language-features/package.json | 2 +- .../server/package-lock.json | 40 +++++----- .../server/package.json | 6 +- .../server/src/htmlServer.ts | 15 ++-- .../json-language-features/package-lock.json | 80 +++++++++---------- .../json-language-features/package.json | 2 +- .../server/package-lock.json | 32 ++++---- .../server/package.json | 4 +- 15 files changed, 128 insertions(+), 125 deletions(-) diff --git a/extensions/css-language-features/package-lock.json b/extensions/css-language-features/package-lock.json index 3b3ff93fa4d3d..231eda54dba77 100644 --- a/extensions/css-language-features/package-lock.json +++ b/extensions/css-language-features/package-lock.json @@ -9,7 +9,7 @@ "version": "10.0.0", "license": "MIT", "dependencies": { - "vscode-languageclient": "^10.0.0-next.18", + "vscode-languageclient": "^10.0.0-next.20", "vscode-uri": "^3.1.0" }, "devDependencies": { @@ -85,35 +85,35 @@ "license": "MIT" }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.10", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.10.tgz", - "integrity": "sha512-P+UOjuG/B1zkLM+bGIdmBwSkDejxtgo6EjG0pIkwnFBI0a2Mb7od36uUu8CPbECeQuh+n3zGcNwDl16DhuJ5IA==", + "version": "9.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.11.tgz", + "integrity": "sha512-u6LElQNbSiE9OugEEmrUKwH6+8BpPz2S5MDHvQUqHL//I4Q8GPikKLOUf856UnbLkZdhxaPrExac1lA3XwpIPA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "10.0.0-next.18", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.18.tgz", - "integrity": "sha512-Dpcr0VEEf4SuMW17TFCuKovhvbCx6/tHTnmFyLW1KTJCdVmNG08hXVAmw8Z/izec7TQlzEvzw5PvRfYGzdtr5Q==", + "version": "10.0.0-next.20", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.20.tgz", + "integrity": "sha512-/tTHk+U2q+4YQeF3PLr+IlsQA7P2WQy+ZrOpe88VOJDfPer9knm4cz6aMrozSxwkts3q7X41WEf3uASxnaC3gQ==", "license": "MIT", "dependencies": { - "minimatch": "^10.0.3", + "minimatch": "^10.1.2", "semver": "^7.7.1", - "vscode-languageserver-protocol": "3.17.6-next.15" + "vscode-languageserver-protocol": "3.17.6-next.16" }, "engines": { "vscode": "^1.91.0" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.15.tgz", - "integrity": "sha512-aoWX1wwGCndzfrTRhGKVpKAPVy9+WYhUtZW/PJQfHODmVwhVwb4we68CgsQZRTl36t8ZqlSOO2c2TdBPW7hrCw==", + "version": "3.17.6-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.16.tgz", + "integrity": "sha512-kQTjXEuyxMbdmmZ3U+Lib3oUl12xEKNc73RtWxPSDS3TFtjVwt98Q1CUzfDA9EUpsA24M46Bl6q3sLe9AUOKyw==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.10", + "vscode-jsonrpc": "9.0.0-next.11", "vscode-languageserver-types": "3.17.6-next.6" } }, diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 5d25c2ca43a3f..1fd31eeae793b 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -994,7 +994,7 @@ ] }, "dependencies": { - "vscode-languageclient": "^10.0.0-next.18", + "vscode-languageclient": "^10.0.0-next.20", "vscode-uri": "^3.1.0" }, "devDependencies": { diff --git a/extensions/css-language-features/server/package-lock.json b/extensions/css-language-features/server/package-lock.json index 72e2e858443b4..b981dcd8f81f8 100644 --- a/extensions/css-language-features/server/package-lock.json +++ b/extensions/css-language-features/server/package-lock.json @@ -10,8 +10,8 @@ "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-css-languageservice": "^6.3.9", - "vscode-languageserver": "^10.0.0-next.15", + "vscode-css-languageservice": "^6.3.10", + "vscode-languageserver": "^10.0.0-next.16", "vscode-uri": "^3.1.0" }, "devDependencies": { @@ -52,9 +52,9 @@ "license": "MIT" }, "node_modules/vscode-css-languageservice": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.9.tgz", - "integrity": "sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==", + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", @@ -64,33 +64,33 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.10", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.10.tgz", - "integrity": "sha512-P+UOjuG/B1zkLM+bGIdmBwSkDejxtgo6EjG0pIkwnFBI0a2Mb7od36uUu8CPbECeQuh+n3zGcNwDl16DhuJ5IA==", + "version": "9.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.11.tgz", + "integrity": "sha512-u6LElQNbSiE9OugEEmrUKwH6+8BpPz2S5MDHvQUqHL//I4Q8GPikKLOUf856UnbLkZdhxaPrExac1lA3XwpIPA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageserver": { - "version": "10.0.0-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.15.tgz", - "integrity": "sha512-vs+bwci/lM83ZhrR9t8DcZ2AgS2CKx4i6Yw86teKKkqlzlrYWTixuBd9w6H/UP9s8EGBvii0jnbjQd6wsKJ0ig==", + "version": "10.0.0-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.16.tgz", + "integrity": "sha512-RbsYDOhddv1NtBCAR7+oVxxCmOpQUHhrtgUE0xz6J+BJGSCkfOqBCyLUIwSjKk2rK9llxUj/pR5aL8QCsXrxow==", "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "3.17.6-next.15" + "vscode-languageserver-protocol": "3.17.6-next.16" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.15.tgz", - "integrity": "sha512-aoWX1wwGCndzfrTRhGKVpKAPVy9+WYhUtZW/PJQfHODmVwhVwb4we68CgsQZRTl36t8ZqlSOO2c2TdBPW7hrCw==", + "version": "3.17.6-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.16.tgz", + "integrity": "sha512-kQTjXEuyxMbdmmZ3U+Lib3oUl12xEKNc73RtWxPSDS3TFtjVwt98Q1CUzfDA9EUpsA24M46Bl6q3sLe9AUOKyw==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.10", + "vscode-jsonrpc": "9.0.0-next.11", "vscode-languageserver-types": "3.17.6-next.6" } }, diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 17aaf4052137c..f030ee29057a7 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -11,8 +11,8 @@ "browser": "./dist/browser/cssServerMain", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-css-languageservice": "^6.3.9", - "vscode-languageserver": "^10.0.0-next.15", + "vscode-css-languageservice": "^6.3.10", + "vscode-languageserver": "^10.0.0-next.16", "vscode-uri": "^3.1.0" }, "devDependencies": { diff --git a/extensions/html-language-features/client/src/autoInsertion.ts b/extensions/html-language-features/client/src/autoInsertion.ts index 3c70839befe4a..3efb5e877f8b5 100644 --- a/extensions/html-language-features/client/src/autoInsertion.ts +++ b/extensions/html-language-features/client/src/autoInsertion.ts @@ -7,7 +7,7 @@ import { window, workspace, Disposable, TextDocument, Position, SnippetString, T import { Runtime } from './htmlClient'; import { LanguageParticipants } from './languageParticipants'; -export function activateAutoInsertion(provider: (kind: 'autoQuote' | 'autoClose', document: TextDocument, position: Position) => Thenable, languageParticipants: LanguageParticipants, runtime: Runtime): Disposable { +export function activateAutoInsertion(provider: (kind: 'autoQuote' | 'autoClose', document: TextDocument, position: Position) => Thenable, languageParticipants: LanguageParticipants, runtime: Runtime): Disposable { const disposables: Disposable[] = []; workspace.onDidChangeTextDocument(onDidChangeTextDocument, null, disposables); diff --git a/extensions/html-language-features/client/src/htmlClient.ts b/extensions/html-language-features/client/src/htmlClient.ts index 54fc91469da62..250b340cf6229 100644 --- a/extensions/html-language-features/client/src/htmlClient.ts +++ b/extensions/html-language-features/client/src/htmlClient.ts @@ -43,7 +43,7 @@ interface AutoInsertParams { } namespace AutoInsertRequest { - export const type: RequestType = new RequestType('html/autoInsert'); + export const type: RequestType = new RequestType('html/autoInsert'); } // experimental: semantic tokens @@ -209,7 +209,7 @@ async function startClientWithParticipants(languageParticipants: LanguagePartici toDispose.push(client.onRequest(CustomDataContent.type, customDataSource.getContent)); - const insertRequestor = (kind: 'autoQuote' | 'autoClose', document: TextDocument, position: Position): Promise => { + const insertRequestor = (kind: 'autoQuote' | 'autoClose', document: TextDocument, position: Position): Promise => { const param: AutoInsertParams = { kind, textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), diff --git a/extensions/html-language-features/package-lock.json b/extensions/html-language-features/package-lock.json index 46be23d97bee0..1e97c143679e7 100644 --- a/extensions/html-language-features/package-lock.json +++ b/extensions/html-language-features/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@vscode/extension-telemetry": "^0.9.8", - "vscode-languageclient": "^10.0.0-next.18", + "vscode-languageclient": "^10.0.0-next.10", "vscode-uri": "^3.1.0" }, "devDependencies": { diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 0e3d2a046ffa1..c31130450aad0 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -265,7 +265,7 @@ }, "dependencies": { "@vscode/extension-telemetry": "^0.9.8", - "vscode-languageclient": "^10.0.0-next.18", + "vscode-languageclient": "^10.0.0-next.10", "vscode-uri": "^3.1.0" }, "devDependencies": { diff --git a/extensions/html-language-features/server/package-lock.json b/extensions/html-language-features/server/package-lock.json index 1237a0d47fce6..6ed9f55f74a01 100644 --- a/extensions/html-language-features/server/package-lock.json +++ b/extensions/html-language-features/server/package-lock.json @@ -10,9 +10,9 @@ "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-css-languageservice": "^6.3.9", - "vscode-html-languageservice": "^5.6.1", - "vscode-languageserver": "^10.0.0-next.15", + "vscode-css-languageservice": "^6.3.10", + "vscode-html-languageservice": "^5.6.2", + "vscode-languageserver": "^10.0.0-next.16", "vscode-languageserver-textdocument": "^1.0.12", "vscode-uri": "^3.1.0" }, @@ -54,9 +54,9 @@ "license": "MIT" }, "node_modules/vscode-css-languageservice": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.9.tgz", - "integrity": "sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==", + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", @@ -66,9 +66,9 @@ } }, "node_modules/vscode-html-languageservice": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.1.tgz", - "integrity": "sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", @@ -78,33 +78,33 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.10", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.10.tgz", - "integrity": "sha512-P+UOjuG/B1zkLM+bGIdmBwSkDejxtgo6EjG0pIkwnFBI0a2Mb7od36uUu8CPbECeQuh+n3zGcNwDl16DhuJ5IA==", + "version": "9.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.11.tgz", + "integrity": "sha512-u6LElQNbSiE9OugEEmrUKwH6+8BpPz2S5MDHvQUqHL//I4Q8GPikKLOUf856UnbLkZdhxaPrExac1lA3XwpIPA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageserver": { - "version": "10.0.0-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.15.tgz", - "integrity": "sha512-vs+bwci/lM83ZhrR9t8DcZ2AgS2CKx4i6Yw86teKKkqlzlrYWTixuBd9w6H/UP9s8EGBvii0jnbjQd6wsKJ0ig==", + "version": "10.0.0-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.16.tgz", + "integrity": "sha512-RbsYDOhddv1NtBCAR7+oVxxCmOpQUHhrtgUE0xz6J+BJGSCkfOqBCyLUIwSjKk2rK9llxUj/pR5aL8QCsXrxow==", "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "3.17.6-next.15" + "vscode-languageserver-protocol": "3.17.6-next.16" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.15.tgz", - "integrity": "sha512-aoWX1wwGCndzfrTRhGKVpKAPVy9+WYhUtZW/PJQfHODmVwhVwb4we68CgsQZRTl36t8ZqlSOO2c2TdBPW7hrCw==", + "version": "3.17.6-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.16.tgz", + "integrity": "sha512-kQTjXEuyxMbdmmZ3U+Lib3oUl12xEKNc73RtWxPSDS3TFtjVwt98Q1CUzfDA9EUpsA24M46Bl6q3sLe9AUOKyw==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.10", + "vscode-jsonrpc": "9.0.0-next.11", "vscode-languageserver-types": "3.17.6-next.6" } }, diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index bdec7b48344d5..0e4f2b92a2f8c 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -10,9 +10,9 @@ "main": "./out/node/htmlServerMain", "dependencies": { "@vscode/l10n": "^0.0.18", - "vscode-css-languageservice": "^6.3.9", - "vscode-html-languageservice": "^5.6.1", - "vscode-languageserver": "^10.0.0-next.15", + "vscode-css-languageservice": "^6.3.10", + "vscode-html-languageservice": "^5.6.2", + "vscode-languageserver": "^10.0.0-next.16", "vscode-languageserver-textdocument": "^1.0.12", "vscode-uri": "^3.1.0" }, diff --git a/extensions/html-language-features/server/src/htmlServer.ts b/extensions/html-language-features/server/src/htmlServer.ts index 877c42f5c7cbf..c2c45dbc23e10 100644 --- a/extensions/html-language-features/server/src/htmlServer.ts +++ b/extensions/html-language-features/server/src/htmlServer.ts @@ -8,7 +8,10 @@ import { DocumentRangeFormattingRequest, Disposable, ServerCapabilities, ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, DocumentColorRequest, ColorPresentationRequest, TextDocumentSyncKind, NotificationType, RequestType0, DocumentFormattingRequest, FormattingOptions, TextEdit, - TextDocumentContentRequest + TextDocumentContentRequest, + TextDocumentContentParams, + CancellationToken, + TextDocumentContentResult } from 'vscode-languageserver'; import { getLanguageModes, LanguageModes, Settings, TextDocument, Position, Diagnostic, WorkspaceFolder, ColorInformation, @@ -52,7 +55,7 @@ interface AutoInsertParams { } namespace AutoInsertRequest { - export const type: RequestType = new RequestType('html/autoInsert'); + export const type: RequestType = new RequestType('html/autoInsert'); } // experimental: semantic tokens @@ -590,16 +593,16 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) }); }); - connection.onRequest(TextDocumentContentRequest.type, (params, token) => { - return runSafe(runtime, async () => { + connection.onRequest(TextDocumentContentRequest.type, (params: TextDocumentContentParams, token: CancellationToken) => { + return runSafe(runtime, async () => { for (const languageMode of languageModes.getAllModes()) { const content = await languageMode.getTextDocumentContent?.(params.uri); if (content) { return { text: content }; } } - return null; - }, null, `Error while computing text document content for ${params.uri}`, token); + return { text: '' }; + }, { text: '' }, `Error while computing text document content for ${params.uri}`, token); }); // Listen on the connection diff --git a/extensions/json-language-features/package-lock.json b/extensions/json-language-features/package-lock.json index 213518c3d0964..e5e1b9c133204 100644 --- a/extensions/json-language-features/package-lock.json +++ b/extensions/json-language-features/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@vscode/extension-telemetry": "^0.9.8", "request-light": "^0.8.0", - "vscode-languageclient": "^10.0.0-next.18" + "vscode-languageclient": "^10.0.0-next.20" }, "devDependencies": { "@types/node": "22.x" @@ -20,27 +20,6 @@ "vscode": "^1.77.0" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@microsoft/1ds-core-js": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.4.tgz", @@ -189,16 +168,37 @@ "vscode": "^1.75.0" } }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "license": "ISC", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -229,35 +229,35 @@ "license": "MIT" }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.10", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.10.tgz", - "integrity": "sha512-P+UOjuG/B1zkLM+bGIdmBwSkDejxtgo6EjG0pIkwnFBI0a2Mb7od36uUu8CPbECeQuh+n3zGcNwDl16DhuJ5IA==", + "version": "9.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.11.tgz", + "integrity": "sha512-u6LElQNbSiE9OugEEmrUKwH6+8BpPz2S5MDHvQUqHL//I4Q8GPikKLOUf856UnbLkZdhxaPrExac1lA3XwpIPA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "10.0.0-next.18", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.18.tgz", - "integrity": "sha512-Dpcr0VEEf4SuMW17TFCuKovhvbCx6/tHTnmFyLW1KTJCdVmNG08hXVAmw8Z/izec7TQlzEvzw5PvRfYGzdtr5Q==", + "version": "10.0.0-next.20", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.20.tgz", + "integrity": "sha512-/tTHk+U2q+4YQeF3PLr+IlsQA7P2WQy+ZrOpe88VOJDfPer9knm4cz6aMrozSxwkts3q7X41WEf3uASxnaC3gQ==", "license": "MIT", "dependencies": { - "minimatch": "^10.0.3", + "minimatch": "^10.1.2", "semver": "^7.7.1", - "vscode-languageserver-protocol": "3.17.6-next.15" + "vscode-languageserver-protocol": "3.17.6-next.16" }, "engines": { "vscode": "^1.91.0" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.15.tgz", - "integrity": "sha512-aoWX1wwGCndzfrTRhGKVpKAPVy9+WYhUtZW/PJQfHODmVwhVwb4we68CgsQZRTl36t8ZqlSOO2c2TdBPW7hrCw==", + "version": "3.17.6-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.16.tgz", + "integrity": "sha512-kQTjXEuyxMbdmmZ3U+Lib3oUl12xEKNc73RtWxPSDS3TFtjVwt98Q1CUzfDA9EUpsA24M46Bl6q3sLe9AUOKyw==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.10", + "vscode-jsonrpc": "9.0.0-next.11", "vscode-languageserver-types": "3.17.6-next.6" } }, diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index d5877954cde4b..fe0a23cb59101 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -190,7 +190,7 @@ "dependencies": { "@vscode/extension-telemetry": "^0.9.8", "request-light": "^0.8.0", - "vscode-languageclient": "^10.0.0-next.18" + "vscode-languageclient": "^10.0.0-next.20" }, "devDependencies": { "@types/node": "22.x" diff --git a/extensions/json-language-features/server/package-lock.json b/extensions/json-language-features/server/package-lock.json index 4761136e1bf2a..1623dfa4eecc4 100644 --- a/extensions/json-language-features/server/package-lock.json +++ b/extensions/json-language-features/server/package-lock.json @@ -12,8 +12,8 @@ "@vscode/l10n": "^0.0.18", "jsonc-parser": "^3.3.1", "request-light": "^0.8.0", - "vscode-json-languageservice": "^5.7.1", - "vscode-languageserver": "^10.0.0-next.15", + "vscode-json-languageservice": "^5.7.2", + "vscode-languageserver": "^10.0.0-next.16", "vscode-uri": "^3.1.0" }, "bin": { @@ -67,9 +67,9 @@ "license": "MIT" }, "node_modules/vscode-json-languageservice": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.7.1.tgz", - "integrity": "sha512-sMK2F8p7St0lJCr/4IfbQRoEUDUZRR7Ud0IiSl8I/JtN+m9Gv+FJlNkSAYns2R7Ebm/PKxqUuWYOfBej/rAdBQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.7.2.tgz", + "integrity": "sha512-WtKRDtJfFEmLrgtu+ODexOHm/6/krRF0k6t+uvkKIKW1Jh9ZIyxZQwJJwB3qhrEgvAxa37zbUg+vn+UyUK/U2w==", "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", @@ -80,33 +80,33 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "9.0.0-next.10", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.10.tgz", - "integrity": "sha512-P+UOjuG/B1zkLM+bGIdmBwSkDejxtgo6EjG0pIkwnFBI0a2Mb7od36uUu8CPbECeQuh+n3zGcNwDl16DhuJ5IA==", + "version": "9.0.0-next.11", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.11.tgz", + "integrity": "sha512-u6LElQNbSiE9OugEEmrUKwH6+8BpPz2S5MDHvQUqHL//I4Q8GPikKLOUf856UnbLkZdhxaPrExac1lA3XwpIPA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageserver": { - "version": "10.0.0-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.15.tgz", - "integrity": "sha512-vs+bwci/lM83ZhrR9t8DcZ2AgS2CKx4i6Yw86teKKkqlzlrYWTixuBd9w6H/UP9s8EGBvii0jnbjQd6wsKJ0ig==", + "version": "10.0.0-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.16.tgz", + "integrity": "sha512-RbsYDOhddv1NtBCAR7+oVxxCmOpQUHhrtgUE0xz6J+BJGSCkfOqBCyLUIwSjKk2rK9llxUj/pR5aL8QCsXrxow==", "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "3.17.6-next.15" + "vscode-languageserver-protocol": "3.17.6-next.16" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.6-next.15", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.15.tgz", - "integrity": "sha512-aoWX1wwGCndzfrTRhGKVpKAPVy9+WYhUtZW/PJQfHODmVwhVwb4we68CgsQZRTl36t8ZqlSOO2c2TdBPW7hrCw==", + "version": "3.17.6-next.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.16.tgz", + "integrity": "sha512-kQTjXEuyxMbdmmZ3U+Lib3oUl12xEKNc73RtWxPSDS3TFtjVwt98Q1CUzfDA9EUpsA24M46Bl6q3sLe9AUOKyw==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.0-next.10", + "vscode-jsonrpc": "9.0.0-next.11", "vscode-languageserver-types": "3.17.6-next.6" } }, diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 6534e6f0eca86..a2f249f0934f4 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -15,8 +15,8 @@ "@vscode/l10n": "^0.0.18", "jsonc-parser": "^3.3.1", "request-light": "^0.8.0", - "vscode-json-languageservice": "^5.7.1", - "vscode-languageserver": "^10.0.0-next.15", + "vscode-json-languageservice": "^5.7.2", + "vscode-languageserver": "^10.0.0-next.16", "vscode-uri": "^3.1.0" }, "devDependencies": {