@deepseek-ai/dsh-client-ui-sidebar-documentpreview 0.1.7-alpha.2 → 0.1.7-rc.2

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/lib/client.pdf.js CHANGED
@@ -959,7 +959,7 @@ window.__ModuleLoader__.load({
959
959
  * @param pageNumber - 1-based selected page.
960
960
  * @param canvas - canvas owned by this render only.
961
961
  * @param signal - render lifetime.
962
- * @param pixelRatio - display pixel ratio.
962
+ * @param pixelRatio - device pixel ratio multiplied by the settled document zoom.
963
963
  * @param renderText - optional selectable text layer sharing this page and viewport.
964
964
  * @returns the page's CSS dimensions after rendering completes.
965
965
  */
@@ -32376,7 +32376,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32376
32376
  }
32377
32377
  //#endregion
32378
32378
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-sidebar-documentpreview/src/client/pdf/PdfBody.module.css.mjs
32379
- const css = ".E0GbtG_body{box-sizing:border-box;background:var(--dsw-alias-bg-document-preview);width:100%;min-width:100%;min-height:0;font-family:var(--dsw-font,sans-serif);white-space:normal;flex-direction:column;display:flex;overflow:visible}.E0GbtG_page{box-sizing:border-box;width:100%;min-width:0;overflow-x:visible}.E0GbtG_placeholder{aspect-ratio:3/4;background:var(--dsw-alias-bg-skeleton);width:100%}.E0GbtG_canvas{width:100%;max-width:none;height:auto;margin-inline:auto;display:block}.E0GbtG_surface{max-width:none;box-shadow:var(--dsw-elevation-prominent);margin-inline:auto;position:relative}.E0GbtG_surface[hidden]{display:none}.E0GbtG_text{position:absolute;inset:0;overflow:clip}.E0GbtG_text .textLayer{text-align:initial;letter-spacing:normal;word-spacing:normal;text-size-adjust:none;forced-color-adjust:none;transform-origin:0 0;caret-color:canvastext;z-index:0;--text-scale-factor:calc(var(--total-scale-factor) * var(--min-font-size));--min-font-size-inv:calc(1 / var(--min-font-size));line-height:1;position:absolute;inset:0;overflow:clip}.E0GbtG_text .textLayer[data-main-rotation=\"90\"]{transform:rotate(90deg)translateY(-100%)}.E0GbtG_text .textLayer[data-main-rotation=\"180\"]{transform:rotate(180deg)translate(-100%,-100%)}.E0GbtG_text .textLayer[data-main-rotation=\"270\"]{transform:rotate(270deg)translate(-100%)}.E0GbtG_text :is(span,br){color:#0000;white-space:pre;cursor:text;transform-origin:0 0;user-select:text;position:absolute}.E0GbtG_text .textLayer>:not(.markedContent),.E0GbtG_text .markedContent span:not(.markedContent){z-index:1;--font-height:0;--scale-x:1;--rotate:0deg;font-size:calc(var(--text-scale-factor) * var(--font-height));transform:rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv))}.E0GbtG_text .markedContent{display:contents}.E0GbtG_text ::selection{background:var(--dsw-alias-interactive-bg-hover-accent);color:#0000}.E0GbtG_text br::selection{background:0 0}.E0GbtG_text .textLayer .endOfContent{z-index:0;cursor:default;user-select:none;display:block;position:absolute;inset:100% 0 0}.E0GbtG_text .selecting .endOfContent{top:0}.E0GbtG_status{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;padding:10px;font-size:13px;line-height:1.5;display:flex}.E0GbtG_body .E0GbtG_status{color:var(--dsw-alias-label-document-preview)}.E0GbtG_opening{box-sizing:border-box;justify-content:center;width:100%;min-height:100%}";
32379
+ const css = ".E0GbtG_body{box-sizing:border-box;background:var(--dsw-alias-bg-document-preview);width:100%;min-width:100%;min-height:100%;font-family:var(--dsw-font,sans-serif);white-space:normal;flex-direction:column;gap:12px;padding:12px;display:flex;overflow:visible}[data-document-zoom-mode=fixed] .E0GbtG_body{width:max-content}.E0GbtG_page{box-sizing:border-box;width:100%;min-width:0;overflow-x:visible}.E0GbtG_placeholder{aspect-ratio:3/4;background:var(--dsw-alias-bg-skeleton);width:100%}.E0GbtG_canvas{width:100%;max-width:none;height:auto;margin-inline:auto;display:block}.E0GbtG_surface{max-width:none;box-shadow:var(--dsw-elevation-prominent);margin-inline:auto;position:relative}.E0GbtG_surface[hidden]{display:none}.E0GbtG_text{position:absolute;inset:0;overflow:clip}.E0GbtG_text .textLayer{text-align:initial;letter-spacing:normal;word-spacing:normal;text-size-adjust:none;forced-color-adjust:none;transform-origin:0 0;caret-color:canvastext;z-index:0;--text-scale-factor:calc(var(--total-scale-factor) * var(--min-font-size));--min-font-size-inv:calc(1 / var(--min-font-size));line-height:1;position:absolute;inset:0;overflow:clip}.E0GbtG_text .textLayer[data-main-rotation=\"90\"]{transform:rotate(90deg)translateY(-100%)}.E0GbtG_text .textLayer[data-main-rotation=\"180\"]{transform:rotate(180deg)translate(-100%,-100%)}.E0GbtG_text .textLayer[data-main-rotation=\"270\"]{transform:rotate(270deg)translate(-100%)}.E0GbtG_text :is(span,br){color:#0000;white-space:pre;cursor:text;transform-origin:0 0;user-select:text;position:absolute}.E0GbtG_text .textLayer>:not(.markedContent),.E0GbtG_text .markedContent span:not(.markedContent){z-index:1;--font-height:0;--scale-x:1;--rotate:0deg;font-size:calc(var(--text-scale-factor) * var(--font-height));transform:rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv))}.E0GbtG_text .markedContent{display:contents}.E0GbtG_text ::selection{background:var(--dsw-alias-interactive-bg-hover-accent);color:#0000}.E0GbtG_text br::selection{background:0 0}.E0GbtG_text .textLayer .endOfContent{z-index:0;cursor:default;user-select:none;display:block;position:absolute;inset:100% 0 0}.E0GbtG_text .selecting .endOfContent{top:0}.E0GbtG_status{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;padding:10px;font-size:13px;line-height:1.5;display:flex}.E0GbtG_body .E0GbtG_status{color:var(--dsw-alias-label-document-preview)}";
32380
32380
  const tagId = "@deepseek-ai/dsh-client-ui-sidebar-documentpreview/PdfBody.module.css";
32381
32381
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
32382
32382
  const tag = document.createElement("style");
@@ -32388,7 +32388,6 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32388
32388
  var PdfBody_module_css_default = {
32389
32389
  "body": "E0GbtG_body",
32390
32390
  "canvas": "E0GbtG_canvas",
32391
- "opening": "E0GbtG_opening",
32392
32391
  "page": "E0GbtG_page",
32393
32392
  "placeholder": "E0GbtG_placeholder",
32394
32393
  "status": "E0GbtG_status",
@@ -32402,7 +32401,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32402
32401
  const FIT_WIDTH = { kind: "fit-width" };
32403
32402
  /**
32404
32403
  * Present a PDF with tab-local viewing preferences and component-owned rendering resources.
32405
- * @param props - complete bytes and framework-owned tab/store/locale seats.
32404
+ * @param props - complete bytes, framework-owned tab/store/locale seats, and main-bundle loading content.
32406
32405
  * @returns the PDF reader.
32407
32406
  */
32408
32407
  function PdfBody(props) {
@@ -32412,6 +32411,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32412
32411
  const [load, setLoad] = (0, react.useState)();
32413
32412
  const [attempt, setAttempt] = (0, react.useState)(0);
32414
32413
  const [pageWidth, setPageWidth] = (0, react.useState)();
32414
+ const [renderZoom, setRenderZoom] = (0, react.useState)(1);
32415
32415
  const { retainTab, actions, t, ZoomViewport, zoomSurfaceClass } = props;
32416
32416
  const preference = view.zoom ?? FIT_WIDTH;
32417
32417
  const labels = {
@@ -32474,13 +32474,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32474
32474
  role: "alert",
32475
32475
  children: t("unsupported")
32476
32476
  });
32477
- if (load?.data !== data) return (0, react_jsx_runtime.jsx)("span", {
32478
- className: `${PdfBody_module_css_default.status} ${PdfBody_module_css_default.opening}`,
32479
- role: "status",
32480
- "aria-label": t("loading"),
32481
- "data-document-loading": true,
32482
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" })
32483
- });
32477
+ if (load?.data !== data) return props.loading;
32484
32478
  if (load.kind === "failed") return (0, react_jsx_runtime.jsxs)("div", {
32485
32479
  className: PdfBody_module_css_default.status,
32486
32480
  role: "alert",
@@ -32502,6 +32496,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32502
32496
  onVisible: pageVisible,
32503
32497
  signal: tab.signal,
32504
32498
  onWidth: index === 0 ? setPageWidth : void 0,
32499
+ zoom: renderZoom,
32505
32500
  zoomSurfaceClass,
32506
32501
  t
32507
32502
  }, index))
@@ -32509,70 +32504,104 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32509
32504
  return (0, react_jsx_runtime.jsx)(ZoomViewport, {
32510
32505
  preference,
32511
32506
  intrinsicWidth: pageWidth,
32507
+ horizontalInset: 24,
32512
32508
  labels,
32513
32509
  signal: tab.signal,
32514
32510
  scrollportRef: props.scrollportRef,
32515
32511
  onPreference: setPreference,
32512
+ onRenderZoom: setRenderZoom,
32516
32513
  children: pages
32517
32514
  });
32518
32515
  }
32519
- function PdfPage({ document, page, requested: initiallyRequested, onVisible, signal, onWidth, zoomSurfaceClass, t }) {
32516
+ function PdfPage({ document, page, requested: initiallyRequested, onVisible, signal, onWidth, zoom, zoomSurfaceClass, t }) {
32520
32517
  const host = (0, react.useRef)(null);
32521
32518
  const canvas = (0, react.useRef)(null);
32522
32519
  const text = (0, react.useRef)(null);
32523
32520
  const [width, setWidth] = (0, react.useState)();
32524
32521
  const [requested, setRequested] = (0, react.useState)(initiallyRequested);
32522
+ const [visible, setVisible] = (0, react.useState)(initiallyRequested);
32523
+ const renderedZoom = (0, react.useRef)();
32524
+ const pendingRender = (0, react.useRef)(Promise.resolve());
32525
+ const textTask = (0, react.useRef)();
32525
32526
  const [state, setState] = (0, react.useState)("loading");
32526
32527
  const [failure, setFailure] = (0, react.useState)();
32527
32528
  const [attempt, setAttempt] = (0, react.useState)(0);
32528
32529
  (0, react.useEffect)(() => {
32529
- const node = host.current;
32530
+ const node = state === "ready" ? canvas.current : host.current;
32530
32531
  if (typeof IntersectionObserver === "undefined") {
32531
32532
  setRequested(true);
32533
+ setVisible(true);
32532
32534
  return;
32533
32535
  }
32534
32536
  let disposed = false;
32535
32537
  const observer = new IntersectionObserver((entries) => {
32536
- if (disposed || !entries.some((entry) => entry.isIntersecting)) return;
32538
+ if (disposed) return;
32539
+ const intersects = entries.some((entry) => entry.isIntersecting);
32540
+ setVisible(intersects);
32541
+ if (!intersects) return;
32537
32542
  setRequested(true);
32538
32543
  onVisible(page);
32539
- observer.disconnect();
32540
32544
  }, { rootMargin: "100% 0px" });
32541
32545
  observer.observe(node);
32542
32546
  return () => {
32543
32547
  disposed = true;
32544
32548
  observer.disconnect();
32545
32549
  };
32546
- }, [page, onVisible]);
32550
+ }, [
32551
+ page,
32552
+ onVisible,
32553
+ state
32554
+ ]);
32555
+ (0, react.useEffect)(() => () => {
32556
+ textTask.current?.cancel();
32557
+ }, []);
32547
32558
  (0, react.useEffect)(() => {
32548
32559
  if (!requested) return;
32560
+ setFailure(void 0);
32561
+ if (renderedZoom.current !== void 0 && (!visible || renderedZoom.current === zoom)) return;
32549
32562
  const node = canvas.current;
32550
32563
  const lifetime = new AbortController();
32551
32564
  const renderSignal = AbortSignal.any([lifetime.signal, signal]);
32552
- setState("loading");
32553
- setFailure(void 0);
32554
- const createText = pdfTextRenderer(text.current);
32555
- let textTask;
32556
- renderPdfPage(document, page, node, renderSignal, window.devicePixelRatio, (pdfPage, viewport) => {
32557
- textTask = createText(pdfPage, viewport);
32558
- return textTask;
32559
- }).then((size) => {
32560
- if (!renderSignal.aborted) {
32565
+ let newText;
32566
+ pendingRender.current = pendingRender.current.then(async () => {
32567
+ renderSignal.throwIfAborted();
32568
+ const buffer = node.ownerDocument.createElement("canvas");
32569
+ try {
32570
+ const size = await renderPdfPage(document, page, buffer, renderSignal, window.devicePixelRatio * zoom, textTask.current === void 0 ? (pdfPage, viewport) => {
32571
+ newText = pdfTextRenderer(text.current)(pdfPage, viewport);
32572
+ return newText;
32573
+ } : void 0);
32574
+ renderSignal.throwIfAborted();
32575
+ const context = node.getContext("2d");
32576
+ if (context === null) throw new Error("PDF canvas has no 2D context");
32577
+ node.width = buffer.width;
32578
+ node.height = buffer.height;
32579
+ node.style.setProperty("--pdf-page-width", `${size.width}px`);
32580
+ node.style.setProperty("--pdf-page-height", `${size.height}px`);
32581
+ context.drawImage(buffer, 0, 0);
32582
+ textTask.current ??= newText;
32583
+ newText = void 0;
32584
+ renderedZoom.current = zoom;
32561
32585
  setWidth(size.width);
32562
32586
  onWidth?.(size.width);
32563
32587
  setState("ready");
32588
+ } finally {
32589
+ buffer.width = buffer.height = 0;
32590
+ newText?.cancel();
32564
32591
  }
32565
- }, (error) => {
32592
+ }).catch((error) => {
32566
32593
  if (!renderSignal.aborted) setFailure({ error });
32567
32594
  });
32568
32595
  return () => {
32569
32596
  lifetime.abort();
32570
- textTask?.cancel();
32597
+ newText?.cancel();
32571
32598
  };
32572
32599
  }, [
32573
32600
  document,
32574
32601
  page,
32575
32602
  requested,
32603
+ visible,
32604
+ zoom,
32576
32605
  signal,
32577
32606
  attempt,
32578
32607
  onWidth
@@ -32602,7 +32631,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
32602
32631
  className: `${PdfBody_module_css_default.surface} ${zoomSurfaceClass}`,
32603
32632
  "data-document-zoom-surface": true,
32604
32633
  style: { "--document-zoom-width": `${width ?? 0}px` },
32605
- hidden: state !== "ready" || failure !== void 0,
32634
+ hidden: state !== "ready",
32606
32635
  children: [(0, react_jsx_runtime.jsx)("canvas", {
32607
32636
  ref: canvas,
32608
32637
  className: PdfBody_module_css_default.canvas,
@@ -1,12 +1,11 @@
1
1
  /** Shared indeterminate loading feedback for document reads and rendering. */
2
2
  import type { ReactNode } from 'react';
3
3
  /**
4
- * @param props - localized status label, carried as the accessible name with
5
- * no visible text, and optional placement style.
6
- * @returns an animated, accessible loading status.
4
+ * @param props - localized status label and compact inline placement for additional pages.
5
+ * @returns a centered document loading status or an accessible inline spinner.
7
6
  */
8
- export declare function LoadingIndicator({ label, className }: {
7
+ export declare function LoadingIndicator({ label, inline }: {
9
8
  label: string;
10
- className?: string | undefined;
9
+ inline?: boolean;
11
10
  }): ReactNode;
12
11
  //# sourceMappingURL=LoadingIndicator.d.ts.map
@@ -8,9 +8,10 @@ import type { ExcelLimits } from './model.ts';
8
8
  export type ExcelBodyProps = DocumentPreviewProps & PropsLocale<'sidebarExcel'> & {
9
9
  readonly limits: ExcelLimits;
10
10
  };
11
- /** Lazily loaded renderer input with the filename-derived parser choice. */
11
+ /** Lazily loaded renderer input with the parser choice and main-bundle loading content. */
12
12
  export type LoadedExcelBodyProps = ExcelBodyProps & {
13
13
  readonly format: ExcelFormat;
14
+ readonly loading: ReactNode;
14
15
  };
15
16
  /**
16
17
  * Load the browser spreadsheet renderer for every registered format.
@@ -7,5 +7,5 @@ import type { LoadedExcelBodyProps } from './LazyExcelBody.tsx';
7
7
  * @param props - Complete workbook bytes, limits, and locale.
8
8
  * @returns An isolated spreadsheet surface with cancellable loading.
9
9
  */
10
- export declare function ExcelBody({ content, format, limits, t }: LoadedExcelBodyProps): ReactNode;
10
+ export declare function ExcelBody({ content, format, limits, t, loading }: LoadedExcelBodyProps): ReactNode;
11
11
  //# sourceMappingURL=excel.d.ts.map
@@ -3,7 +3,7 @@
3
3
  * @param base - document base URI, including any deployment prefix.
4
4
  * @param documentPath - absolute source path reported by the Host, when available.
5
5
  * @param destination - authored Markdown image URL; query and fragment are not filename components.
6
- * @returns an HTTP(S) file URL, or undefined for unsupported or malformed destinations.
6
+ * @returns a Web or Desktop file URL, or undefined for unsupported or malformed destinations.
7
7
  */
8
8
  export declare function markdownImageUrl(base: string, documentPath: string | undefined, destination: string): string | undefined;
9
9
  //# sourceMappingURL=path-images.d.ts.map
@@ -30,7 +30,7 @@ export type RenderPdfText = (page: PDFPageProxy, viewport: PageViewport) => {
30
30
  * @param pageNumber - 1-based selected page.
31
31
  * @param canvas - canvas owned by this render only.
32
32
  * @param signal - render lifetime.
33
- * @param pixelRatio - display pixel ratio.
33
+ * @param pixelRatio - device pixel ratio multiplied by the settled document zoom.
34
34
  * @param renderText - optional selectable text layer sharing this page and viewport.
35
35
  * @returns the page's CSS dimensions after rendering completes.
36
36
  */
@@ -22,8 +22,10 @@ export interface PdfBodyInjected {
22
22
  export type PdfBodyProps = DocumentPreviewProps & PropsLocale<'sidebarPdf'> & PropsStore<PdfStore> & PdfBodyInjected;
23
23
  /**
24
24
  * Present a PDF with tab-local viewing preferences and component-owned rendering resources.
25
- * @param props - complete bytes and framework-owned tab/store/locale seats.
25
+ * @param props - complete bytes, framework-owned tab/store/locale seats, and main-bundle loading content.
26
26
  * @returns the PDF reader.
27
27
  */
28
- export declare function PdfBody(props: PdfBodyProps): ReactNode;
28
+ export declare function PdfBody(props: PdfBodyProps & {
29
+ readonly loading: ReactNode;
30
+ }): ReactNode;
29
31
  //# sourceMappingURL=pdf.d.ts.map
@@ -12,6 +12,8 @@ export interface ZoomViewportProps {
12
12
  readonly signal: AbortSignal;
13
13
  readonly scrollportRef: RefCallback<HTMLElement>;
14
14
  readonly onPreference: (preference: ZoomPreference) => void;
15
+ /** Resolved scale after a gesture settles or fit-width measurement changes. */
16
+ readonly onRenderZoom?: (zoom: number) => void;
15
17
  readonly children: ReactNode;
16
18
  }
17
19
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-sidebar-documentpreview",
3
3
  "description": "Extensible Sidebar previews for Office documents, spreadsheets, Markdown, code, images, PDF, HTML, and plain text",
4
- "version": "0.1.7-alpha.2",
4
+ "version": "0.1.7-rc.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -62,25 +62,25 @@
62
62
  "react-dom": "^18.2.0",
63
63
  "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
64
64
  "@deepseek-ai/cordis": "~4.0.4",
65
- "@deepseek-ai/dsh-api-gateway": "0.1.7-alpha.2",
66
- "@deepseek-ai/dsh-api-remotes": "0.1.7-alpha.2",
67
- "@deepseek-ai/dsh-api-workspace-files": "0.1.7-alpha.2",
68
- "@deepseek-ai/dsh-client-connection": "0.1.7-alpha.2",
69
- "@deepseek-ai/dsh-client-locale": "0.1.7-alpha.2",
70
- "@deepseek-ai/dsh-client-resources": "0.1.7-alpha.2",
71
- "@deepseek-ai/dsh-client-store": "0.1.7-alpha.2",
72
- "@deepseek-ai/dsh-client-test-runtime": "0.1.7-alpha.2",
73
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-alpha.2",
74
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-alpha.2",
75
- "@deepseek-ai/dsh-client-ui-dockkit": "0.1.7-alpha.2",
76
- "@deepseek-ai/dsh-client-ui-session": "0.1.7-alpha.2",
77
- "@deepseek-ai/dsh-client-ui-settings": "0.1.7-alpha.2",
78
- "@deepseek-ai/dsh-client-ui-sidebar-right": "0.1.7-alpha.2",
79
- "@deepseek-ai/dsh-client-ui-slots": "0.1.7-alpha.2",
80
- "@deepseek-ai/dsh-office-to-pdf": "0.1.7-alpha.2",
81
- "@deepseek-ai/dsh-host-webserver": "0.1.7-alpha.2",
82
- "@deepseek-ai/dsh-session": "0.1.7-alpha.2",
83
- "@deepseek-ai/dsh-util-workspace-path": "0.1.7-alpha.2"
65
+ "@deepseek-ai/dsh-api-remotes": "0.1.7-rc.2",
66
+ "@deepseek-ai/dsh-api-workspace-files": "0.1.7-rc.2",
67
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.2",
68
+ "@deepseek-ai/dsh-api-gateway": "0.1.7-rc.2",
69
+ "@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
70
+ "@deepseek-ai/dsh-client-resources": "0.1.7-rc.2",
71
+ "@deepseek-ai/dsh-client-store": "0.1.7-rc.2",
72
+ "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.2",
73
+ "@deepseek-ai/dsh-client-ui-dockkit": "0.1.7-rc.2",
74
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
75
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.2",
76
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.7-rc.2",
77
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
78
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.1.7-rc.2",
79
+ "@deepseek-ai/dsh-office-to-pdf": "0.1.7-rc.2",
80
+ "@deepseek-ai/dsh-host-webserver": "0.1.7-rc.2",
81
+ "@deepseek-ai/dsh-session": "0.1.7-rc.2",
82
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.2",
83
+ "@deepseek-ai/dsh-client-ui-session": "0.1.7-rc.2"
84
84
  },
85
85
  "files": [
86
86
  "lib/index.js",