sessionContextKeys.ts ×2

Frontier kind: Code frontier

unlabeled · c_aa84b55d89d3

5 tests · 13500 LOC · 89 files · introduces 0 tests · 293 LOC · 2 files

Introduces — evidence that enters the hierarchy at this concept

Code
3 ranges293 lines · 2 files
Tests
0 tests

Contains — complete concept membership

All code (extent)
1642 ranges13500 lines · 89 files · Browse complete extent
All tests (intent)
5 testsBrowse complete intent

Neighbourhood graph

The orange circle is the focus. Violet and green circles are every ancestor and descendant, broader and narrower, at any distance; blue squares and pink diamonds are the introduced files and exact introduced tests of every visible concept, not only the focus's. Arrows point from broader to narrower concepts and bridge only concepts omitted from this view. Undirected links show source or test introduction. Concept and file size follows LOC; exact test nodes use test-count units.

Introduced files, introduced tests, and structurally relevant concept specialization

In the embedded map, ordinary wheel input scrolls the page; use the visible controls to zoom and drag to pan. Open the full-screen map for canvas navigation: wheel pans, Ctrl/Command plus wheel zooms, and arrow keys pan when this region is focused. On touch screens, open the full-screen map to pan or pinch. If JavaScript or WebGL is unavailable, use the native relationship evidence on this page.

Graph controls are ready.

Interactive rendering requires JavaScript and WebGL. Use the native relationship evidence on this page while the interactive map is unavailable.

Native relationship evidence

Every exact file and test below is linked only from the concept that introduces it.

Introduced tests

Every collected test enters the hierarchy at exactly one concept.

No tests are introduced at this concept. Its intent tests are introduced by other concepts.

Introduced code

Every collected source range enters the hierarchy at exactly one concept.

2 files ranked by introduced lines: 293 introduced LOC across 3 ranges. Expand a file to inspect source; the > gutter marks introduced lines.

src/vs/sessions/services/sessions/common/sessionContextKeys.ts 170 introduced LOC · 2 ranges

Open complete file

1 > /*--------------------------------------------------------------------------------------------- sessionContextKeys.ts
2 > * Copyright (c) Microsoft Corporation. All rights reserved.
3 > * Licensed under the MIT License. See License.txt in the project root for license information.
4 > *--------------------------------------------------------------------------------------------*/
5 >
6 > import { IReader } from '../../../../base/common/observable.js';
7 > import { isEqual } from '../../../../base/common/resources.js';
8 > import { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
9 > import {
10 > SessionHasChangesContext,
11 > SessionHasPullRequestContext,
12 > SessionHasWorkspaceContext,
13 > IsQuickChatSessionContext,
14 > SessionIsArchivedContext,
15 > SessionIsCreatedContext,
16 > SessionIsReadContext,
17 > SessionIsStickyContext,
18 > SessionProviderIdContext,
19 > SessionSupportsDeleteContext,
20 > SessionSupportsMultipleChatsContext,
21 > SessionSupportsForkContext,
22 > SessionSupportsSideChatContext,
23 > SessionSupportsRenameContext,
24 > SessionTypeContext,
25 > SessionWorkspaceIsVirtualContext,
26 > SessionIdContext,
27 > SessionHasMultipleCommittedChatsContext,
28 > SessionShouldShowChatTabsContext,
29 > SessionHasMultipleOpenChatsContext,
30 > SessionActiveChatIsClosableContext,
31 > SessionActiveChatIsDeletableContext,
32 > SessionActiveChatHasSubagentsContext,
33 > SessionHasGitRepositoryContext,
34 > } from '../../../common/contextkeys.js';
35 > import { ChatOriginKind, getChatCapabilities, ISession, SessionStatus } from './session.js';
36 > import { IActiveSession } from './sessionsManagement.js';
37 >
38 > /**
39 > * The set of session context keys bound to a single {@link IContextKeyService}.
40 > */
41 > interface ISessionContextKeys {
42 > readonly sessionId: IContextKey<string>;
43 > readonly providerId: IContextKey<string>;
44 > readonly type: IContextKey<string>;
45 > readonly isArchived: IContextKey<boolean>;
46 > readonly isRead: IContextKey<boolean>;
47 > readonly supportsMultipleChats: IContextKey<boolean>;
48 > readonly supportsFork: IContextKey<boolean>;
49 > readonly supportsSideChat: IContextKey<boolean>;
50 > readonly supportsRename: IContextKey<boolean>;
51 > readonly supportsDelete: IContextKey<boolean>;
52 > readonly workspaceIsVirtual: IContextKey<boolean>;
53 > readonly hasGitRepository: IContextKey<boolean>;
54 > readonly hasChanges: IContextKey<boolean>;
55 > readonly hasPullRequest: IContextKey<boolean>;
56 > readonly hasWorkspace: IContextKey<boolean>;
57 > readonly isQuickChat: IContextKey<boolean>;
58 > readonly isCreated: IContextKey<boolean>;
59 > readonly sticky: IContextKey<boolean>;
60 > readonly hasMultipleCommittedChats: IContextKey<boolean>;
61 > readonly shouldShowChatTabs: IContextKey<boolean>;
62 > readonly hasMultipleOpenChats: IContextKey<boolean>;
63 > readonly activeChatIsClosable: IContextKey<boolean>;
64 > readonly activeChatIsDeletable: IContextKey<boolean>;
65 > readonly activeChatHasSubagents: IContextKey<boolean>;
66 > }
67 >
68 > /**
69 > * Caches the bound context keys per {@link IContextKeyService}. Binding a
70 > * {@link RawContextKey} resets it to its default value, so re-binding on every
71 > * call (these helpers run inside `autorun`s) would churn the keys and emit
72 > * spurious change events. Binding once per service and reusing the bound keys
73 > * lets {@link IContextKey.set} short-circuit unchanged values instead. The map
74 > * is weak so entries are released once the service is disposed and collected.
75 > */
76 > const boundKeysByService = new WeakMap<IContextKeyService, ISessionContextKeys>();
77 >
78 > function getBoundKeys(contextKeyService: IContextKeyService): ISessionContextKeys {
79 > let keys = boundKeysByService.get(contextKeyService);
80 > if (!keys) {
81 > keys = {
82 > sessionId: SessionIdContext.bindTo(contextKeyService),
83 > providerId: SessionProviderIdContext.bindTo(contextKeyService),
84 > type: SessionTypeContext.bindTo(contextKeyService),
85 > isArchived: SessionIsArchivedContext.bindTo(contextKeyService),
86 > isRead: SessionIsReadContext.bindTo(contextKeyService),
87 > supportsMultipleChats: SessionSupportsMultipleChatsContext.bindTo(contextKeyService),
88 > supportsFork: SessionSupportsForkContext.bindTo(contextKeyService),
89 > supportsSideChat: SessionSupportsSideChatContext.bindTo(contextKeyService),
90 > supportsRename: SessionSupportsRenameContext.bindTo(contextKeyService),
91 > supportsDelete: SessionSupportsDeleteContext.bindTo(contextKeyService),
92 > workspaceIsVirtual: SessionWorkspaceIsVirtualContext.bindTo(contextKeyService),
93 > hasGitRepository: SessionHasGitRepositoryContext.bindTo(contextKeyService),
94 > hasChanges: SessionHasChangesContext.bindTo(contextKeyService),
95 > hasPullRequest: SessionHasPullRequestContext.bindTo(contextKeyService),
96 > hasWorkspace: SessionHasWorkspaceContext.bindTo(contextKeyService),
97 > isQuickChat: IsQuickChatSessionContext.bindTo(contextKeyService),
98 > isCreated: SessionIsCreatedContext.bindTo(contextKeyService),
99 > sticky: SessionIsStickyContext.bindTo(contextKeyService),
100 > hasMultipleCommittedChats: SessionHasMultipleCommittedChatsContext.bindTo(contextKeyService),
101 > shouldShowChatTabs: SessionShouldShowChatTabsContext.bindTo(contextKeyService),
102 > hasMultipleOpenChats: SessionHasMultipleOpenChatsContext.bindTo(contextKeyService),
103 > activeChatIsClosable: SessionActiveChatIsClosableContext.bindTo(contextKeyService),
104 > activeChatIsDeletable: SessionActiveChatIsDeletableContext.bindTo(contextKeyService),
105 > activeChatHasSubagents: SessionActiveChatHasSubagentsContext.bindTo(contextKeyService),
106 > };
107 > boundKeysByService.set(contextKeyService, keys);
108 > }
109 > return keys;
110 > }
111 >
112 > /**
113 > * Sets every context key that can be derived from an {@link ISession} on the
114 > * given context key service. The service may be the global/root service (so the
115 > * keys reflect the active session) or a scoped service owned by an isolated
116 > * component (e.g. a session view), in which case the keys are scoped to that
117 > * component's session.
118 > *
119 > * When invoked from within an `autorun`/`derived`, pass the `reader` so the
120 > * observable session properties are tracked and the keys are re-applied on
121 > * change. Pass `undefined` for a one-shot read (equivalent to `.get()`).
122 > *
123 > * Passing `undefined` for `session` resets the keys to their defaults (e.g. for
124 > * the empty new-session slot).
125 > */
126 > export function setSessionContextKeys(session: ISession | undefined, contextKeyService: IContextKeyService, reader: IReader | undefined): void {
127 > const keys = getBoundKeys(contextKeyService);
128 > keys.sessionId.set(session?.sessionId ?? '');
129 > keys.providerId.set(session?.providerId ?? '');
130 > keys.type.set(session?.sessionType ?? '');
131 > keys.isArchived.set(session?.isArchived.read(reader) ?? false);
132 > keys.isRead.set(session?.isRead.read(reader) ?? true);
133 > const capabilities = session?.capabilities.read(reader);
134 > keys.supportsMultipleChats.set(capabilities?.supportsMultipleChats ?? false);
135 > keys.supportsFork.set(capabilities?.supportsFork ?? false);
136 > keys.supportsSideChat.set(capabilities?.supportsSideChat ?? false);
137 > keys.supportsRename.set(capabilities?.supportsRename ?? false);
138 > keys.supportsDelete.set(capabilities?.supportsDelete ?? false);
139 > const workspace = session?.workspace.read(reader);
140 > keys.workspaceIsVirtual.set(workspace?.isVirtualWorkspace ?? true);
141 > keys.hasGitRepository.set(session?.hasGitRepository?.read(reader) ?? workspace?.folders.some(folder => folder.gitRepository !== undefined) ?? false);
142 >
143 > // Mirror the changes pill: the default changeset, falling back to the session's changes.
144 > const defaultChangeset = session?.changesets.read(reader)?.find(c => c.isDefault.read(reader));
145 > let insertions = 0;
146 > let deletions = 0;
147 > for (const change of defaultChangeset?.changes.read(reader) ?? session?.changes.read(reader) ?? []) {
148 insertions += change.insertions;
149 deletions += change.deletions;
150 }
151 > keys.hasChanges.set(insertions > 0 || deletions > 0); sessionContextKeys.ts
152 >
153 > const pullRequest = session?.workspace.read(reader)?.folders[0]?.gitRepository?.gitHubInfo.read(reader)?.pullRequest;
154 > keys.hasPullRequest.set(!!pullRequest);
155 >
156 > keys.hasWorkspace.set(!!session?.workspace.read(reader)?.label);
157 >
158 > // Sourced from the session's `isQuickChat` tag — never inferred from
159 > // `workspace === undefined` (which is also transiently true for a
160 > // still-resolving workspace session).
161 > keys.isQuickChat.set(!!session && (session.isQuickChat?.read(reader) ?? false));
162 >
163 > }
164 >
165 > /**
166 > * Sets every context key that can be derived from an {@link IActiveSession} on
167 > * the given context key service. This is a superset of
168 > * {@link setSessionContextKeys} that also applies the keys which only exist on
169 > * an active (visible) session, then delegates to it for the shared keys.
170 > *
171 > * See {@link setSessionContextKeys} for the `reader` and `undefined` semantics.
172 > */
173 > export function setActiveSessionContextKeys(session: IActiveSession | undefined, contextKeyService: IContextKeyService, reader: IReader | undefined): void {
174 setSessionContextKeys(session, contextKeyService, reader);
175 const keys = getBoundKeys(contextKeyService);
src/vs/sessions/common/contextkeys.ts 123 introduced LOC · 1 range

Open complete file

1 > /*--------------------------------------------------------------------------------------------- contextkeys.ts
2 > * Copyright (c) Microsoft Corporation. All rights reserved.
3 > * Licensed under the MIT License. See License.txt in the project root for license information.
4 > *--------------------------------------------------------------------------------------------*/
5 >
6 > import { localize } from '../../nls.js';
7 > import { RawContextKey } from '../../platform/contextkey/common/contextkey.js';
8 >
9 > //#region < --- Active Session --- >
10 >
11 > export const IsNewChatSessionContext = new RawContextKey<boolean>('isNewChatSession', true);
12 > export const SessionIdContext = new RawContextKey<string>('sessionId', '', localize('sessionId', "The identifier of the session in scope (the active session globally, or a specific session within an isolated component such as the session view or a context menu overlay)"));
13 > export const SessionProviderIdContext = new RawContextKey<string>('sessionProviderId', '', localize('sessionProviderId', "The provider ID of the session in scope (the active session globally, or a specific session within an isolated component such as the session view or a context menu overlay)"));
14 > export const SessionTypeContext = new RawContextKey<string>('sessionType', '', localize('sessionType', "The session type of the session in scope (the active session globally, or a specific session within an isolated component such as the session view or a context menu overlay)"));
15 > export const SessionWorkspaceIsVirtualContext = new RawContextKey<boolean>('sessionWorkspaceIsVirtual', true, localize('sessionWorkspaceIsVirtual', "Whether the session's workspace is virtual"));
16 > export const SessionHasGitRepositoryContext = new RawContextKey<boolean>('sessionHasGitRepository', false, localize('sessionHasGitRepository', "Whether the session has a usable git repository"));
17 > export const SessionHasGitSyncActionRunningContext = new RawContextKey<boolean>('sessionHasGitSyncActionRunning', false, localize('sessionHasGitSyncActionRunning', "Whether the session has a git sync action currently running"));
18 > export const SessionUsesCombinedConfigPickerContext = new RawContextKey<boolean>('sessionUsesCombinedConfigPicker', false, localize('sessionUsesCombinedConfigPicker', "Whether the session's provider offers a combined mode and model configuration picker (used on phone layouts in place of the standalone pickers)"));
19 > export const SessionSupportsRenameContext = new RawContextKey<boolean>('sessionSupportsRename', false, localize('sessionSupportsRename', "Whether the session can be renamed"));
20 > export const SessionSupportsDeleteContext = new RawContextKey<boolean>('sessionSupportsDelete', false, localize('sessionSupportsDelete', "Whether the session can be deleted"));
21 >
22 > //#endregion
23 >
24 > //#region < --- Session View --- >
25 >
26 > export const SessionIsCreatedContext = new RawContextKey<boolean>('sessionIsCreated', false, localize('sessionIsCreated', "Whether the session view's session has been created (chat view shown, not new-session view)"));
27 > export const SessionIsStickyContext = new RawContextKey<boolean>('sessionIsSticky', false, localize('sessionIsSticky', "Whether the session view's session is sticky in the grid"));
28 > export const SessionIsMaximizedContext = new RawContextKey<boolean>('sessionIsMaximized', false, localize('sessionIsMaximized', "Whether the session view is currently maximized in the sessions part's grid"));
29 > export const SessionSupportsMultipleChatsContext = new RawContextKey<boolean>('sessionSupportsMultipleChats', false, localize('sessionSupportsMultipleChats', "Whether the session view's session supports multiple chats"));
30 > export const SessionSupportsForkContext = new RawContextKey<boolean>('sessionSupportsFork', false, localize('sessionSupportsFork', "Whether the session view's session supports forking a chat from a turn into a new peer chat"));
31 > export const SessionSupportsSideChatContext = new RawContextKey<boolean>('sessionSupportsSideChat', false, localize('sessionSupportsSideChat', "Whether the session view's session supports creating a side chat from a turn (via /btw)"));
32 > export const SessionHasMultipleCommittedChatsContext = new RawContextKey<boolean>('sessionHasMultipleCommittedChats', false, localize('sessionHasMultipleCommittedChats', "Whether the session view's session has more than one committed (non-draft) chat, which drives the Conversations menu visibility"));
33 > export const SessionActiveChatHasSubagentsContext = new RawContextKey<boolean>('sessionActiveChatHasSubagents', false, localize('sessionActiveChatHasSubagents', "Whether the session view's currently-active chat has spawned subagent (tool-origin) chats, which are listed as a separate group in the Conversations menu"));
34 > export const SessionShouldShowChatTabsContext = new RawContextKey<boolean>('sessionShouldShowChatTabs', false, localize('sessionShouldShowChatTabs', "Whether the session view's chat tab strip is shown, i.e. the session has more than one chat actually showing as a tab. A single visible tab always hides the strip. Used to hide the header New Chat button, which the tab strip then offers instead"));
35 > export const SessionHasMultipleOpenChatsContext = new RawContextKey<boolean>('sessionHasMultipleOpenChats', false, localize('sessionHasMultipleOpenChats', "Whether the session view's session has more than one open chat (the tabs shown in the strip, including in-composer drafts). Used to scope chat-to-chat navigation (next/previous chat, the Ctrl+Tab chat switcher)"));
36 > export const SessionActiveChatIsClosableContext = new RawContextKey<boolean>('sessionActiveChatIsClosable', false, localize('sessionActiveChatIsClosable', "Whether the session's active chat can be closed (hidden) from the tab strip, i.e. it is not the main chat. Includes read-only subagent chats. Used to scope the close-chat keybinding so it closes the tab instead of the session"));
37 > export const SessionActiveChatIsDeletableContext = new RawContextKey<boolean>('sessionActiveChatIsDeletable', false, localize('sessionActiveChatIsDeletable', "Whether the session's active chat can be permanently deleted from the tab strip, i.e. it is a real, user-created non-main chat (not the main chat and not a tool-spawned subagent chat, which are transient children). Used to scope the delete-chat keybinding"));
38 > export const SessionIsReadContext = new RawContextKey<boolean>('sessionIsRead', true, localize('sessionIsRead', "Whether the session has been marked as read"));
39 > export const SessionIsArchivedContext = new RawContextKey<boolean>('sessionIsArchived', false, localize('sessionIsArchived', "Whether the session in scope is archived/marked as done (the active session globally, or a specific session within an isolated component such as the session view or a context menu overlay)"));
40 > export const SessionHasChangesContext = new RawContextKey<boolean>('sessionHasChanges', false, localize('sessionHasChanges', "Whether the session view's session has pending changes (insertions or deletions)"));
41 > export const SessionHasPullRequestContext = new RawContextKey<boolean>('sessionHasPullRequest', false, localize('sessionHasPullRequest', "Whether the session view's session is associated with a GitHub pull request"));
42 > export const SessionHasWorkspaceContext = new RawContextKey<boolean>('sessionHasWorkspace', false, localize('sessionHasWorkspace', "Whether the session view's session has an associated workspace folder"));
43 > export const IsQuickChatSessionContext = new RawContextKey<boolean>('isQuickChatSession', false, localize('isQuickChatSession', "Whether the session in scope is a workspace-less quick chat"));
44 >
45 > //#endregion
46 >
47 > //#region < --- Sessions Part --- >
48 >
49 > export const ActiveSessionsContext = new RawContextKey<string>('activeSessions', '', localize('activeSessions', "The identifier of the active sessions panel"));
50 > export const SessionsFocusContext = new RawContextKey<boolean>('sessionsFocus', false, localize('sessionsFocus', "Whether the sessions part has keyboard focus"));
51 > export const SessionsVisibleContext = new RawContextKey<boolean>('sessionsVisible', false, localize('sessionsVisible', "Whether the sessions part is visible"));
52 > export const MultipleSessionsVisibleContext = new RawContextKey<boolean>('multipleSessionsVisible', false, localize('multipleSessionsVisible', "Whether more than one session is visible in the sessions part's grid"));
53 >
54 > //#endregion
55 >
56 > //#region < --- Welcome --- >
57 >
58 > export const SessionsWelcomeVisibleContext = new RawContextKey<boolean>('sessionsWelcomeVisible', false, localize('sessionsWelcomeVisible', "Whether the sessions welcome overlay is visible"));
59 >
60 > //#endregion
61 >
62 > //#region < --- Experiments --- >
63 >
64 > export const SessionsTitleBarNewSessionEnabledContext = new RawContextKey<boolean>('sessionsTitleBarNewSessionEnabled', false, localize('sessionsTitleBarNewSessionEnabled', "Whether the new-session button is shown in the titlebar when the sessions list is hidden (A/B experiment)"));
65 >
66 > //#endregion
67 >
68 > //#region < --- Workspace Picker --- >
69 >
70 > export const SessionWorkspacePickerGroupContext = new RawContextKey<string>('sessionWorkspacePickerGroup', '', localize('sessionWorkspacePickerGroup', "The currently active group tab in the session workspace picker"));
71 >
72 > //#endregion
73 >
74 > //#region < --- New Session Pickers --- >
75 >
76 > export const SessionWorkspacePickerVisibleContext = new RawContextKey<boolean>('sessionWorkspacePickerVisible', false, localize('sessionWorkspacePickerVisible', "Whether the new-session view's workspace picker is rendered (as opposed to being replaced by the no-agent-host empty state)"));
77 > export const SessionHarnessPickerVisibleContext = new RawContextKey<boolean>('sessionHarnessPickerVisible', false, localize('sessionHarnessPickerVisible', "Whether the new-session view's harness (session type) picker is visible — it is hidden when at most one harness can serve the selected workspace"));
78 > export const SessionIsolationPickerVisibleContext = new RawContextKey<boolean>('sessionIsolationPickerVisible', false, localize('sessionIsolationPickerVisible', "Whether the new-session view's isolation picker is visible — it is shown only when the isolation option is enabled and the workspace has a git repository"));
79 >
80 > //#endregion
81 >
82 > //#region < --- Sessions Picker --- >
83 >
84 > export const SessionsPickerVisibleContext = new RawContextKey<boolean>('sessionsPickerVisible', false, localize('sessionsPickerVisible', "Whether the sessions picker is visible"));
85 > export const SessionChatsPickerVisibleContext = new RawContextKey<boolean>('sessionChatsPickerVisible', false, localize('sessionChatsPickerVisible', "Whether the chats picker (chats within the active session) is visible"));
86 >
87 > //#endregion
88 >
89 > //#region < --- Blocked Sessions --- >
90 >
91 > export const SessionsBlockedSessionsVisibleContext = new RawContextKey<boolean>('sessionsBlockedSessionsVisible', false, localize('sessionsBlockedSessionsVisible', "Whether the blocked-sessions dropdown (surfacing sessions that require input) is open in the sessions titlebar"));
92 >
93 > //#endregion
94 >
95 > //#region < --- Aquarium --- >
96 >
97 > export const SessionsAquariumActiveContext = new RawContextKey<boolean>('sessionsAquariumActive', false, localize('sessionsAquariumActive', "Whether the sessions aquarium overlay is active"));
98 >
99 > //#endregion
100 >
101 > //#region < --- Session Navigation --- >
102 >
103 > export const CanGoBackContext = new RawContextKey<boolean>('sessionsCanGoBack', false, localize('sessionsCanGoBack', "Whether there is a previous session in the navigation history"));
104 > export const CanGoForwardContext = new RawContextKey<boolean>('sessionsCanGoForward', false, localize('sessionsCanGoForward', "Whether there is a next session in the navigation history"));
105 >
106 > //#endregion
107 >
108 > //#region < --- Editor --- >
109 >
110 > export const EditorMaximizedContext = new RawContextKey<boolean>('editorMaximized', false, localize('editorMaximized', "Whether the editor area is maximized"));
111 > export const SinglePaneLayoutEnabledContext = new RawContextKey<boolean>('agentSessionsSinglePaneLayoutEnabled', false, localize('agentSessionsSinglePaneLayoutEnabled', "Whether the Agents window is using the single-pane (docked detail panel) layout. Single source of truth for gating single-pane behaviour — set once by the workbench from the layout it was constructed with; features must read this instead of the underlying setting"));
112 > export const HasDockedDetailsContext = new RawContextKey<boolean>('agentSessionsHasDockedDetails', false, localize('agentSessionsHasDockedDetails', "Whether the single-pane active editor has a docked detail panel (a managed Changes/Files tab or a text file editor)"));
113 > export const SinglePaneChangesTabMissingContext = new RawContextKey<boolean>('agentSessionsSinglePaneChangesTabMissing', false, localize('agentSessionsSinglePaneChangesTabMissing', "Whether the single-pane session supports a Changes editor but its tab is not currently open"));
114 > export const SinglePaneFilesTabMissingContext = new RawContextKey<boolean>('agentSessionsSinglePaneFilesTabMissing', false, localize('agentSessionsSinglePaneFilesTabMissing', "Whether the single-pane session supports a Files tab but its tab is not currently open"));
115 >
116 > //#endregion
117 >
118 > //#region < --- Mobile Layout --- >
119 >
120 > export const IsPhoneLayoutContext = new RawContextKey<boolean>('sessionsIsPhoneLayout', false, localize('sessionsIsPhoneLayout', "Whether the current layout is the phone layout"));
121 > export const KeyboardVisibleContext = new RawContextKey<boolean>('sessionsKeyboardVisible', false, localize('sessionsKeyboardVisible', "Whether the virtual keyboard is visible"));
122 >
123 > //#endregion