mirror of
https://github.com/microsoft/vscode.git
synced 2026-07-01 03:57:15 +01:00
01cb792966
Replace the per-provider model picker actions with a single sessions-core ModelPicker that wraps the shared workbench ModelPickerActionItem. The core picker reads the available models from the active session's provider via the new ISessionsProvider.getModels API, remembers the last used model per provider per session type, and applies the selection through ISessionsProvider.setModel. Providers stay authoritative for their own behavior: - getModels resolves model metadata per provider (local/CLI/agent-host filter registered language models; cloud synthesizes metadata from its option group). - getModelPickerOptions lets each provider decide grouping, featured models and whether the Manage Models action is shown, instead of core branching on session type. - onDidChangeModels lets the core picker refresh when models change. Decouple the core picker from agent-host provider identity: the agent-host mobile combined config picker now publishes the neutral ActiveSessionUsesCombinedConfigPickerContext key, which the core picker uses to gate itself out on phone layouts. Add architecture guidelines: do not mirror runtime state into context keys, delegate provider-specific decisions to the provider, and avoid large mid-method comments. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
3.2 KiB
3.2 KiB
description, applyTo
| description | applyTo |
|---|---|
| VS Code coding guidelines — naming, style, types, strings, and code quality rules. Reference when writing or reviewing code. | src/vs/** |
Coding Guidelines
Canonical reference: https://github.com/microsoft/vscode/wiki/Coding-Guidelines
Also see the Source Code Organization wiki page.
Indentation
Use tabs, not spaces.
Naming
- PascalCase for types and enum values
- camelCase for functions, methods, properties, and local variables
- Use whole words when possible
Types
- Do not export types or functions unless shared across multiple components
- Do not introduce new types or values to the global namespace
Comments
- Use JSDoc style comments for functions, interfaces, enums, and classes
- Do not write large comments in the middle of a method or comments that explain a single line. If a line or block needs a paragraph of explanation to be understood, treat that as a signal that the code itself is unclear: extract a well-named function, introduce an explanatory variable, or simplify the logic instead. Keep any remaining inline comment to a brief note.
Strings
"double quotes"for user-visible strings that need localization'single quotes'for everything else- All user-visible strings must be externalized via
nls.localize()— no string concatenation, use{0}placeholders
UI Labels
- Title case for command labels, buttons, and menu items (each major word capitalized)
- Don't capitalize prepositions of four or fewer letters unless first or last word
- Sentence case for view titles/headings (only first word capitalized), no trailing period
Style
- Arrow functions over anonymous function expressions
- Only parenthesize arrow parameters when necessary:
x => x + xnot(x) => x + x - Always surround loop and conditional bodies with curly braces
- Open curly braces on the same line
- No surrounding whitespace in parenthesized constructs
- Prefer
export function x(…) {…}overexport const x = (…) => {…}at top-level scope (better stack traces)
Code Quality
- Include Microsoft copyright header in all files
- Prefer
async/awaitoverPromise.then() - Localize all user-facing messages
- Prefer named regex capture groups over numbered ones
- Do not use
anyorunknownunless absolutely necessary - Register disposables immediately after creation — use
DisposableStore,MutableDisposable, orthis._register() - Declare service dependencies in constructors via DI — never access services through
IInstantiationServiceelsewhere. In particular, do not lazily resolve a service withthis.instantiationService.invokeFunction(accessor => accessor.get(ISomeService)); add@ISomeServiceas a constructor parameter instead. If a constructor cycle prevents direct injection, break the cycle (e.g. pass the dependency into aninit()/wiring method from the orchestrator, or relocate the call) rather than reaching throughinvokeFunction/accessor.get. - Use
IEditorServiceto open editors, notIEditorGroupsService.activeGroup.openEditor - Avoid
bind()/call()/apply()solely forthis— prefer arrow functions - Avoid events for control flow between components — prefer direct method calls