Change:
Continuing This is just a flag in Example: In this case, vscode is in control of when and where to show this message.
Is a good name? Drop the ?
If I see some "messages" related to a debugger, I first think of something like DAP messages. I would only use this property to drive some feature in the UI and it feels good to tie it to that. But if feels awkward I don't have a strong opinion.

Discussion:
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; <del> import { IDebugService, IBreakpoint, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, BreakpointWidgetContext, IBreakpointEditorContribution, IBreakpointUpdateData, IDebugConfiguration, State, IDebugSession, DebuggerUiMessage } from 'vs/workbench/contrib/debug/common/debug'; </del> <ins> import { IDebugService, IBreakpoint, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, BreakpointWidgetContext, IBreakpointEditorContribution, IBreakpointUpdateData, IDebugConfiguration, State, IDebugSession, DebuggerString } from 'vs/workbench/contrib/debug/common/debug'; </ins> import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { BreakpointWidget } from 'vs/workbench/contrib/debug/browser/breakpointWidget'; import { IDisposable, dispose, disposeIfDisposable } from 'vs/base/common/lifecycle';

let langId: string | undefined; unverifiedMessage = debugService.getModel().getSessions().map(s => { const dbg = debugService.getAdapterManager().getDebugger(s.configuration.type); <del> const message = dbg?.uiMessages?.[DebuggerUiMessage.UnverifiedBreakpoints]; </del> <ins> const message = dbg?.strings?.[DebuggerString.UnverifiedBreakpoints]; </ins> if (message) { if (!langId) { // Lazily compute this, only if needed for some debug adapter

import { IViewDescriptorService } from 'vs/workbench/common/views'; import * as icons from 'vs/workbench/contrib/debug/browser/debugIcons'; import { DisassemblyView } from 'vs/workbench/contrib/debug/browser/disassemblyView'; <del> import { BREAKPOINTS_VIEW_ID, BREAKPOINT_EDITOR_CONTRIBUTION_ID, CONTEXT_BREAKPOINTS_EXIST, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_BREAKPOINT_INPUT_FOCUSED, CONTEXT_BREAKPOINT_ITEM_TYPE, CONTEXT_BREAKPOINT_SUPPORTS_CONDITION, CONTEXT_DEBUGGERS_AVAILABLE, CONTEXT_IN_DEBUG_MODE, DebuggerUiMessage, DEBUG_SCHEME, IBaseBreakpoint, IBreakpoint, IBreakpointEditorContribution, IDataBreakpoint, IDebugModel, IDebugService, IEnablement, IExceptionBreakpoint, IFunctionBreakpoint, IInstructionBreakpoint, State } from 'vs/workbench/contrib/debug/common/debug'; </del> <ins> import { BREAKPOINTS_VIEW_ID, BREAKPOINT_EDITOR_CONTRIBUTION_ID, CONTEXT_BREAKPOINTS_EXIST, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_BREAKPOINT_INPUT_FOCUSED, CONTEXT_BREAKPOINT_ITEM_TYPE, CONTEXT_BREAKPOINT_SUPPORTS_CONDITION, CONTEXT_DEBUGGERS_AVAILABLE, CONTEXT_IN_DEBUG_MODE, DebuggerString, DEBUG_SCHEME, IBaseBreakpoint, IBreakpoint, IBreakpointEditorContribution, IDataBreakpoint, IDebugModel, IDebugService, IEnablement, IExceptionBreakpoint, IFunctionBreakpoint, IInstructionBreakpoint, State } from 'vs/workbench/contrib/debug/common/debug'; </ins> import { Breakpoint, DataBreakpoint, ExceptionBreakpoint, FunctionBreakpoint, InstructionBreakpoint } from 'vs/workbench/contrib/debug/common/debugModel'; import { DisassemblyViewInput } from 'vs/workbench/contrib/debug/common/disassemblyViewInput'; import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';

const currentType = this.debugService.getViewModel().focusedSession?.configuration.type; const dbg = currentType ? this.debugService.getAdapterManager().getDebugger(currentType) : undefined; <del> const message = dbg?.uiMessages && dbg.uiMessages[DebuggerUiMessage.UnverifiedBreakpoints]; </del> <ins> const message = dbg?.strings?.[DebuggerString.UnverifiedBreakpoints]; </ins> const debuggerHasUnverifiedBps = message && this.debugService.getModel().getBreakpoints().filter(bp => { if (bp.verified || !bp.enabled) { return false;

export interface IDebuggerMetadata { label: string; type: string; <del> uiMessages?: { [key in DebuggerUiMessage]: string }; </del> <ins> strings?: { [key in DebuggerString]: string }; </ins> interestedInLanguage(languageId: string): boolean; }

variables?: { [key: string]: string }; when?: string; deprecated?: string; <del> uiMessages?: { [key in DebuggerUiMessage]: string }; </del> <ins> strings?: { [key in DebuggerString]: string }; </ins> } export interface IBreakpointContribution {

resolveConfigurationByProviders(folderUri: uri | undefined, type: string | undefined, debugConfiguration: any, token: CancellationToken): Promise<any>; } <del> export enum DebuggerUiMessage { </del> <ins> export enum DebuggerString { </ins> UnverifiedBreakpoints = 'unverifiedBreakpoints' }

type: 'string' } } <ins> }, strings: { description: nls.localize('vscode.extension.contributes.debuggers.strings', "UI strings contributed by this debug adapter."), type: 'object', properties: { unverifiedBreakpoints: { description: nls.localize('vscode.extension.contributes.debuggers.strings.unverifiedBreakpoints', "When there are unverified breakpoints in a language supported by this debug adapter, this message will appear on the breakpoint hover and in the breakpoints view. Markdown and command links are supported."), type: 'string' } } </ins> } } }

return !this.debuggerWhen || this.contextKeyService.contextMatchesRules(this.debuggerWhen); } <del> get uiMessages() { return this.debuggerContribution.uiMessages; </del> <ins> get strings() { return this.debuggerContribution.strings ?? (this.debuggerContribution as any).uiMessages; </ins> } interestedInLanguage(languageId: string): boolean {