@hachej/boring-workspace 0.1.34 → 0.1.35

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.
@@ -100,6 +100,7 @@ declare interface BoringFrontAPI {
100
100
  registerPanelCommand(registration: BoringFrontPanelCommandRegistration): void;
101
101
  registerLeftTab<T = LeftTabParams>(registration: BoringFrontLeftTabRegistration<T>): void;
102
102
  registerSurfaceResolver(registration: BoringFrontSurfaceResolverRegistration): void;
103
+ registerToolRenderer(registration: BoringFrontToolRendererRegistration): void;
103
104
  }
104
105
 
105
106
  declare interface BoringFrontBindingRegistration {
@@ -173,6 +174,13 @@ declare interface BoringFrontSurfaceResolverRegistration {
173
174
  resolve: (request: SurfaceOpenRequest) => SurfacePanelResolution | null | undefined;
174
175
  }
175
176
 
177
+ declare type BoringFrontToolRenderer = (part: unknown) => ReactNode;
178
+
179
+ declare interface BoringFrontToolRendererRegistration {
180
+ id: string;
181
+ render: BoringFrontToolRenderer;
182
+ }
183
+
176
184
  export declare interface BridgeClient {
177
185
  connect(): void;
178
186
  disconnect(): void;
@@ -251,6 +259,7 @@ declare interface CapturedBoringFrontRegistrations {
251
259
  panelCommands: BoringFrontPanelCommandRegistration[];
252
260
  leftTabs: BoringFrontLeftTabRegistration<any>[];
253
261
  surfaceResolvers: BoringFrontSurfaceResolverRegistration[];
262
+ toolRenderers: BoringFrontToolRendererRegistration[];
254
263
  }
255
264
 
256
265
  declare interface CapturedFrontPlugin {
@@ -367,6 +376,20 @@ export declare interface ChatLayoutProps {
367
376
  navParams?: Record<string, unknown>;
368
377
  center?: string;
369
378
  centerParams?: Record<string, unknown>;
379
+ chatPanes?: ChatPaneDescriptor[];
380
+ activeChatPaneId?: string | null;
381
+ onActiveChatPaneChange?: (id: string) => void;
382
+ onCloseChatPane?: (id: string) => void;
383
+ onCreateChatPaneAfter?: (id: string) => void;
384
+ onDropChatSession?: (sessionId: string) => void;
385
+ flashChatPaneId?: string | null;
386
+ /**
387
+ * Chat stage layout engine. `dock` enables the dockview-backed stage
388
+ * (drag headers to split in any direction); defaults to the flex row.
389
+ * The `boring-workspace:chat-pane-engine` localStorage key overrides
390
+ * when no explicit value is passed.
391
+ */
392
+ chatPaneEngine?: ChatPaneEngine | null;
370
393
  surface?: string | null;
371
394
  surfaceParams?: Record<string, unknown>;
372
395
  surfaceOverlay?: ReactNode;
@@ -380,6 +403,25 @@ export declare interface ChatLayoutProps {
380
403
  className?: string;
381
404
  }
382
405
 
406
+ declare interface ChatPaneDescriptor {
407
+ id: string;
408
+ title?: string | null;
409
+ panel?: string;
410
+ params?: Record<string, unknown>;
411
+ }
412
+
413
+ /**
414
+ * Layout engine for the chat pane stage.
415
+ *
416
+ * - `flex` (default): panes lay out as a single row of vertical splits.
417
+ * - `dock`: dockview-backed stage — drag pane headers to split in any
418
+ * direction and resize; geometry persists per workspace.
419
+ *
420
+ * Resolution order: explicit prop, then the
421
+ * `boring-workspace:chat-pane-engine` localStorage override, then `flex`.
422
+ */
423
+ declare type ChatPaneEngine = "flex" | "dock";
424
+
383
425
  export declare const closePanelSchema: z.ZodObject<{
384
426
  id: z.ZodString;
385
427
  }, "strip", z.ZodTypeAny, {
@@ -674,6 +716,7 @@ declare class FetchClient {
674
716
  }>;
675
717
  deleteFile(path: string): Promise<void>;
676
718
  stat(path: string, signal?: AbortSignal): Promise<FileStat>;
719
+ getGitUrlMetadata(path: string, signal?: AbortSignal): Promise<GitUrlMetadata>;
677
720
  search(query: string, limit?: number, signal?: AbortSignal): Promise<string[]>;
678
721
  createDir(path: string): Promise<void>;
679
722
  moveFile(from: string, to: string): Promise<void>;
@@ -920,6 +963,12 @@ export declare type FrontPluginHotReloadMode = "vite" | false;
920
963
 
921
964
  export declare function getFileIcon(filename: string): LucideIcon;
922
965
 
966
+ declare interface GitUrlMetadata {
967
+ enabled: boolean;
968
+ reason?: string;
969
+ url?: string;
970
+ }
971
+
923
972
  export declare interface GroupConfig {
924
973
  id: string;
925
974
  position: "left" | "center" | "right" | "bottom";
@@ -1337,12 +1386,18 @@ export declare interface ResponsiveDockviewShellProps {
1337
1386
 
1338
1387
  export declare type SerializedLayout = Parameters<DockviewApi["fromJSON"]>[0];
1339
1388
 
1340
- export declare function SessionBrowser({ sessions, activeId, onSwitch, onCreate, onDelete, onLoadMore, hasMore, loadingMore, onClose, className, }: SessionBrowserProps): JSX.Element;
1389
+ export declare function SessionBrowser({ sessions, activeId, openIds, pinnedIds, onTogglePin, onSwitch, onOpenAsTab, onCreate, onDelete, onLoadMore, hasMore, loadingMore, onClose, className, }: SessionBrowserProps): JSX.Element;
1341
1390
 
1342
1391
  export declare interface SessionBrowserProps {
1343
1392
  sessions: SessionItem[];
1344
1393
  activeId?: string | null;
1394
+ /** Session ids currently open as chat panes, in pane order. */
1395
+ openIds?: string[];
1396
+ /** Session ids the user pinned; surfaced in a Pinned section on top. */
1397
+ pinnedIds?: string[];
1398
+ onTogglePin?: (id: string) => void;
1345
1399
  onSwitch?: (id: string) => void;
1400
+ onOpenAsTab?: (id: string) => void;
1346
1401
  onCreate?: () => void;
1347
1402
  onDelete?: (id: string) => void;
1348
1403
  onLoadMore?: () => void;
@@ -1955,6 +2010,15 @@ export declare interface WorkspaceEventMap extends WorkspaceHostEventMap, Worksp
1955
2010
  /** Names that share a prefix can be filtered with `startsWith`. */
1956
2011
  export declare type WorkspaceEventName = keyof WorkspaceEventMap;
1957
2012
 
2013
+ export declare const workspaceEvents: {
2014
+ readonly uiCommand: "workspace:ui.command";
2015
+ readonly editorSaveStart: "workspace:editor.save.start";
2016
+ readonly editorSaveEnd: "workspace:editor.save.end";
2017
+ readonly panelUpdate: "workspace:panel.update";
2018
+ readonly panelClose: "workspace:panel.close";
2019
+ readonly agentData: "workspace:agent.data";
2020
+ };
2021
+
1958
2022
  export declare function WorkspaceFilesProvider({ apiBaseUrl, authHeaders, onAuthError, timeout, client: providedClient, children, }: DataProviderProps): JSX.Element;
1959
2023
 
1960
2024
  declare interface WorkspaceHostEventMap {
@@ -2071,7 +2135,7 @@ export declare interface WorkspacePluginEventMap {
2071
2135
  };
2072
2136
  }
2073
2137
 
2074
- export declare function WorkspaceProvider({ children, chatPanel, plugins, excludeDefaults, panels, commands, catalogs, capabilities, apiBaseUrl, authHeaders, apiTimeout, defaultTheme, onThemeChange, workspaceId, storageKey, persistenceEnabled, bridgeEndpoint, onAuthError, onOpenFile, debug, frontPluginHotReload, fullPageBasePath, }: WorkspaceProviderProps): JSX.Element;
2138
+ export declare function WorkspaceProvider({ children, chatPanel, plugins, excludeDefaults, panels, commands, catalogs, capabilities, apiBaseUrl, authHeaders, apiTimeout, defaultTheme, onThemeChange, workspaceId, workspaceLabel, storageKey, persistenceEnabled, manageDocumentTitle, bridgeEndpoint, onAuthError, onOpenFile, debug, frontPluginHotReload, fullPageBasePath, }: WorkspaceProviderProps): JSX.Element;
2075
2139
 
2076
2140
  export declare interface WorkspaceProviderProps {
2077
2141
  children: ReactNode;
@@ -2093,8 +2157,10 @@ export declare interface WorkspaceProviderProps {
2093
2157
  defaultTheme?: "light" | "dark" | undefined;
2094
2158
  onThemeChange?: (theme: "light" | "dark") => void;
2095
2159
  workspaceId?: string;
2160
+ workspaceLabel?: string;
2096
2161
  storageKey?: string;
2097
2162
  persistenceEnabled?: boolean;
2163
+ manageDocumentTitle?: boolean;
2098
2164
  bridgeEndpoint?: string | null;
2099
2165
  onAuthError?: (statusCode: number) => void;
2100
2166
  onOpenFile?: (path: string) => void;
package/dist/workspace.js CHANGED
@@ -1,19 +1,19 @@
1
1
  var V = Object.defineProperty;
2
2
  var X = (e, t, a) => t in e ? V(e, t, { enumerable: !0, configurable: !0, writable: !0, value: a }) : e[t] = a;
3
3
  var T = (e, t, a) => X(e, typeof t != "symbol" ? t + "" : t, a);
4
- import { u as K, p as Q, a as Y, b as Z, D as ee } from "./WorkspaceProvider-hCE2wXKZ.js";
5
- import { A as Je, C as Ge, c as Ve, d as Xe, e as Qe, F as Ye, f as Ze, M as et, g as tt, P as at, h as rt, i as nt, j as st, k as ot, R as it, S as lt, l as ct, m as dt, T as ut, U as pt, W as ft, n as mt, o as ht, q as gt, r as bt, s as yt, t as vt, v as xt, w as kt, x as wt, y as Pt, z as St, B as Ct, E as Nt, G as Rt, H as Et, I as Tt, J as It, K as Ot, L as Ft, N as Lt, O as Mt, Q as Bt, V as Wt, X as Dt, Y as Kt, Z as $t, _ as jt, $ as zt, a0 as Ht, a1 as Ut, a2 as _t, a3 as qt, a4 as At, a5 as Jt, a6 as Gt, a7 as Vt, a8 as Xt, a9 as Qt, aa as Yt, ab as Zt, ac as ea, ad as ta, ae as aa, af as ra, ag as na, ah as sa, ai as oa, aj as ia, ak as la, al as ca, am as da, an as ua, ao as pa, ap as fa, aq as ma, ar as ha } from "./WorkspaceProvider-hCE2wXKZ.js";
4
+ import { u as K, p as Q, a as Y, b as Z, D as ee } from "./WorkspaceProvider-BhRPFy5R.js";
5
+ import { A as Je, C as Ge, c as Ve, d as Xe, e as Qe, F as Ye, f as Ze, M as et, g as tt, P as at, h as rt, i as nt, j as st, k as ot, R as it, S as lt, l as ct, m as dt, T as ut, U as pt, W as ft, n as mt, o as ht, q as gt, r as bt, s as yt, t as vt, v as xt, w as kt, x as wt, y as Pt, z as St, B as Ct, E as Nt, G as Et, H as Rt, I as Tt, J as It, K as Ot, L as Ft, N as Lt, O as Mt, Q as Bt, V as Wt, X as Dt, Y as Kt, Z as $t, _ as jt, $ as zt, a0 as Ht, a1 as Ut, a2 as _t, a3 as qt, a4 as At, a5 as Jt, a6 as Gt, a7 as Vt, a8 as Xt, a9 as Qt, aa as Yt, ab as Zt, ac as ea, ad as ta, ae as aa, af as ra, ag as na, ah as sa, ai as oa, aj as ia, ak as la, al as ca, am as da, an as ua, ao as pa, ap as fa, aq as ma, ar as ha, as as ga } from "./WorkspaceProvider-BhRPFy5R.js";
6
6
  import { c as C } from "./utils-B6yFEsav.js";
7
- import { C as ba, T as ya, W as va, b as xa } from "./WorkspaceLoadingState-RVGURLJy.js";
7
+ import { C as ya, T as va, W as xa, b as ka } from "./WorkspaceLoadingState-Bl-92Dly.js";
8
8
  import { jsx as r, jsxs as g, Fragment as te } from "react/jsx-runtime";
9
9
  import { Button as P, Sheet as ae, SheetContent as re, SheetHeader as ne, SheetTitle as se, SheetDescription as oe, EmptyState as ie, Kbd as I, ErrorState as le, IconButton as O } from "@hachej/boring-ui-kit";
10
- import { Toaster as wa, dismissToast as Pa, toast as Sa } from "@hachej/boring-ui-kit";
10
+ import { Toaster as Pa, dismissToast as Sa, toast as Ca } from "@hachej/boring-ui-kit";
11
11
  import { useSyncExternalStore as $, useState as N, useEffect as k, useRef as S, useCallback as b, useMemo as w, Suspense as ce, Component as de } from "react";
12
- import { C as Na, c as Ra } from "./CodeEditor-DQqOn4xz.js";
13
- import { FileTree as Ta } from "./FileTree-DWbh0xNI.js";
14
- import { MarkdownEditor as Oa } from "./MarkdownEditor-BhLjIyPQ.js";
12
+ import { C as Ea, c as Ra } from "./CodeEditor-DQqOn4xz.js";
13
+ import { FileTree as Ia } from "./FileTree-CkCxHBDu.js";
14
+ import { MarkdownEditor as Fa } from "./MarkdownEditor-CtPphEVP.js";
15
15
  import { MenuIcon as ue, PanelLeftOpenIcon as pe, PanelLeftCloseIcon as fe, PinIcon as me, CheckIcon as he, CopyIcon as ge } from "lucide-react";
16
- import { d as La } from "./panel-DnvDNQac.js";
16
+ import { d as Ma } from "./panel-DnvDNQac.js";
17
17
  function We() {
18
18
  const e = K();
19
19
  return $(e.subscribe, e.getSnapshot);
@@ -217,14 +217,14 @@ function Ce({
217
217
  () => f ? e : Se(e),
218
218
  [f, e]
219
219
  ), z = w(() => {
220
- const x = f ? "inline-sidebar" : "overlay-sidebar", M = v.groups.map((R) => {
221
- let E = "";
220
+ const x = f ? "inline-sidebar" : "overlay-sidebar", M = v.groups.map((E) => {
221
+ let R = "";
222
222
  try {
223
- E = JSON.stringify(R.params ?? null);
223
+ R = JSON.stringify(E.params ?? null);
224
224
  } catch {
225
- E = "unserializable";
225
+ R = "unserializable";
226
226
  }
227
- return `${R.id}:${R.panel ?? ""}:${E}`;
227
+ return `${E.id}:${E.panel ?? ""}:${R}`;
228
228
  }).join(",");
229
229
  return `${v.version}:${x}:${M}`;
230
230
  }, [v, f]), H = $(
@@ -501,7 +501,7 @@ function _e({
501
501
  /* @__PURE__ */ g("div", { className: "flex-1 overflow-y-auto", role: "list", "aria-label": "Session list", children: [
502
502
  e.length === 0 && /* @__PURE__ */ r("div", { className: "px-3 py-6 text-center text-sm text-muted-foreground", children: "No sessions" }),
503
503
  e.map((s) => /* @__PURE__ */ r(
504
- Ee,
504
+ Re,
505
505
  {
506
506
  session: s,
507
507
  isActive: s.id === t,
@@ -521,7 +521,7 @@ function _e({
521
521
  }
522
522
  );
523
523
  }
524
- async function Re(e) {
524
+ async function Ee(e) {
525
525
  var a, n;
526
526
  if (typeof navigator < "u" && ((a = navigator.clipboard) != null && a.writeText))
527
527
  try {
@@ -539,7 +539,7 @@ async function Re(e) {
539
539
  document.body.removeChild(t);
540
540
  }
541
541
  }
542
- function Ee({
542
+ function Re({
543
543
  session: e,
544
544
  isActive: t,
545
545
  isFocused: a,
@@ -550,7 +550,7 @@ function Ee({
550
550
  rowRef: d
551
551
  }) {
552
552
  const [l, c] = N(!1), p = b((m) => {
553
- m.stopPropagation(), Re(e.id).then((s) => {
553
+ m.stopPropagation(), Ee(e.id).then((s) => {
554
554
  s && (c(!0), window.setTimeout(() => c(!1), 1200));
555
555
  });
556
556
  }, [e.id]);
@@ -629,19 +629,19 @@ function Ee({
629
629
  export {
630
630
  Je as ArtifactSurfacePane,
631
631
  Ge as CatalogRegistry,
632
- ba as ChatLayout,
633
- Na as CodeEditor,
632
+ ya as ChatLayout,
633
+ Ea as CodeEditor,
634
634
  Ve as CodeEditorPane,
635
635
  Xe as CommandPalette,
636
636
  Qe as CommandRegistry,
637
637
  ee as DockviewShell,
638
638
  He as EmptyPane,
639
- Ta as FileTree,
639
+ Ia as FileTree,
640
640
  Ye as FileTreePane,
641
641
  Ze as FileTreeView,
642
642
  ze as IdeLayout,
643
643
  et as MAX_PANELS,
644
- Oa as MarkdownEditor,
644
+ Fa as MarkdownEditor,
645
645
  tt as MarkdownEditorPane,
646
646
  at as PanelChrome,
647
647
  Ue as PanelErrorBoundary,
@@ -656,19 +656,19 @@ export {
656
656
  ct as SurfaceResolverRegistry,
657
657
  dt as SurfaceShell,
658
658
  ut as ThemeProvider,
659
- wa as Toaster,
660
- ya as TopBar,
659
+ Pa as Toaster,
660
+ va as TopBar,
661
661
  pt as UI_COMMAND_EVENT,
662
662
  ft as WORKSPACE_OPEN_PATH_SURFACE_KIND,
663
663
  mt as WorkbenchLeftPane,
664
664
  ht as WorkspaceFilesProvider,
665
665
  De as WorkspaceLink,
666
- va as WorkspaceLoadingState,
666
+ xa as WorkspaceLoadingState,
667
667
  gt as WorkspaceProvider,
668
668
  bt as agentMeta,
669
669
  yt as bindStore,
670
670
  vt as bootstrap,
671
- xa as buildChatLayout,
671
+ ka as buildChatLayout,
672
672
  xt as buildFullPagePanelHref,
673
673
  Ne as buildIdeLayout,
674
674
  kt as closePanelSchema,
@@ -677,12 +677,12 @@ export {
677
677
  Pt as createBridgeClient,
678
678
  Ra as createShadcnTheme,
679
679
  St as createWorkspaceStore,
680
- La as definePanel,
681
- Pa as dismissToast,
680
+ Ma as definePanel,
681
+ Sa as dismissToast,
682
682
  Ct as emitAgentData,
683
683
  Nt as emitFilesystemAgentFileChange,
684
- Rt as events,
685
- Et as expandToFileSchema,
684
+ Et as events,
685
+ Rt as expandToFileSchema,
686
686
  Tt as filesystemEvents,
687
687
  It as filesystemPlugin,
688
688
  Ot as formatShortcut,
@@ -694,7 +694,7 @@ export {
694
694
  Dt as openPanelSchema,
695
695
  Q as postUiCommand,
696
696
  Ke as readFileRecords,
697
- Sa as toast,
697
+ Ca as toast,
698
698
  Kt as useActiveFile,
699
699
  $t as useActivePanel,
700
700
  We as useActivePanels,
@@ -735,6 +735,7 @@ export {
735
735
  fa as useWorkspaceContextOptional,
736
736
  ma as useWorkspaceRequestId,
737
737
  ha as userMeta,
738
+ ga as workspaceEvents,
738
739
  j as workspaceLinkCommand,
739
740
  be as workspaceLinkHref
740
741
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hachej/boring-workspace",
3
- "version": "0.1.34",
3
+ "version": "0.1.35",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Workspace UI, plugin, and bridge package for composing chat, files, catalogs, editors, and app-specific panes.",
@@ -135,9 +135,9 @@
135
135
  "tailwind-merge": "^2.0.0",
136
136
  "zod": "^3.23.0",
137
137
  "zustand": "^5.0.0",
138
- "@hachej/boring-agent": "0.1.34",
139
- "@hachej/boring-ui-kit": "0.1.34",
140
- "@hachej/boring-ui-plugin-cli": "0.1.34"
138
+ "@hachej/boring-agent": "0.1.35",
139
+ "@hachej/boring-ui-plugin-cli": "0.1.35",
140
+ "@hachej/boring-ui-kit": "0.1.35"
141
141
  },
142
142
  "devDependencies": {
143
143
  "@tailwindcss/postcss": "^4.0.0",
@@ -160,7 +160,7 @@
160
160
  "typescript": "^5.4.0",
161
161
  "vite": "^6.0.0",
162
162
  "vite-plugin-dts": "^4.5.4",
163
- "vitest": "^2.0.0",
163
+ "vitest": "^3.2.6",
164
164
  "@boring-fixtures/default-plugin": "0.0.0"
165
165
  },
166
166
  "scripts": {