@hachej/boring-workspace 0.1.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/LICENSE +21 -0
- package/README.md +94 -0
- package/dist/CodeEditor-DQqOn4xz.js +266 -0
- package/dist/CommandPalette-aM61U-b0.js +5229 -0
- package/dist/FileTree-DRq_bfue.js +245 -0
- package/dist/MarkdownEditor-DjiHxnRv.js +349 -0
- package/dist/WorkspaceLoadingState-By0dZoPD.js +568 -0
- package/dist/agent-tool-NvxKfist.d.ts +28 -0
- package/dist/app-front.d.ts +485 -0
- package/dist/app-front.js +452 -0
- package/dist/app-server.d.ts +53 -0
- package/dist/app-server.js +769 -0
- package/dist/bootstrapServer-BRUqUpVW.d.ts +66 -0
- package/dist/boring-workspace.css +1 -0
- package/dist/charts.d.ts +114 -0
- package/dist/charts.js +143 -0
- package/dist/events.d.ts +178 -0
- package/dist/events.js +88 -0
- package/dist/explorer-DtLUnuah.d.ts +129 -0
- package/dist/panel-DnvDNQac.js +6 -0
- package/dist/server.d.ts +84 -0
- package/dist/server.js +811 -0
- package/dist/shared.d.ts +113 -0
- package/dist/shared.js +11 -0
- package/dist/testing-e2e.d.ts +68 -0
- package/dist/testing-e2e.js +45 -0
- package/dist/testing.d.ts +464 -0
- package/dist/testing.js +10984 -0
- package/dist/utils-B6yFEsav.js +8 -0
- package/dist/workspace.css +5780 -0
- package/dist/workspace.d.ts +2119 -0
- package/dist/workspace.js +1884 -0
- package/docs/INTERFACES.md +58 -0
- package/docs/PLUGIN_STRUCTURE.md +162 -0
- package/docs/README.md +19 -0
- package/docs/bridge.md +135 -0
- package/docs/panels.md +102 -0
- package/docs/plans/GENERIC_EXPLORER_PLUGIN_PLAN.md +455 -0
- package/docs/plans/MACRO_PLUGIN_GENERIC_HELPERS_AUDIT.md +962 -0
- package/docs/plans/PLUGIN_OUTPUTS_ISOLATION_PLAN.md +301 -0
- package/docs/plans/README.md +9 -0
- package/docs/plans/UI_BRIDGE_OWNERSHIP_REFACTOR.md +303 -0
- package/docs/plans/archive/CODE_OWNERSHIP_CLEANUP_PLAN.md +387 -0
- package/docs/plans/archive/COMMAND_PALETTE_REGISTRY.md +814 -0
- package/docs/plans/archive/DECLARATIVE_LAYOUT_MIGRATION.md +277 -0
- package/docs/plans/archive/PLUGIN_MODEL.md +3674 -0
- package/docs/plans/archive/SRC_FOLDER_REORG_PLAN.md +307 -0
- package/docs/plans/archive/UNIFIED_EVENT_BUS.md +647 -0
- package/docs/plans/archive/WORKSPACE_V2_PLAN.md +2489 -0
- package/docs/plugins.md +158 -0
- package/package.json +164 -0
|
@@ -0,0 +1,2119 @@
|
|
|
1
|
+
import { ClassValue } from 'clsx';
|
|
2
|
+
import { Component } from 'react';
|
|
3
|
+
import { ComponentType } from 'react';
|
|
4
|
+
import { Context } from 'react';
|
|
5
|
+
import { dismissToast } from '@hachej/boring-ui-kit';
|
|
6
|
+
import { DockviewApi } from 'dockview-react';
|
|
7
|
+
import { DockviewPanelApi } from 'dockview-react';
|
|
8
|
+
import { ErrorInfo } from 'react';
|
|
9
|
+
import { Extension } from '@codemirror/state';
|
|
10
|
+
import { JSX } from 'react/jsx-runtime';
|
|
11
|
+
import { JSXElementConstructor } from 'react';
|
|
12
|
+
import { LucideIcon } from 'lucide-react';
|
|
13
|
+
import { PersistOptions } from 'zustand/middleware';
|
|
14
|
+
import { ReactElement } from 'react';
|
|
15
|
+
import { ReactNode } from 'react';
|
|
16
|
+
import { ReactPortal } from 'react';
|
|
17
|
+
import { StoreApi as StoreApi_3 } from 'zustand';
|
|
18
|
+
import { toast } from '@hachej/boring-ui-kit';
|
|
19
|
+
import { ToastApi } from '@hachej/boring-ui-kit';
|
|
20
|
+
import { Toaster } from '@hachej/boring-ui-kit';
|
|
21
|
+
import { ToasterProps } from '@hachej/boring-ui-kit';
|
|
22
|
+
import { ToastInput } from '@hachej/boring-ui-kit';
|
|
23
|
+
import { ToastRecord } from '@hachej/boring-ui-kit';
|
|
24
|
+
import { ToastVariant } from '@hachej/boring-ui-kit';
|
|
25
|
+
import { z } from 'zod';
|
|
26
|
+
|
|
27
|
+
export declare function agentMeta(toolCallId: string): {
|
|
28
|
+
cause: "agent";
|
|
29
|
+
toolCallId: string;
|
|
30
|
+
ts: number;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Structural tool contract accepted from workspace plugins and UI tool
|
|
35
|
+
* factories. Kept agent-runtime-neutral so only the app integration layer
|
|
36
|
+
* needs to import @hachej/boring-agent.
|
|
37
|
+
*/
|
|
38
|
+
export declare interface AgentTool {
|
|
39
|
+
name: string;
|
|
40
|
+
description: string;
|
|
41
|
+
promptSnippet?: string;
|
|
42
|
+
parameters: JSONSchema;
|
|
43
|
+
execute(params: Record<string, unknown>, ctx: ToolExecContext): Promise<ToolResult>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export declare interface AgentToolOutput {
|
|
47
|
+
/**
|
|
48
|
+
* @deprecated Executable agent tools should be contributed by server
|
|
49
|
+
* plugins. This output remains for migration only.
|
|
50
|
+
*/
|
|
51
|
+
type: "agent-tool";
|
|
52
|
+
id: string;
|
|
53
|
+
tool: AgentTool;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export declare interface AgentToolRegistry {
|
|
57
|
+
register(tool: AgentTool, pluginId: string): void;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export declare function appendDataCatalogOutputs<T extends WorkspaceFrontPlugin>(plugin: T, options: CreateDataCatalogOutputsOptions): T;
|
|
61
|
+
|
|
62
|
+
export declare interface ArtifactPanel {
|
|
63
|
+
id: string;
|
|
64
|
+
component: string;
|
|
65
|
+
params?: Record<string, unknown>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export declare function ArtifactSurfacePane({ visible, storageKey, allowedPanels, persistedLayout, onLayoutChange, onReady, prefixHeaderActions, rightHeaderActions, watermarkComponent, className, }: ArtifactSurfacePaneProps): JSX.Element | null;
|
|
69
|
+
|
|
70
|
+
export declare namespace ArtifactSurfacePane {
|
|
71
|
+
var defaultAllowedPanels: string[];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export declare interface ArtifactSurfacePaneProps {
|
|
75
|
+
visible?: boolean;
|
|
76
|
+
storageKey?: string;
|
|
77
|
+
allowedPanels?: string[];
|
|
78
|
+
persistedLayout?: SerializedLayout;
|
|
79
|
+
onLayoutChange?: (layout: SerializedLayout) => void;
|
|
80
|
+
onReady?: (api: DockviewApi) => void;
|
|
81
|
+
prefixHeaderActions?: React.FunctionComponent<unknown>;
|
|
82
|
+
rightHeaderActions?: React.FunctionComponent<unknown>;
|
|
83
|
+
watermarkComponent?: React.FunctionComponent<unknown>;
|
|
84
|
+
className?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export declare type Badge = {
|
|
88
|
+
/** 1–4 char mono code rendered as a chip. */
|
|
89
|
+
code: string;
|
|
90
|
+
tooltip?: string;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* DataExplorer shared types — no runtime deps.
|
|
95
|
+
*
|
|
96
|
+
* Importable from BOTH front and server bundles without dragging in
|
|
97
|
+
* platform-specific code.
|
|
98
|
+
*/
|
|
99
|
+
declare type Badge_2 = {
|
|
100
|
+
/** 1–4 char mono code rendered as a chip. */
|
|
101
|
+
code: string;
|
|
102
|
+
tooltip?: string;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export declare interface BindingOutput {
|
|
106
|
+
type: "binding";
|
|
107
|
+
id: string;
|
|
108
|
+
component: PluginBinding;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export declare function bindStore(store: WorkspaceStoreApi): void;
|
|
112
|
+
|
|
113
|
+
export declare function bootstrap(options: BootstrapOptions): BootstrapResult;
|
|
114
|
+
|
|
115
|
+
export declare interface BootstrapOptions {
|
|
116
|
+
chatPanel: unknown;
|
|
117
|
+
plugins?: WorkspaceFrontPlugin[];
|
|
118
|
+
defaults?: WorkspaceFrontPlugin[];
|
|
119
|
+
excludeDefaults?: string[];
|
|
120
|
+
registries: {
|
|
121
|
+
panels: PanelRegistryLike;
|
|
122
|
+
commands: CommandRegistryLike;
|
|
123
|
+
catalogs: CatalogRegistryLike;
|
|
124
|
+
surfaceResolvers?: SurfaceResolverRegistryLike;
|
|
125
|
+
agentTools?: AgentToolRegistry;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export declare interface BootstrapResult {
|
|
130
|
+
registered: string[];
|
|
131
|
+
systemPromptAppend: string;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export declare interface BridgeClient {
|
|
135
|
+
connect(): void;
|
|
136
|
+
disconnect(): void;
|
|
137
|
+
pushState(causedBy: CausedBy): void;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export declare interface BridgeClientOptions {
|
|
141
|
+
endpoint: string;
|
|
142
|
+
bridge: WorkspaceBridge;
|
|
143
|
+
store: StoreApi_2;
|
|
144
|
+
authToken?: string;
|
|
145
|
+
pollMode?: boolean;
|
|
146
|
+
pollInterval?: number;
|
|
147
|
+
onAuthError?: (statusCode: number) => void;
|
|
148
|
+
onVersionMismatch?: (version: number) => void;
|
|
149
|
+
onConnectionChange?: (connected: boolean) => void;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export declare interface BridgeEventMap {
|
|
153
|
+
"panel:opened": {
|
|
154
|
+
panelId: string;
|
|
155
|
+
params: Record<string, unknown>;
|
|
156
|
+
};
|
|
157
|
+
"panel:closed": {
|
|
158
|
+
panelId: string;
|
|
159
|
+
};
|
|
160
|
+
"panel:activated": {
|
|
161
|
+
panelId: string;
|
|
162
|
+
previousPanelId: string | null;
|
|
163
|
+
};
|
|
164
|
+
"file:opened": {
|
|
165
|
+
path: string;
|
|
166
|
+
mode: "view" | "edit" | "diff";
|
|
167
|
+
};
|
|
168
|
+
"file:saved": {
|
|
169
|
+
path: string;
|
|
170
|
+
};
|
|
171
|
+
"file:dirty": {
|
|
172
|
+
path: string;
|
|
173
|
+
dirty: boolean;
|
|
174
|
+
};
|
|
175
|
+
"sidebar:toggled": {
|
|
176
|
+
collapsed: boolean;
|
|
177
|
+
};
|
|
178
|
+
"tree:expand": {
|
|
179
|
+
path: string;
|
|
180
|
+
};
|
|
181
|
+
"notification:shown": {
|
|
182
|
+
message: string;
|
|
183
|
+
level: "info" | "warn" | "error";
|
|
184
|
+
};
|
|
185
|
+
"pane:error": {
|
|
186
|
+
panelId: string;
|
|
187
|
+
error: string;
|
|
188
|
+
stack?: string;
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export declare function buildChatLayout(props?: ChatLayoutProps): LayoutConfig;
|
|
193
|
+
|
|
194
|
+
export declare function buildIdeLayout(props?: IdeLayoutProps): LayoutConfig;
|
|
195
|
+
|
|
196
|
+
export declare interface CatalogConfig {
|
|
197
|
+
id: string;
|
|
198
|
+
label: string;
|
|
199
|
+
adapter: ExplorerAdapter_2;
|
|
200
|
+
onSelect: (row: ExplorerRow_2) => void;
|
|
201
|
+
pluginId?: string;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export declare interface CatalogOutput {
|
|
205
|
+
type: "catalog";
|
|
206
|
+
catalog: CatalogConfig;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export declare class CatalogRegistry {
|
|
210
|
+
private catalogs;
|
|
211
|
+
private listeners;
|
|
212
|
+
private snapshotCache;
|
|
213
|
+
private warnOnDuplicate;
|
|
214
|
+
constructor(options?: CatalogRegistryOptions);
|
|
215
|
+
register(config: CatalogConfig, sourcePluginId: string): void;
|
|
216
|
+
unregister(id: string): void;
|
|
217
|
+
unregisterByPluginId(pluginId: string): void;
|
|
218
|
+
list(): readonly CatalogConfig[];
|
|
219
|
+
get(id: string): CatalogConfig | undefined;
|
|
220
|
+
subscribe: (cb: () => void) => (() => void);
|
|
221
|
+
getSnapshot: () => readonly CatalogConfig[];
|
|
222
|
+
private emit;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export declare interface CatalogRegistryLike {
|
|
226
|
+
register(catalog: CatalogConfig, pluginId: string): void;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export declare interface CatalogRegistryOptions {
|
|
230
|
+
warnOnDuplicate?: boolean;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export declare type CausedBy = "user" | "agent" | "restore";
|
|
234
|
+
|
|
235
|
+
export declare function ChatLayout(props: ChatLayoutProps): JSX.Element;
|
|
236
|
+
|
|
237
|
+
export declare interface ChatLayoutProps {
|
|
238
|
+
nav?: string | null;
|
|
239
|
+
navParams?: Record<string, unknown>;
|
|
240
|
+
center?: string;
|
|
241
|
+
centerParams?: Record<string, unknown>;
|
|
242
|
+
surface?: string | null;
|
|
243
|
+
surfaceParams?: Record<string, unknown>;
|
|
244
|
+
sidebar?: string | null;
|
|
245
|
+
sidebarParams?: Record<string, unknown>;
|
|
246
|
+
storageKey?: string;
|
|
247
|
+
onOpenNav?: () => void;
|
|
248
|
+
onOpenSurface?: () => void;
|
|
249
|
+
className?: string;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export declare const closePanelSchema: z.ZodObject<{
|
|
253
|
+
id: z.ZodString;
|
|
254
|
+
}, "strip", z.ZodTypeAny, {
|
|
255
|
+
id: string;
|
|
256
|
+
}, {
|
|
257
|
+
id: string;
|
|
258
|
+
}>;
|
|
259
|
+
|
|
260
|
+
export declare function cn(...inputs: ClassValue[]): string;
|
|
261
|
+
|
|
262
|
+
export declare function CodeEditor({ content, onChange, language, readOnly, lineNumbers, wordWrap, className, }: CodeEditorProps): JSX.Element;
|
|
263
|
+
|
|
264
|
+
export declare function CodeEditorPane({ params, api, className }: CodeEditorPaneProps): JSX.Element;
|
|
265
|
+
|
|
266
|
+
export declare type CodeEditorPaneProps = PaneProps<{
|
|
267
|
+
path?: string;
|
|
268
|
+
}>;
|
|
269
|
+
|
|
270
|
+
export declare interface CodeEditorProps {
|
|
271
|
+
content: string;
|
|
272
|
+
onChange?: (content: string) => void;
|
|
273
|
+
language?: string;
|
|
274
|
+
readOnly?: boolean;
|
|
275
|
+
lineNumbers?: boolean;
|
|
276
|
+
wordWrap?: boolean;
|
|
277
|
+
className?: string;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export declare interface CommandConfig {
|
|
281
|
+
id: string;
|
|
282
|
+
title: string;
|
|
283
|
+
run: () => void;
|
|
284
|
+
keywords?: string[];
|
|
285
|
+
shortcut?: string;
|
|
286
|
+
when?: () => boolean;
|
|
287
|
+
pluginId?: string;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export declare interface CommandOutput {
|
|
291
|
+
type: "command";
|
|
292
|
+
command: CommandConfig;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export declare function CommandPalette(_props?: CommandPaletteProps): JSX.Element;
|
|
296
|
+
|
|
297
|
+
export declare type CommandPaletteProps = Record<string, never>;
|
|
298
|
+
|
|
299
|
+
export declare class CommandRegistry {
|
|
300
|
+
private commands;
|
|
301
|
+
private listeners;
|
|
302
|
+
private snapshotCache;
|
|
303
|
+
registerCommand(config: CommandConfig): void;
|
|
304
|
+
unregisterByPluginId(pluginId: string): void;
|
|
305
|
+
unregisterCommand(id: string): void;
|
|
306
|
+
getCommand(id: string): CommandConfig | undefined;
|
|
307
|
+
getCommands(): CommandConfig[];
|
|
308
|
+
getActiveCommands(): CommandConfig[];
|
|
309
|
+
subscribe: (cb: () => void) => (() => void);
|
|
310
|
+
getSnapshot: () => readonly CommandConfig[];
|
|
311
|
+
private emit;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export declare interface CommandRegistryLike {
|
|
315
|
+
registerCommand(command: CommandConfig): void;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export declare interface CommandResult {
|
|
319
|
+
seq: number;
|
|
320
|
+
status: "ok" | "error";
|
|
321
|
+
error?: {
|
|
322
|
+
code: string;
|
|
323
|
+
message: string;
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Compose a parent plugin from smaller child plugins without introducing a new
|
|
329
|
+
* enhancer/mixin lifecycle. Contributions are flattened into PluginOutput
|
|
330
|
+
* values so normal plugin bootstrap remains the single registration path.
|
|
331
|
+
*/
|
|
332
|
+
export declare function composePlugins(options: ComposePluginsOptions): WorkspaceFrontPlugin;
|
|
333
|
+
|
|
334
|
+
export declare interface ComposePluginsOptions {
|
|
335
|
+
id: string;
|
|
336
|
+
label?: string;
|
|
337
|
+
plugins: WorkspaceFrontPlugin[];
|
|
338
|
+
outputs?: PluginOutput[];
|
|
339
|
+
panels?: WorkspaceFrontPlugin["panels"];
|
|
340
|
+
commands?: WorkspaceFrontPlugin["commands"];
|
|
341
|
+
catalogs?: WorkspaceFrontPlugin["catalogs"];
|
|
342
|
+
agentTools?: WorkspaceFrontPlugin["agentTools"];
|
|
343
|
+
systemPrompt?: string;
|
|
344
|
+
/**
|
|
345
|
+
* When true (default), child contributions are registered as owned by the
|
|
346
|
+
* composed parent plugin. When false, output contributions carry the child
|
|
347
|
+
* plugin id so bootstrap can preserve child ownership in registries.
|
|
348
|
+
*/
|
|
349
|
+
adoptOutputs?: boolean;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export declare function createBridge(store: StoreApi): WorkspaceBridge;
|
|
353
|
+
|
|
354
|
+
export declare function createBridgeClient(options: BridgeClientOptions): BridgeClient;
|
|
355
|
+
|
|
356
|
+
export declare function createDataCatalogCatalog(options: Pick<CreateDataCatalogOutputsOptions, "id" | "label" | "adapter" | "catalogId" | "catalogLabel" | "onSelect">): CatalogConfig;
|
|
357
|
+
|
|
358
|
+
export declare function createDataCatalogOpenHandler(options: OpenDataCatalogVisualizationOptions): (row: ExplorerRow) => void;
|
|
359
|
+
|
|
360
|
+
export declare function createDataCatalogOutputs(options: CreateDataCatalogOutputsOptions): PluginOutput[];
|
|
361
|
+
|
|
362
|
+
export declare interface CreateDataCatalogOutputsOptions {
|
|
363
|
+
/**
|
|
364
|
+
* Base contribution id. Defaults catalog id to this value and left tab /
|
|
365
|
+
* visualization panel ids to derived names.
|
|
366
|
+
*/
|
|
367
|
+
id?: string;
|
|
368
|
+
label?: string;
|
|
369
|
+
adapter: ExplorerAdapter;
|
|
370
|
+
facets?: FacetConfig[];
|
|
371
|
+
groupBy?: string;
|
|
372
|
+
getDragPayload?: (row: ExplorerRow) => DragPayload | null | undefined;
|
|
373
|
+
onSelect?: (row: ExplorerRow, context: DataCatalogSelectContext) => void;
|
|
374
|
+
emptyState?: ReactNode;
|
|
375
|
+
searchPlaceholder?: string;
|
|
376
|
+
pageSize?: number;
|
|
377
|
+
debounceMs?: number;
|
|
378
|
+
leftTabId?: string;
|
|
379
|
+
leftTabTitle?: string;
|
|
380
|
+
leftTabIcon?: PanelConfig["icon"];
|
|
381
|
+
includeLeftTab?: boolean;
|
|
382
|
+
catalogId?: string;
|
|
383
|
+
catalogLabel?: string;
|
|
384
|
+
includeCatalog?: boolean;
|
|
385
|
+
visualizationPanelId?: string;
|
|
386
|
+
visualizationTitle?: string;
|
|
387
|
+
visualizationIcon?: PanelConfig["icon"];
|
|
388
|
+
visualizationComponent?: ComponentType<PaneProps<DataCatalogVisualizationParams>>;
|
|
389
|
+
includeVisualizationPanel?: boolean;
|
|
390
|
+
surfaceKind?: string;
|
|
391
|
+
surfaceResolverId?: string;
|
|
392
|
+
includeSurfaceResolver?: boolean;
|
|
393
|
+
source?: PanelConfig["source"];
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
export declare function createDataCatalogPlugin(options: CreateDataCatalogPluginOptions): WorkspaceFrontPlugin;
|
|
397
|
+
|
|
398
|
+
export declare interface CreateDataCatalogPluginOptions extends CreateDataCatalogOutputsOptions {
|
|
399
|
+
pluginId?: string;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
export declare function createDataCatalogSurfaceResolver(options: CreateDataCatalogSurfaceResolverOptions): SurfaceResolverConfig;
|
|
403
|
+
|
|
404
|
+
export declare interface CreateDataCatalogSurfaceResolverOptions {
|
|
405
|
+
id: string;
|
|
406
|
+
catalogId: string;
|
|
407
|
+
visualizationPanelId: string;
|
|
408
|
+
visualizationTitle: string;
|
|
409
|
+
panelIdPrefix?: string;
|
|
410
|
+
surfaceKind?: string;
|
|
411
|
+
surfaceResolverId?: string;
|
|
412
|
+
source?: string;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
export declare function createExplorerOutputs(options: CreateExplorerOutputsOptions): PluginOutput[];
|
|
416
|
+
|
|
417
|
+
export declare interface CreateExplorerOutputsOptions {
|
|
418
|
+
id: string;
|
|
419
|
+
label?: string;
|
|
420
|
+
mode?: ExplorerMode;
|
|
421
|
+
adapter?: ExplorerAdapter;
|
|
422
|
+
sectionedAdapter?: SectionedExplorerAdapter;
|
|
423
|
+
facets?: FacetConfig[];
|
|
424
|
+
groupBy?: string;
|
|
425
|
+
onActivate?: (row: ExplorerRow) => void;
|
|
426
|
+
getDragPayload?: (row: ExplorerRow) => DragPayload | null | undefined;
|
|
427
|
+
emptyState?: ReactNode;
|
|
428
|
+
searchPlaceholder?: string;
|
|
429
|
+
searchable?: boolean;
|
|
430
|
+
query?: string;
|
|
431
|
+
pageSize?: number;
|
|
432
|
+
debounceMs?: number;
|
|
433
|
+
className?: string;
|
|
434
|
+
leftTab?: false | ExplorerContributionConfig;
|
|
435
|
+
panel?: false | ExplorerContributionConfig;
|
|
436
|
+
catalog?: false | ExplorerCatalogConfig;
|
|
437
|
+
source?: PanelConfig["source"];
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
export declare function createExplorerPlugin(options: CreateExplorerPluginOptions): WorkspaceFrontPlugin;
|
|
441
|
+
|
|
442
|
+
export declare interface CreateExplorerPluginOptions extends CreateExplorerOutputsOptions {
|
|
443
|
+
pluginId?: string;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export declare function createShadcnTheme(options?: {
|
|
447
|
+
dark?: boolean;
|
|
448
|
+
}): Extension[];
|
|
449
|
+
|
|
450
|
+
export declare function createWorkspaceStore(options?: CreateWorkspaceStoreOptions): {
|
|
451
|
+
(): WorkspaceStore;
|
|
452
|
+
<U>(selector: (state: WorkspaceStore) => U): U;
|
|
453
|
+
} & Omit<StoreApi_3<WorkspaceStore>, "setState" | "persist"> & {
|
|
454
|
+
setState(partial: WorkspaceStore | Partial<WorkspaceStore> | ((state: WorkspaceStore) => WorkspaceStore | Partial<WorkspaceStore>), replace?: false | undefined): unknown;
|
|
455
|
+
setState(state: WorkspaceStore | ((state: WorkspaceStore) => WorkspaceStore), replace: true): unknown;
|
|
456
|
+
persist: {
|
|
457
|
+
setOptions: (options: Partial<PersistOptions<WorkspaceStore, {
|
|
458
|
+
layout: unknown;
|
|
459
|
+
sidebar: SidebarState;
|
|
460
|
+
panelSizes: Record<string, number>;
|
|
461
|
+
}, unknown>>) => void;
|
|
462
|
+
clearStorage: () => void;
|
|
463
|
+
rehydrate: () => Promise<void> | void;
|
|
464
|
+
hasHydrated: () => boolean;
|
|
465
|
+
onHydrate: (fn: (state: WorkspaceStore) => void) => () => void;
|
|
466
|
+
onFinishHydration: (fn: (state: WorkspaceStore) => void) => () => void;
|
|
467
|
+
getOptions: () => Partial<PersistOptions<WorkspaceStore, {
|
|
468
|
+
layout: unknown;
|
|
469
|
+
sidebar: SidebarState;
|
|
470
|
+
panelSizes: Record<string, number>;
|
|
471
|
+
}, unknown>>;
|
|
472
|
+
};
|
|
473
|
+
} & {
|
|
474
|
+
cleanup: () => void;
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
export declare interface CreateWorkspaceStoreOptions {
|
|
478
|
+
workspaceId?: string;
|
|
479
|
+
storageKey?: string;
|
|
480
|
+
persistenceEnabled?: boolean;
|
|
481
|
+
onLayoutVersionMismatch?: () => void;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export declare const DATA_CATALOG_DEFAULT_TOOL_NAME = "query_data_catalog";
|
|
485
|
+
|
|
486
|
+
export declare const DATA_CATALOG_PLUGIN_ID = "data-catalog";
|
|
487
|
+
|
|
488
|
+
export declare const DATA_CATALOG_ROW_SURFACE_KIND = "data-catalog.open-row";
|
|
489
|
+
|
|
490
|
+
export declare function dataCatalogPanelInstanceId(rowId: string, prefix?: string): string;
|
|
491
|
+
|
|
492
|
+
export declare interface DataCatalogResolvedQuery {
|
|
493
|
+
query?: string;
|
|
494
|
+
controlled: boolean;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export declare interface DataCatalogSelectContext {
|
|
498
|
+
params?: LeftTabParams;
|
|
499
|
+
bridge?: WorkspaceBridge;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
export declare interface DataCatalogVisualizationParams {
|
|
503
|
+
row?: ExplorerRow;
|
|
504
|
+
query?: string;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
export declare interface DataCatalogVisualizationState extends DataCatalogResolvedQuery {
|
|
508
|
+
row?: ExplorerRow;
|
|
509
|
+
title: string;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
export declare function DataExplorer({ adapter, facets: facetConfigs, groupBy, onActivate, getDragPayload, emptyState, searchPlaceholder, searchable, query, pageSize, debounceMs, className, }: DataExplorerProps): JSX.Element;
|
|
513
|
+
|
|
514
|
+
export declare type DataExplorerProps = {
|
|
515
|
+
adapter: ExplorerAdapter;
|
|
516
|
+
/** Facets shown in the toolbar popover. Adapter must implement fetchFacets for this to work. */
|
|
517
|
+
facets?: FacetConfig[];
|
|
518
|
+
/** Single grouping axis (must match a facet key). When set, renders tree mode. */
|
|
519
|
+
groupBy?: string;
|
|
520
|
+
/** Activated when a row is clicked, double-clicked, or Enter-pressed. */
|
|
521
|
+
onActivate?: (row: ExplorerRow) => void;
|
|
522
|
+
/** Returning a payload makes rows draggable. */
|
|
523
|
+
getDragPayload?: (row: ExplorerRow) => DragPayload | null | undefined;
|
|
524
|
+
/** Empty state shown when the top-level result has no rows and no query/filters. */
|
|
525
|
+
emptyState?: ReactNode;
|
|
526
|
+
searchPlaceholder?: string;
|
|
527
|
+
/** Hide the search input. Default true. */
|
|
528
|
+
searchable?: boolean;
|
|
529
|
+
/**
|
|
530
|
+
* Controlled query. When set, the toolbar's search input is hidden and the
|
|
531
|
+
* caller is responsible for supplying (and debouncing) the query value.
|
|
532
|
+
* Useful when an outer chrome already owns a search box.
|
|
533
|
+
*/
|
|
534
|
+
query?: string;
|
|
535
|
+
/** Page size and debounce — passed through to useExplorerState. */
|
|
536
|
+
pageSize?: number;
|
|
537
|
+
debounceMs?: number;
|
|
538
|
+
className?: string;
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
export declare function defineFrontPlugin(spec: WorkspaceFrontPlugin): WorkspaceFrontPlugin;
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Identity helper for type-safe panel registration. Pure runtime
|
|
545
|
+
* passthrough — the value of this is forcing TypeScript to verify that
|
|
546
|
+
* the registered component accepts the params shape declared on the
|
|
547
|
+
* config. Without it, apps tend to widen `component` to
|
|
548
|
+
* `ComponentType<PaneProps<unknown>>` and lose the link.
|
|
549
|
+
*
|
|
550
|
+
* ```ts
|
|
551
|
+
* const editorPanel = definePanel<{ path: string }>({
|
|
552
|
+
* id: "code-editor",
|
|
553
|
+
* title: "Editor",
|
|
554
|
+
* component: CodeEditorPane, // typechecked against PaneProps<{ path: string }>
|
|
555
|
+
* placement: "center",
|
|
556
|
+
* })
|
|
557
|
+
* ```
|
|
558
|
+
*/
|
|
559
|
+
export declare function definePanel<T = unknown>(config: PanelConfig<T>): PanelConfig<T>;
|
|
560
|
+
|
|
561
|
+
export { dismissToast }
|
|
562
|
+
|
|
563
|
+
export declare interface DispatchContext {
|
|
564
|
+
/**
|
|
565
|
+
* Imperative handle to the workbench surface. Function (getter) so a
|
|
566
|
+
* late SurfaceShell mount, or any later swap, is picked up without
|
|
567
|
+
* restarting the transport. Returns null when the surface isn't ready.
|
|
568
|
+
*/
|
|
569
|
+
surface: () => SurfaceShellApi | null;
|
|
570
|
+
/** Read the current open/closed state of the workbench pane. */
|
|
571
|
+
isWorkbenchOpen: () => boolean;
|
|
572
|
+
/** Toggle the workbench pane open. Must be a no-op when already open. */
|
|
573
|
+
openWorkbench: () => void;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
export declare function DockviewShell({ layout, persistedLayout, onReady, onLayoutChange, allowedPanels, className, prefixHeaderActions, rightHeaderActions, watermarkComponent, }: DockviewShellProps): JSX.Element;
|
|
577
|
+
|
|
578
|
+
export declare interface DockviewShellApi {
|
|
579
|
+
addPanel(groupId: string, config: {
|
|
580
|
+
id: string;
|
|
581
|
+
component: string;
|
|
582
|
+
title?: string;
|
|
583
|
+
params?: Record<string, unknown>;
|
|
584
|
+
}): void;
|
|
585
|
+
removePanel(panelId: string): void;
|
|
586
|
+
activatePanel(panelId: string): void;
|
|
587
|
+
movePanel(panelId: string, target: {
|
|
588
|
+
groupId: string;
|
|
589
|
+
} | {
|
|
590
|
+
direction: "left" | "right" | "above" | "below";
|
|
591
|
+
referencePanelId: string;
|
|
592
|
+
}): void;
|
|
593
|
+
updatePanelParams(panelId: string, params: Record<string, unknown>): void;
|
|
594
|
+
setPanelTitle(panelId: string, title: string): void;
|
|
595
|
+
findPanelsByParam(key: string, value: unknown): string[];
|
|
596
|
+
getActivePanel(): string | null;
|
|
597
|
+
toJSON(): SerializedLayout;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export declare interface DockviewShellProps {
|
|
601
|
+
layout: LayoutConfig;
|
|
602
|
+
persistedLayout?: SerializedLayout;
|
|
603
|
+
onReady?: (api: DockviewApi) => void;
|
|
604
|
+
onLayoutChange?: (layout: SerializedLayout) => void;
|
|
605
|
+
storageKey?: string;
|
|
606
|
+
allowedPanels?: string[];
|
|
607
|
+
className?: string;
|
|
608
|
+
/** Component rendered in the tab strip BEFORE the tabs. Useful for inline controls. */
|
|
609
|
+
prefixHeaderActions?: React.FunctionComponent<unknown>;
|
|
610
|
+
/** Component rendered in the tab strip on the far right. */
|
|
611
|
+
rightHeaderActions?: React.FunctionComponent<unknown>;
|
|
612
|
+
/** Component used as the empty-state watermark when a group has no panels. */
|
|
613
|
+
watermarkComponent?: React.FunctionComponent<unknown>;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
export declare type DragPayload = {
|
|
617
|
+
mimeType: string;
|
|
618
|
+
value: string;
|
|
619
|
+
};
|
|
620
|
+
|
|
621
|
+
export declare interface DynamicPaneConfig {
|
|
622
|
+
id: string;
|
|
623
|
+
component: string;
|
|
624
|
+
params?: Record<string, unknown>;
|
|
625
|
+
title?: string;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
export declare interface EditorLifecycleAdapter {
|
|
629
|
+
isDirty: () => boolean;
|
|
630
|
+
save: () => Promise<void>;
|
|
631
|
+
getContent: () => string;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
export declare function emitAgentData(part: unknown): void;
|
|
635
|
+
|
|
636
|
+
export declare function emitFilesystemAgentFileChange(part: unknown): void;
|
|
637
|
+
|
|
638
|
+
export declare function EmptyPane({ className, onOpenFile }: EmptyPaneProps): JSX.Element;
|
|
639
|
+
|
|
640
|
+
export declare interface EmptyPaneProps {
|
|
641
|
+
className?: string;
|
|
642
|
+
onOpenFile?: () => void;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* Tiny typed event bus. ~30 lines, no runtime deps.
|
|
647
|
+
*
|
|
648
|
+
* Design constraints (locked by reviewer feedback in
|
|
649
|
+
* `docs/plans/UNIFIED_EVENT_BUS.md`):
|
|
650
|
+
*
|
|
651
|
+
* - Synchronous emit only. Slow subscribers fire-and-forget their own async work.
|
|
652
|
+
* - Snapshot listeners before iterating so subscribe / unsubscribe
|
|
653
|
+
* during dispatch is safe.
|
|
654
|
+
* - One thrown listener does not stop the chain. Errors go to console.error.
|
|
655
|
+
* - Bus emits transitions only — no replay-on-subscribe.
|
|
656
|
+
*/
|
|
657
|
+
declare interface EventBus<TMap extends Record<string, any>> {
|
|
658
|
+
/** Subscribe to one event name. Returns an unsubscribe function. */
|
|
659
|
+
on<K extends keyof TMap>(name: K, fn: (payload: TMap[K]) => void): () => void;
|
|
660
|
+
/** Synchronously dispatch to every matching listener. */
|
|
661
|
+
emit<K extends keyof TMap>(name: K, payload: TMap[K]): void;
|
|
662
|
+
/** Test-only — never call from production code. Underscore-prefixed by convention. */
|
|
663
|
+
_reset(): void;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/** Common envelope on every payload. */
|
|
667
|
+
export declare type EventMeta = Origin & {
|
|
668
|
+
ts: number;
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
export declare const events: EventBus<WorkspaceEventMap>;
|
|
672
|
+
|
|
673
|
+
export declare const expandToFileSchema: z.ZodObject<{
|
|
674
|
+
path: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
|
675
|
+
}, "strip", z.ZodTypeAny, {
|
|
676
|
+
path: string;
|
|
677
|
+
}, {
|
|
678
|
+
path: string;
|
|
679
|
+
}>;
|
|
680
|
+
|
|
681
|
+
export declare const EXPLORER_PLUGIN_ID = "explorer";
|
|
682
|
+
|
|
683
|
+
export declare type ExplorerAdapter = {
|
|
684
|
+
search(args: SearchArgs): Promise<SearchResult>;
|
|
685
|
+
/** Optional. When omitted, the explorer renders flat (no facet popover). */
|
|
686
|
+
fetchFacets?(args: FacetsArgs): Promise<Facets>;
|
|
687
|
+
};
|
|
688
|
+
|
|
689
|
+
declare type ExplorerAdapter_2 = {
|
|
690
|
+
search(args: SearchArgs_2): Promise<SearchResult_2>;
|
|
691
|
+
/** Optional. When omitted, the explorer renders flat (no facet popover). */
|
|
692
|
+
fetchFacets?(args: FacetsArgs_2): Promise<Facets_2>;
|
|
693
|
+
};
|
|
694
|
+
|
|
695
|
+
export declare interface ExplorerCatalogConfig {
|
|
696
|
+
id?: string;
|
|
697
|
+
label?: string;
|
|
698
|
+
onSelect?: (row: ExplorerRow) => void;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
export declare interface ExplorerContributionConfig {
|
|
702
|
+
id?: string;
|
|
703
|
+
title?: string;
|
|
704
|
+
label?: string;
|
|
705
|
+
icon?: PanelConfig["icon"];
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
export declare type ExplorerMode = "flat" | "grouped" | "sectioned";
|
|
709
|
+
|
|
710
|
+
export declare type ExplorerRow = {
|
|
711
|
+
id: string;
|
|
712
|
+
title: string;
|
|
713
|
+
/** Optional muted second line (truncates with title). */
|
|
714
|
+
subtitle?: string;
|
|
715
|
+
/** Group key — must match one of the facet values for `groupBy`. */
|
|
716
|
+
group?: string;
|
|
717
|
+
/** Leading mono chip (e.g. type code, frequency). */
|
|
718
|
+
leading?: Badge;
|
|
719
|
+
/** Trailing mono chips for status flags (e.g. [D] derived, [LIVE]). */
|
|
720
|
+
trailing?: Badge[];
|
|
721
|
+
/** Right-aligned plain text for numeric metadata (e.g. "1.2M", "2.4s"). */
|
|
722
|
+
meta?: string;
|
|
723
|
+
};
|
|
724
|
+
|
|
725
|
+
declare type ExplorerRow_2 = {
|
|
726
|
+
id: string;
|
|
727
|
+
title: string;
|
|
728
|
+
/** Optional muted second line (truncates with title). */
|
|
729
|
+
subtitle?: string;
|
|
730
|
+
/** Group key — must match one of the facet values for `groupBy`. */
|
|
731
|
+
group?: string;
|
|
732
|
+
/** Leading mono chip (e.g. type code, frequency). */
|
|
733
|
+
leading?: Badge_2;
|
|
734
|
+
/** Trailing mono chips for status flags (e.g. [D] derived, [LIVE]). */
|
|
735
|
+
trailing?: Badge_2[];
|
|
736
|
+
/** Right-aligned plain text for numeric metadata (e.g. "1.2M", "2.4s"). */
|
|
737
|
+
meta?: string;
|
|
738
|
+
};
|
|
739
|
+
|
|
740
|
+
export declare interface ExplorerSection {
|
|
741
|
+
id: string;
|
|
742
|
+
title: string;
|
|
743
|
+
subtitle?: string;
|
|
744
|
+
count?: number;
|
|
745
|
+
filters?: ExplorerSectionFilter[];
|
|
746
|
+
defaultExpanded?: boolean;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
export declare interface ExplorerSectionFilter extends FacetConfig {
|
|
750
|
+
values?: FacetValue[];
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
export declare function ExplorerView(props: ExplorerViewProps): JSX.Element;
|
|
754
|
+
|
|
755
|
+
export declare type ExplorerViewProps = (Omit<DataExplorerProps, "groupBy"> & {
|
|
756
|
+
mode?: "flat";
|
|
757
|
+
groupBy?: never;
|
|
758
|
+
sectionedAdapter?: never;
|
|
759
|
+
}) | (DataExplorerProps & {
|
|
760
|
+
mode: "grouped";
|
|
761
|
+
groupBy: string;
|
|
762
|
+
sectionedAdapter?: never;
|
|
763
|
+
}) | (Omit<SectionedExplorerProps, "adapter"> & {
|
|
764
|
+
mode: "sectioned";
|
|
765
|
+
adapter?: never;
|
|
766
|
+
sectionedAdapter: SectionedExplorerAdapter;
|
|
767
|
+
facets?: never;
|
|
768
|
+
groupBy?: never;
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
export declare type FacetConfig = {
|
|
772
|
+
/** Filter key sent to the adapter (e.g. "frequency"). */
|
|
773
|
+
key: string;
|
|
774
|
+
/** Display label (e.g. "Frequency"). */
|
|
775
|
+
label: string;
|
|
776
|
+
/** Explicit display order; unknown values go after in adapter order. */
|
|
777
|
+
order?: string[];
|
|
778
|
+
/** Display formatter for raw values (e.g. "M" → "Monthly"). */
|
|
779
|
+
formatValue?: (value: string) => string;
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
export declare type Facets = Record<string, FacetValue[]>;
|
|
783
|
+
|
|
784
|
+
declare type Facets_2 = Record<string, FacetValue_2[]>;
|
|
785
|
+
|
|
786
|
+
export declare type FacetsArgs = {
|
|
787
|
+
filters: Record<string, string[]>;
|
|
788
|
+
signal?: AbortSignal;
|
|
789
|
+
};
|
|
790
|
+
|
|
791
|
+
declare type FacetsArgs_2 = {
|
|
792
|
+
filters: Record<string, string[]>;
|
|
793
|
+
signal?: AbortSignal;
|
|
794
|
+
};
|
|
795
|
+
|
|
796
|
+
export declare type FacetValue = {
|
|
797
|
+
value: string;
|
|
798
|
+
count: number;
|
|
799
|
+
};
|
|
800
|
+
|
|
801
|
+
declare type FacetValue_2 = {
|
|
802
|
+
value: string;
|
|
803
|
+
count: number;
|
|
804
|
+
};
|
|
805
|
+
|
|
806
|
+
declare const FILESYSTEM_FILE_CHANGED_EVENT = "filesystem:file.changed";
|
|
807
|
+
|
|
808
|
+
declare const FILESYSTEM_FILE_CREATED_EVENT = "filesystem:file.created";
|
|
809
|
+
|
|
810
|
+
declare const FILESYSTEM_FILE_DELETED_EVENT = "filesystem:file.deleted";
|
|
811
|
+
|
|
812
|
+
declare const FILESYSTEM_FILE_MOVED_EVENT = "filesystem:file.moved";
|
|
813
|
+
|
|
814
|
+
export declare interface FilesystemEventMap {
|
|
815
|
+
[FILESYSTEM_FILE_MOVED_EVENT]: FilesystemEventMeta & {
|
|
816
|
+
from: string;
|
|
817
|
+
to: string;
|
|
818
|
+
};
|
|
819
|
+
[FILESYSTEM_FILE_DELETED_EVENT]: FilesystemEventMeta & {
|
|
820
|
+
path: string;
|
|
821
|
+
};
|
|
822
|
+
[FILESYSTEM_FILE_CREATED_EVENT]: FilesystemEventMeta & {
|
|
823
|
+
path: string;
|
|
824
|
+
kind: "file" | "dir";
|
|
825
|
+
};
|
|
826
|
+
[FILESYSTEM_FILE_CHANGED_EVENT]: FilesystemEventMeta & {
|
|
827
|
+
path: string;
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
export declare type FilesystemEventMeta = ({
|
|
832
|
+
cause: "user";
|
|
833
|
+
} | {
|
|
834
|
+
cause: "agent";
|
|
835
|
+
toolCallId: string;
|
|
836
|
+
} | {
|
|
837
|
+
cause: "remote";
|
|
838
|
+
toolCallId?: string;
|
|
839
|
+
}) & {
|
|
840
|
+
ts: number;
|
|
841
|
+
};
|
|
842
|
+
|
|
843
|
+
export declare const filesystemEvents: {
|
|
844
|
+
readonly changed: "filesystem:file.changed";
|
|
845
|
+
readonly created: "filesystem:file.created";
|
|
846
|
+
readonly moved: "filesystem:file.moved";
|
|
847
|
+
readonly deleted: "filesystem:file.deleted";
|
|
848
|
+
};
|
|
849
|
+
|
|
850
|
+
export declare const filesystemPlugin: WorkspaceFrontPlugin;
|
|
851
|
+
|
|
852
|
+
export declare function FileTree({ files, selectedPath, searchQuery, height, editing, revealPath, pendingPaths, onSelect, onExpand, onCollapse, onContextMenu, onSubmitEdit, onCancelEdit, onDragDrop, className, }: FileTreeProps): JSX.Element;
|
|
853
|
+
|
|
854
|
+
declare interface FileTreeEditState {
|
|
855
|
+
/** Path of the row currently being edited (rename target or draft path). */
|
|
856
|
+
path: string;
|
|
857
|
+
/** When true, treat blank/Esc as cancel-without-error (new-file/folder flow). */
|
|
858
|
+
isDraft: boolean;
|
|
859
|
+
/** Pre-filled value (for rename). */
|
|
860
|
+
initialValue?: string;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
export declare interface FileTreeNode {
|
|
864
|
+
name: string;
|
|
865
|
+
kind: "file" | "dir";
|
|
866
|
+
path: string;
|
|
867
|
+
children?: FileTreeNode[];
|
|
868
|
+
/**
|
|
869
|
+
* Internal: marks a placeholder row used for inline new-file/new-folder
|
|
870
|
+
* input. Consumers (FileTreeView) inject this when the user starts a
|
|
871
|
+
* create action; FileTree renders an <input> instead of a name.
|
|
872
|
+
*/
|
|
873
|
+
isDraft?: boolean;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/**
|
|
877
|
+
* Default "Files" panel: `PanelChrome` + always-visible search input wired to
|
|
878
|
+
* `<FileTreeView>`. Drop into a dockview registry as-is, or compose
|
|
879
|
+
* `FileTreeView` directly when you want different chrome/search UX.
|
|
880
|
+
*/
|
|
881
|
+
export declare function FileTreePane({ params, rootDir, searchQuery: controlledSearchQuery, panelApi, bridge, api, chromeless, className, }: FileTreePaneProps): JSX.Element;
|
|
882
|
+
|
|
883
|
+
declare interface FileTreePaneParams extends LeftTabParams {
|
|
884
|
+
rootDir?: string;
|
|
885
|
+
searchQuery?: string;
|
|
886
|
+
query?: string;
|
|
887
|
+
bridge?: unknown;
|
|
888
|
+
chromeless?: boolean;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
export declare interface FileTreePaneProps extends Partial<PaneProps<FileTreePaneParams>> {
|
|
892
|
+
rootDir?: string;
|
|
893
|
+
searchQuery?: string;
|
|
894
|
+
panelApi?: DockviewPanelApi;
|
|
895
|
+
bridge?: WorkspaceBridge;
|
|
896
|
+
chromeless?: boolean;
|
|
897
|
+
className?: string;
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
export declare interface FileTreeProps {
|
|
901
|
+
files: FileTreeNode[];
|
|
902
|
+
selectedPath?: string | null;
|
|
903
|
+
searchQuery?: string;
|
|
904
|
+
height?: number;
|
|
905
|
+
/** Path of the row whose name should render as an <input>. */
|
|
906
|
+
editing?: FileTreeEditState | null;
|
|
907
|
+
/** Path that should be scrolled into view, opening parent folders if needed. */
|
|
908
|
+
revealPath?: string | null;
|
|
909
|
+
/** Paths currently being mutated — render a small spinner on those rows. */
|
|
910
|
+
pendingPaths?: ReadonlySet<string>;
|
|
911
|
+
onSelect?: (path: string) => void;
|
|
912
|
+
onExpand?: (path: string) => void;
|
|
913
|
+
onCollapse?: (path: string) => void;
|
|
914
|
+
onContextMenu?: (event: React.MouseEvent, node: FileTreeNode) => void;
|
|
915
|
+
onDragDrop?: (sourcePath: string, targetDirPath: string) => void;
|
|
916
|
+
/** Called when the user presses Enter on an inline-edit input. */
|
|
917
|
+
onSubmitEdit?: (path: string, value: string) => void;
|
|
918
|
+
/** Called when the user presses Esc or blurs without submitting. */
|
|
919
|
+
onCancelEdit?: () => void;
|
|
920
|
+
className?: string;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
/**
|
|
924
|
+
* File tree with the full workbench actions: tracks container height,
|
|
925
|
+
* routes selects through `bridge.openFile`, and provides a right-click
|
|
926
|
+
* context menu (new file/folder, rename, delete, copy path) plus a
|
|
927
|
+
* delete-confirmation dialog.
|
|
928
|
+
*
|
|
929
|
+
* The chrome (PanelChrome, search input) is the consumer's responsibility.
|
|
930
|
+
* `FileTreePane` (below) is the default chromed wrapper for hosts that just
|
|
931
|
+
* want a "Files" panel; `WorkbenchLeftPane` uses this primitive directly to
|
|
932
|
+
* share its search input with the Data tab.
|
|
933
|
+
*/
|
|
934
|
+
export declare function FileTreeView({ rootDir, searchQuery, bridge, ignoreNames, className, }: FileTreeViewProps): JSX.Element;
|
|
935
|
+
|
|
936
|
+
export declare interface FileTreeViewProps {
|
|
937
|
+
rootDir?: string;
|
|
938
|
+
/** Already-debounced query. Empty/undefined means no filter. */
|
|
939
|
+
searchQuery?: string;
|
|
940
|
+
bridge?: Pick<WorkspaceBridge, "openFile" | "getActiveFile" | "select">;
|
|
941
|
+
/**
|
|
942
|
+
* Names (or regex patterns) to hide from the tree. Defaults to
|
|
943
|
+
* `DEFAULT_TREE_IGNORE` (node_modules, .git, dist, …). Pass `[]` to
|
|
944
|
+
* show everything; pass your own array to override entirely. Patterns
|
|
945
|
+
* match on file/folder NAME, not the full path.
|
|
946
|
+
*/
|
|
947
|
+
ignoreNames?: ReadonlyArray<string | RegExp>;
|
|
948
|
+
/** Forwarded to the inner <FileTree>. */
|
|
949
|
+
className?: string;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
export declare function formatShortcut(binding: Pick<ShortcutBinding, "key" | "mod" | "shift">): string;
|
|
953
|
+
|
|
954
|
+
export declare function getFileIcon(filename: string): LucideIcon;
|
|
955
|
+
|
|
956
|
+
export declare interface GroupConfig {
|
|
957
|
+
id: string;
|
|
958
|
+
position: "left" | "center" | "right" | "bottom";
|
|
959
|
+
panel?: string;
|
|
960
|
+
params?: Record<string, unknown>;
|
|
961
|
+
locked?: boolean;
|
|
962
|
+
hideHeader?: boolean;
|
|
963
|
+
dynamic?: boolean;
|
|
964
|
+
placeholder?: string;
|
|
965
|
+
collapsible?: boolean;
|
|
966
|
+
collapsedWidth?: number;
|
|
967
|
+
constraints?: {
|
|
968
|
+
minWidth?: number;
|
|
969
|
+
maxWidth?: number;
|
|
970
|
+
maxWidthViewportRatio?: number;
|
|
971
|
+
minHeight?: number;
|
|
972
|
+
maxHeight?: number;
|
|
973
|
+
};
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
declare type GroupState = {
|
|
977
|
+
items: ExplorerRow[];
|
|
978
|
+
total: number;
|
|
979
|
+
hasMore: boolean;
|
|
980
|
+
loading: boolean;
|
|
981
|
+
};
|
|
982
|
+
|
|
983
|
+
export declare function IdeLayout(props: IdeLayoutProps): JSX.Element;
|
|
984
|
+
|
|
985
|
+
export declare interface IdeLayoutProps {
|
|
986
|
+
sidebar?: string;
|
|
987
|
+
center?: string;
|
|
988
|
+
right?: string;
|
|
989
|
+
className?: string;
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
export declare type JSONSchema = Record<string, unknown>;
|
|
993
|
+
|
|
994
|
+
export declare interface LayoutConfig {
|
|
995
|
+
version: string;
|
|
996
|
+
groups: GroupConfig[];
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
export declare type LeftTabComponent = ComponentType<PaneProps<LeftTabParams>>;
|
|
1000
|
+
|
|
1001
|
+
export declare interface LeftTabOutput<T = LeftTabParams> {
|
|
1002
|
+
type: "left-tab";
|
|
1003
|
+
id: string;
|
|
1004
|
+
title: string;
|
|
1005
|
+
icon?: PanelConfig<T>["icon"];
|
|
1006
|
+
component: PanelConfig<T>["component"];
|
|
1007
|
+
lazy?: PanelConfig<T>["lazy"];
|
|
1008
|
+
requiresCapabilities?: PanelConfig<T>["requiresCapabilities"];
|
|
1009
|
+
source?: PanelConfig<T>["source"];
|
|
1010
|
+
chromeless?: PanelConfig<T>["chromeless"];
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
export declare interface LeftTabParams {
|
|
1014
|
+
rootDir?: string;
|
|
1015
|
+
query?: string;
|
|
1016
|
+
searchQuery?: string;
|
|
1017
|
+
bridge?: unknown;
|
|
1018
|
+
chromeless?: boolean;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
export declare function MarkdownEditor({ content, onChange, readOnly, placeholder, className, }: MarkdownEditorProps): JSX.Element;
|
|
1022
|
+
|
|
1023
|
+
export declare function MarkdownEditorPane({ params, api, className }: MarkdownEditorPaneProps): JSX.Element;
|
|
1024
|
+
|
|
1025
|
+
export declare type MarkdownEditorPaneProps = PaneProps<{
|
|
1026
|
+
path?: string;
|
|
1027
|
+
}>;
|
|
1028
|
+
|
|
1029
|
+
export declare interface MarkdownEditorProps {
|
|
1030
|
+
content: string;
|
|
1031
|
+
onChange?: (content: string) => void;
|
|
1032
|
+
readOnly?: boolean;
|
|
1033
|
+
placeholder?: string;
|
|
1034
|
+
className?: string;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
export declare const MAX_PANELS = 50;
|
|
1038
|
+
|
|
1039
|
+
export declare const navigateToLineSchema: z.ZodObject<{
|
|
1040
|
+
file: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
|
1041
|
+
line: z.ZodNumber;
|
|
1042
|
+
}, "strip", z.ZodTypeAny, {
|
|
1043
|
+
line: number;
|
|
1044
|
+
file: string;
|
|
1045
|
+
}, {
|
|
1046
|
+
line: number;
|
|
1047
|
+
file: string;
|
|
1048
|
+
}>;
|
|
1049
|
+
|
|
1050
|
+
declare interface Notification_2 {
|
|
1051
|
+
id: string;
|
|
1052
|
+
message: string;
|
|
1053
|
+
type: "info" | "warning" | "error";
|
|
1054
|
+
timestamp: number;
|
|
1055
|
+
}
|
|
1056
|
+
export { Notification_2 as Notification }
|
|
1057
|
+
|
|
1058
|
+
export declare const notificationSchema: z.ZodObject<{
|
|
1059
|
+
msg: z.ZodString;
|
|
1060
|
+
level: z.ZodOptional<z.ZodEnum<["info", "warn", "error"]>>;
|
|
1061
|
+
}, "strip", z.ZodTypeAny, {
|
|
1062
|
+
msg: string;
|
|
1063
|
+
level?: "error" | "info" | "warn" | undefined;
|
|
1064
|
+
}, {
|
|
1065
|
+
msg: string;
|
|
1066
|
+
level?: "error" | "info" | "warn" | undefined;
|
|
1067
|
+
}>;
|
|
1068
|
+
|
|
1069
|
+
/** Subscribe to file-changed events. Returns the unsubscribe function. */
|
|
1070
|
+
export declare function onFilesystemChanged(handler: (payload: FilesystemEventMeta & {
|
|
1071
|
+
path: string;
|
|
1072
|
+
}) => void): () => void;
|
|
1073
|
+
|
|
1074
|
+
export declare type OpenArtifactHandler = (path: string) => void;
|
|
1075
|
+
|
|
1076
|
+
export declare function openDataCatalogVisualization(row: ExplorerRow, options: OpenDataCatalogVisualizationOptions): void;
|
|
1077
|
+
|
|
1078
|
+
export declare interface OpenDataCatalogVisualizationOptions {
|
|
1079
|
+
catalogId: string;
|
|
1080
|
+
surfaceKind?: string;
|
|
1081
|
+
title?: string;
|
|
1082
|
+
params?: Record<string, unknown>;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
export declare const openFileSchema: z.ZodObject<{
|
|
1086
|
+
path: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
|
1087
|
+
mode: z.ZodOptional<z.ZodEnum<["view", "edit", "diff"]>>;
|
|
1088
|
+
}, "strip", z.ZodTypeAny, {
|
|
1089
|
+
path: string;
|
|
1090
|
+
mode?: "view" | "edit" | "diff" | undefined;
|
|
1091
|
+
}, {
|
|
1092
|
+
path: string;
|
|
1093
|
+
mode?: "view" | "edit" | "diff" | undefined;
|
|
1094
|
+
}>;
|
|
1095
|
+
|
|
1096
|
+
export declare interface OpenPanelConfig {
|
|
1097
|
+
/** Panel instance id. If a panel with this id is already open, it's re-activated instead of duplicated. */
|
|
1098
|
+
id: string;
|
|
1099
|
+
/** Registered component id (must match a `PanelConfig.id` in WorkspaceProvider's panel registry). */
|
|
1100
|
+
component: string;
|
|
1101
|
+
/** Tab title. Defaults to `id`. */
|
|
1102
|
+
title?: string;
|
|
1103
|
+
/** Arbitrary params passed to the pane component. */
|
|
1104
|
+
params?: Record<string, unknown>;
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
export declare const openPanelSchema: z.ZodObject<{
|
|
1108
|
+
id: z.ZodString;
|
|
1109
|
+
component: z.ZodString;
|
|
1110
|
+
params: z.ZodEffects<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
|
|
1111
|
+
title: z.ZodOptional<z.ZodString>;
|
|
1112
|
+
}, "strip", z.ZodTypeAny, {
|
|
1113
|
+
id: string;
|
|
1114
|
+
component: string;
|
|
1115
|
+
title?: string | undefined;
|
|
1116
|
+
params?: Record<string, unknown> | undefined;
|
|
1117
|
+
}, {
|
|
1118
|
+
id: string;
|
|
1119
|
+
component: string;
|
|
1120
|
+
title?: string | undefined;
|
|
1121
|
+
params?: Record<string, unknown> | undefined;
|
|
1122
|
+
}>;
|
|
1123
|
+
|
|
1124
|
+
/**
|
|
1125
|
+
* Discriminated origin metadata. Encoded as a union (rather than a
|
|
1126
|
+
* flat `cause` + optional `toolCallId`) so the type system enforces
|
|
1127
|
+
* that agent-originated events always carry a tool call id.
|
|
1128
|
+
*/
|
|
1129
|
+
export declare type Origin = {
|
|
1130
|
+
cause: "user";
|
|
1131
|
+
} | {
|
|
1132
|
+
cause: "agent";
|
|
1133
|
+
toolCallId: string;
|
|
1134
|
+
}
|
|
1135
|
+
/**
|
|
1136
|
+
* Anything observed via the server-side fs watcher: a collaborator
|
|
1137
|
+
* editing the same workspace, a git pull, an external editor, the
|
|
1138
|
+
* agent in another tab. Carries the tool call id ONLY when the
|
|
1139
|
+
* server can attribute the change (sandbox emits its own writes
|
|
1140
|
+
* with attribution; chokidar can't). Consumers that want to
|
|
1141
|
+
* suppress UX side-effects on self-echo compare `actorClientId` (a
|
|
1142
|
+
* future field) against their own.
|
|
1143
|
+
*/
|
|
1144
|
+
| {
|
|
1145
|
+
cause: "remote";
|
|
1146
|
+
toolCallId?: string;
|
|
1147
|
+
};
|
|
1148
|
+
|
|
1149
|
+
export declare interface PanelConfig<T = any> {
|
|
1150
|
+
id: string;
|
|
1151
|
+
title: string;
|
|
1152
|
+
icon?: ComponentType<{
|
|
1153
|
+
className?: string;
|
|
1154
|
+
}>;
|
|
1155
|
+
/** Placement hint: "left" | "center" | "right" | "bottom" | "left-tab" | "right-tab" */
|
|
1156
|
+
placement?: string;
|
|
1157
|
+
requiresCapabilities?: string[];
|
|
1158
|
+
essential?: boolean;
|
|
1159
|
+
chromeless?: boolean;
|
|
1160
|
+
/** Source: "builtin" | "app" */
|
|
1161
|
+
source?: string;
|
|
1162
|
+
pluginId?: string;
|
|
1163
|
+
/**
|
|
1164
|
+
* Whether to wrap the component with React.lazy + Suspense. Omit to let
|
|
1165
|
+
* the registry auto-detect: zero-arg functions (factories) are treated as
|
|
1166
|
+
* lazy; components that accept a props argument are treated as eager.
|
|
1167
|
+
*/
|
|
1168
|
+
lazy?: boolean;
|
|
1169
|
+
component: ComponentType<PaneProps<T>> | (() => Promise<{
|
|
1170
|
+
default: ComponentType<PaneProps<T>>;
|
|
1171
|
+
}>);
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
export declare class PanelErrorBoundary extends Component<PanelErrorBoundaryProps, State_2> {
|
|
1175
|
+
state: State_2;
|
|
1176
|
+
static getDerivedStateFromError(error: Error): State_2;
|
|
1177
|
+
componentDidCatch(error: Error, info: ErrorInfo): void;
|
|
1178
|
+
handleRetry: () => void;
|
|
1179
|
+
render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | ReactPortal | ReactElement<unknown, string | JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | JSX.Element | null | undefined;
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
export declare interface PanelErrorBoundaryProps {
|
|
1183
|
+
panelId: string;
|
|
1184
|
+
onError?: (data: {
|
|
1185
|
+
panelId: string;
|
|
1186
|
+
error: string;
|
|
1187
|
+
stack?: string;
|
|
1188
|
+
}) => void;
|
|
1189
|
+
children: ReactNode;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
export declare interface PanelLifecycleApi {
|
|
1193
|
+
panelId: string;
|
|
1194
|
+
title: string;
|
|
1195
|
+
setTitle(title: string): void;
|
|
1196
|
+
close(): void;
|
|
1197
|
+
focus(): void;
|
|
1198
|
+
isActive: boolean;
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
export declare interface PanelOutput<T = any> {
|
|
1202
|
+
type: "panel";
|
|
1203
|
+
panel: PanelConfig<T>;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
export declare type PanelRegistration<T = any> = Omit<PanelConfig<T>, 'id'>;
|
|
1207
|
+
|
|
1208
|
+
export declare class PanelRegistry {
|
|
1209
|
+
private panels;
|
|
1210
|
+
private registrationOrder;
|
|
1211
|
+
private capabilities;
|
|
1212
|
+
private listeners;
|
|
1213
|
+
private snapshotCache;
|
|
1214
|
+
constructor(capabilities?: Record<string, boolean>);
|
|
1215
|
+
register(id: string, config: PanelRegistration): void;
|
|
1216
|
+
unregisterByPluginId(pluginId: string): void;
|
|
1217
|
+
get(id: string): PanelConfig | undefined;
|
|
1218
|
+
has(id: string): boolean;
|
|
1219
|
+
list(): PanelConfig[];
|
|
1220
|
+
getComponents(): Record<string, ComponentType<any>>;
|
|
1221
|
+
subscribe: (cb: () => void) => (() => void);
|
|
1222
|
+
getSnapshot: () => readonly PanelConfig[];
|
|
1223
|
+
private emit;
|
|
1224
|
+
private filteredPanels;
|
|
1225
|
+
private satisfiesCapabilities;
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
export declare interface PanelRegistryLike {
|
|
1229
|
+
register(id: string, config: PanelRegistration): void;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
export declare interface PanelState {
|
|
1233
|
+
id: string;
|
|
1234
|
+
component: string;
|
|
1235
|
+
params?: Record<string, unknown>;
|
|
1236
|
+
groupId?: string;
|
|
1237
|
+
essential?: boolean;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
/**
|
|
1241
|
+
* Unified prop shape for panel components rendered inside DockviewShell.
|
|
1242
|
+
*
|
|
1243
|
+
* Structurally mirrors dockview's `IDockviewPanelProps<T>` so dockview
|
|
1244
|
+
* can render registered components directly — no wrapper, no field
|
|
1245
|
+
* renaming, no `as` casts. We re-state the shape (rather than re-export
|
|
1246
|
+
* dockview's type) so the workspace package owns its public contract:
|
|
1247
|
+
* if dockview's type ever drifts, only the wiring inside DockviewShell
|
|
1248
|
+
* needs to change.
|
|
1249
|
+
*
|
|
1250
|
+
* Use {@link definePanel} for type-safe registration.
|
|
1251
|
+
*
|
|
1252
|
+
* @typeParam T - Shape of the panel-specific `params` payload. Defaults
|
|
1253
|
+
* to `unknown` because layouts restored from JSON are inherently
|
|
1254
|
+
* un-typed at runtime; use a generic param when you control the
|
|
1255
|
+
* addPanel call site, otherwise read defensively.
|
|
1256
|
+
*/
|
|
1257
|
+
export declare interface PaneProps<T = unknown> {
|
|
1258
|
+
/** App-supplied data for this panel instance (e.g. `{ path: string }`). */
|
|
1259
|
+
params: T;
|
|
1260
|
+
/** Per-panel control surface (close, setActive, setTitle, …). */
|
|
1261
|
+
api: DockviewPanelApi;
|
|
1262
|
+
/** Top-level dockview API (groups, addPanel, removePanel, fromJSON, …). */
|
|
1263
|
+
containerApi: DockviewApi;
|
|
1264
|
+
/** Optional className forwarded to the pane's root element. */
|
|
1265
|
+
className?: string;
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
export declare type PluginBinding = ComponentType<unknown>;
|
|
1269
|
+
|
|
1270
|
+
export declare interface PluginContributionError {
|
|
1271
|
+
kind: "contribution";
|
|
1272
|
+
pluginId: string;
|
|
1273
|
+
contributionKind: "panel" | "catalog-row" | "chat-suggestion";
|
|
1274
|
+
contributionId?: string;
|
|
1275
|
+
error: Error;
|
|
1276
|
+
componentStack?: string | null;
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
export declare class PluginError extends Error {
|
|
1280
|
+
readonly kind: PluginErrorKind;
|
|
1281
|
+
constructor(kind: PluginErrorKind, message: string);
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
export declare class PluginErrorBoundary extends Component<Props, State> {
|
|
1285
|
+
static contextType: Context<PluginErrorContextValue | null>;
|
|
1286
|
+
context: React.ContextType<typeof PluginErrorContext>;
|
|
1287
|
+
state: State;
|
|
1288
|
+
static getDerivedStateFromError(error: Error): State;
|
|
1289
|
+
componentDidCatch(error: Error, info: ErrorInfo): void;
|
|
1290
|
+
render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | ReactPortal | ReactElement<unknown, string | JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | JSX.Element | null | undefined;
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
declare const PluginErrorContext: Context<PluginErrorContextValue | null>;
|
|
1294
|
+
|
|
1295
|
+
declare interface PluginErrorContextValue {
|
|
1296
|
+
errors: PluginContributionError[];
|
|
1297
|
+
reportPluginError: (error: PluginContributionError) => void;
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
export declare type PluginErrorKind = "validation" | "duplicate-id" | "mount" | "contribution";
|
|
1301
|
+
|
|
1302
|
+
export declare function PluginErrorProvider({ children }: {
|
|
1303
|
+
children: ReactNode;
|
|
1304
|
+
}): JSX.Element;
|
|
1305
|
+
|
|
1306
|
+
export declare type PluginOutput = LeftTabOutput | PanelOutput | CommandOutput | CatalogOutput | BindingOutput | ProviderOutput | SurfaceResolverOutput | AgentToolOutput;
|
|
1307
|
+
|
|
1308
|
+
export declare type PluginProvider = ComponentType<PluginProviderProps>;
|
|
1309
|
+
|
|
1310
|
+
export declare interface PluginProviderProps {
|
|
1311
|
+
apiBaseUrl: string;
|
|
1312
|
+
authHeaders?: Record<string, string>;
|
|
1313
|
+
onAuthError?: (statusCode: number) => void;
|
|
1314
|
+
apiTimeout?: number;
|
|
1315
|
+
children: ReactNode;
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
export declare function postUiCommand(command: UiCommand): void;
|
|
1319
|
+
|
|
1320
|
+
declare interface Props {
|
|
1321
|
+
pluginId: string;
|
|
1322
|
+
contributionKind: "panel" | "catalog-row" | "chat-suggestion";
|
|
1323
|
+
contributionId?: string;
|
|
1324
|
+
children?: ReactNode;
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
export declare interface ProviderOutput {
|
|
1328
|
+
type: "provider";
|
|
1329
|
+
id: string;
|
|
1330
|
+
component: PluginProvider;
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
export declare function readDataCatalogRow(value: unknown): ExplorerRow | undefined;
|
|
1334
|
+
|
|
1335
|
+
declare interface RegisteredPluginMeta {
|
|
1336
|
+
id: string;
|
|
1337
|
+
label?: string;
|
|
1338
|
+
systemPrompt?: string;
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
export declare function RegistryProvider({ panelRegistry, commandRegistry, catalogRegistry, surfaceResolverRegistry, children, }: RegistryProviderProps): JSX.Element;
|
|
1342
|
+
|
|
1343
|
+
declare interface RegistryProviderProps {
|
|
1344
|
+
panelRegistry: PanelRegistry;
|
|
1345
|
+
commandRegistry: CommandRegistry;
|
|
1346
|
+
catalogRegistry?: CatalogRegistry;
|
|
1347
|
+
surfaceResolverRegistry?: SurfaceResolverRegistry;
|
|
1348
|
+
children: ReactNode;
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
export declare function resolveDataCatalogControlledQuery(params: LeftTabParams | DataCatalogVisualizationParams | undefined): DataCatalogResolvedQuery;
|
|
1352
|
+
|
|
1353
|
+
export declare function resolveDataCatalogQuery(params: LeftTabParams | DataCatalogVisualizationParams | undefined): string | undefined;
|
|
1354
|
+
|
|
1355
|
+
export declare function resolveDataCatalogVisualizationState(params: DataCatalogVisualizationParams | undefined, fallbackTitle: string): DataCatalogVisualizationState;
|
|
1356
|
+
|
|
1357
|
+
export declare function ResponsiveDockviewShell({ layout, className, }: ResponsiveDockviewShellProps): JSX.Element;
|
|
1358
|
+
|
|
1359
|
+
export declare interface ResponsiveDockviewShellProps {
|
|
1360
|
+
layout: LayoutConfig;
|
|
1361
|
+
className?: string;
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
export declare type SearchArgs = {
|
|
1365
|
+
query: string;
|
|
1366
|
+
filters: Record<string, string[]>;
|
|
1367
|
+
/** Scope to a single group's value (only set when paginating inside a group). */
|
|
1368
|
+
group?: {
|
|
1369
|
+
key: string;
|
|
1370
|
+
value: string;
|
|
1371
|
+
};
|
|
1372
|
+
limit: number;
|
|
1373
|
+
offset: number;
|
|
1374
|
+
signal?: AbortSignal;
|
|
1375
|
+
};
|
|
1376
|
+
|
|
1377
|
+
declare type SearchArgs_2 = {
|
|
1378
|
+
query: string;
|
|
1379
|
+
filters: Record<string, string[]>;
|
|
1380
|
+
/** Scope to a single group's value (only set when paginating inside a group). */
|
|
1381
|
+
group?: {
|
|
1382
|
+
key: string;
|
|
1383
|
+
value: string;
|
|
1384
|
+
};
|
|
1385
|
+
limit: number;
|
|
1386
|
+
offset: number;
|
|
1387
|
+
signal?: AbortSignal;
|
|
1388
|
+
};
|
|
1389
|
+
|
|
1390
|
+
export declare type SearchResult = {
|
|
1391
|
+
items: ExplorerRow[];
|
|
1392
|
+
/** Total count for the current scope (query + filters + optional group). */
|
|
1393
|
+
total: number;
|
|
1394
|
+
hasMore: boolean;
|
|
1395
|
+
};
|
|
1396
|
+
|
|
1397
|
+
declare type SearchResult_2 = {
|
|
1398
|
+
items: ExplorerRow_2[];
|
|
1399
|
+
/** Total count for the current scope (query + filters + optional group). */
|
|
1400
|
+
total: number;
|
|
1401
|
+
hasMore: boolean;
|
|
1402
|
+
};
|
|
1403
|
+
|
|
1404
|
+
export declare interface SectionedExplorerAdapter {
|
|
1405
|
+
sections(args: SectionedExplorerSectionsArgs): Promise<ExplorerSection[]>;
|
|
1406
|
+
searchSection(sectionId: string, args: SectionedExplorerSearchArgs): Promise<SearchResult>;
|
|
1407
|
+
fetchSectionFacets?(sectionId: string, args: SectionedExplorerFacetArgs): Promise<Facets>;
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
export declare interface SectionedExplorerFacetArgs {
|
|
1411
|
+
query: string;
|
|
1412
|
+
globalFilters: Record<string, string[]>;
|
|
1413
|
+
filters: Record<string, string[]>;
|
|
1414
|
+
signal?: AbortSignal;
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
export declare interface SectionedExplorerProps {
|
|
1418
|
+
adapter: SectionedExplorerAdapter;
|
|
1419
|
+
onActivate?: (row: ExplorerRow) => void;
|
|
1420
|
+
getDragPayload?: (row: ExplorerRow) => DragPayload | null | undefined;
|
|
1421
|
+
emptyState?: ReactNode;
|
|
1422
|
+
searchPlaceholder?: string;
|
|
1423
|
+
searchable?: boolean;
|
|
1424
|
+
query?: string;
|
|
1425
|
+
pageSize?: number;
|
|
1426
|
+
className?: string;
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
export declare interface SectionedExplorerSearchArgs {
|
|
1430
|
+
query: string;
|
|
1431
|
+
globalFilters: Record<string, string[]>;
|
|
1432
|
+
filters: Record<string, string[]>;
|
|
1433
|
+
limit: number;
|
|
1434
|
+
offset: number;
|
|
1435
|
+
signal?: AbortSignal;
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
export declare interface SectionedExplorerSectionsArgs {
|
|
1439
|
+
query: string;
|
|
1440
|
+
globalFilters: Record<string, string[]>;
|
|
1441
|
+
signal?: AbortSignal;
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
export declare type SerializedLayout = Parameters<DockviewApi["fromJSON"]>[0];
|
|
1445
|
+
|
|
1446
|
+
export declare function SessionBrowser({ sessions, activeId, onSwitch, onCreate, onDelete, onClose, className, }: SessionBrowserProps): JSX.Element;
|
|
1447
|
+
|
|
1448
|
+
export declare interface SessionBrowserProps {
|
|
1449
|
+
sessions: SessionItem[];
|
|
1450
|
+
activeId?: string | null;
|
|
1451
|
+
onSwitch?: (id: string) => void;
|
|
1452
|
+
onCreate?: () => void;
|
|
1453
|
+
onDelete?: (id: string) => void;
|
|
1454
|
+
onClose?: () => void;
|
|
1455
|
+
className?: string;
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
export declare interface SessionItem {
|
|
1459
|
+
id: string;
|
|
1460
|
+
title: string;
|
|
1461
|
+
updatedAt?: string | number;
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
export declare function SessionList({ sessions, activeId, onSwitch, onCreate, onDelete, className, }: SessionListProps): JSX.Element;
|
|
1465
|
+
|
|
1466
|
+
export declare interface SessionListProps {
|
|
1467
|
+
sessions: SessionItem[];
|
|
1468
|
+
activeId?: string | null;
|
|
1469
|
+
onSwitch?: (id: string) => void;
|
|
1470
|
+
onCreate?: () => void;
|
|
1471
|
+
onDelete?: (id: string) => void;
|
|
1472
|
+
onRename?: (id: string, newTitle: string) => void;
|
|
1473
|
+
className?: string;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
export declare interface ShortcutBinding {
|
|
1477
|
+
key: string;
|
|
1478
|
+
mod?: boolean;
|
|
1479
|
+
shift?: boolean;
|
|
1480
|
+
allowInEditable?: boolean;
|
|
1481
|
+
handler: () => void;
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
export declare interface SidebarState {
|
|
1485
|
+
collapsed: boolean;
|
|
1486
|
+
width: number;
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1489
|
+
declare interface State {
|
|
1490
|
+
error: Error | null;
|
|
1491
|
+
}
|
|
1492
|
+
|
|
1493
|
+
declare interface State_2 {
|
|
1494
|
+
hasError: boolean;
|
|
1495
|
+
error: Error | null;
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
declare type StoreApi = {
|
|
1499
|
+
getState: () => WorkspaceStore;
|
|
1500
|
+
subscribe: (listener: (state: WorkspaceStore, prev: WorkspaceStore) => void) => () => void;
|
|
1501
|
+
};
|
|
1502
|
+
|
|
1503
|
+
declare type StoreApi_2 = {
|
|
1504
|
+
getState: () => WorkspaceStore;
|
|
1505
|
+
subscribe: (listener: (state: WorkspaceStore, prev: WorkspaceStore) => void) => () => void;
|
|
1506
|
+
};
|
|
1507
|
+
|
|
1508
|
+
export declare interface SurfaceOpenRequest {
|
|
1509
|
+
kind: string;
|
|
1510
|
+
target: string;
|
|
1511
|
+
meta?: Record<string, unknown>;
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
export declare interface SurfacePanelResolution {
|
|
1515
|
+
component: string;
|
|
1516
|
+
id?: string;
|
|
1517
|
+
title?: string;
|
|
1518
|
+
params?: Record<string, unknown>;
|
|
1519
|
+
score?: number;
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
export declare interface SurfaceResolverConfig {
|
|
1523
|
+
id: string;
|
|
1524
|
+
resolve: (request: SurfaceOpenRequest) => SurfacePanelResolution | undefined;
|
|
1525
|
+
source?: string;
|
|
1526
|
+
pluginId?: string;
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1529
|
+
export declare interface SurfaceResolverOutput {
|
|
1530
|
+
type: "surface-resolver";
|
|
1531
|
+
resolver: SurfaceResolverConfig;
|
|
1532
|
+
}
|
|
1533
|
+
|
|
1534
|
+
export declare type SurfaceResolverRegistration = Omit<SurfaceResolverConfig, "id">;
|
|
1535
|
+
|
|
1536
|
+
export declare class SurfaceResolverRegistry {
|
|
1537
|
+
private resolvers;
|
|
1538
|
+
private registrationOrder;
|
|
1539
|
+
private listeners;
|
|
1540
|
+
private snapshotCache;
|
|
1541
|
+
register(id: string, config: SurfaceResolverRegistration): void;
|
|
1542
|
+
unregisterByPluginId(pluginId: string): void;
|
|
1543
|
+
get(id: string): SurfaceResolverConfig | undefined;
|
|
1544
|
+
has(id: string): boolean;
|
|
1545
|
+
list(): SurfaceResolverConfig[];
|
|
1546
|
+
resolve(request: SurfaceOpenRequest): SurfacePanelResolution | undefined;
|
|
1547
|
+
subscribe: (cb: () => void) => (() => void);
|
|
1548
|
+
getSnapshot: () => readonly SurfaceResolverConfig[];
|
|
1549
|
+
private emit;
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
export declare interface SurfaceResolverRegistryLike {
|
|
1553
|
+
register(id: string, config: SurfaceResolverRegistration): void;
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
export declare function SurfaceShell({ rootDir, sidebarDefaultWidth, sidebarMinWidth, sidebarMaxWidth, storageKey, onReady, onChange, onClose, extraPanels, className, }: SurfaceShellProps): JSX.Element;
|
|
1557
|
+
|
|
1558
|
+
export declare interface SurfaceShellApi {
|
|
1559
|
+
/** Open a file in the workbench. Idempotent — re-activates an existing pane for the same path. */
|
|
1560
|
+
openFile: (path: string) => void;
|
|
1561
|
+
/** Open a plugin-defined surface target through the registered surface resolvers. */
|
|
1562
|
+
openSurface: (request: SurfaceOpenRequest) => void;
|
|
1563
|
+
/**
|
|
1564
|
+
* Open a non-file pane in the workbench. Idempotent on `id` —
|
|
1565
|
+
* re-activates an existing panel with the same id rather than duplicating.
|
|
1566
|
+
* Use this for app-specific panes (charts, dashboards, log viewers, …) that
|
|
1567
|
+
* aren't anchored to a filesystem path.
|
|
1568
|
+
*/
|
|
1569
|
+
openPanel: (config: OpenPanelConfig) => void;
|
|
1570
|
+
/** Hide the workbench's left sources/files pane while leaving the workbench open. */
|
|
1571
|
+
closeWorkbenchLeftPane: () => void;
|
|
1572
|
+
/** Current snapshot of open tabs + active tab. */
|
|
1573
|
+
getSnapshot: () => SurfaceShellSnapshot;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
export declare interface SurfaceShellProps {
|
|
1577
|
+
rootDir?: string;
|
|
1578
|
+
sidebarDefaultWidth?: number;
|
|
1579
|
+
sidebarMinWidth?: number;
|
|
1580
|
+
sidebarMaxWidth?: number;
|
|
1581
|
+
storageKey?: string;
|
|
1582
|
+
/** Called once when the surface dockview becomes ready, with an imperative handle. */
|
|
1583
|
+
onReady?: (api: SurfaceShellApi) => void;
|
|
1584
|
+
/** Called on every panel add/remove/active-change with the current snapshot. */
|
|
1585
|
+
onChange?: (snapshot: SurfaceShellSnapshot) => void;
|
|
1586
|
+
/** Optional close action for hosts that model the workbench as collapsible. */
|
|
1587
|
+
onClose?: () => void;
|
|
1588
|
+
/**
|
|
1589
|
+
* Extra panel ids (registered via WorkspaceProvider's `panels` prop) that
|
|
1590
|
+
* this workbench is allowed to render. Defaults to the built-in
|
|
1591
|
+
* editor/viewer panels only. Pass app-specific pane ids here so calls
|
|
1592
|
+
* like `surface.openPanel({ component: "chart-canvas" })` actually
|
|
1593
|
+
* instantiate — without this, dockview's components map filters them
|
|
1594
|
+
* out and you get an empty tab. Two-layer defense: SurfaceShell.openPanel
|
|
1595
|
+
* validates against the registry (loud throw on unknown), AND the
|
|
1596
|
+
* dockview allowlist below filters which registered panels can mount
|
|
1597
|
+
* inside THIS surface (so a host can gate panels per shell instance).
|
|
1598
|
+
*/
|
|
1599
|
+
extraPanels?: string[];
|
|
1600
|
+
className?: string;
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
export declare interface SurfaceShellSnapshot {
|
|
1604
|
+
openTabs: SurfaceShellTab[];
|
|
1605
|
+
activeTab: string | null;
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
export declare interface SurfaceShellTab {
|
|
1609
|
+
id: string;
|
|
1610
|
+
title: string;
|
|
1611
|
+
params?: Record<string, unknown>;
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
export declare function ThemeProvider({ children, defaultTheme, onThemeChange }: ThemeProviderProps): JSX.Element;
|
|
1615
|
+
|
|
1616
|
+
export declare interface ThemeProviderProps {
|
|
1617
|
+
children: ReactNode;
|
|
1618
|
+
defaultTheme?: "light" | "dark";
|
|
1619
|
+
onThemeChange?: (theme: "light" | "dark") => void;
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
export { toast }
|
|
1623
|
+
|
|
1624
|
+
export { ToastApi }
|
|
1625
|
+
|
|
1626
|
+
export { Toaster }
|
|
1627
|
+
|
|
1628
|
+
export { ToasterProps }
|
|
1629
|
+
|
|
1630
|
+
export { ToastInput }
|
|
1631
|
+
|
|
1632
|
+
export { ToastRecord }
|
|
1633
|
+
|
|
1634
|
+
export { ToastVariant }
|
|
1635
|
+
|
|
1636
|
+
export declare interface ToolExecContext {
|
|
1637
|
+
abortSignal: AbortSignal;
|
|
1638
|
+
toolCallId: string;
|
|
1639
|
+
onUpdate?: (partial: string) => void;
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
export declare interface ToolResult {
|
|
1643
|
+
content: Array<{
|
|
1644
|
+
type: "text";
|
|
1645
|
+
text: string;
|
|
1646
|
+
}>;
|
|
1647
|
+
isError?: boolean;
|
|
1648
|
+
details?: unknown;
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
export declare function TopBar({ appTitle, sessionTitle, onCommandPalette, onNewChat, topBarLeft, topBarRight, className, }: TopBarProps): JSX.Element;
|
|
1652
|
+
|
|
1653
|
+
export declare interface TopBarProps {
|
|
1654
|
+
appTitle?: string;
|
|
1655
|
+
sessionTitle?: string;
|
|
1656
|
+
onCommandPalette?: () => void;
|
|
1657
|
+
onNewChat?: () => void;
|
|
1658
|
+
/** Override the brand/title block on the left. Hosts pass workspace
|
|
1659
|
+
* switchers, breadcrumbs, etc. here. When set, the default
|
|
1660
|
+
* `[B] appTitle / sessionTitle` block is replaced entirely. */
|
|
1661
|
+
topBarLeft?: ReactNode;
|
|
1662
|
+
/** Override the avatar on the right. The new-chat (+) button stays —
|
|
1663
|
+
* it's session-mechanic, not host chrome. Hosts pass theme toggles,
|
|
1664
|
+
* user menus, etc. here. */
|
|
1665
|
+
topBarRight?: ReactNode;
|
|
1666
|
+
className?: string;
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
export declare interface UiCommand {
|
|
1670
|
+
v?: number;
|
|
1671
|
+
seq?: number;
|
|
1672
|
+
kind: string;
|
|
1673
|
+
params: Record<string, unknown>;
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
export declare interface UIStatePut {
|
|
1677
|
+
v: 1;
|
|
1678
|
+
causedBy: CausedBy;
|
|
1679
|
+
openPanels: PanelState[];
|
|
1680
|
+
activePanel: string | null;
|
|
1681
|
+
activeFile: string | null;
|
|
1682
|
+
visibleFiles: string[];
|
|
1683
|
+
dirtyFiles: string[];
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
export declare type Unsubscribe = () => void;
|
|
1687
|
+
|
|
1688
|
+
export declare function useActiveFile(): string | null;
|
|
1689
|
+
|
|
1690
|
+
export declare function useActivePanel(): string | null;
|
|
1691
|
+
|
|
1692
|
+
export declare function useActivePanels(): readonly PanelConfig[];
|
|
1693
|
+
|
|
1694
|
+
export declare function useArtifactPanels(surfaceApi: DockviewShellApi | null): UseArtifactPanelsReturn;
|
|
1695
|
+
|
|
1696
|
+
export declare interface UseArtifactPanelsReturn {
|
|
1697
|
+
panels: ArtifactPanel[];
|
|
1698
|
+
open: (panel: ArtifactPanel) => void;
|
|
1699
|
+
close: (panelId: string) => void;
|
|
1700
|
+
activate: (panelId: string) => void;
|
|
1701
|
+
isOpen: (panelId: string) => boolean;
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
export declare function useArtifactRouting(artifactPanels: UseArtifactPanelsReturn, opts?: UseArtifactRoutingOptions): UseArtifactRoutingReturn;
|
|
1705
|
+
|
|
1706
|
+
export declare interface UseArtifactRoutingOptions {
|
|
1707
|
+
toolPanelMap?: Record<string, string>;
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
export declare interface UseArtifactRoutingReturn {
|
|
1711
|
+
openForTool: (toolName: string, params: {
|
|
1712
|
+
path: string;
|
|
1713
|
+
[key: string]: unknown;
|
|
1714
|
+
}) => void;
|
|
1715
|
+
resolvePanel: (toolName: string) => string | undefined;
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
export declare function useAutoOpenAgentFiles(onOpen: (path: string) => void, options?: UseAutoOpenAgentFilesOptions): void;
|
|
1719
|
+
|
|
1720
|
+
export declare interface UseAutoOpenAgentFilesOptions {
|
|
1721
|
+
skip?: (path: string) => boolean;
|
|
1722
|
+
filesOnly?: boolean;
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
export declare function useCatalogRegistry(): CatalogRegistry;
|
|
1726
|
+
|
|
1727
|
+
export declare function useCatalogs(): readonly CatalogConfig[];
|
|
1728
|
+
|
|
1729
|
+
export declare function useCommandRegistry(): CommandRegistry;
|
|
1730
|
+
|
|
1731
|
+
export declare function useCommands(): readonly CommandConfig[];
|
|
1732
|
+
|
|
1733
|
+
export declare function useDataCatalogOpenVisualization(options: OpenDataCatalogVisualizationOptions): (row: ExplorerRow) => void;
|
|
1734
|
+
|
|
1735
|
+
export declare function useDataCatalogQuery(params: LeftTabParams | DataCatalogVisualizationParams | undefined): DataCatalogResolvedQuery;
|
|
1736
|
+
|
|
1737
|
+
export declare function useDataCatalogVisualizationState(params: DataCatalogVisualizationParams | undefined, fallbackTitle: string): DataCatalogVisualizationState;
|
|
1738
|
+
|
|
1739
|
+
export declare function useDirtyFiles(): Record<string, {
|
|
1740
|
+
panelId: string;
|
|
1741
|
+
savedAt: number | null;
|
|
1742
|
+
}>;
|
|
1743
|
+
|
|
1744
|
+
export declare function useDockviewApi(): DockviewShellApi;
|
|
1745
|
+
|
|
1746
|
+
export declare function useEditorLifecycle(path: string | null, opts: UseEditorLifecycleOptions): UseEditorLifecycleReturn;
|
|
1747
|
+
|
|
1748
|
+
export declare interface UseEditorLifecycleOptions {
|
|
1749
|
+
adapter: EditorLifecycleAdapter | null;
|
|
1750
|
+
panelId: string;
|
|
1751
|
+
onDirtyChange?: (path: string, dirty: boolean) => void;
|
|
1752
|
+
serverMtime?: number | null;
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
export declare interface UseEditorLifecycleReturn {
|
|
1756
|
+
isDirty: boolean;
|
|
1757
|
+
isSaving: boolean;
|
|
1758
|
+
lastSavedAt: number | null;
|
|
1759
|
+
markDirty: () => void;
|
|
1760
|
+
flushSave: () => Promise<void>;
|
|
1761
|
+
shouldSync: boolean;
|
|
1762
|
+
ackSync: () => void;
|
|
1763
|
+
/** True when the file was modified externally while the editor has unsaved changes. */
|
|
1764
|
+
externalChangeWhileDirty: boolean;
|
|
1765
|
+
ackExternalChange: () => void;
|
|
1766
|
+
/** Call after a successful save with the mtime the server returned. */
|
|
1767
|
+
notifySaved: (mtime: number) => void;
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
/**
|
|
1771
|
+
* React hook: subscribe to a workspace event for the lifetime of the
|
|
1772
|
+
* component. The handler ref is stable across renders so changing the
|
|
1773
|
+
* handler doesn't tear down and re-subscribe.
|
|
1774
|
+
*/
|
|
1775
|
+
export declare function useEvent<K extends keyof WorkspaceEventMap>(name: K, handler: (payload: WorkspaceEventMap[K]) => void): void;
|
|
1776
|
+
|
|
1777
|
+
export declare function useExplorerState(options: UseExplorerStateOptions): {
|
|
1778
|
+
query: string;
|
|
1779
|
+
filters: Record<string, string[]>;
|
|
1780
|
+
facets: Facets | null;
|
|
1781
|
+
topItems: ExplorerRow[];
|
|
1782
|
+
topTotal: number;
|
|
1783
|
+
topHasMore: boolean;
|
|
1784
|
+
loading: boolean;
|
|
1785
|
+
getGroup: (value: string) => GroupState;
|
|
1786
|
+
isExpanded: (value: string) => boolean;
|
|
1787
|
+
setQuery: (q: string) => void;
|
|
1788
|
+
toggleFilter: (key: string, value: string) => void;
|
|
1789
|
+
clearFilters: () => void;
|
|
1790
|
+
expandGroup: (value: string) => void;
|
|
1791
|
+
collapseGroup: (value: string) => void;
|
|
1792
|
+
loadMoreTop: () => void;
|
|
1793
|
+
loadMoreGroup: (value: string) => void;
|
|
1794
|
+
};
|
|
1795
|
+
|
|
1796
|
+
export declare type UseExplorerStateOptions = {
|
|
1797
|
+
adapter: ExplorerAdapter;
|
|
1798
|
+
/** Facets shown in the toolbar popover. Adapter must implement fetchFacets. */
|
|
1799
|
+
facets?: FacetConfig[];
|
|
1800
|
+
/** Facet key used as the single grouping axis (tree mode). */
|
|
1801
|
+
groupBy?: string;
|
|
1802
|
+
/** Page size for both top-level and per-group pagination. */
|
|
1803
|
+
pageSize?: number;
|
|
1804
|
+
/** Debounce window (ms) applied to setQuery. */
|
|
1805
|
+
debounceMs?: number;
|
|
1806
|
+
/**
|
|
1807
|
+
* Controlled query. When set, the hook bypasses internal debounce and
|
|
1808
|
+
* `setQuery` becomes a no-op — the caller owns the value (and any debounce
|
|
1809
|
+
* the caller wants to apply). Searches re-run when this prop changes.
|
|
1810
|
+
*/
|
|
1811
|
+
query?: string;
|
|
1812
|
+
};
|
|
1813
|
+
|
|
1814
|
+
export declare type UseExplorerStateReturn = ReturnType<typeof useExplorerState>;
|
|
1815
|
+
|
|
1816
|
+
export declare function useHydrationComplete(): boolean;
|
|
1817
|
+
|
|
1818
|
+
export declare function useKeyboardShortcuts({ shortcuts, enabled }: UseKeyboardShortcutsOptions): void;
|
|
1819
|
+
|
|
1820
|
+
export declare interface UseKeyboardShortcutsOptions {
|
|
1821
|
+
shortcuts: ShortcutBinding[];
|
|
1822
|
+
enabled?: boolean;
|
|
1823
|
+
}
|
|
1824
|
+
|
|
1825
|
+
export declare function useOpenPanels(): PanelState[];
|
|
1826
|
+
|
|
1827
|
+
export declare function usePluginErrors(): PluginErrorContextValue;
|
|
1828
|
+
|
|
1829
|
+
export declare function useRegistry(): PanelRegistry;
|
|
1830
|
+
|
|
1831
|
+
export declare function useResetLayout(): () => void;
|
|
1832
|
+
|
|
1833
|
+
export declare function useResponsiveSidebarCollapse({ isNarrowViewport, isCollapsed, setCollapsed, }: UseResponsiveSidebarCollapseOptions): () => void;
|
|
1834
|
+
|
|
1835
|
+
export declare interface UseResponsiveSidebarCollapseOptions {
|
|
1836
|
+
isNarrowViewport: boolean;
|
|
1837
|
+
isCollapsed: boolean;
|
|
1838
|
+
setCollapsed: (collapsed: boolean) => void;
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
/** Helper for emitting a user-originated event payload. */
|
|
1842
|
+
export declare function userMeta(): {
|
|
1843
|
+
cause: "user";
|
|
1844
|
+
ts: number;
|
|
1845
|
+
};
|
|
1846
|
+
|
|
1847
|
+
export declare function useSetSidebar(): (sidebar: Partial<SidebarState>) => void;
|
|
1848
|
+
|
|
1849
|
+
export declare function useSidebarState(): SidebarState;
|
|
1850
|
+
|
|
1851
|
+
export declare function useSurfaceResolverRegistry(): SurfaceResolverRegistry;
|
|
1852
|
+
|
|
1853
|
+
export declare function useTheme(): {
|
|
1854
|
+
theme: "light" | "dark";
|
|
1855
|
+
setTheme: (theme: "light" | "dark") => void;
|
|
1856
|
+
toggleTheme: () => void;
|
|
1857
|
+
};
|
|
1858
|
+
|
|
1859
|
+
export declare function useThemePreference(): "light" | "dark";
|
|
1860
|
+
|
|
1861
|
+
export declare function useViewportBreakpoint(maxWidth?: number): boolean;
|
|
1862
|
+
|
|
1863
|
+
export declare function useWorkspaceBridge(): WorkspaceBridgeContextValue;
|
|
1864
|
+
|
|
1865
|
+
export declare function useWorkspaceChatPanel(): WorkspaceChatPanelComponent;
|
|
1866
|
+
|
|
1867
|
+
export declare function useWorkspaceContext(): WorkspaceContextValue;
|
|
1868
|
+
|
|
1869
|
+
export declare function useWorkspaceContextOptional(): WorkspaceContextValue | null;
|
|
1870
|
+
|
|
1871
|
+
export declare function WorkbenchLeftPane({ rootDir, bridge, defaultTab, onCollapse, className, }: WorkbenchLeftPaneProps): JSX.Element;
|
|
1872
|
+
|
|
1873
|
+
export declare interface WorkbenchLeftPaneProps {
|
|
1874
|
+
rootDir?: string;
|
|
1875
|
+
bridge?: WorkspaceBridge;
|
|
1876
|
+
defaultTab?: WorkbenchLeftTabId;
|
|
1877
|
+
onCollapse?: () => void;
|
|
1878
|
+
className?: string;
|
|
1879
|
+
}
|
|
1880
|
+
|
|
1881
|
+
export declare type WorkbenchLeftTabId = string;
|
|
1882
|
+
|
|
1883
|
+
declare const WORKSPACE_AGENT_DATA_EVENT = "workspace:agent.data";
|
|
1884
|
+
|
|
1885
|
+
declare const WORKSPACE_EDITOR_SAVE_END_EVENT = "workspace:editor.save.end";
|
|
1886
|
+
|
|
1887
|
+
declare const WORKSPACE_EDITOR_SAVE_START_EVENT = "workspace:editor.save.start";
|
|
1888
|
+
|
|
1889
|
+
export declare const WORKSPACE_OPEN_PATH_SURFACE_KIND = "workspace.open.path";
|
|
1890
|
+
|
|
1891
|
+
declare const WORKSPACE_PANEL_CLOSE_EVENT = "workspace:panel.close";
|
|
1892
|
+
|
|
1893
|
+
declare const WORKSPACE_PANEL_UPDATE_EVENT = "workspace:panel.update";
|
|
1894
|
+
|
|
1895
|
+
declare const WORKSPACE_UI_COMMAND_EVENT = "workspace:ui.command";
|
|
1896
|
+
|
|
1897
|
+
export declare interface WorkspaceActions {
|
|
1898
|
+
setHydrationComplete: (complete: boolean) => void;
|
|
1899
|
+
setLayout: (layout: unknown) => void;
|
|
1900
|
+
setSidebar: (sidebar: Partial<SidebarState>) => void;
|
|
1901
|
+
setPanelSize: (panelId: string, size: number) => void;
|
|
1902
|
+
setTheme: (theme: "light" | "dark") => void;
|
|
1903
|
+
openPanel: (panel: PanelState) => void;
|
|
1904
|
+
closePanel: (panelId: string) => void;
|
|
1905
|
+
activatePanel: (panelId: string) => void;
|
|
1906
|
+
openFile: (file: string, panelId?: string) => void;
|
|
1907
|
+
markDirty: (file: string, panelId: string) => void;
|
|
1908
|
+
markClean: (file: string) => void;
|
|
1909
|
+
showNotification: (notification: Omit<Notification_2, "id" | "timestamp">) => void;
|
|
1910
|
+
dismissNotification: (id: string) => void;
|
|
1911
|
+
navigateToLine: (file: string, line: number) => void;
|
|
1912
|
+
resetLayout: () => void;
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
export declare interface WorkspaceBridge {
|
|
1916
|
+
getOpenPanels(): PanelState[];
|
|
1917
|
+
getActiveFile(): string | null;
|
|
1918
|
+
getDirtyFiles(): string[];
|
|
1919
|
+
getVisibleFiles(): string[];
|
|
1920
|
+
openFile(path: string, opts?: {
|
|
1921
|
+
mode?: "view" | "edit" | "diff";
|
|
1922
|
+
}): Promise<CommandResult>;
|
|
1923
|
+
openPanel(config: DynamicPaneConfig): Promise<CommandResult>;
|
|
1924
|
+
closePanel(id: string): Promise<CommandResult>;
|
|
1925
|
+
closeWorkbenchLeftPane(): Promise<CommandResult>;
|
|
1926
|
+
showNotification(msg: string, level?: "info" | "warn" | "error"): Promise<CommandResult>;
|
|
1927
|
+
navigateToLine(file: string, line: number): Promise<CommandResult>;
|
|
1928
|
+
expandToFile(path: string): Promise<CommandResult>;
|
|
1929
|
+
markDirty(path: string): void;
|
|
1930
|
+
markClean(path: string): void;
|
|
1931
|
+
subscribe<K extends keyof BridgeEventMap>(event: K, handler: (data: BridgeEventMap[K]) => void): Unsubscribe;
|
|
1932
|
+
select<T>(selector: (state: WorkspaceState) => T, handler: (value: T) => void): Unsubscribe;
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
export declare interface WorkspaceBridgeContextValue {
|
|
1936
|
+
connected: boolean;
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
export declare type WorkspaceChatPanelComponent = ComponentType<any>;
|
|
1940
|
+
|
|
1941
|
+
export declare interface WorkspaceChatPanelProps {
|
|
1942
|
+
sessionId: string;
|
|
1943
|
+
onData?: (part: unknown) => void;
|
|
1944
|
+
requestHeaders?: Record<string, string>;
|
|
1945
|
+
onOpenArtifact?: OpenArtifactHandler;
|
|
1946
|
+
className?: string;
|
|
1947
|
+
/** Endpoint base for agent → visible-workbench UI commands. */
|
|
1948
|
+
bridgeEndpoint?: string | null;
|
|
1949
|
+
/** Imperative handle getter for the visible workbench surface. */
|
|
1950
|
+
getSurface?: () => SurfaceShellApi | null;
|
|
1951
|
+
/** Reads whether the visible workbench surface should be open. */
|
|
1952
|
+
isWorkbenchOpen?: () => boolean;
|
|
1953
|
+
/** Opens the visible workbench surface before dispatching a command. */
|
|
1954
|
+
openWorkbench?: () => void;
|
|
1955
|
+
[key: string]: unknown;
|
|
1956
|
+
}
|
|
1957
|
+
|
|
1958
|
+
export declare interface WorkspaceContextValue {
|
|
1959
|
+
chatPanel: WorkspaceChatPanelComponent | null;
|
|
1960
|
+
registeredPlugins: RegisteredPluginMeta[];
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
export declare interface WorkspaceEventMap extends WorkspaceHostEventMap, WorkspacePluginEventMap {
|
|
1964
|
+
}
|
|
1965
|
+
|
|
1966
|
+
/** Names that share a prefix can be filtered with `startsWith`. */
|
|
1967
|
+
export declare type WorkspaceEventName = keyof WorkspaceEventMap;
|
|
1968
|
+
|
|
1969
|
+
export declare interface WorkspaceFrontPlugin {
|
|
1970
|
+
id: string;
|
|
1971
|
+
label?: string;
|
|
1972
|
+
/**
|
|
1973
|
+
* Context prepended to the agent's system prompt at boot. Concatenated
|
|
1974
|
+
* across all registered plugins (in registration order) and joined with
|
|
1975
|
+
* double-newlines. Plain Markdown. ~200-500 chars recommended.
|
|
1976
|
+
*/
|
|
1977
|
+
systemPrompt?: string;
|
|
1978
|
+
panels?: PanelConfig[];
|
|
1979
|
+
commands?: CommandConfig[];
|
|
1980
|
+
catalogs?: CatalogConfig[];
|
|
1981
|
+
bindings?: PluginBinding[];
|
|
1982
|
+
/**
|
|
1983
|
+
* @deprecated Executable agent tools should be contributed by server
|
|
1984
|
+
* plugins. This field remains for migration only.
|
|
1985
|
+
*/
|
|
1986
|
+
agentTools?: AgentTool[];
|
|
1987
|
+
outputs?: PluginOutput[];
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
declare interface WorkspaceHostEventMap {
|
|
1991
|
+
/** Shared UI manipulation contract used by the agent stream and plugin bindings. */
|
|
1992
|
+
[WORKSPACE_UI_COMMAND_EVENT]: EventMeta & {
|
|
1993
|
+
command: UiCommand;
|
|
1994
|
+
};
|
|
1995
|
+
[WORKSPACE_EDITOR_SAVE_START_EVENT]: {
|
|
1996
|
+
panelId: string;
|
|
1997
|
+
};
|
|
1998
|
+
[WORKSPACE_EDITOR_SAVE_END_EVENT]: {
|
|
1999
|
+
panelId: string;
|
|
2000
|
+
ok?: boolean;
|
|
2001
|
+
error?: string;
|
|
2002
|
+
};
|
|
2003
|
+
[WORKSPACE_PANEL_UPDATE_EVENT]: EventMeta & {
|
|
2004
|
+
match: WorkspacePanelMatch | WorkspacePanelMatch[];
|
|
2005
|
+
params?: Record<string, unknown>;
|
|
2006
|
+
title?: string;
|
|
2007
|
+
};
|
|
2008
|
+
[WORKSPACE_PANEL_CLOSE_EVENT]: EventMeta & {
|
|
2009
|
+
match: WorkspacePanelMatch | WorkspacePanelMatch[];
|
|
2010
|
+
};
|
|
2011
|
+
/**
|
|
2012
|
+
* Raw agent stream data observed by ChatPanelHost. Core treats this as an
|
|
2013
|
+
* opaque packet; plugins translate packets they understand into their own
|
|
2014
|
+
* plugin-keyed events.
|
|
2015
|
+
*/
|
|
2016
|
+
[WORKSPACE_AGENT_DATA_EVENT]: {
|
|
2017
|
+
ts: number;
|
|
2018
|
+
part: unknown;
|
|
2019
|
+
};
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
export declare function WorkspaceLoadingState({ title, description, status, fullscreen, className, }: WorkspaceLoadingStateProps): JSX.Element;
|
|
2023
|
+
|
|
2024
|
+
export declare interface WorkspaceLoadingStateProps {
|
|
2025
|
+
title?: string;
|
|
2026
|
+
description?: string;
|
|
2027
|
+
status?: string;
|
|
2028
|
+
fullscreen?: boolean;
|
|
2029
|
+
className?: string;
|
|
2030
|
+
}
|
|
2031
|
+
|
|
2032
|
+
declare type WorkspacePanelMatch = {
|
|
2033
|
+
id: string;
|
|
2034
|
+
} | {
|
|
2035
|
+
param: string;
|
|
2036
|
+
value: unknown;
|
|
2037
|
+
};
|
|
2038
|
+
|
|
2039
|
+
/**
|
|
2040
|
+
* Built-in plugin events baked into the public workspace event map.
|
|
2041
|
+
*
|
|
2042
|
+
* Filesystem events are declared inline (using EventMeta which is structurally
|
|
2043
|
+
* identical to FilesystemEventMeta) so the keys survive vite's rollupTypes
|
|
2044
|
+
* bundling without importing plugin-domain modules.
|
|
2045
|
+
*
|
|
2046
|
+
* Third-party plugins can extend this interface via declare module augmentation,
|
|
2047
|
+
* though that only works in source compilation — it does not survive dist bundling.
|
|
2048
|
+
*/
|
|
2049
|
+
export declare interface WorkspacePluginEventMap {
|
|
2050
|
+
"filesystem:file.changed": EventMeta & {
|
|
2051
|
+
path: string;
|
|
2052
|
+
};
|
|
2053
|
+
"filesystem:file.created": EventMeta & {
|
|
2054
|
+
path: string;
|
|
2055
|
+
kind: "file" | "dir";
|
|
2056
|
+
};
|
|
2057
|
+
"filesystem:file.moved": EventMeta & {
|
|
2058
|
+
from: string;
|
|
2059
|
+
to: string;
|
|
2060
|
+
};
|
|
2061
|
+
"filesystem:file.deleted": EventMeta & {
|
|
2062
|
+
path: string;
|
|
2063
|
+
};
|
|
2064
|
+
}
|
|
2065
|
+
|
|
2066
|
+
export declare function WorkspaceProvider({ children, chatPanel, plugins, excludeDefaults, panels, commands, catalogs, capabilities, apiBaseUrl, authHeaders, apiTimeout, defaultTheme, onThemeChange, workspaceId, storageKey, persistenceEnabled, bridgeEndpoint, onAuthError, onOpenFile, }: WorkspaceProviderProps): JSX.Element;
|
|
2067
|
+
|
|
2068
|
+
export declare interface WorkspaceProviderProps {
|
|
2069
|
+
children: ReactNode;
|
|
2070
|
+
chatPanel?: WorkspaceChatPanelComponent;
|
|
2071
|
+
plugins?: WorkspaceFrontPlugin[];
|
|
2072
|
+
excludeDefaults?: string[];
|
|
2073
|
+
panels?: PanelConfig[];
|
|
2074
|
+
commands?: CommandConfig[];
|
|
2075
|
+
catalogs?: CatalogConfig[];
|
|
2076
|
+
capabilities?: Record<string, boolean>;
|
|
2077
|
+
apiBaseUrl?: string;
|
|
2078
|
+
authHeaders?: Record<string, string>;
|
|
2079
|
+
/** Per-request timeout for the data layer's FetchClient, in ms. */
|
|
2080
|
+
apiTimeout?: number;
|
|
2081
|
+
defaultTheme?: "light" | "dark" | undefined;
|
|
2082
|
+
onThemeChange?: (theme: "light" | "dark") => void;
|
|
2083
|
+
workspaceId?: string;
|
|
2084
|
+
storageKey?: string;
|
|
2085
|
+
persistenceEnabled?: boolean;
|
|
2086
|
+
bridgeEndpoint?: string | null;
|
|
2087
|
+
onAuthError?: (statusCode: number) => void;
|
|
2088
|
+
onOpenFile?: (path: string) => void;
|
|
2089
|
+
}
|
|
2090
|
+
|
|
2091
|
+
export declare interface WorkspaceState {
|
|
2092
|
+
hydrationComplete: boolean;
|
|
2093
|
+
layout: unknown | null;
|
|
2094
|
+
sidebar: SidebarState;
|
|
2095
|
+
panelSizes: Record<string, number>;
|
|
2096
|
+
preferences: {
|
|
2097
|
+
theme: "light" | "dark";
|
|
2098
|
+
};
|
|
2099
|
+
panels: PanelState[];
|
|
2100
|
+
activePanel: string | null;
|
|
2101
|
+
activeFile: string | null;
|
|
2102
|
+
visibleFiles: string[];
|
|
2103
|
+
dirtyFiles: Record<string, {
|
|
2104
|
+
panelId: string;
|
|
2105
|
+
savedAt: number | null;
|
|
2106
|
+
}>;
|
|
2107
|
+
notifications: Notification_2[];
|
|
2108
|
+
}
|
|
2109
|
+
|
|
2110
|
+
export declare type WorkspaceStore = WorkspaceState & WorkspaceActions;
|
|
2111
|
+
|
|
2112
|
+
declare type WorkspaceStoreApi = {
|
|
2113
|
+
getState: () => WorkspaceStore;
|
|
2114
|
+
subscribe: (listener: (state: WorkspaceStore, prevState: WorkspaceStore) => void) => () => void;
|
|
2115
|
+
setState: (partial: Partial<WorkspaceStore>) => void;
|
|
2116
|
+
getInitialState: () => WorkspaceStore;
|
|
2117
|
+
};
|
|
2118
|
+
|
|
2119
|
+
export { }
|