@hachej/boring-workspace 0.1.63 → 0.1.65

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.
Files changed (36) hide show
  1. package/dist/FileTree-B_fRS4Om.js +230 -0
  2. package/dist/MarkdownEditor-C55gVDyW.js +743 -0
  3. package/dist/WorkspaceLoadingState-D3i4X-eH.js +847 -0
  4. package/dist/WorkspaceProvider-Ddx7GByq.js +8770 -0
  5. package/dist/app-front.d.ts +106 -4
  6. package/dist/app-front.js +3110 -2427
  7. package/dist/app-server.d.ts +2 -2
  8. package/dist/app-server.js +6 -4
  9. package/dist/boring-workspace.css +2 -1
  10. package/dist/charts.d.ts +6 -1
  11. package/dist/charts.js +131 -138
  12. package/dist/plugin.d.ts +64 -1
  13. package/dist/plugin.js +32 -0
  14. package/dist/rolldown-runtime-Dqa2HsxW.js +20 -0
  15. package/dist/{runtimeEnv-HolIkcoB.d.ts → runtimeEnv-CU-c4kaV.d.ts} +7 -0
  16. package/dist/server.d.ts +2 -2
  17. package/dist/server.js +4 -3
  18. package/dist/testing-e2e.d.ts +5 -0
  19. package/dist/testing-e2e.js +33 -42
  20. package/dist/testing.d.ts +6 -1
  21. package/dist/testing.js +9474 -10814
  22. package/dist/utils-BRcxFdrz.js +8 -0
  23. package/dist/workspace.css +2790 -301
  24. package/dist/workspace.d.ts +164 -21
  25. package/dist/workspace.js +568 -734
  26. package/docs/plans/archive/CODE_OWNERSHIP_CLEANUP_PLAN.md +1 -1
  27. package/docs/plans/archive/DECLARATIVE_LAYOUT_MIGRATION.md +4 -4
  28. package/docs/plans/archive/GENERIC_EXPLORER_PLUGIN_PLAN.md +10 -10
  29. package/docs/plans/archive/PLUGIN_MODEL.md +37 -37
  30. package/docs/plans/archive/WORKSPACE_V2_PLAN.md +2 -2
  31. package/package.json +50 -50
  32. package/dist/FileTree-CUvn5K86.js +0 -315
  33. package/dist/MarkdownEditor-5f4lhBqc.js +0 -598
  34. package/dist/WorkspaceLoadingState-y087Q6ek.js +0 -866
  35. package/dist/WorkspaceProvider-U4izhS84.js +0 -8660
  36. package/dist/utils-B6yFEsav.js +0 -8
@@ -8,7 +8,7 @@ import { DockviewPanelApi } from 'dockview-react';
8
8
  import { ErrorInfo } from 'react';
9
9
  import { Extension } from '@codemirror/state';
10
10
  import { FunctionComponentElement } from 'react';
11
- import { JSX } from 'react/jsx-runtime';
11
+ import { JSX } from 'react';
12
12
  import { JSXElementConstructor } from 'react';
13
13
  import { LucideIcon } from 'lucide-react';
14
14
  import { MouseEvent as MouseEvent_2 } from 'react';
@@ -48,6 +48,11 @@ export declare interface AgentTool {
48
48
  execute(params: Record<string, unknown>, ctx: ToolExecContext): Promise<ToolResult>;
49
49
  }
50
50
 
51
+ export declare interface AppLeftOverlayChromeValue {
52
+ headerInsetStart: boolean;
53
+ headerInsetEnd: boolean;
54
+ }
55
+
51
56
  export declare interface ArtifactPanel {
52
57
  id: string;
53
58
  component: string;
@@ -80,6 +85,7 @@ export declare function bootstrap(options: BootstrapOptions): BootstrapResult;
80
85
  export declare interface BootstrapOptions {
81
86
  chatPanel: unknown;
82
87
  plugins?: BoringFrontFactoryWithId[];
88
+ capturedPlugins?: CapturedFrontPlugin[];
83
89
  defaults?: BoringFrontFactoryWithId[];
84
90
  excludeDefaults?: string[];
85
91
  registries: {
@@ -104,10 +110,27 @@ declare interface BoringFrontAPI {
104
110
  registerPanel<T = unknown>(registration: BoringFrontPanelRegistration<T>): void;
105
111
  registerWorkspaceSource<T = unknown>(registration: BoringFrontWorkspaceSourceRegistration<T>): void;
106
112
  registerPanelCommand(registration: BoringFrontPanelCommandRegistration): void;
113
+ registerAppLeftAction(registration: BoringFrontAppLeftActionRegistration): void;
107
114
  registerSurfaceResolver(registration: BoringFrontSurfaceResolverRegistration): void;
108
115
  registerToolRenderer(registration: BoringFrontToolRendererRegistration): void;
109
116
  }
110
117
 
118
+ declare interface BoringFrontAppLeftActionRegistration {
119
+ id: string;
120
+ label: string;
121
+ icon?: ComponentType<{
122
+ className?: string;
123
+ }>;
124
+ trailing?: ComponentType;
125
+ overlay: ComponentType<BoringFrontAppLeftOverlayProps>;
126
+ order?: number;
127
+ emphasis?: boolean;
128
+ }
129
+
130
+ declare interface BoringFrontAppLeftOverlayProps {
131
+ onClose: () => void;
132
+ }
133
+
111
134
  declare interface BoringFrontBindingRegistration {
112
135
  id: string;
113
136
  component: PluginBinding;
@@ -271,6 +294,7 @@ declare interface CapturedBoringFrontRegistrations {
271
294
  panels: BoringFrontPanelRegistration<any>[];
272
295
  workspaceSources: BoringFrontWorkspaceSourceRegistration<any>[];
273
296
  panelCommands: BoringFrontPanelCommandRegistration[];
297
+ appLeftActions: BoringFrontAppLeftActionRegistration[];
274
298
  surfaceResolvers: BoringFrontSurfaceResolverRegistration[];
275
299
  toolRenderers: BoringFrontToolRendererRegistration[];
276
300
  }
@@ -390,6 +414,8 @@ export declare interface ChatLayoutProps {
390
414
  center?: string;
391
415
  centerParams?: Record<string, unknown>;
392
416
  chatPanes?: ChatPaneDescriptor[];
417
+ /** Optional host actions rendered in the active chat pane header. */
418
+ chatTopActions?: ReactNode;
393
419
  activeChatPaneId?: string | null;
394
420
  onActiveChatPaneChange?: (id: string) => void;
395
421
  onCloseChatPane?: (id: string) => void;
@@ -533,24 +559,24 @@ export declare function createWorkspacePluginClient(apiBaseUrl: string, workspac
533
559
  export declare function createWorkspaceStore(options?: CreateWorkspaceStoreOptions): {
534
560
  (): WorkspaceStore;
535
561
  <U>(selector: (state: WorkspaceStore) => U): U;
536
- } & Omit<StoreApi_3<WorkspaceStore>, "setState" | "persist"> & {
562
+ } & Omit< StoreApi_3<WorkspaceStore>, "setState" | "persist"> & {
537
563
  setState(partial: WorkspaceStore | Partial<WorkspaceStore> | ((state: WorkspaceStore) => WorkspaceStore | Partial<WorkspaceStore>), replace?: false | undefined): unknown;
538
564
  setState(state: WorkspaceStore | ((state: WorkspaceStore) => WorkspaceStore), replace: true): unknown;
539
565
  persist: {
540
- setOptions: (options: Partial<PersistOptions<WorkspaceStore, {
541
- layout: unknown;
542
- sidebar: SidebarState;
543
- panelSizes: Record<string, number>;
566
+ setOptions: (options: Partial< PersistOptions<WorkspaceStore, {
567
+ layout: unknown;
568
+ sidebar: SidebarState;
569
+ panelSizes: Record<string, number>;
544
570
  }, unknown>>) => void;
545
571
  clearStorage: () => void;
546
572
  rehydrate: () => Promise<void> | void;
547
573
  hasHydrated: () => boolean;
548
574
  onHydrate: (fn: (state: WorkspaceStore) => void) => () => void;
549
575
  onFinishHydration: (fn: (state: WorkspaceStore) => void) => () => void;
550
- getOptions: () => Partial<PersistOptions<WorkspaceStore, {
551
- layout: unknown;
552
- sidebar: SidebarState;
553
- panelSizes: Record<string, number>;
576
+ getOptions: () => Partial< PersistOptions<WorkspaceStore, {
577
+ layout: unknown;
578
+ sidebar: SidebarState;
579
+ panelSizes: Record<string, number>;
554
580
  }, unknown>>;
555
581
  };
556
582
  } & {
@@ -733,7 +759,7 @@ declare class FetchClient {
733
759
  private retryBaseMs;
734
760
  constructor(opts: FetchClientOptions);
735
761
  private request;
736
- getTree(path: string, signal?: AbortSignal): Promise<FileEntry[]>;
762
+ getTree(path: string, signal?: AbortSignal, filesystem?: string): Promise<FileEntry[]>;
737
763
  getFile(path: string, signal?: AbortSignal, filesystem?: string): Promise<FileContent>;
738
764
  /**
739
765
  * Write file content. When `expectedMtimeMs` is supplied, the server
@@ -800,6 +826,8 @@ declare class FileConflictError extends Error {
800
826
 
801
827
  declare interface FileContent {
802
828
  content: string;
829
+ /** Access granted by the resolved filesystem binding, when the server exposes it. */
830
+ access?: "readonly" | "readwrite";
803
831
  /**
804
832
  * Server-stat'd modification time. Used as the OCC baseline for the
805
833
  * next write — the client sends it back as `expectedMtimeMs` so the
@@ -934,7 +962,7 @@ export declare interface FileTreeNode {
934
962
  * `<FileTreeView>`. Drop into a dockview registry as-is, or compose
935
963
  * `FileTreeView` directly when you want different chrome/search UX.
936
964
  */
937
- export declare function FileTreePane({ params, rootDir, searchQuery: controlledSearchQuery, panelApi, bridge, api, chromeless, className, }: FileTreePaneProps): JSX.Element;
965
+ export declare function FileTreePane({ params, rootDir, searchQuery: controlledSearchQuery, panelApi, bridge, api, chromeless, filesystem, access, roots, className, }: FileTreePaneProps): JSX.Element;
938
966
 
939
967
  declare interface FileTreePaneParams extends LeftTabParams {
940
968
  rootDir?: string;
@@ -942,6 +970,9 @@ declare interface FileTreePaneParams extends LeftTabParams {
942
970
  query?: string;
943
971
  bridge?: unknown;
944
972
  chromeless?: boolean;
973
+ filesystem?: FilesystemId;
974
+ access?: "readonly" | "readwrite";
975
+ roots?: FileTreeRootConfig[];
945
976
  revealFileTreeRequest?: {
946
977
  path: string;
947
978
  seq: number;
@@ -954,6 +985,9 @@ export declare interface FileTreePaneProps extends Partial<PaneProps<FileTreePan
954
985
  panelApi?: DockviewPanelApi;
955
986
  bridge?: FileTreeBridge;
956
987
  chromeless?: boolean;
988
+ filesystem?: FilesystemId;
989
+ access?: "readonly" | "readwrite";
990
+ roots?: FileTreeRootConfig[];
957
991
  className?: string;
958
992
  }
959
993
 
@@ -982,6 +1016,14 @@ export declare interface FileTreeProps {
982
1016
  className?: string;
983
1017
  }
984
1018
 
1019
+ declare interface FileTreeRootConfig {
1020
+ filesystem: FilesystemId;
1021
+ label: string;
1022
+ rootDir?: string;
1023
+ access?: "readonly" | "readwrite";
1024
+ searchPlaceholder?: string;
1025
+ }
1026
+
985
1027
  /**
986
1028
  * File tree with the full workbench actions: tracks container height,
987
1029
  * routes selects through `bridge.openFile`, and provides a right-click
@@ -993,7 +1035,7 @@ export declare interface FileTreeProps {
993
1035
  * want a "Files" panel; `WorkbenchLeftPane` uses this primitive directly to
994
1036
  * share its search input with the Data tab.
995
1037
  */
996
- export declare function FileTreeView({ rootDir, searchQuery, bridge, revealFileTreeRequest, ignoreNames, className, }: FileTreeViewProps): JSX.Element;
1038
+ export declare function FileTreeView({ rootDir, searchQuery, bridge, revealFileTreeRequest, filesystem, access, ignoreNames, className, }: FileTreeViewProps): JSX.Element;
997
1039
 
998
1040
  export declare interface FileTreeViewProps {
999
1041
  rootDir?: string;
@@ -1004,6 +1046,8 @@ export declare interface FileTreeViewProps {
1004
1046
  path: string;
1005
1047
  seq: number;
1006
1048
  } | null;
1049
+ filesystem?: FilesystemId;
1050
+ access?: "readonly" | "readwrite";
1007
1051
  /**
1008
1052
  * Names (or regex patterns) to hide from the tree. Defaults to
1009
1053
  * `DEFAULT_TREE_IGNORE` (node_modules, .git, dist, …). Pass `[]` to
@@ -1083,7 +1127,7 @@ export declare interface LeftTabParams {
1083
1127
  } | null;
1084
1128
  }
1085
1129
 
1086
- export declare function MarkdownEditor({ content, onChange, readOnly, placeholder, className, documentPath, }: MarkdownEditorProps): JSX.Element;
1130
+ export declare function MarkdownEditor({ content, onChange, readOnly, placeholder, className, documentPath, filesystem: rawFilesystem, }: MarkdownEditorProps): JSX.Element;
1087
1131
 
1088
1132
  export declare function MarkdownEditorPane({ params, api, className }: MarkdownEditorPaneProps): JSX.Element;
1089
1133
 
@@ -1101,6 +1145,8 @@ export declare interface MarkdownEditorProps {
1101
1145
  className?: string;
1102
1146
  /** Workspace-relative markdown file path, used to make uploaded image links relative. */
1103
1147
  documentPath?: string;
1148
+ /** Filesystem identity for relative markdown links/assets. Defaults to user. */
1149
+ filesystem?: FilesystemId;
1104
1150
  }
1105
1151
 
1106
1152
  export declare const MAX_PANELS = 50;
@@ -1140,7 +1186,9 @@ export declare function onFilesystemChanged(handler: (payload: FilesystemEventMe
1140
1186
  path: string;
1141
1187
  }) => void): () => void;
1142
1188
 
1143
- export declare type OpenArtifactHandler = (path: string) => void;
1189
+ export declare type OpenArtifactHandler = (path: string, options?: {
1190
+ filesystem?: FilesystemId;
1191
+ }) => void;
1144
1192
 
1145
1193
  export declare const openFileSchema: z.ZodObject<{
1146
1194
  path: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
@@ -1366,7 +1414,7 @@ export declare type PluginBinding = ComponentType<unknown>;
1366
1414
  export declare interface PluginContributionError {
1367
1415
  kind: "contribution";
1368
1416
  pluginId: string;
1369
- contributionKind: "panel" | "workspace-source" | "catalog-row" | "chat-suggestion";
1417
+ contributionKind: "panel" | "workspace-source" | "catalog-row" | "chat-suggestion" | "app-left-action";
1370
1418
  contributionId?: string;
1371
1419
  error: Error;
1372
1420
  componentStack?: string | null;
@@ -1378,7 +1426,7 @@ export declare class PluginError extends Error {
1378
1426
  }
1379
1427
 
1380
1428
  export declare class PluginErrorBoundary extends Component<Props, State> {
1381
- static contextType: Context<PluginErrorContextValue | null>;
1429
+ static contextType: Context< PluginErrorContextValue | null>;
1382
1430
  context: React.ContextType<typeof PluginErrorContext>;
1383
1431
  state: State;
1384
1432
  static getDerivedStateFromError(error: Error): State;
@@ -1415,7 +1463,7 @@ export declare function postUiCommand(command: UiCommand): void;
1415
1463
 
1416
1464
  declare interface Props {
1417
1465
  pluginId: string;
1418
- contributionKind: "panel" | "workspace-source" | "catalog-row" | "chat-suggestion";
1466
+ contributionKind: "panel" | "workspace-source" | "catalog-row" | "chat-suggestion" | "app-left-action";
1419
1467
  contributionId?: string;
1420
1468
  children?: ReactNode;
1421
1469
  onError?: (error: Error, info: ErrorInfo) => void;
@@ -1763,6 +1811,8 @@ export declare function useActivePanels(): readonly PanelConfig[];
1763
1811
 
1764
1812
  export declare function useApiBaseUrl(): string;
1765
1813
 
1814
+ export declare function useAppLeftOverlayChrome(): AppLeftOverlayChromeValue;
1815
+
1766
1816
  export declare function useArtifactPanels(surfaceApi: DockviewShellApi | null): UseArtifactPanelsReturn;
1767
1817
 
1768
1818
  export declare interface UseArtifactPanelsReturn {
@@ -1892,6 +1942,7 @@ export declare interface UseFilePaneReturn {
1892
1942
  error: Error | null;
1893
1943
  content: string | null;
1894
1944
  isDirty: boolean;
1945
+ isReadonly: boolean;
1895
1946
  conflict: FileConflictError | null;
1896
1947
  onReloadFromServer: () => Promise<void>;
1897
1948
  onOverwrite: () => Promise<void>;
@@ -1944,7 +1995,7 @@ export declare function userMeta(): {
1944
1995
  ts: number;
1945
1996
  };
1946
1997
 
1947
- export declare function useSetSidebar(): (sidebar: Partial<SidebarState>) => void;
1998
+ export declare function useSetSidebar(): (sidebar: Partial< SidebarState>) => void;
1948
1999
 
1949
2000
  export declare function useSidebarState(): SidebarState;
1950
2001
 
@@ -1992,6 +2043,8 @@ export declare function useWorkspacePluginClient(): WorkspacePluginClient;
1992
2043
 
1993
2044
  export declare function useWorkspaceRequestId(): string | null;
1994
2045
 
2046
+ export declare function useWorkspaceShellCapabilities(): WorkspaceShellCapabilities;
2047
+
1995
2048
  export declare function useWorkspaceSourceRegistry(): WorkspaceSourceRegistry;
1996
2049
 
1997
2050
  export declare function WorkbenchLeftPane({ rootDir, bridge, defaultTab, activeTab: controlledActiveTab, activePanelId, onActiveTabChange, revealFileTreeRequest, onOpenPanel, onReloadAgentPlugins, onCollapse, onExpand, onCloseSourcePane, railOnly, className, }: WorkbenchLeftPaneProps): JSX.Element;
@@ -2083,6 +2136,16 @@ export declare type WorkspaceAttentionBlocker = {
2083
2136
  sessionId?: string;
2084
2137
  /** Optional generic session-row badge contributed by the plugin that owns this attention. */
2085
2138
  sessionBadge?: WorkspaceAttentionSessionBadge;
2139
+ /**
2140
+ * Remove this blocker once its workspace chat session disappears from the
2141
+ * authoritative session list. Leave unset for external inbox items whose
2142
+ * `sessionId` is a source/thread identifier rather than a local chat id.
2143
+ */
2144
+ pruneWhenSessionMissing?: boolean;
2145
+ /** Explicit inbox projection metadata. New inbox-aware plugins should provide this instead of relying on reason parsing. */
2146
+ inbox?: WorkspaceAttentionInboxMetadata;
2147
+ /** Optional shell focus behavior requested by the plugin that owns this blocker. */
2148
+ focus?: WorkspaceAttentionFocusMetadata;
2086
2149
  actions?: WorkspaceAttentionBlockerAction[];
2087
2150
  };
2088
2151
 
@@ -2097,6 +2160,27 @@ export declare interface WorkspaceAttentionContextValue {
2097
2160
  removeBlocker: (id: string) => void;
2098
2161
  }
2099
2162
 
2163
+ export declare type WorkspaceAttentionFocusMetadata = {
2164
+ /** Close the workbench left pane when this blocker becomes active for the current session. */
2165
+ closeWorkbenchLeftPane?: boolean;
2166
+ };
2167
+
2168
+ declare type WorkspaceAttentionInboxMetadata = {
2169
+ kind: "question" | "review" | "approval" | "notice";
2170
+ sourceLabel: string;
2171
+ createdAt?: string | number | Date;
2172
+ updatedAt?: string | number | Date;
2173
+ priority?: number;
2174
+ };
2175
+
2176
+ export declare type WorkspaceAttentionProviderProps = {
2177
+ children: ReactNode;
2178
+ /** Authoritative set of existing chat sessions. Blockers that opt into pruning outside this set are stale and removed. */
2179
+ knownSessionIds?: readonly string[];
2180
+ /** Keep false while sessions are still loading/paginated so valid blockers are not pruned early. */
2181
+ knownSessionsAuthoritative?: boolean;
2182
+ };
2183
+
2100
2184
  export declare type WorkspaceAttentionSessionBadge = {
2101
2185
  /** Stable badge kind for data attributes and plugin-specific styling hooks. */
2102
2186
  kind: string;
@@ -2137,8 +2221,9 @@ export declare interface WorkspaceBridgeContextValue {
2137
2221
 
2138
2222
  export declare type WorkspaceChatPanelComponent = ComponentType<any>;
2139
2223
 
2140
- export declare interface WorkspaceChatPanelProps extends PiChatPanelProps<WorkspaceAttentionBlocker> {
2224
+ export declare interface WorkspaceChatPanelProps extends Omit<PiChatPanelProps<WorkspaceAttentionBlocker>, "onOpenArtifact"> {
2141
2225
  sessionId: string;
2226
+ onOpenArtifact?: OpenArtifactHandler;
2142
2227
  /** Endpoint base for agent → visible-workbench UI commands. */
2143
2228
  bridgeEndpoint?: string | null;
2144
2229
  /** Imperative handle getter for the visible workbench surface. */
@@ -2151,6 +2236,11 @@ export declare interface WorkspaceChatPanelProps extends PiChatPanelProps<Worksp
2151
2236
  openWorkbenchSources?: () => void;
2152
2237
  /** Closes the visible workbench surface after an ephemeral command finishes. */
2153
2238
  closeWorkbench?: () => void;
2239
+ /** Host-injected composer blockers (for shell policies such as detached read-only chat). */
2240
+ composerBlockers?: WorkspaceAttentionBlocker[];
2241
+ onComposerStop?: () => void;
2242
+ onComposerBlockerAction?: (blocker: WorkspaceAttentionBlocker, action: string) => void;
2243
+ onData?: (part: unknown) => void;
2154
2244
  }
2155
2245
 
2156
2246
  export declare function workspaceComposerStopAppliesToSession(detail: unknown, sessionId: string, options?: WorkspaceComposerStopMatchOptions): boolean;
@@ -2172,6 +2262,7 @@ export declare function workspaceComposerStopTargetSessionId(detail: unknown, fa
2172
2262
  export declare interface WorkspaceContextValue {
2173
2263
  chatPanel: WorkspaceChatPanelComponent | null;
2174
2264
  registeredPlugins: RegisteredPluginMeta[];
2265
+ workspaceId?: string;
2175
2266
  debug: boolean;
2176
2267
  }
2177
2268
 
@@ -2360,7 +2451,7 @@ export declare interface WorkspacePluginEventMap {
2360
2451
  };
2361
2452
  }
2362
2453
 
2363
- export declare function WorkspaceProvider({ children, chatPanel, plugins, excludeDefaults, panels, commands, catalogs, capabilities, apiBaseUrl, authHeaders, apiTimeout, activeSessionId, openSessionIds, defaultTheme, onThemeChange, workspaceId, workspaceLabel, appTitle, storageKey, persistenceEnabled, manageDocumentTitle, bridgeEndpoint, onAuthError, onOpenFile, debug, frontPluginHotReload, fullPageBasePath, commandPaletteSessionSearch, }: WorkspaceProviderProps): JSX.Element;
2454
+ export declare function WorkspaceProvider({ children, chatPanel, plugins, capturedPlugins, excludeDefaults, panels, commands, catalogs, capabilities, apiBaseUrl, authHeaders, apiTimeout, activeSessionId, openSessionIds, attentionSessionIds, attentionSessionsAuthoritative, defaultTheme, onThemeChange, workspaceId, workspaceLabel, appTitle, storageKey, persistenceEnabled, manageDocumentTitle, bridgeEndpoint, onAuthError, onOpenFile, debug, frontPluginHotReload, fullPageBasePath, commandPaletteSessionSearch, }: WorkspaceProviderProps): JSX.Element;
2364
2455
 
2365
2456
  export declare interface WorkspaceProviderProps {
2366
2457
  children: ReactNode;
@@ -2370,6 +2461,7 @@ export declare interface WorkspaceProviderProps {
2370
2461
  * `@hachej/boring-workspace/plugin`.
2371
2462
  */
2372
2463
  plugins?: BoringFrontFactoryWithId[];
2464
+ capturedPlugins?: CapturedFrontPlugin[];
2373
2465
  excludeDefaults?: string[];
2374
2466
  panels?: PanelConfig[];
2375
2467
  commands?: CommandConfig[];
@@ -2383,6 +2475,10 @@ export declare interface WorkspaceProviderProps {
2383
2475
  activeSessionId?: string | null;
2384
2476
  /** Session ids that are currently open in chat panes, for plugins that must avoid opening closed-session UI. */
2385
2477
  openSessionIds?: readonly string[];
2478
+ /** Authoritative chat session ids used to drop stale session-scoped Inbox/attention entries. */
2479
+ attentionSessionIds?: readonly string[];
2480
+ /** False while session data is loading or paginated; prevents pruning valid off-page attention entries. */
2481
+ attentionSessionsAuthoritative?: boolean;
2386
2482
  defaultTheme?: "light" | "dark" | undefined;
2387
2483
  onThemeChange?: (theme: "light" | "dark") => void;
2388
2484
  workspaceId?: string;
@@ -2406,6 +2502,48 @@ export declare interface WorkspaceProviderProps {
2406
2502
  commandPaletteSessionSearch?: CommandPaletteSessionSearchConfig;
2407
2503
  }
2408
2504
 
2505
+ export declare interface WorkspaceShellAnchorRect {
2506
+ x: number;
2507
+ y: number;
2508
+ width: number;
2509
+ height: number;
2510
+ top: number;
2511
+ right: number;
2512
+ bottom: number;
2513
+ left: number;
2514
+ }
2515
+
2516
+ export declare type WorkspaceShellArtifactTarget = {
2517
+ type: "surface";
2518
+ surfaceKind: string;
2519
+ target?: string;
2520
+ params?: Record<string, unknown>;
2521
+ } | {
2522
+ type: "panel";
2523
+ panelComponentId: string;
2524
+ params?: Record<string, unknown>;
2525
+ };
2526
+
2527
+ export declare interface WorkspaceShellCapabilities {
2528
+ openArtifact(target: WorkspaceShellArtifactTarget | null, options?: {
2529
+ sessionId?: string | null;
2530
+ title?: string;
2531
+ instanceId?: string;
2532
+ }): WorkspaceShellCapabilityResult;
2533
+ openDetachedChat(sessionId: string, options?: {
2534
+ anchor?: WorkspaceShellAnchorRect;
2535
+ title?: string;
2536
+ }): WorkspaceShellCapabilityResult;
2537
+ }
2538
+
2539
+ export declare type WorkspaceShellCapabilityResult = {
2540
+ success: true;
2541
+ } | {
2542
+ success: false;
2543
+ reason: "no-artifact" | "open-failed" | "invalid-session" | "placement-failed";
2544
+ message: string;
2545
+ };
2546
+
2409
2547
  export declare interface WorkspaceSourceConfig<T = any> {
2410
2548
  id: string;
2411
2549
  title: string;
@@ -2504,3 +2642,8 @@ declare type WorkspaceStoreApi = {
2504
2642
  };
2505
2643
 
2506
2644
  export { }
2645
+
2646
+
2647
+ declare global {
2648
+ var __BORING_RUNTIME_SINGLETONS__: Record<string, unknown> | undefined;
2649
+ }