@workbench-kit/react 0.0.1-prototype.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +62 -0
- package/src/index.ts +43 -0
- package/src/layout/Panel.tsx +27 -0
- package/src/layout/SideBarViewFrame.tsx +328 -0
- package/src/modal/ConfirmDialog.tsx +53 -0
- package/src/modal/Modal.tsx +110 -0
- package/src/overlay/ContextMenu.tsx +145 -0
- package/src/primitives/Badge.tsx +12 -0
- package/src/primitives/Button.tsx +14 -0
- package/src/primitives/Checkbox.tsx +15 -0
- package/src/primitives/EmptyState.tsx +26 -0
- package/src/primitives/Field.tsx +38 -0
- package/src/primitives/IconButton.tsx +32 -0
- package/src/primitives/Select.tsx +12 -0
- package/src/primitives/TextInput.tsx +24 -0
- package/src/primitives/Toolbar.tsx +8 -0
- package/src/styles.css +1762 -0
- package/src/utils/cx.ts +3 -0
- package/src/workbench/ActivityBar.tsx +52 -0
- package/src/workbench/SplitView.tsx +136 -0
- package/src/workbench/StatusBar.tsx +123 -0
- package/src/workbench/WorkbenchShell.tsx +70 -0
- package/src/workbench/WorkbenchStandaloneShell.tsx +291 -0
- package/src/workbench/chat/ChatComposer.tsx +148 -0
- package/src/workbench/chat/ChatMessageItem.tsx +35 -0
- package/src/workbench/chat/ChatMessageList.tsx +49 -0
- package/src/workbench/chat/ChatPanel.tsx +55 -0
- package/src/workbench/chat/index.ts +9 -0
- package/src/workbench/chat/types.ts +10 -0
- package/src/workbench/commands.ts +490 -0
- package/src/workbench/index.ts +98 -0
- package/src/workbench/settings/WorkbenchSettingsModal.tsx +188 -0
- package/src/workbench/settings/WorkbenchSettingsNav.tsx +41 -0
- package/src/workbench/settings/WorkbenchSettingsSection.tsx +30 -0
- package/src/workbench/settings/index.ts +7 -0
- package/src/workbench/settings/types.ts +16 -0
- package/src/workbench/shellState.ts +203 -0
- package/src/workbench/standalone.ts +94 -0
- package/src/workbench/workspace/WorkspaceEditor.tsx +226 -0
- package/src/workbench/workspace/WorkspaceEditorPanel.tsx +353 -0
- package/src/workbench/workspace/WorkspaceExplorer.tsx +524 -0
- package/src/workbench/workspace/WorkspaceFileIcon.tsx +149 -0
- package/src/workbench/workspace/WorkspaceHighlightedText.tsx +22 -0
- package/src/workbench/workspace/WorkspaceSearchPanel.tsx +113 -0
- package/src/workbench/workspace/WorkspaceSearchResults.tsx +47 -0
- package/src/workbench/workspace/index.ts +98 -0
- package/src/workbench/workspace/path.ts +10 -0
- package/src/workbench/workspace/search.ts +6 -0
- package/src/workbench/workspace/tree.ts +1 -0
- package/src/workbench/workspace/types.ts +10 -0
- package/src/workbench/workspace/useVirtualWorkspace.ts +98 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { KeyboardEvent, MouseEvent, ReactNode } from 'react';
|
|
2
|
+
import { SideBarHeaderControl, SideBarViewFrame } from '../../layout/SideBarViewFrame';
|
|
3
|
+
import { Badge } from '../../primitives/Badge';
|
|
4
|
+
import { EmptyState } from '../../primitives/EmptyState';
|
|
5
|
+
import { IconButton } from '../../primitives/IconButton';
|
|
6
|
+
import { TextInput } from '../../primitives/TextInput';
|
|
7
|
+
import { Toolbar } from '../../primitives/Toolbar';
|
|
8
|
+
import { WorkspaceSearchResults } from './WorkspaceSearchResults';
|
|
9
|
+
import type { WorkspaceSearchResult } from './types';
|
|
10
|
+
|
|
11
|
+
export interface WorkspaceSearchPanelProps {
|
|
12
|
+
activePath?: string;
|
|
13
|
+
compactRows?: boolean;
|
|
14
|
+
emptyQueryLabel?: ReactNode;
|
|
15
|
+
noResultsLabel?: ReactNode;
|
|
16
|
+
onActivateResult: (result: WorkspaceSearchResult) => void;
|
|
17
|
+
onQueryChange: (query: string) => void;
|
|
18
|
+
onRefresh?: () => void;
|
|
19
|
+
onResultContextMenu?: (event: MouseEvent<HTMLElement>, result: WorkspaceSearchResult) => void;
|
|
20
|
+
placeholder?: string;
|
|
21
|
+
query: string;
|
|
22
|
+
results: WorkspaceSearchResult[];
|
|
23
|
+
searchLabel?: string;
|
|
24
|
+
title?: ReactNode;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function WorkspaceSearchPanel({
|
|
28
|
+
activePath,
|
|
29
|
+
compactRows,
|
|
30
|
+
emptyQueryLabel = 'Type to search files',
|
|
31
|
+
noResultsLabel = 'No results',
|
|
32
|
+
onActivateResult,
|
|
33
|
+
onQueryChange,
|
|
34
|
+
onRefresh,
|
|
35
|
+
onResultContextMenu,
|
|
36
|
+
placeholder = 'Search',
|
|
37
|
+
query,
|
|
38
|
+
results,
|
|
39
|
+
searchLabel = 'Search workspace',
|
|
40
|
+
title = 'Search',
|
|
41
|
+
}: WorkspaceSearchPanelProps) {
|
|
42
|
+
const hasQuery = Boolean(query.trim());
|
|
43
|
+
const visibleResults = hasQuery ? results : [];
|
|
44
|
+
const resultLabel = `${visibleResults.length} ${visibleResults.length === 1 ? 'result' : 'results'}`;
|
|
45
|
+
|
|
46
|
+
const handleQueryKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
47
|
+
if (event.key === 'Enter') {
|
|
48
|
+
if (visibleResults[0]) {
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
onActivateResult(visibleResults[0]);
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (event.key === 'Escape' && query) {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
onQueryChange('');
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<SideBarViewFrame
|
|
63
|
+
title={title}
|
|
64
|
+
actions={
|
|
65
|
+
<Toolbar>
|
|
66
|
+
<Badge variant="muted">{resultLabel}</Badge>
|
|
67
|
+
{onRefresh ? (
|
|
68
|
+
<IconButton icon="codicon-refresh" label="Refresh results" onClick={onRefresh} />
|
|
69
|
+
) : null}
|
|
70
|
+
</Toolbar>
|
|
71
|
+
}
|
|
72
|
+
headerAddon={
|
|
73
|
+
<SideBarHeaderControl>
|
|
74
|
+
<div className="workbench-search-control">
|
|
75
|
+
<TextInput
|
|
76
|
+
aria-label={searchLabel}
|
|
77
|
+
controlWidth="full"
|
|
78
|
+
placeholder={placeholder}
|
|
79
|
+
value={query}
|
|
80
|
+
onChange={(event) => onQueryChange(event.currentTarget.value)}
|
|
81
|
+
onKeyDown={handleQueryKeyDown}
|
|
82
|
+
/>
|
|
83
|
+
<IconButton
|
|
84
|
+
disabled={!query}
|
|
85
|
+
icon="codicon-close"
|
|
86
|
+
label="Clear search"
|
|
87
|
+
onClick={() => onQueryChange('')}
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
</SideBarHeaderControl>
|
|
91
|
+
}
|
|
92
|
+
>
|
|
93
|
+
{!hasQuery ? (
|
|
94
|
+
<EmptyState compact icon="codicon-search">
|
|
95
|
+
{emptyQueryLabel}
|
|
96
|
+
</EmptyState>
|
|
97
|
+
) : visibleResults.length > 0 ? (
|
|
98
|
+
<WorkspaceSearchResults
|
|
99
|
+
activePath={activePath}
|
|
100
|
+
compactRows={compactRows}
|
|
101
|
+
query={query}
|
|
102
|
+
results={visibleResults}
|
|
103
|
+
onActivateResult={onActivateResult}
|
|
104
|
+
onResultContextMenu={onResultContextMenu}
|
|
105
|
+
/>
|
|
106
|
+
) : (
|
|
107
|
+
<EmptyState compact icon="codicon-search">
|
|
108
|
+
{noResultsLabel}
|
|
109
|
+
</EmptyState>
|
|
110
|
+
)}
|
|
111
|
+
</SideBarViewFrame>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { MouseEvent } from 'react';
|
|
2
|
+
import { SideBarList, SideBarListItem } from '../../layout/SideBarViewFrame';
|
|
3
|
+
import { WorkspaceFileIcon } from './WorkspaceFileIcon';
|
|
4
|
+
import { WorkspaceHighlightedText } from './WorkspaceHighlightedText';
|
|
5
|
+
import type { WorkspaceSearchResult } from './types';
|
|
6
|
+
|
|
7
|
+
export interface WorkspaceSearchResultsProps {
|
|
8
|
+
activePath?: string;
|
|
9
|
+
compactRows?: boolean;
|
|
10
|
+
onActivateResult: (result: WorkspaceSearchResult) => void;
|
|
11
|
+
onResultContextMenu?: (event: MouseEvent<HTMLElement>, result: WorkspaceSearchResult) => void;
|
|
12
|
+
query: string;
|
|
13
|
+
results: WorkspaceSearchResult[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function WorkspaceSearchResults({
|
|
17
|
+
activePath,
|
|
18
|
+
compactRows,
|
|
19
|
+
onActivateResult,
|
|
20
|
+
onResultContextMenu,
|
|
21
|
+
query,
|
|
22
|
+
results,
|
|
23
|
+
}: WorkspaceSearchResultsProps) {
|
|
24
|
+
return (
|
|
25
|
+
<SideBarList fill aria-label="Search results">
|
|
26
|
+
{results.map((result) => (
|
|
27
|
+
<SideBarListItem
|
|
28
|
+
key={result.id}
|
|
29
|
+
active={activePath === result.path}
|
|
30
|
+
style={compactRows ? { minHeight: 46 } : undefined}
|
|
31
|
+
variant="stacked"
|
|
32
|
+
onClick={() => onActivateResult(result)}
|
|
33
|
+
onContextMenu={(event) => onResultContextMenu?.(event, result)}
|
|
34
|
+
>
|
|
35
|
+
<strong>
|
|
36
|
+
<WorkspaceFileIcon mimeType={result.file.mimeType} path={result.path} />
|
|
37
|
+
<WorkspaceHighlightedText query={query} text={result.path} />
|
|
38
|
+
</strong>
|
|
39
|
+
<span>
|
|
40
|
+
Line {result.line}: <WorkspaceHighlightedText query={query} text={result.preview} />
|
|
41
|
+
</span>
|
|
42
|
+
</SideBarListItem>
|
|
43
|
+
))}
|
|
44
|
+
{results.length === 0 ? <SideBarListItem disabled>No results</SideBarListItem> : null}
|
|
45
|
+
</SideBarList>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export { WorkspaceEditor, languageForFile, monacoThemeForWorkspaceTheme } from './WorkspaceEditor';
|
|
2
|
+
export type { WorkspaceEditorProps, WorkspaceEditorTheme } from './WorkspaceEditor';
|
|
3
|
+
export { WorkspaceEditorPanel } from './WorkspaceEditorPanel';
|
|
4
|
+
export type { WorkspaceEditorPanelProps } from './WorkspaceEditorPanel';
|
|
5
|
+
export {
|
|
6
|
+
WORKSPACE_EXPLORER_DRAG_DATA_TYPE,
|
|
7
|
+
WORKSPACE_EXPLORER_DRAG_METADATA_DATA_TYPE,
|
|
8
|
+
WorkspaceExplorer,
|
|
9
|
+
} from './WorkspaceExplorer';
|
|
10
|
+
export type {
|
|
11
|
+
WorkspaceExplorerItemActionMeta,
|
|
12
|
+
WorkspaceExplorerItemContextMenuMeta,
|
|
13
|
+
WorkspaceExplorerItemKeyboardActionMeta,
|
|
14
|
+
WorkspaceExplorerInlineEditCommitMeta,
|
|
15
|
+
WorkspaceExplorerDragMetadataContext,
|
|
16
|
+
WorkspaceExplorerDragMetadataFactory,
|
|
17
|
+
WorkspaceExplorerInlineEditKind,
|
|
18
|
+
WorkspaceExplorerInlineEditState,
|
|
19
|
+
WorkspaceExplorerMoveRequestMeta,
|
|
20
|
+
WorkspaceExplorerProps,
|
|
21
|
+
WorkspaceExplorerSelectionChangeMeta,
|
|
22
|
+
} from './WorkspaceExplorer';
|
|
23
|
+
export { WorkspaceFileIcon, codiconForFileKind, fileIconKindForPath } from './WorkspaceFileIcon';
|
|
24
|
+
export type { WorkspaceFileIconKind, WorkspaceFileIconProps } from './WorkspaceFileIcon';
|
|
25
|
+
export { WorkspaceHighlightedText } from './WorkspaceHighlightedText';
|
|
26
|
+
export type { WorkspaceHighlightedTextProps } from './WorkspaceHighlightedText';
|
|
27
|
+
export { WorkspaceSearchPanel } from './WorkspaceSearchPanel';
|
|
28
|
+
export type { WorkspaceSearchPanelProps } from './WorkspaceSearchPanel';
|
|
29
|
+
export { WorkspaceSearchResults } from './WorkspaceSearchResults';
|
|
30
|
+
export type { WorkspaceSearchResultsProps } from './WorkspaceSearchResults';
|
|
31
|
+
export {
|
|
32
|
+
extensionOfPath,
|
|
33
|
+
fileNameOfPath,
|
|
34
|
+
isSimpleWorkspaceName,
|
|
35
|
+
joinWorkspacePath,
|
|
36
|
+
normalizeWorkspacePath,
|
|
37
|
+
parentPathOf,
|
|
38
|
+
parentPathsOf,
|
|
39
|
+
workspacePathSegments,
|
|
40
|
+
} from './path';
|
|
41
|
+
export {
|
|
42
|
+
createWorkspaceFileDraft,
|
|
43
|
+
discardWorkspaceFileDraft,
|
|
44
|
+
isWorkspaceFileDraftDirty,
|
|
45
|
+
resolveWorkspaceFileDraft,
|
|
46
|
+
saveWorkspaceFileDraft,
|
|
47
|
+
updateWorkspaceFileDraft,
|
|
48
|
+
type DiscardWorkspaceFileDraftInput,
|
|
49
|
+
type ResolveWorkspaceFileDraftInput,
|
|
50
|
+
type SaveWorkspaceFileDraftInput,
|
|
51
|
+
type UpdateWorkspaceFileDraftInput,
|
|
52
|
+
type WorkspaceFileDraft,
|
|
53
|
+
type WorkspaceFileDraftMap,
|
|
54
|
+
} from '@workbench-kit/workspace';
|
|
55
|
+
export { compactText, createContentPreview, highlightText, searchWorkspaceFiles } from './search';
|
|
56
|
+
export {
|
|
57
|
+
getWorkspaceSelectionActionPaths,
|
|
58
|
+
getWorkspaceSelectionRange,
|
|
59
|
+
normalizeWorkspaceSelectionPaths,
|
|
60
|
+
pruneWorkspaceSelection,
|
|
61
|
+
updateWorkspaceSelection,
|
|
62
|
+
type UpdateWorkspaceSelectionInput,
|
|
63
|
+
type WorkspaceSelectionActionPathsInput,
|
|
64
|
+
type WorkspaceSelectionMode,
|
|
65
|
+
type WorkspaceSelectionState,
|
|
66
|
+
} from '@workbench-kit/workspace';
|
|
67
|
+
export { buildWorkspaceTree, flattenWorkspaceTree } from './tree';
|
|
68
|
+
export {
|
|
69
|
+
getAvailableWorkspaceEntryName,
|
|
70
|
+
getWorkspaceFileMovePlan,
|
|
71
|
+
initializeVirtualWorkspaceState,
|
|
72
|
+
isWorkspaceEntryPathAvailable,
|
|
73
|
+
useVirtualWorkspace,
|
|
74
|
+
virtualWorkspaceReducer,
|
|
75
|
+
} from './useVirtualWorkspace';
|
|
76
|
+
export type {
|
|
77
|
+
CreateWorkspaceFileInput,
|
|
78
|
+
VirtualWorkspaceAction,
|
|
79
|
+
VirtualWorkspaceApi,
|
|
80
|
+
VirtualWorkspaceInitialState,
|
|
81
|
+
VirtualWorkspaceState,
|
|
82
|
+
WorkspaceEntryNameSuggestionInput,
|
|
83
|
+
WorkspaceEntryPathAvailabilityInput,
|
|
84
|
+
WorkspaceFileMove,
|
|
85
|
+
WorkspaceFileMovePlan,
|
|
86
|
+
WorkspaceFileMovePlanInput,
|
|
87
|
+
WriteWorkspaceFileInput,
|
|
88
|
+
} from './useVirtualWorkspace';
|
|
89
|
+
export type {
|
|
90
|
+
VisibleWorkspaceNode,
|
|
91
|
+
WorkspaceFile,
|
|
92
|
+
WorkspaceFileSource,
|
|
93
|
+
WorkspaceHighlightPart,
|
|
94
|
+
WorkspaceNodeType,
|
|
95
|
+
WorkspaceSearchMatchKind,
|
|
96
|
+
WorkspaceSearchResult,
|
|
97
|
+
WorkspaceTreeNode,
|
|
98
|
+
} from './types';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { buildWorkspaceTree, flattenWorkspaceTree } from '@workbench-kit/workspace';
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { useMemo, useReducer } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
buildWorkspaceTree,
|
|
4
|
+
getAvailableWorkspaceEntryName,
|
|
5
|
+
getWorkspaceFileMovePlan,
|
|
6
|
+
initializeVirtualWorkspaceState,
|
|
7
|
+
isWorkspaceEntryPathAvailable,
|
|
8
|
+
searchWorkspaceFiles,
|
|
9
|
+
virtualWorkspaceReducer,
|
|
10
|
+
type CreateWorkspaceFileInput,
|
|
11
|
+
type VirtualWorkspaceAction,
|
|
12
|
+
type VirtualWorkspaceInitialState,
|
|
13
|
+
type VirtualWorkspaceState,
|
|
14
|
+
type WorkspaceEntryNameSuggestionInput,
|
|
15
|
+
type WorkspaceEntryPathAvailabilityInput,
|
|
16
|
+
type WorkspaceFileMove,
|
|
17
|
+
type WorkspaceFileMovePlan,
|
|
18
|
+
type WorkspaceFileMovePlanInput,
|
|
19
|
+
type WorkspaceSearchResult,
|
|
20
|
+
type WorkspaceTreeNode,
|
|
21
|
+
type WriteWorkspaceFileInput,
|
|
22
|
+
} from '@workbench-kit/workspace';
|
|
23
|
+
|
|
24
|
+
export interface VirtualWorkspaceApi extends VirtualWorkspaceState {
|
|
25
|
+
closeAll: () => void;
|
|
26
|
+
closeOthers: (path: string) => void;
|
|
27
|
+
closePath: (path: string) => void;
|
|
28
|
+
createFile: (file: CreateWorkspaceFileInput) => void;
|
|
29
|
+
createFolder: (path: string) => void;
|
|
30
|
+
deleteFile: (path: string) => void;
|
|
31
|
+
deleteFolder: (path: string) => void;
|
|
32
|
+
moveFile: (sourcePath: string, targetFolderPath: string) => void;
|
|
33
|
+
openFile: (path: string) => void;
|
|
34
|
+
renameFile: (path: string, name: string, mimeType?: string) => void;
|
|
35
|
+
renameFolder: (path: string, name: string) => void;
|
|
36
|
+
saveFile: (path: string, file: WriteWorkspaceFileInput) => void;
|
|
37
|
+
searchResults: WorkspaceSearchResult[];
|
|
38
|
+
setSearchQuery: (query: string) => void;
|
|
39
|
+
toggleFolder: (path: string) => void;
|
|
40
|
+
workspaceTree: WorkspaceTreeNode[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function useVirtualWorkspace(
|
|
44
|
+
initialState: VirtualWorkspaceInitialState,
|
|
45
|
+
): VirtualWorkspaceApi {
|
|
46
|
+
const [state, dispatch] = useReducer(
|
|
47
|
+
virtualWorkspaceReducer,
|
|
48
|
+
initialState,
|
|
49
|
+
initializeVirtualWorkspaceState,
|
|
50
|
+
);
|
|
51
|
+
const workspaceTree = useMemo(
|
|
52
|
+
() => buildWorkspaceTree(state.folders, state.files),
|
|
53
|
+
[state.files, state.folders],
|
|
54
|
+
);
|
|
55
|
+
const searchResults = useMemo(
|
|
56
|
+
() => searchWorkspaceFiles(state.files, state.searchQuery),
|
|
57
|
+
[state.files, state.searchQuery],
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
...state,
|
|
62
|
+
closeAll: () => dispatch({ type: 'close-all' }),
|
|
63
|
+
closeOthers: (path) => dispatch({ path, type: 'close-others' }),
|
|
64
|
+
closePath: (path) => dispatch({ path, type: 'close-path' }),
|
|
65
|
+
createFile: (file) => dispatch({ file, type: 'create-file' }),
|
|
66
|
+
createFolder: (path) => dispatch({ path, type: 'create-folder' }),
|
|
67
|
+
deleteFile: (path) => dispatch({ path, type: 'delete-file' }),
|
|
68
|
+
deleteFolder: (path) => dispatch({ path, type: 'delete-folder' }),
|
|
69
|
+
moveFile: (sourcePath, targetFolderPath) =>
|
|
70
|
+
dispatch({ sourcePath, targetFolderPath, type: 'move-file' }),
|
|
71
|
+
openFile: (path) => dispatch({ path, type: 'open-file' }),
|
|
72
|
+
renameFile: (path, name, mimeType) => dispatch({ mimeType, name, path, type: 'rename-file' }),
|
|
73
|
+
renameFolder: (path, name) => dispatch({ name, path, type: 'rename-folder' }),
|
|
74
|
+
saveFile: (path, file) => dispatch({ file, path, type: 'save-file' }),
|
|
75
|
+
searchResults,
|
|
76
|
+
setSearchQuery: (query) => dispatch({ query, type: 'set-search-query' }),
|
|
77
|
+
toggleFolder: (path) => dispatch({ path, type: 'toggle-folder' }),
|
|
78
|
+
workspaceTree,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
getAvailableWorkspaceEntryName,
|
|
84
|
+
getWorkspaceFileMovePlan,
|
|
85
|
+
initializeVirtualWorkspaceState,
|
|
86
|
+
isWorkspaceEntryPathAvailable,
|
|
87
|
+
virtualWorkspaceReducer,
|
|
88
|
+
type CreateWorkspaceFileInput,
|
|
89
|
+
type VirtualWorkspaceAction,
|
|
90
|
+
type VirtualWorkspaceInitialState,
|
|
91
|
+
type VirtualWorkspaceState,
|
|
92
|
+
type WorkspaceEntryNameSuggestionInput,
|
|
93
|
+
type WorkspaceEntryPathAvailabilityInput,
|
|
94
|
+
type WorkspaceFileMove,
|
|
95
|
+
type WorkspaceFileMovePlan,
|
|
96
|
+
type WorkspaceFileMovePlanInput,
|
|
97
|
+
type WriteWorkspaceFileInput,
|
|
98
|
+
};
|