@chengxianglibra/dsh-data-analysis 0.1.2 → 0.2.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.
Files changed (212) hide show
  1. package/README.md +136 -99
  2. package/cordis.patch.yml +1 -1
  3. package/lib/bin/environment.js +8 -6
  4. package/lib/client/credentials/changes.js +74 -0
  5. package/lib/client/credentials/create-datasource.js +126 -22
  6. package/lib/client/credentials/credential-draft.js +42 -0
  7. package/lib/client/credentials/defaults.js +11 -0
  8. package/lib/client/credentials/descriptions.js +46 -0
  9. package/lib/client/credentials/install.js +209 -81
  10. package/lib/client/credentials/model.js +323 -51
  11. package/lib/client/credentials/report-publishing.js +96 -0
  12. package/lib/client/credentials/styles.js +13 -9
  13. package/lib/client/i18n/context.js +22 -0
  14. package/lib/client/i18n/copy.js +57 -0
  15. package/lib/client/i18n/credentials.js +475 -0
  16. package/lib/client/i18n/host.js +27 -0
  17. package/lib/client/i18n/navigation.js +41 -0
  18. package/lib/client/i18n/presentation.js +577 -0
  19. package/lib/client/i18n/python.js +36 -0
  20. package/lib/client/i18n/semantic.js +441 -0
  21. package/lib/client/input-context.js +21 -0
  22. package/lib/client/python-tool/card.js +35 -0
  23. package/lib/client/python-tool/execution-error.js +35 -0
  24. package/lib/client/python-tool/install.js +9 -0
  25. package/lib/client/python-tool/model.js +101 -0
  26. package/lib/client/right-tabs/install.js +535 -0
  27. package/lib/client/right-tabs/live-delivery.js +58 -0
  28. package/lib/client/right-tabs/navigation.js +47 -0
  29. package/lib/client/right-tabs/page.js +178 -0
  30. package/lib/client/right-tabs/styles.js +11 -0
  31. package/lib/client/rpc.js +5 -0
  32. package/lib/client/semantic-reference.js +10 -0
  33. package/lib/client/workspace-header-action.js +14 -1
  34. package/lib/client/workspace-shortcuts.js +26 -0
  35. package/lib/client.js +365 -242
  36. package/lib/compatibility.js +1 -1
  37. package/lib/datasource/authoring.js +43 -4
  38. package/lib/datasource/bridge-programs.js +23 -20
  39. package/lib/datasource/bridge.js +46 -3
  40. package/lib/datasource/changes-contract.js +41 -0
  41. package/lib/datasource/changes.js +49 -0
  42. package/lib/datasource/configure.js +39 -0
  43. package/lib/datasource/defaults.js +25 -0
  44. package/lib/datasource/index.js +2 -1
  45. package/lib/datasource/python-options.js +21 -0
  46. package/lib/datasource/python.js +116 -25
  47. package/lib/datasource/rpc.js +75 -13
  48. package/lib/datasource/service.js +286 -11
  49. package/lib/datasource/test.js +2 -1
  50. package/lib/disclosure/activation.js +19 -7
  51. package/lib/disclosure/execution-guidance.js +52 -0
  52. package/lib/disclosure/help.js +4 -1
  53. package/lib/environment/runtime.js +35 -34
  54. package/lib/environment/workspace.js +18 -1
  55. package/lib/lifecycle.js +33 -0
  56. package/lib/plugin-agents.js +154 -0
  57. package/lib/plugin.js +94 -172
  58. package/lib/presentation/asset.js +34 -0
  59. package/lib/presentation/assets/portable.js +14 -14
  60. package/lib/presentation/assets/static.js +344 -73
  61. package/lib/presentation/build/index.js +3 -2
  62. package/lib/presentation/commit.js +19 -12
  63. package/lib/presentation/contracts/asset-path.js +9 -0
  64. package/lib/presentation/contracts/catalog.js +62 -0
  65. package/lib/presentation/contracts/charts.js +0 -23
  66. package/lib/presentation/contracts/index.js +17 -5
  67. package/lib/presentation/contracts/types.js +1 -1
  68. package/lib/presentation/delivery.js +45 -30
  69. package/lib/presentation/export-html.js +214 -0
  70. package/lib/presentation/files.js +4 -5
  71. package/lib/presentation/projection/index.js +2 -1
  72. package/lib/presentation/projection/program.js +2 -9
  73. package/lib/presentation/projection/sql-code.js +13 -13
  74. package/lib/presentation/reports.js +114 -17
  75. package/lib/presentation/rpc.js +96 -58
  76. package/lib/presentation/tool.js +6 -10
  77. package/lib/report-publishing/adapters.js +111 -0
  78. package/lib/report-publishing/config.js +69 -0
  79. package/lib/report-publishing/service.js +180 -0
  80. package/lib/rpc.js +49 -0
  81. package/lib/semantic-browser/contracts.js +17 -0
  82. package/lib/semantic-browser/program.js +10 -0
  83. package/lib/semantic-browser/service.js +40 -6
  84. package/lib/semantic-reference/bridge.js +10 -1
  85. package/lib/semantic-reference/contracts.js +20 -6
  86. package/lib/semantic-reference/environment.js +56 -0
  87. package/lib/semantic-reference/labels.js +16 -0
  88. package/lib/semantic-reference/rpc.js +39 -18
  89. package/lib/semantic-reference/search.js +5 -4
  90. package/lib/semantic-reference/usage.js +12 -3
  91. package/lib/tool-lifecycle.js +22 -0
  92. package/lib/types/client/credentials/changes.d.ts +9 -0
  93. package/lib/types/client/credentials/create-datasource.d.ts +3 -1
  94. package/lib/types/client/credentials/credential-draft.d.ts +14 -0
  95. package/lib/types/client/credentials/defaults.d.ts +2 -0
  96. package/lib/types/client/credentials/descriptions.d.ts +1 -0
  97. package/lib/types/client/credentials/install.d.ts +19 -1
  98. package/lib/types/client/credentials/model.d.ts +31 -11
  99. package/lib/types/client/credentials/report-publishing.d.ts +5 -0
  100. package/lib/types/client/credentials/styles.d.ts +1 -1
  101. package/lib/types/client/i18n/context.d.ts +17 -0
  102. package/lib/types/client/i18n/copy.d.ts +806 -0
  103. package/lib/types/client/i18n/credentials.d.ts +475 -0
  104. package/lib/types/client/i18n/host.d.ts +16 -0
  105. package/lib/types/client/i18n/navigation.d.ts +41 -0
  106. package/lib/types/client/i18n/presentation.d.ts +577 -0
  107. package/lib/types/client/i18n/python.d.ts +19 -0
  108. package/lib/types/client/i18n/semantic.d.ts +441 -0
  109. package/lib/types/client/input-context.d.ts +19 -0
  110. package/lib/types/client/presentation/ask-dsh.d.ts +4 -8
  111. package/lib/types/client/presentation/catalog-model.d.ts +24 -0
  112. package/lib/types/client/presentation/catalog.d.ts +20 -0
  113. package/lib/types/client/presentation/chart-tooltip.d.ts +2 -2
  114. package/lib/types/client/presentation/context-reference.d.ts +12 -0
  115. package/lib/types/client/presentation/copy-context.d.ts +2 -2
  116. package/lib/types/client/presentation/delivery-model.d.ts +27 -6
  117. package/lib/types/client/presentation/delivery.d.ts +8 -7
  118. package/lib/types/client/presentation/download.d.ts +2 -0
  119. package/lib/types/client/presentation/export-menu.d.ts +26 -0
  120. package/lib/types/client/presentation/export-view.d.ts +63 -0
  121. package/lib/types/client/presentation/host-entry.d.ts +8 -2
  122. package/lib/types/client/presentation/icons.d.ts +1 -1
  123. package/lib/types/client/presentation/model.d.ts +14 -15
  124. package/lib/types/client/presentation/reader.d.ts +15 -2
  125. package/lib/types/client/presentation/reference-source.d.ts +9 -0
  126. package/lib/types/client/presentation/source-code-model.d.ts +2 -1
  127. package/lib/types/client/presentation/source-code.d.ts +0 -5
  128. package/lib/types/client/presentation/source-dialog.d.ts +1 -2
  129. package/lib/types/client/presentation/sources.d.ts +5 -5
  130. package/lib/types/client/presentation/styles.d.ts +1 -1
  131. package/lib/types/client/presentation/table.d.ts +5 -1
  132. package/lib/types/client/python-tool/card.d.ts +2 -0
  133. package/lib/types/client/python-tool/execution-error.d.ts +3 -0
  134. package/lib/types/client/python-tool/install.d.ts +2 -0
  135. package/lib/types/client/python-tool/model.d.ts +20 -0
  136. package/lib/types/client/right-tabs/install.d.ts +18 -0
  137. package/lib/types/client/right-tabs/live-delivery.d.ts +8 -0
  138. package/lib/types/client/right-tabs/navigation.d.ts +17 -0
  139. package/lib/types/client/right-tabs/page.d.ts +36 -0
  140. package/lib/types/client/right-tabs/styles.d.ts +2 -0
  141. package/lib/types/client/rpc.d.ts +3 -0
  142. package/lib/types/client/semantic-reference.d.ts +4 -0
  143. package/lib/types/client/workspace-header-action.d.ts +1 -1
  144. package/lib/types/client/workspace-shortcuts.d.ts +15 -0
  145. package/lib/types/client.d.ts +6 -3
  146. package/lib/types/compatibility.d.ts +1 -1
  147. package/lib/types/datasource/authoring.d.ts +10 -0
  148. package/lib/types/datasource/bridge.d.ts +23 -2
  149. package/lib/types/datasource/changes-contract.d.ts +18 -0
  150. package/lib/types/datasource/changes.d.ts +15 -0
  151. package/lib/types/datasource/configure.d.ts +7 -0
  152. package/lib/types/datasource/defaults.d.ts +7 -0
  153. package/lib/types/datasource/index.d.ts +6 -1
  154. package/lib/types/datasource/python-options.d.ts +9 -0
  155. package/lib/types/datasource/python.d.ts +17 -2
  156. package/lib/types/datasource/rpc.d.ts +2 -1
  157. package/lib/types/datasource/service.d.ts +48 -5
  158. package/lib/types/datasource/test.d.ts +1 -1
  159. package/lib/types/disclosure/activation.d.ts +2 -1
  160. package/lib/types/disclosure/execution-guidance.d.ts +6 -0
  161. package/lib/types/disclosure/help.d.ts +1 -1
  162. package/lib/types/environment/types.d.ts +2 -1
  163. package/lib/types/environment/workspace.d.ts +1 -0
  164. package/lib/types/lifecycle.d.ts +8 -0
  165. package/lib/types/plugin-agents.d.ts +27 -0
  166. package/lib/types/plugin.d.ts +12 -28
  167. package/lib/types/presentation/asset.d.ts +6 -0
  168. package/lib/types/presentation/build/index.d.ts +7 -2
  169. package/lib/types/presentation/commit.d.ts +1 -1
  170. package/lib/types/presentation/contracts/asset-path.d.ts +2 -0
  171. package/lib/types/presentation/contracts/catalog.d.ts +27 -0
  172. package/lib/types/presentation/contracts/charts.d.ts +0 -2
  173. package/lib/types/presentation/contracts/types.d.ts +7 -4
  174. package/lib/types/presentation/delivery.d.ts +1 -1
  175. package/lib/types/presentation/export-html.d.ts +13 -0
  176. package/lib/types/presentation/reports.d.ts +6 -1
  177. package/lib/types/presentation/rpc.d.ts +3 -2
  178. package/lib/types/presentation/tool.d.ts +2 -2
  179. package/lib/types/report-publishing/adapters.d.ts +6 -0
  180. package/lib/types/report-publishing/config.d.ts +22 -0
  181. package/lib/types/report-publishing/service.d.ts +68 -0
  182. package/lib/types/rpc.d.ts +3 -0
  183. package/lib/types/semantic-browser/contracts.d.ts +7 -0
  184. package/lib/types/semantic-browser/service.d.ts +7 -1
  185. package/lib/types/semantic-reference/bridge.d.ts +1 -0
  186. package/lib/types/semantic-reference/contracts.d.ts +5 -2
  187. package/lib/types/semantic-reference/environment.d.ts +22 -0
  188. package/lib/types/semantic-reference/labels.d.ts +16 -0
  189. package/lib/types/semantic-reference/rpc.d.ts +1 -1
  190. package/lib/types/semantic-reference/search.d.ts +1 -1
  191. package/lib/types/tool-lifecycle.d.ts +4 -0
  192. package/lib/types/workspace-identity.d.ts +6 -0
  193. package/lib/workspace-identity.js +9 -0
  194. package/package.json +83 -61
  195. package/python/presentation-kit/dist/dsh_data_analysis_presentation_kit-1.1.0-py3-none-any.whl +0 -0
  196. package/skills/dsh-data-analysis-files/SKILL.md +32 -0
  197. package/skills/dsh-data-analysis-files/references/examples.md +93 -0
  198. package/skills/dsh-data-analysis-presentation/SKILL.md +10 -6
  199. package/skills/dsh-data-analysis-presentation/references/examples/artifact.draft.json +13 -4
  200. package/skills/dsh-data-analysis-presentation/references/examples/charts.draft.json +3 -2
  201. package/skills/dsh-data-analysis-presentation/references/examples/comparison.draft.json +3 -2
  202. package/skills/dsh-data-analysis-presentation/references/examples/computed-sources.draft.json +12 -5
  203. package/skills/dsh-data-analysis-presentation/references/examples/computed.draft.json +3 -2
  204. package/skills/dsh-data-analysis-presentation/references/examples/interaction.draft.json +3 -2
  205. package/skills/dsh-data-analysis-presentation/references/examples/source-only.draft.json +12 -4
  206. package/skills/dsh-data-analysis-presentation/references/examples.md +3 -1
  207. package/skills/dsh-data-analysis-presentation/references/export-html.md +7 -0
  208. package/skills/dsh-data-analysis-presentation/references/interaction.md +1 -1
  209. package/skills/dsh-data-analysis-presentation/references/narrative.md +1 -1
  210. package/skills/dsh-data-analysis-presentation/references/publishing.md +3 -0
  211. package/skills/dsh-data-analysis-presentation/references/schema.md +25 -1
  212. package/lib/types/client/presentation/install.d.ts +0 -15
@@ -1,4 +1,5 @@
1
- import type { ChatConversationViewNode, ConversationNodeContext } from '@deepseek-ai/dsh-client-runtime/client';
1
+ import type { ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ import type { ConversationNodeContext } from '@deepseek-ai/dsh-client-ui-conversation/client';
2
3
  import { type PresentationDelivery } from '../../presentation/receipt.ts';
3
4
  export declare const PRESENTATION_TURN_DATA_KEY = "marivo-presentation-delivery";
4
5
  export interface PresentationTurnDelivery {
@@ -12,12 +13,12 @@ interface PresentationTurnState extends PresentationTurnData {
12
13
  readonly turn: number;
13
14
  readonly calls: ReadonlyMap<string, string>;
14
15
  }
15
- declare module '@deepseek-ai/dsh-client-runtime/client' {
16
+ declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
16
17
  interface ConversationTurnDataMap {
17
18
  'marivo-presentation-delivery': PresentationTurnData;
18
19
  }
19
20
  }
20
- declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
21
+ declare module '@deepseek-ai/dsh-client-ui-chat/client' {
21
22
  interface ChatNodeDataMap {
22
23
  'marivo-presentation-delivery': PresentationTurnData;
23
24
  }
@@ -32,7 +33,7 @@ export declare const marivoPresentationDeliveryDefinition: {
32
33
  target: string;
33
34
  match(value: unknown): {
34
35
  id: string;
35
- role: "start" | "update";
36
+ role: "update" | "start";
36
37
  } | null;
37
38
  start(_context: unknown, match: {
38
39
  event: any;
@@ -60,11 +61,11 @@ export declare const marivoPresentationDeliveryDefinition: {
60
61
  anchorSeq: number;
61
62
  location: {
62
63
  readonly kind: "turn";
63
- readonly turn: import("@deepseek-ai/dsh-client-runtime/client").TurnLocation;
64
+ readonly turn: import("@deepseek-ai/dsh-client-ui-conversation/client").TurnLocation;
64
65
  } | {
65
66
  readonly kind: "step";
66
- readonly turn: import("@deepseek-ai/dsh-client-runtime/client").TurnLocation;
67
- readonly step: import("@deepseek-ai/dsh-client-runtime/client").StepLocation;
67
+ readonly turn: import("@deepseek-ai/dsh-client-ui-conversation/client").TurnLocation;
68
+ readonly step: import("@deepseek-ai/dsh-client-ui-conversation/client").StepLocation;
68
69
  };
69
70
  visibility: "visible";
70
71
  data: Readonly<{
@@ -0,0 +1,2 @@
1
+ /** Download bytes as an attachment without inserting generated HTML into the reader. */
2
+ export declare function savePresentationHtml(bytes: Uint8Array, filename: string): void;
@@ -0,0 +1,26 @@
1
+ export interface ReaderExportActions {
2
+ downloadFullReport: () => void;
3
+ publishing?: {
4
+ name: string;
5
+ publish: () => void;
6
+ publishView: (bytes: Uint8Array) => Promise<void>;
7
+ };
8
+ publishingUnavailable?: boolean;
9
+ publishingLoading?: boolean;
10
+ disabled?: boolean;
11
+ downloading?: boolean;
12
+ report?: {
13
+ version: string;
14
+ refresh: () => void;
15
+ edit: () => void;
16
+ history: () => void;
17
+ historical?: boolean;
18
+ historyLoading?: boolean;
19
+ busy?: boolean;
20
+ };
21
+ }
22
+ export declare function ExportMenu({ actions, editing, onExport, }: {
23
+ actions: ReaderExportActions;
24
+ editing: boolean;
25
+ onExport: () => void;
26
+ }): import("react").JSX.Element;
@@ -0,0 +1,63 @@
1
+ import type { PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import { type ChartExploration } from './chart-view.ts';
3
+ export interface TableSort {
4
+ columnId: string;
5
+ direction: 'ascending' | 'descending';
6
+ }
7
+ export interface CurrentViewState {
8
+ selection: Record<string, string>;
9
+ explorations: Record<string, ChartExploration>;
10
+ tableSorts: Record<string, TableSort | undefined>;
11
+ }
12
+ /** Resolve only existing rows. Sorting never changes values or precomputed chart semantics. */
13
+ export declare function currentViewBlocks(document: PresentationDocument, state: CurrentViewState): ({
14
+ block: {
15
+ id: string;
16
+ kind: "markdown";
17
+ text: string;
18
+ } | {
19
+ id: string;
20
+ kind: "source";
21
+ sourceIds: string[];
22
+ };
23
+ dataset?: undefined;
24
+ rowIndices?: undefined;
25
+ sort?: undefined;
26
+ } | {
27
+ block: ({
28
+ id: string;
29
+ kind: "metric";
30
+ datasetId: string;
31
+ columnId: string;
32
+ label: string;
33
+ description?: string;
34
+ comparisons?: import("../../presentation/contracts/types.ts").MetricComparison[];
35
+ } & {
36
+ rowIndex: number;
37
+ rowSelection?: never;
38
+ }) | ({
39
+ id: string;
40
+ kind: "metric";
41
+ datasetId: string;
42
+ columnId: string;
43
+ label: string;
44
+ description?: string;
45
+ comparisons?: import("../../presentation/contracts/types.ts").MetricComparison[];
46
+ } & {
47
+ rowSelection: "slice";
48
+ rowIndex?: never;
49
+ }) | {
50
+ id: string;
51
+ kind: "table";
52
+ datasetId: string;
53
+ columns?: string[];
54
+ } | import("./model.ts").ChartBlock;
55
+ dataset: import("../../presentation/contracts/types.ts").DocumentDataset;
56
+ rowIndices: number[];
57
+ sort: TableSort | undefined;
58
+ })[];
59
+ /** Freeze rendered SVGs synchronously; no query, saved-document rewrite or hidden dataset payload. */
60
+ export declare function exportCurrentView(root: HTMLElement, document: PresentationDocument, state: CurrentViewState, exportedAt?: string): {
61
+ bytes: Uint8Array<ArrayBuffer>;
62
+ filename: string;
63
+ };
@@ -1,12 +1,18 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { PresentationDocument } from '../../presentation/contracts/types.ts';
3
+ import type { PresentationContext } from './context-reference.ts';
3
4
  import type { ReaderEditing } from './editor-controls.tsx';
5
+ import type { ReaderExportActions } from './export-menu.tsx';
6
+ import { type ReaderViewMemory } from './reader.tsx';
4
7
  import type { OpenSemanticRef } from './source-facts.ts';
5
8
  /** Host integrations supply only outer actions; document interpretation stays shared. */
6
- export declare function HostPresentationReader({ document, actions, editing, onOpenSemanticRef, onAskDsh, }: {
9
+ export declare function HostPresentationReader({ document, actions, editing, onOpenSemanticRef, onAskDsh, exportActions, viewMemory, closeSourceOnNavigate, }: {
7
10
  document: PresentationDocument;
8
11
  editing?: ReaderEditing;
9
12
  actions?: ReactNode;
10
13
  onOpenSemanticRef?: OpenSemanticRef;
11
- onAskDsh?: (context: string) => void;
14
+ onAskDsh?: (context: PresentationContext) => void;
15
+ exportActions?: ReaderExportActions;
16
+ viewMemory?: ReaderViewMemory;
17
+ closeSourceOnNavigate?: boolean;
12
18
  }): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
1
  import type { SVGProps } from 'react';
2
- export declare function CopyIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
3
2
  export declare function MoreIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
3
+ export declare function ExportIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
4
4
  export declare function CloseIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
@@ -1,6 +1,5 @@
1
- import { type ChartView } from '../../presentation/contracts/charts.ts';
2
- import type { Cell, DatasetColumn, DocumentDataset, PresentationBlock, PresentationDocument, SourceSnapshot, TypedDataset } from '../../presentation/contracts/types.ts';
3
- import type { ChartExploration } from './chart-view.ts';
1
+ import type { ChartView } from '../../presentation/contracts/charts.ts';
2
+ import type { Cell, DatasetColumn, DocumentDataset, PresentationBlock, PresentationDocument, PresentationLocale, SourceSnapshot, TypedDataset } from '../../presentation/contracts/types.ts';
4
3
  export type ReaderMode = 'interactive' | 'static';
5
4
  export type ChartBlock = Extract<PresentationBlock, {
6
5
  kind: 'chart';
@@ -9,19 +8,19 @@ export type MetricBlock = Extract<PresentationBlock, {
9
8
  kind: 'metric';
10
9
  }>;
11
10
  export declare const TABLE_PAGE_SIZE = 20;
12
- export declare function cellText(value: Cell, column: DatasetColumn): string;
13
- export declare function valueWithUnit(value: Cell, column: DatasetColumn): string;
14
- /** Add grouping separators only; never round, rescale, or convert exact decimal text. */
15
- export declare function metricText(value: Cell, column: DatasetColumn): string;
11
+ export declare function cellText(locale: PresentationLocale, value: Cell, column: DatasetColumn): string;
12
+ export declare function valueWithUnit(locale: PresentationLocale, value: Cell, column: DatasetColumn): string;
13
+ /** Round floating KPI values for display; preserve exact decimal and integer text. */
14
+ export declare function metricText(locale: PresentationLocale, value: Cell, column: DatasetColumn): string;
16
15
  /** A stable explicit timezone keeps portable and Host metadata equally readable. */
17
- export declare function snapshotDate(value: string): string;
16
+ export declare function snapshotDate(locale: PresentationLocale, value: string): string;
18
17
  export declare function columnLabel(column: DatasetColumn): string;
19
18
  /** Axis labels are compact coordinates; tooltips and tables retain exact source text. */
20
- export declare function formatAxisTick(value: number): string;
19
+ export declare function formatAxisTick(locale: PresentationLocale, value: number): string;
21
20
  export declare function formatCategoryTick(value: string): string;
22
21
  export declare function datasetById(document: PresentationDocument, id: string): DocumentDataset;
23
22
  export declare function columnIndex(dataset: TypedDataset, id: string): number;
24
- export declare function selectMetric(dataset: TypedDataset, block: MetricBlock, rowIndices?: readonly number[]): {
23
+ export declare function selectMetric(locale: PresentationLocale, dataset: TypedDataset, block: MetricBlock, rowIndices?: readonly number[]): {
25
24
  column: DatasetColumn;
26
25
  value: string | number | boolean;
27
26
  comparisons: {
@@ -46,17 +45,17 @@ export declare function selectMetric(dataset: TypedDataset, block: MetricBlock,
46
45
  }[];
47
46
  };
48
47
  export declare function compareDecimalText(first: string, second: string): number;
49
- export declare function sortedRowIndices(dataset: TypedDataset, sort?: {
48
+ export declare function sortedRowIndices(locale: PresentationLocale, dataset: TypedDataset, sort?: {
50
49
  columnId: string;
51
50
  direction: 'ascending' | 'descending';
52
51
  }): number[];
53
- export declare function datasetScope(dataset: TypedDataset): string;
52
+ export declare function datasetScope(locale: PresentationLocale, dataset: TypedDataset): string;
54
53
  export interface ChartRow {
55
54
  rowIndex: number;
56
55
  xLabel: string;
57
56
  [key: string]: number | string | null;
58
57
  }
59
- export declare function chartRows(dataset: TypedDataset, block: ChartView, rowIndices?: readonly number[]): ChartRow[];
60
- export declare function chartTitle(dataset: TypedDataset, block: ChartView): string;
58
+ export declare function chartRows(locale: PresentationLocale, dataset: TypedDataset, block: ChartView, rowIndices?: readonly number[]): ChartRow[];
59
+ export declare function chartTitle(locale: PresentationLocale, dataset: TypedDataset, block: ChartView): string;
61
60
  export declare function selectedSources(document: PresentationDocument, ids: string[]): SourceSnapshot[];
62
- export declare function followUpContext(document: PresentationDocument, savedBlock: PresentationBlock, exploration?: ChartExploration, selection?: Record<string, string>): string;
61
+ export { followUpContext } from './context-reference.ts';
@@ -1,11 +1,24 @@
1
1
  import type { PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import { type ChartExploration } from './chart-view.ts';
3
+ import { type PresentationContext } from './context-reference.ts';
2
4
  import { type ReaderEditing } from './editor-controls.tsx';
5
+ import { type ReaderExportActions } from './export-menu.tsx';
6
+ import { type TableSort } from './export-view.ts';
3
7
  import { type ReaderMode } from './model.ts';
4
8
  import type { OpenSemanticRef } from './source-facts.ts';
5
- export declare function PresentationReader({ document, mode, editing, onOpenSemanticRef, onAskDsh, }: {
9
+ export interface ReaderViewState {
10
+ chosen: Record<string, string>;
11
+ tableSorts: Record<string, TableSort | undefined>;
12
+ explorations: Record<string, ChartExploration>;
13
+ }
14
+ export type ReaderViewMemory = Map<string, ReaderViewState>;
15
+ export declare function PresentationReader({ document, mode, editing, onOpenSemanticRef, onAskDsh, exportActions, viewMemory, closeSourceOnNavigate, }: {
6
16
  document: PresentationDocument;
7
17
  mode?: ReaderMode;
8
18
  editing?: ReaderEditing;
9
19
  onOpenSemanticRef?: OpenSemanticRef;
10
- onAskDsh?: (context: string) => void;
20
+ onAskDsh?: (context: PresentationContext) => void;
21
+ exportActions?: ReaderExportActions;
22
+ viewMemory?: ReaderViewMemory;
23
+ closeSourceOnNavigate?: boolean;
11
24
  }): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { ReferenceInsert } from '@deepseek-ai/dsh-client-ui-conversation/client';
3
+ import type { InputTriggerSource } from '@deepseek-ai/dsh-client-ui-input-trigger/client';
4
+ import { type InputContextHost } from '../input-context.ts';
5
+ import { type PresentationContext } from './context-reference.ts';
6
+ export declare const PRESENTATION_REFERENCE_SOURCE = "marivo-report-cell";
7
+ export declare function presentationReference(sessionId: string, workspaceId: string, payload: PresentationContext, append: boolean): ReferenceInsert;
8
+ export declare function createPresentationReferenceSource(host: InputContextHost, lifetime?: AbortSignal): InputTriggerSource;
9
+ export declare function installPresentationReferenceSource(ctx: Context & InputContextHost): void;
@@ -1,4 +1,5 @@
1
1
  import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import { type Notice } from './../i18n/copy.ts';
2
3
  export type SourceTab = 'overview' | 'preview' | 'code';
3
4
  export declare function sourceTabs(hasDataset: boolean): SourceTab[];
4
5
  export declare function sourceTabForKey(tabs: readonly SourceTab[], current: SourceTab, key: string): SourceTab | undefined;
@@ -11,6 +12,6 @@ interface CodeEntry {
11
12
  /** Read only the selected cell binding; prepared views are separate, unselected bindings. */
12
13
  export declare function sourceCodeFacts(document: PresentationDocument, block?: PresentationBlock): {
13
14
  entries: CodeEntry[];
14
- notices: string[];
15
+ notices: Notice[];
15
16
  };
16
17
  export {};
@@ -4,8 +4,3 @@ export declare function SourceCode({ document, block, interactive, }: {
4
4
  block?: PresentationBlock;
5
5
  interactive?: boolean;
6
6
  }): import("react").JSX.Element;
7
- /** Native disclosures remain usable in saved HTML with JavaScript disabled. */
8
- export declare function SourceCodeSummary({ document, block, }: {
9
- document: PresentationDocument;
10
- block?: PresentationBlock;
11
- }): import("react").JSX.Element | import("react").JSX.Element[];
@@ -1,6 +1,6 @@
1
1
  import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
2
  import type { OpenSemanticRef } from './source-facts.ts';
3
- export declare function SourceDialog({ document, block, onClose, restoreFocusTo, rowIndices, filterKey, filterSummary, explored, onOpenSemanticRef, }: {
3
+ export declare function SourceDialog({ document, block, onClose, restoreFocusTo, rowIndices, filterKey, filterSummary, onOpenSemanticRef, }: {
4
4
  document: PresentationDocument;
5
5
  block: PresentationBlock;
6
6
  onClose: () => void;
@@ -8,6 +8,5 @@ export declare function SourceDialog({ document, block, onClose, restoreFocusTo,
8
8
  rowIndices?: readonly number[];
9
9
  filterKey?: string;
10
10
  filterSummary?: string;
11
- explored?: boolean;
12
11
  onOpenSemanticRef?: OpenSemanticRef;
13
12
  }): import("react").JSX.Element;
@@ -1,13 +1,13 @@
1
1
  import type { PresentationBlock, PresentationDocument, SourceSnapshot } from '../../presentation/contracts/types.ts';
2
2
  import { type OpenSemanticRef } from './source-facts.ts';
3
3
  export declare function blockSources(document: PresentationDocument, block?: PresentationBlock): SourceSnapshot[];
4
+ /** Reading summary; saved timestamps remain in the source dialog. */
5
+ export declare function SourceList({ document, block, }: {
6
+ document: PresentationDocument;
7
+ block: PresentationBlock;
8
+ }): import("react").JSX.Element;
4
9
  export declare function SourceOverview({ document, block, onOpenSemanticRef, }: {
5
10
  document: PresentationDocument;
6
11
  block?: PresentationBlock;
7
12
  onOpenSemanticRef?: OpenSemanticRef;
8
13
  }): import("react").JSX.Element;
9
- /** Compact native disclosure for reading the saved report without JavaScript. */
10
- export declare function SourceSummary({ document, block, }: {
11
- document: PresentationDocument;
12
- block?: PresentationBlock;
13
- }): import("react").JSX.Element | null;
@@ -1 +1 @@
1
- export declare const PRESENTATION_STYLES = "\n.pr-reader {\n --pr-bg:#fff; --pr-soft:#f7f7f8; --pr-text:#242424; --pr-muted:#666;\n --pr-code-keyword:#8a3294; --pr-code-string:#216b43; --pr-code-number:#995119; --pr-code-function:#285d9e;\n --pr-border:#e5e5e7; --pr-accent:#3567b7; --pr-warning:#805b20;\n --pr-chart-1:#286dee; --pr-chart-2:#ba7039; --pr-chart-3:#548878;\n --pr-chart-muted:#96969b; --pr-chart-grid:rgba(13,13,13,.06); --pr-chart-hover:rgba(13,13,13,.03); --pr-chart-4:#8d6cb0; --pr-chart-5:#b46379; --pr-chart-6:#727c38;\n box-sizing:border-box; margin:0 auto; padding:48px clamp(20px,4%,64px); width:100%; max-width:none; min-width:0;\n color:var(--pr-text); background:var(--pr-bg); font:16px/1.65 system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;\n overflow-wrap:anywhere; color-scheme:light;\n}\n.pr-reader * { box-sizing:border-box }\n.pr-reader h1,.pr-reader h2,.pr-reader h3,.pr-reader h4 { line-height:1.4; font-weight:600; text-wrap:balance }\n.pr-reader h1 { font-size:30px; margin:0 0 12px; letter-spacing:-.025em }\n.pr-reader h2 { font-size:21px; margin:0 0 16px }\n.pr-reader h3 { font-size:17px; margin:0 0 12px }\n.pr-reader p { margin:10px 0 }\n.pr-reader button,.pr-reader select,.pr-reader textarea { font:inherit; color:inherit }\n.pr-reader button,.pr-reader select { border:1px solid var(--pr-border); border-radius:8px; background:var(--pr-bg); padding:6px 10px; max-width:100% }\n.pr-reader button { cursor:pointer }\n.pr-reader button:hover { background:var(--pr-soft) }\n.pr-reader button:disabled { opacity:.45; cursor:default }\n.pr-reader :focus-visible { outline:3px solid var(--pr-accent); outline-offset:3px }\n.pr-reader a { color:var(--pr-accent); text-decoration:underline; text-underline-offset:3px }\n.pr-reader summary { cursor:pointer; color:var(--pr-muted); padding:8px 0; font-size:13px }\n.pr-reader summary:hover { color:var(--pr-text) }\n.pr-reader details[open]>summary { margin-bottom:8px }\n.pr-muted { color:var(--pr-muted); font-size:13px }\n.pr-header { padding-bottom:28px; margin-bottom:32px; border-bottom:1px solid var(--pr-border) }\n.pr-blocks { display:flex; flex-direction:column; gap:32px }\n.pr-block { min-width:0; position:relative }\n.pr-block-markdown { padding:0; width:100% }\n.pr-block-chart { padding:0; border:0; border-radius:0 }\n.pr-block-chart>h2 { font-size:17px }\n.pr-chart-row { display:flex; flex-direction:column; gap:32px; min-width:0 }\n.pr-chart-row>.pr-block-chart { width:100% }\n.pr-reader[data-mode=interactive] .pr-chart-row { flex-direction:row; flex-wrap:wrap; align-items:flex-start }\n.pr-reader[data-mode=interactive] .pr-chart-row>.pr-block-chart { flex:1 1 calc((100% - 32px)/2); min-width:min(100%,560px); max-width:100% }\n.pr-reader[data-mode=interactive] .pr-chart-row>.pr-block-chart[data-chart-layout=wide] { min-width:min(100%,720px) }\n.pr-metric-group { display:flex; flex-wrap:wrap; gap:16px; min-width:0 }\n.pr-metric-group>.pr-block-metric { flex:1 1 240px; min-width:min(100%,240px); max-width:min(100%,480px) }\n.pr-block-metric { border:1px solid var(--pr-border); border-radius:14px; padding:20px; display:flex; flex-direction:column; gap:4px }\n.pr-block-metric h2 { font-size:13px; font-weight:500; color:var(--pr-muted); margin:0 }\n.pr-metric-value { font-size:clamp(24px,3vw,32px); font-variant-numeric:tabular-nums; font-weight:600; line-height:1.35; letter-spacing:-.025em }\n.pr-metric-value { white-space:nowrap; overflow-x:auto; max-width:100% }\n.pr-metric-comparisons { display:grid; gap:12px; margin-top:auto; padding-top:12px }\n.pr-metric-comparison { display:flex; flex-wrap:wrap; gap:4px 10px; border-top:1px solid var(--pr-border); padding-top:10px; font-size:13px; font-variant-numeric:tabular-nums }\n.pr-metric-comparison>.pr-muted { flex-basis:100% }\n.pr-metric-change { display:flex; flex-wrap:wrap; gap:4px 8px }\n.pr-metric-change-positive { color:#167044 }\n.pr-metric-change-negative { color:#b42318 }\n.pr-metric-change-neutral { color:var(--pr-muted) }\n.pr-notice { color:var(--pr-warning); font-size:13px; border-left:2px solid currentColor; padding-left:12px }\n.pr-empty { padding:24px; text-align:center; color:var(--pr-muted); background:var(--pr-soft); border-radius:8px }\n.pr-markdown p { white-space:pre-wrap }\n.pr-markdown pre { max-width:100%; overflow:auto; background:var(--pr-soft); padding:16px; border-radius:8px; font:13px/1.65 ui-monospace,monospace }\n.pr-markdown code { font-family:ui-monospace,monospace; font-size:.9em; background:var(--pr-soft); padding:2px 4px; border-radius:3px }\n.pr-markdown pre code { padding:0 }\n.pr-markdown blockquote { border-left:3px solid var(--pr-border); padding-left:18px; margin:16px 0; color:var(--pr-muted) }\n.pr-markdown hr { border:0; border-top:1px solid var(--pr-border); margin:24px 0 }\n.pr-markdown ul,.pr-markdown ol { padding-left:24px }\n.pr-markdown li+li { margin-top:6px }\n.pr-table-scroll { max-width:100%; overflow:auto }\n.pr-table table { border-collapse:collapse; min-width:100%; font-size:13px }\n.pr-table caption { text-align:left; font-size:12px; color:var(--pr-muted); padding:8px 12px }\n.pr-table th,.pr-table td { padding:12px; text-align:left; border-bottom:1px solid var(--pr-border); vertical-align:top; white-space:pre-wrap; overflow-wrap:anywhere; min-width:90px; max-width:400px }\n.pr-table th { font-weight:500; color:var(--pr-muted) }\n.pr-table th button { position:relative; font-weight:500; padding:0; text-align:inherit; border:0; background:transparent; border-radius:0 }\n.pr-table th.pr-numeric { text-align:right }\n.pr-sort-indicator { position:absolute; left:calc(100% + 3px); top:0; font-size:11px; line-height:inherit }\n.pr-table tbody tr:hover { background:var(--pr-soft) }\n.pr-table td.pr-numeric { text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap }\n.pr-table td[data-cell-null=true] { color:var(--pr-muted) }\n.pr-pagination { display:flex; gap:12px; align-items:center; justify-content:flex-end; flex-wrap:wrap; margin-top:12px; font-size:12px }\n.pr-diagnostics { margin:0 0 28px; padding:16px; background:var(--pr-soft); border-radius:10px; font-size:13px }\n.pr-diagnostics h2 { font-size:14px; margin:0 }\n.pr-diagnostics ul { padding-left:20px }\n.pr-legend { display:flex; flex-wrap:wrap; gap:8px 16px; margin:8px 0 0; justify-content:center }\n.pr-legend button { display:flex; align-items:center; gap:7px; font-size:12px; border:0; padding:4px 0; background:transparent }\n.pr-legend button[aria-pressed=false] { opacity:.5; text-decoration:line-through }\n.pr-swatch { display:inline-block; width:9px; height:9px; border-radius:50%; flex-shrink:0 }\n.pr-chart { margin:0; width:100%; min-width:0; height:320px }\n.pr-chart svg { overflow:visible }\n.pr-chart-group+.pr-chart-group { margin-top:24px }\n.pr-chart .recharts-cartesian-axis-tick-value { font-variant-numeric:tabular-nums }\n.pr-tooltip { padding:10px 13px; border:1px solid var(--pr-border); border-radius:10px; background:var(--pr-bg); color:var(--pr-text); font-size:12px; box-shadow:0 4px 18px #0001; max-width:min(420px,80vw) }\n.pr-tooltip dl { margin:5px 0 0 }\n.pr-tooltip dl>div { display:flex; flex-wrap:wrap; justify-content:space-between; gap:6px 20px }\n.pr-tooltip dt { color:var(--pr-muted) }\n.pr-tooltip dd { margin:0; font-variant-numeric:tabular-nums; overflow-wrap:anywhere }\n\n.pr-cell-toolbar { position:absolute; top:0; right:0; display:flex; align-items:center; gap:4px; z-index:2 }\n.pr-block-metric>.pr-cell-toolbar { top:12px; right:12px }\n.pr-block-metric>h2,.pr-block-chart>h2 { padding-right:32px }\n.pr-block-markdown .pr-markdown>:first-child { padding-right:40px }\n.pr-reader[data-mode=interactive] .pr-block-table { padding-top:30px }\n.pr-block-source>h2 { padding-right:40px }\n.pr-reader .pr-icon-button { display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; padding:5px; border:0; background:transparent; color:var(--pr-muted); border-radius:6px; flex-shrink:0 }\n.pr-reader .pr-icon-button:hover { background:var(--pr-soft); color:var(--pr-text) }\n.pr-icon-button svg { width:18px; height:18px; display:block }\n.pr-copy,.pr-cell-menu { position:relative; display:inline-flex; align-items:center }\n.pr-copy-status { position:absolute; right:0; top:calc(100% + 4px); white-space:nowrap; font-size:12px; background:var(--pr-bg); color:var(--pr-text); border-radius:5px }\n.pr-copy-status:not(:empty) { padding:4px 8px; border:1px solid var(--pr-border); box-shadow:0 2px 8px #0001 }\n.pr-cell-menu-popup { position:absolute; right:0; top:calc(100% + 4px); min-width:136px; padding:4px; background:var(--pr-bg); border:1px solid var(--pr-border); border-radius:10px; box-shadow:0 6px 24px #0002; z-index:3 }\n.pr-cell-menu-popup>button { display:block; width:100%; border:0; border-radius:6px; text-align:left; font-size:13px; padding:8px 12px; white-space:nowrap }\n.pr-cell-menu-popup>button[aria-disabled=true] { color:var(--pr-muted); cursor:not-allowed }\n.pr-cell-menu-popup>button small { display:block; font-size:12px; font-weight:normal }\n.pr-source-dialog,.pr-dialog { color:var(--pr-text); background:var(--pr-bg); border:1px solid var(--pr-border); border-radius:24px; width:min(800px,calc(100vw - 48px)); max-width:none; max-height:min(760px,calc(100dvh - 48px)); margin:auto; padding:0; box-shadow:0 18px 70px #0003; font:14px/1.6 system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif; overflow:hidden }\n.pr-source-dialog[open],.pr-dialog[open] { display:flex; flex-direction:column }\n.pr-source-dialog-shell { display:flex; flex-direction:column; min-height:0; width:100% }\n.pr-reader .pr-source-dialog-context { font-size:13px; color:var(--pr-muted); margin:4px 0 0 }\n.pr-source-dialog::backdrop,.pr-dialog::backdrop { background:#0005 }\n.pr-source-dialog-header,.pr-dialog-header { display:flex; justify-content:space-between; align-items:center; gap:16px; padding:20px 24px 4px; flex-shrink:0 }\n.pr-source-dialog .pr-source-dialog-title,.pr-dialog-header h2 { font-size:24px; font-weight:500; margin:0 }\n.pr-reader .pr-source-dialog-close { width:32px; height:32px; border:0; padding:6px; background:transparent; color:var(--pr-muted); flex-shrink:0 }\n.pr-source-dialog-close svg { width:18px; height:18px }\n.pr-source-tabs { display:flex; gap:28px; padding:0 24px; border-bottom:1px solid var(--pr-border); flex-shrink:0 }\n.pr-reader .pr-source-tab { padding:14px 0; border:0; border-bottom:2px solid transparent; border-radius:0; background:transparent; color:var(--pr-muted); font-size:14px }\n.pr-reader .pr-source-tab[aria-selected=true] { color:var(--pr-text); border-bottom-color:var(--pr-text) }\n.pr-source-dialog-body { padding:20px 24px 24px; overflow:auto; min-height:0; overscroll-behavior:contain }\n.pr-source-overview { font-size:14px; min-width:0 }\n.pr-source-overview-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:20px 24px; margin:0 0 24px }\n.pr-source-overview-grid>div { min-width:0 }\n.pr-source-overview-grid dt { color:var(--pr-muted); font-size:13px; margin:0 0 4px }\n.pr-source-overview-label { color:var(--pr-muted); font-size:13px; font-weight:400; margin:0 0 4px }\n.pr-source-overview dd { margin:0; overflow-wrap:anywhere }\n.pr-source-fields { display:flex; flex-wrap:wrap; gap:4px 10px; list-style:none; padding:0; margin:0 }\n.pr-source-list { display:flex; flex-direction:column; gap:24px }\n.pr-source-card { min-width:0 }\n.pr-source-card+.pr-source-card { border-top:1px solid var(--pr-border); padding-top:20px }\n.pr-source-card h3 { font-size:14px; margin:0 0 12px; font-weight:500 }\n.pr-source-semantic-group { margin-top:16px }\n.pr-source-semantic-list { display:flex; flex-wrap:wrap; gap:6px; list-style:none; padding:0; margin:4px 0 16px }\n.pr-source-semantic-list>li { border:1px solid var(--pr-border); border-radius:14px; padding:2px 8px; overflow-wrap:anywhere; max-width:100%; font-size:13px }\n.pr-reader .pr-semantic-link { font:inherit; color:var(--pr-accent); background:none; border:0; padding:0; cursor:pointer; text-align:left; overflow-wrap:anywhere; text-decoration:underline; text-underline-offset:3px }\n.pr-reader .pr-semantic-link:focus-visible { outline:2px solid var(--pr-accent); outline-offset:3px; border-radius:3px }\n.pr-source-issues { margin:12px 0 0; color:var(--pr-warning); font-size:13px }\n.pr-source-summary { margin-top:32px; padding-top:16px; border-top:1px solid var(--pr-border) }\n.pr-source-summary>summary { font-size:14px }\n.pr-source-code { display:flex; flex-direction:column; gap:20px; min-width:0 }\n.pr-source-code-snippet { min-width:0 }\n.pr-source-code-header { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:8px; margin-bottom:8px }\n.pr-source-code-header h3 { margin:0; font-size:14px; font-weight:500 }\n.pr-source-code-copy { display:flex; flex-wrap:wrap; align-items:center; gap:8px; font-size:12px; color:var(--pr-muted) }\n.pr-reader .pr-source-code-note { margin:0 0 8px; font-size:12px; color:var(--pr-muted) }\n.pr-source-code-copy button { font-size:12px }\n.pr-source-code pre { margin:0; padding:14px 16px; border:1px solid var(--pr-border); border-radius:10px; background:var(--pr-soft); max-height:420px; overflow:auto; white-space:pre; tab-size:4; user-select:text; font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace }\n.pr-source-code-summary { margin-top:20px }\n.pr-source-code-summary>summary { margin-bottom:12px; font-size:14px }\n.pr-copy-dialog { max-width:640px; padding-bottom:24px; overflow:auto }\n.pr-copy-dialog>p,.pr-copy-dialog>label { margin:16px 24px }\n.pr-copy-dialog textarea { display:block; width:calc(100% - 48px); min-height:220px; max-height:50vh; margin:16px 24px 0; padding:12px; background:var(--pr-soft); color:var(--pr-text); border:1px solid var(--pr-border); border-radius:8px; font:13px/1.65 ui-monospace,monospace; resize:vertical }\n\n.pr-chart-explorer { margin:18px 0; padding:20px; border:1px solid var(--pr-border); border-radius:12px; background:var(--pr-soft); font-size:13px; min-width:0 }\n.pr-explorer-header { display:flex; justify-content:space-between; gap:12px; align-items:flex-start }\n.pr-explorer-header h3 { margin:0 }\n.pr-explorer-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr)); gap:14px; margin:14px 0 }\n.pr-explorer-grid>label { display:flex; flex-direction:column; gap:6px; min-width:0 }\n.pr-explorer-grid select { width:100%; min-width:0 }\n.pr-explorer-fields { border:0; border-top:1px solid var(--pr-border); padding:12px 0 0; margin:16px 0 0; min-width:0 }\n.pr-explorer-fields legend { font-weight:600; padding:0 8px 0 0 }\n.pr-explorer-series { display:flex; align-items:center; flex-wrap:wrap; gap:10px; margin:8px 0 }\n.pr-explorer-series label { display:flex; align-items:center; gap:6px }\n.pr-explorer-series input { accent-color:var(--pr-accent); min-width:16px; min-height:16px }\n.pr-explorer-visible { color:var(--pr-muted) }\n.pr-explorer-footer { margin-top:16px; display:flex; justify-content:flex-end }\n.pr-host-print { display:none }\n\n.pr-host { min-width:0 }\n.pr-host-actions { display:flex; gap:10px; justify-content:flex-end; padding:12px }\nbody[data-presentation-portable] { margin:0; background:#fff }\nhtml[data-presentation-ready=true] body[data-presentation-portable] #presentation-fallback { display:none }\n@media(prefers-color-scheme:dark) {\n body[data-presentation-portable] { background:#1c1c1f }\n .pr-reader { --pr-code-keyword:#d9a0e5; --pr-code-string:#99cda7; --pr-code-number:#ebbb8a; --pr-code-function:#9bbef3; --pr-bg:#1c1c1f; --pr-soft:#262629; --pr-text:#ededed; --pr-muted:#aaa; --pr-border:#39393e; --pr-accent:#91b7f3; --pr-warning:#e3bb70; --pr-chart-1:#8cb0ed; --pr-chart-2:#dbab7f; --pr-chart-3:#8ec0a9; --pr-chart-muted:#a0a0a6; --pr-chart-grid:rgba(255,255,255,.08); --pr-chart-hover:rgba(255,255,255,.04); --pr-chart-4:#b7a0d6; --pr-chart-5:#d99bb0; --pr-chart-6:#b8be86; color-scheme:dark }\n}\n.dark .pr-reader,[data-theme=dark] .pr-reader { --pr-code-keyword:#d9a0e5; --pr-code-string:#99cda7; --pr-code-number:#ebbb8a; --pr-code-function:#9bbef3; --pr-bg:#1c1c1f; --pr-soft:#262629; --pr-text:#ededed; --pr-muted:#aaa; --pr-border:#39393e; --pr-accent:#91b7f3; --pr-warning:#e3bb70; --pr-chart-1:#8cb0ed; --pr-chart-2:#dbab7f; --pr-chart-3:#8ec0a9; --pr-chart-muted:#a0a0a6; --pr-chart-grid:rgba(255,255,255,.08); --pr-chart-hover:rgba(255,255,255,.04); --pr-chart-4:#b7a0d6; --pr-chart-5:#d99bb0; --pr-chart-6:#b8be86; color-scheme:dark }\n.light .pr-reader,[data-theme=light] .pr-reader { --pr-bg:#fff; --pr-soft:#f7f7f8; --pr-text:#242424; --pr-muted:#666; --pr-border:#e5e5e7; --pr-accent:#3567b7; --pr-warning:#805b20; --pr-chart-1:#286dee; --pr-chart-2:#ba7039; --pr-chart-3:#548878; --pr-chart-muted:#96969b; --pr-chart-grid:rgba(13,13,13,.06); --pr-chart-hover:rgba(13,13,13,.03); --pr-chart-4:#8d6cb0; --pr-chart-5:#b46379; --pr-chart-6:#727c38; color-scheme:light }\n@media(max-width:640px) {\n .pr-reader { padding:28px 20px; font-size:15px }\n .pr-reader h1 { font-size:26px }\n .pr-block-markdown h2 { font-size:20px }\n .pr-blocks { gap:26px }\n .pr-source-dialog,.pr-dialog { width:calc(100vw - 24px); max-height:calc(100dvh - 24px); border-radius:18px }\n .pr-source-dialog-header,.pr-dialog-header { padding:16px 18px 4px }\n .pr-source-tabs { padding:0 18px }\n .pr-source-dialog-body { padding:18px }\n .pr-source-overview-grid { grid-template-columns:1fr; gap:16px }\n .pr-metric-group { gap:12px }\n .pr-block-metric { padding:16px }\n .pr-metric-value { font-size:25px }\n .pr-pagination { justify-content:space-between; gap:8px }\n .pr-tooltip { max-width:80vw }\n}\n@media(pointer:coarse) { .pr-reader summary,.pr-reader button { min-height:44px } .pr-reader .pr-icon-button { width:36px } .pr-block-metric>h2,.pr-block-chart>h2 { padding-right:44px } .pr-reader select,.pr-reader textarea { font-size:16px } }\n@media print {\n .pr-host-live { display:none!important }\n .pr-host-print { display:block!important }\n html[data-presentation-ready=true] body[data-presentation-portable] #presentation-fallback,body[data-presentation-portable] #presentation-fallback { display:block!important }\n body[data-presentation-portable] #reader,.pr-interactive { display:none!important }\n .pr-reader { --pr-bg:#fff; --pr-soft:#fff; --pr-text:#111; --pr-muted:#444; --pr-border:#bbb; --pr-accent:#222; --pr-warning:#333; max-width:none; padding:0; font-size:10pt; color-scheme:light }\n .pr-blocks { display:block }\n .pr-block { border:0; padding:12px 0; border-radius:0 }\n .pr-block-markdown { max-width:none }\n .pr-block-metric>h2,.pr-block-chart>h2,.pr-block-markdown .pr-markdown>:first-child { padding-right:0 }\n .pr-source-summary::details-content { content-visibility:visible }\n .pr-source-summary>* { display:block }\n .pr-source-code-summary { display:none!important }\n .pr-source-dialog,.pr-dialog { display:none!important }\n .pr-metric-group { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)) }\n .pr-metric-group>.pr-block-metric { min-width:0; max-width:none }\n .pr-reader[data-mode] .pr-chart-row { display:block }\n .pr-reader[data-mode] .pr-chart-row>.pr-block-chart { min-width:0; max-width:none }\n .pr-header { break-after:avoid }\n .pr-reader h1,.pr-reader h2,.pr-reader h3 { break-after:avoid }\n .pr-table-scroll { overflow:visible }\n .pr-table table { table-layout:fixed; width:100%; font-size:8pt }\n .pr-table caption { padding-left:5px; padding-right:5px }\n .pr-table th,.pr-table td { min-width:0; padding:5px; white-space:pre-wrap!important; overflow-wrap:anywhere }\n .pr-table tr { break-inside:avoid }\n .pr-table thead { display:table-header-group }\n .pr-reader pre { white-space:pre-wrap }\n}\n.pr-region-label{color:var(--pr-muted);font-size:12px;letter-spacing:.02em;margin:0!important}\n.pr-interaction-region{min-width:0}\n.pr-region-divider{border:0;border-top:1px solid var(--pr-border);margin:0;width:100%}\n@media print{.pr-region-divider{margin:20px 0}}\n.pr-interaction-header{margin-bottom:28px}.pr-interaction-header h2{margin-bottom:4px}.pr-interaction-header>.pr-muted{margin:4px 0 16px}\n.pr-filter-toolbar{border:0;padding:0;margin:0;min-width:0;display:flex;flex-wrap:wrap;gap:8px;align-items:center;position:relative;z-index:5}\n.pr-filter-menu{position:relative;min-width:0;max-width:100%}\n.pr-reader .pr-filter-trigger{display:flex;align-items:center;gap:8px;border-radius:999px;padding:5px 12px;min-height:34px;font-size:14px;line-height:22px;max-width:100%}\n.pr-filter-label{color:var(--pr-muted);flex-shrink:0}.pr-filter-value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}\n.pr-filter-popup{position:absolute;top:calc(100% + 6px);left:0;width:260px;max-width:calc(100vw - 80px);padding:8px;border:1px solid var(--pr-border);border-radius:12px;background:var(--pr-bg);box-shadow:0 8px 24px #0002;z-index:10;animation:pr-filter-in .12s ease-out}\n.pr-filter-popup input{width:100%;min-width:0;padding:8px 10px;border:1px solid var(--pr-border);border-radius:7px;background:var(--pr-bg);color:var(--pr-text);font:inherit;font-size:14px;margin-bottom:6px}\n.pr-filter-options{max-height:260px;overflow-y:auto}.pr-reader .pr-filter-options button{display:flex;justify-content:space-between;align-items:center;gap:12px;text-align:left;width:100%;border:0;border-radius:6px;padding:8px 10px;font-size:14px}\n.pr-filter-options button[aria-checked=true]{background:var(--pr-soft);font-weight:600}\n.pr-reader .pr-filter-reset{border:0;background:transparent;font-size:13px;color:var(--pr-muted)}\n.pr-reader .pr-filter-status{font-size:12px;color:var(--pr-muted);margin:12px 0 0}\n@keyframes pr-filter-in{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}\n@media(prefers-reduced-motion:reduce){.pr-filter-popup{animation:none}}\n@media(max-width:600px){.pr-filter-menu{width:100%}.pr-reader .pr-filter-trigger{width:100%;justify-content:space-between}.pr-filter-popup{width:100%;max-width:100%}}\n\n.pr-special-frame { position:relative; min-width:0; margin:0 }\n.pr-special-scroll { overflow-x:auto; padding-bottom:4px; max-width:100% }\n.pr-special-chart { display:block; color:var(--pr-text); overflow:visible; font-size:12px; font-variant-numeric:tabular-nums }\n.pr-special-chart text { fill:var(--pr-text) }\n.pr-special-chart .pr-axis-tick { fill:var(--pr-chart-muted) }\n.pr-special-chart [data-chart-mark]:focus { outline:2px solid var(--pr-accent); outline-offset:3px }\n.pr-special-tooltip { position:absolute; top:0; left:0; z-index:2; max-width:100%; pointer-events:none }\n.pr-chart-sparkline { height:128px }\n.pr-chart-role { color:var(--pr-muted); font-size:11px }\n.pr-chart-label { fill:var(--pr-text); font-size:11px }\n.pr-special-chart .pr-chart-label { paint-order:stroke; stroke:var(--pr-bg); stroke-width:3px; stroke-linejoin:round }\n.pr-color-key { display:flex; gap:12px; flex-wrap:wrap; font-size:12px; color:var(--pr-muted); margin:8px 0 }\n.pr-color-key span { display:inline-flex; align-items:center; gap:5px }\n\n\n.pr-cell-editor{border:1px solid var(--pr-border);border-radius:8px;padding:12px;margin:8px 0 16px;min-width:0;background:var(--pr-soft)}\n.pr-editor-actions{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px}.pr-cell-editor label{display:block}.pr-cell-editor textarea{display:block;width:100%;min-height:120px;resize:vertical}.pr-cell-editor input:not([type=checkbox]),.pr-report-title-editor input{display:block;width:100%;min-width:0}.pr-cell-editor button{margin:4px;padding:5px 9px}.pr-cell-editor .pr-editor-column{display:inline-flex;align-items:center;gap:6px;margin:4px 12px 4px 0}\n.pr-report-title-editor{display:block;font-weight:600}.pr-report-title-editor input{font:inherit;font-size:24px;padding:8px}\n.pr-cell-editor input,.pr-cell-editor textarea,.pr-report-title-editor input{font-family:inherit;color:var(--pr-text);background:var(--pr-bg);border:1px solid var(--pr-border);border-radius:5px;padding:6px;box-sizing:border-box}\n";
1
+ export declare const PRESENTATION_STYLES = "\n.pr-reader {\n --pr-bg:#fff; --pr-soft:#f7f7f8; --pr-text:#242424; --pr-muted:#666;\n --pr-code-keyword:#8a3294; --pr-code-string:#216b43; --pr-code-number:#995119; --pr-code-function:#285d9e;\n --pr-border:#e5e5e7; --pr-accent:#3567b7; --pr-warning:#805b20;\n --pr-chart-1:#286dee; --pr-chart-2:#ba7039; --pr-chart-3:#548878;\n --pr-chart-muted:#96969b; --pr-chart-grid:rgba(13,13,13,.06); --pr-chart-hover:rgba(13,13,13,.03); --pr-chart-4:#8d6cb0; --pr-chart-5:#b46379; --pr-chart-6:#727c38;\n box-sizing:border-box; margin:0 auto; padding:48px clamp(20px,4%,64px); width:100%; max-width:none; min-width:0;\n color:var(--pr-text); background:var(--pr-bg); font:16px/1.65 system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;\n overflow-wrap:anywhere; color-scheme:light;\n}\n.pr-reader * { box-sizing:border-box }\n.pr-reader h1,.pr-reader h2,.pr-reader h3,.pr-reader h4 { line-height:1.4; font-weight:600; text-wrap:balance }\n.pr-reader h1 { font-size:30px; margin:0 0 12px; letter-spacing:-.025em }\n.pr-reader h2 { font-size:21px; margin:0 0 16px }\n.pr-reader h3 { font-size:17px; margin:0 0 12px }\n.pr-reader p { margin:10px 0 }\n.pr-reader button,.pr-reader select,.pr-reader textarea { font:inherit; color:inherit }\n.pr-reader button,.pr-reader select { border:1px solid var(--pr-border); border-radius:8px; background:var(--pr-bg); padding:6px 10px; max-width:100% }\n.pr-reader button { cursor:pointer }\n.pr-reader button:hover { background:var(--pr-soft) }\n.pr-reader button:disabled { opacity:.45; cursor:default }\n.pr-reader :focus-visible { outline:3px solid var(--pr-accent); outline-offset:3px }\n.pr-reader a { color:var(--pr-accent); text-decoration:underline; text-underline-offset:3px }\n.pr-reader summary { cursor:pointer; color:var(--pr-muted); padding:8px 0; font-size:13px }\n.pr-reader summary:hover { color:var(--pr-text) }\n.pr-reader details[open]>summary { margin-bottom:8px }\n.pr-muted { color:var(--pr-muted); font-size:13px }\n.pr-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.pr-title-row>h1,.pr-title-row>.pr-report-title-editor{flex:1;min-width:0;margin-top:0}.pr-export-menu{display:flex;align-items:center;gap:8px;position:relative;flex:none;z-index:6}.pr-report-version{font:12px/34px ui-monospace,monospace;color:var(--pr-muted)}.pr-export-menu .pr-menu-divider{border-top:1px solid var(--pr-border);margin-top:4px;padding-top:10px}.pr-export-menu small{display:block;font-size:12px;color:var(--pr-muted);margin-top:3px}.pr-export-menu .pr-cell-menu-popup{min-width:240px}.pr-export-menu .pr-icon-button{width:34px;height:34px}\n.pr-header { padding-bottom:28px; margin-bottom:32px; border-bottom:1px solid var(--pr-border) }\n.pr-blocks { display:flex; flex-direction:column; gap:32px }\n.pr-block { min-width:0; position:relative }\n.pr-block-markdown { padding:0; width:100% }\n.pr-block-chart { padding:0; border:0; border-radius:0 }\n.pr-block-chart>h2 { font-size:17px }\n.pr-chart-row { display:flex; flex-direction:column; gap:32px; min-width:0 }\n.pr-chart-row>.pr-block-chart { width:100% }\n.pr-reader[data-mode=interactive] .pr-chart-row { flex-direction:row; flex-wrap:wrap; align-items:flex-start }\n.pr-reader[data-mode=interactive] .pr-chart-row>.pr-block-chart { flex:1 1 calc((100% - 32px)/2); min-width:min(100%,560px); max-width:100% }\n.pr-reader[data-mode=interactive] .pr-chart-row>.pr-block-chart[data-chart-layout=wide] { min-width:min(100%,720px) }\n.pr-metric-group { display:flex; flex-wrap:wrap; gap:16px; min-width:0 }\n.pr-metric-group>.pr-block-metric { flex:1 1 240px; min-width:min(100%,240px); max-width:min(100%,480px) }\n.pr-block-metric { border:1px solid var(--pr-border); border-radius:14px; padding:20px; display:flex; flex-direction:column; gap:4px }\n.pr-block-metric h2 { font-size:13px; font-weight:500; color:var(--pr-muted); margin:0 }\n.pr-metric-value { font-size:clamp(24px,3vw,32px); font-variant-numeric:tabular-nums; font-weight:600; line-height:1.35; letter-spacing:-.025em }\n.pr-metric-value { white-space:nowrap; overflow-x:auto; max-width:100% }\n.pr-metric-comparisons { display:grid; gap:12px; margin-top:auto; padding-top:12px }\n.pr-metric-comparison { display:flex; flex-wrap:wrap; gap:4px 10px; border-top:1px solid var(--pr-border); padding-top:10px; font-size:13px; font-variant-numeric:tabular-nums }\n.pr-metric-comparison>.pr-muted { flex-basis:100% }\n.pr-metric-change { display:flex; flex-wrap:wrap; gap:4px 8px }\n.pr-metric-change-positive { color:#167044 }\n.pr-metric-change-negative { color:#b42318 }\n.pr-metric-change-neutral { color:var(--pr-muted) }\n.pr-notice { color:var(--pr-warning); font-size:13px; border-left:2px solid currentColor; padding-left:12px }\n.pr-empty { padding:24px; text-align:center; color:var(--pr-muted); background:var(--pr-soft); border-radius:8px }\n.pr-markdown p { white-space:pre-wrap }\n.pr-markdown pre { max-width:100%; overflow:auto; background:var(--pr-soft); padding:16px; border-radius:8px; font:13px/1.65 ui-monospace,monospace }\n.pr-markdown code { font-family:ui-monospace,monospace; font-size:.9em; background:var(--pr-soft); padding:2px 4px; border-radius:3px }\n.pr-markdown pre code { padding:0 }\n.pr-markdown blockquote { border-left:3px solid var(--pr-border); padding-left:18px; margin:16px 0; color:var(--pr-muted) }\n.pr-markdown hr { border:0; border-top:1px solid var(--pr-border); margin:24px 0 }\n.pr-markdown ul,.pr-markdown ol { padding-left:24px }\n.pr-markdown li+li { margin-top:6px }\n.pr-table-scroll { max-width:100%; overflow:auto }\n.pr-table table { border-collapse:collapse; min-width:100%; font-size:13px }\n.pr-table caption { text-align:left; font-size:12px; color:var(--pr-muted); padding:8px 12px }\n.pr-table th,.pr-table td { padding:12px; text-align:left; border-bottom:1px solid var(--pr-border); vertical-align:top; white-space:pre-wrap; overflow-wrap:anywhere; min-width:90px; max-width:400px }\n.pr-table th { font-weight:500; color:var(--pr-muted) }\n.pr-table th button { position:relative; font-weight:500; padding:0; text-align:inherit; border:0; background:transparent; border-radius:0 }\n.pr-table th.pr-numeric { text-align:right }\n.pr-sort-indicator { position:absolute; left:calc(100% + 3px); top:0; font-size:11px; line-height:inherit }\n.pr-table tbody tr:hover { background:var(--pr-soft) }\n.pr-table td.pr-numeric { text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap }\n.pr-table td[data-cell-null=true] { color:var(--pr-muted) }\n.pr-pagination { display:flex; gap:12px; align-items:center; justify-content:flex-end; flex-wrap:wrap; margin-top:12px; font-size:12px }\n.pr-diagnostics { margin:0 0 28px; padding:16px; background:var(--pr-soft); border-radius:10px; font-size:13px }\n.pr-diagnostics h2 { font-size:14px; margin:0 }\n.pr-diagnostics ul { padding-left:20px }\n.pr-legend { display:flex; flex-wrap:wrap; gap:8px 16px; margin:8px 0 0; justify-content:center }\n.pr-legend button { display:flex; align-items:center; gap:7px; font-size:12px; border:0; padding:4px 0; background:transparent }\n.pr-legend button[aria-pressed=false] { opacity:.5; text-decoration:line-through }\n.pr-swatch { display:inline-block; width:9px; height:9px; border-radius:50%; flex-shrink:0 }\n.pr-chart { margin:0; width:100%; min-width:0; height:320px }\n.pr-chart svg { overflow:visible }\n.pr-chart-group+.pr-chart-group { margin-top:24px }\n.pr-chart .recharts-cartesian-axis-tick-value { font-variant-numeric:tabular-nums }\n.pr-tooltip { padding:10px 13px; border:1px solid var(--pr-border); border-radius:10px; background:var(--pr-bg); color:var(--pr-text); font-size:12px; box-shadow:0 4px 18px #0001; max-width:min(420px,80vw) }\n.pr-tooltip dl { margin:5px 0 0 }\n.pr-tooltip dl>div { display:flex; flex-wrap:wrap; justify-content:space-between; gap:6px 20px }\n.pr-tooltip dt { color:var(--pr-muted) }\n.pr-tooltip dd { margin:0; font-variant-numeric:tabular-nums; overflow-wrap:anywhere }\n\n.pr-cell-toolbar { position:absolute; top:0; right:0; display:flex; align-items:center; gap:4px; z-index:2 }\n.pr-block-metric>.pr-cell-toolbar { top:12px; right:12px }\n.pr-block-metric>h2,.pr-block-chart>h2 { padding-right:32px }\n.pr-block-markdown .pr-markdown>:first-child { padding-right:40px }\n.pr-reader[data-mode=interactive] .pr-block-table { padding-top:30px }\n.pr-block-source>h2 { padding-right:40px }\n.pr-reader .pr-icon-button { display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; padding:5px; border:0; background:transparent; color:var(--pr-muted); border-radius:6px; flex-shrink:0 }\n.pr-reader .pr-icon-button:hover { background:var(--pr-soft); color:var(--pr-text) }\n.pr-icon-button svg { width:18px; height:18px; display:block }\n.pr-copy,.pr-cell-menu { position:relative; display:inline-flex; align-items:center }\n.pr-copy-status { position:absolute; right:0; top:calc(100% + 4px); white-space:nowrap; font-size:12px; background:var(--pr-bg); color:var(--pr-text); border-radius:5px }\n.pr-copy-status:not(:empty) { padding:4px 8px; border:1px solid var(--pr-border); box-shadow:0 2px 8px #0001 }\n.pr-cell-menu-popup { position:absolute; right:0; top:calc(100% + 4px); min-width:136px; padding:4px; background:var(--pr-bg); border:1px solid var(--pr-border); border-radius:10px; box-shadow:0 6px 24px #0002; z-index:3 }\n.pr-cell-menu-popup>button { display:block; width:100%; border:0; border-radius:6px; text-align:left; font-size:13px; padding:8px 12px; white-space:nowrap }\n.pr-cell-menu-popup>button[aria-disabled=true] { color:var(--pr-muted); cursor:not-allowed }\n.pr-cell-menu-popup>button small { display:block; font-size:12px; font-weight:normal }\n.pr-source-dialog,.pr-dialog { color:var(--pr-text); background:var(--pr-bg); border:1px solid var(--pr-border); border-radius:24px; width:min(800px,calc(100vw - 48px)); max-width:none; max-height:min(760px,calc(100dvh - 48px)); margin:auto; padding:0; box-shadow:0 18px 70px #0003; font:14px/1.6 system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif; overflow:hidden }\n.pr-source-dialog[open],.pr-dialog[open] { display:flex; flex-direction:column }\n.pr-source-dialog-shell { display:flex; flex-direction:column; min-height:0; width:100% }\n.pr-reader .pr-source-dialog-context { font-size:13px; color:var(--pr-muted); margin:4px 0 0 }\n.pr-source-dialog::backdrop,.pr-dialog::backdrop { background:#0005 }\n.pr-source-dialog-header,.pr-dialog-header { display:flex; justify-content:space-between; align-items:center; gap:16px; padding:20px 24px 4px; flex-shrink:0 }\n.pr-source-dialog .pr-source-dialog-title,.pr-dialog-header h2 { font-size:24px; font-weight:500; margin:0 }\n.pr-reader .pr-source-dialog-close { width:32px; height:32px; border:0; padding:6px; background:transparent; color:var(--pr-muted); flex-shrink:0 }\n.pr-source-dialog-close svg { width:18px; height:18px }\n.pr-source-tabs { display:flex; gap:28px; padding:0 24px; border-bottom:1px solid var(--pr-border); flex-shrink:0 }\n.pr-reader .pr-source-tab { padding:14px 0; border:0; border-bottom:2px solid transparent; border-radius:0; background:transparent; color:var(--pr-muted); font-size:14px }\n.pr-reader .pr-source-tab[aria-selected=true] { color:var(--pr-text); border-bottom-color:var(--pr-text) }\n.pr-source-dialog-body { padding:20px 24px 24px; overflow:auto; min-height:0; overscroll-behavior:contain }\n.pr-source-overview { font-size:14px; min-width:0 }\n.pr-source-overview-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:20px 24px; margin:0 0 24px }\n.pr-source-overview-grid>div { min-width:0 }\n.pr-source-overview-grid dt { color:var(--pr-muted); font-size:13px; margin:0 0 4px }\n.pr-source-overview-label { color:var(--pr-muted); font-size:13px; font-weight:400; margin:0 0 4px }\n.pr-source-overview dd { margin:0; overflow-wrap:anywhere }\n.pr-source-field-section { margin-bottom:24px }\n.pr-source-fields { width:100%; border-collapse:collapse; font-size:13px; text-align:left }\n.pr-source-fields th,.pr-source-fields td { padding:8px 12px; border-bottom:1px solid var(--pr-border); vertical-align:top }\n.pr-source-fields th { color:var(--pr-muted); font-weight:500 }\n.pr-source-list { display:flex; flex-direction:column; gap:24px }\n.pr-source-reading-list { margin:12px 0 0; padding-left:20px; list-style:disc }\n.pr-source-reading-list>li { padding:4px 0; margin:0 0 8px; overflow-wrap:anywhere }\n.pr-source-reading-list>li>strong { font-size:14px; font-weight:500 }\n.pr-reader .pr-source-reading-list p { margin:4px 0 0; font-size:13px }\n.pr-source-card { min-width:0 }\n.pr-source-card+.pr-source-card { border-top:1px solid var(--pr-border); padding-top:20px }\n.pr-source-card h3 { font-size:14px; margin:0 0 12px; font-weight:500; overflow-wrap:anywhere }\n.pr-source-semantic-group { margin-top:16px }\n.pr-source-semantic-list { display:flex; flex-wrap:wrap; gap:6px; list-style:none; padding:0; margin:4px 0 16px }\n.pr-source-semantic-list>li { border:1px solid var(--pr-border); border-radius:14px; padding:2px 8px; overflow-wrap:anywhere; max-width:100%; font-size:13px }\n.pr-reader .pr-semantic-link { font:inherit; color:var(--pr-accent); background:none; border:0; padding:0; cursor:pointer; text-align:left; overflow-wrap:anywhere; text-decoration:underline; text-underline-offset:3px }\n.pr-reader .pr-semantic-link:focus-visible { outline:2px solid var(--pr-accent); outline-offset:3px; border-radius:3px }\n.pr-source-issues { margin:12px 0 0; color:var(--pr-warning); font-size:13px }\n.pr-source-summary { margin-top:32px; padding-top:16px; border-top:1px solid var(--pr-border) }\n.pr-source-summary>summary { font-size:14px }\n.pr-source-code { display:flex; flex-direction:column; gap:20px; min-width:0 }\n.pr-source-code-snippet { min-width:0 }\n.pr-source-code-header { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:8px; margin-bottom:8px }\n.pr-source-code-header h3 { margin:0; font-size:14px; font-weight:500 }\n.pr-source-code-copy { display:flex; flex-wrap:wrap; align-items:center; gap:8px; font-size:12px; color:var(--pr-muted) }\n.pr-reader .pr-source-code-note { margin:0 0 8px; font-size:12px; color:var(--pr-muted) }\n.pr-source-code-copy button { font-size:12px }\n.pr-source-code pre { margin:0; padding:14px 16px; border:1px solid var(--pr-border); border-radius:10px; background:var(--pr-soft); max-height:420px; overflow:auto; white-space:pre; tab-size:4; user-select:text; font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace }\n.pr-copy-dialog { max-width:640px; padding-bottom:24px; overflow:auto }\n.pr-copy-dialog>p,.pr-copy-dialog>label { margin:16px 24px }\n.pr-copy-dialog textarea { display:block; width:calc(100% - 48px); min-height:220px; max-height:50vh; margin:16px 24px 0; padding:12px; background:var(--pr-soft); color:var(--pr-text); border:1px solid var(--pr-border); border-radius:8px; font:13px/1.65 ui-monospace,monospace; resize:vertical }\n\n.pr-chart-explorer { margin:18px 0; padding:20px; border:1px solid var(--pr-border); border-radius:12px; background:var(--pr-soft); font-size:13px; min-width:0 }\n.pr-explorer-header { display:flex; justify-content:space-between; gap:12px; align-items:flex-start }\n.pr-explorer-header h3 { margin:0 }\n.pr-explorer-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr)); gap:14px; margin:14px 0 }\n.pr-explorer-grid>label { display:flex; flex-direction:column; gap:6px; min-width:0 }\n.pr-explorer-grid select { width:100%; min-width:0 }\n.pr-explorer-fields { border:0; border-top:1px solid var(--pr-border); padding:12px 0 0; margin:16px 0 0; min-width:0 }\n.pr-explorer-fields legend { font-weight:600; padding:0 8px 0 0 }\n.pr-explorer-series { display:flex; align-items:center; flex-wrap:wrap; gap:10px; margin:8px 0 }\n.pr-explorer-series label { display:flex; align-items:center; gap:6px }\n.pr-explorer-series input { accent-color:var(--pr-accent); min-width:16px; min-height:16px }\n.pr-explorer-visible { color:var(--pr-muted) }\n.pr-explorer-footer { margin-top:16px; display:flex; justify-content:flex-end }\n.pr-host-print { display:none }\n\n.pr-host { min-width:0 }\n.pr-host-actions { display:flex; gap:10px; justify-content:flex-end; padding:12px }\nbody[data-presentation-portable] { margin:0; background:#fff }\nhtml[data-presentation-ready=true] body[data-presentation-portable] #presentation-fallback { display:none }\n@media(prefers-color-scheme:dark) {\n body[data-presentation-portable] { background:#1c1c1f }\n .pr-reader { --pr-code-keyword:#d9a0e5; --pr-code-string:#99cda7; --pr-code-number:#ebbb8a; --pr-code-function:#9bbef3; --pr-bg:#1c1c1f; --pr-soft:#262629; --pr-text:#ededed; --pr-muted:#aaa; --pr-border:#39393e; --pr-accent:#91b7f3; --pr-warning:#e3bb70; --pr-chart-1:#8cb0ed; --pr-chart-2:#dbab7f; --pr-chart-3:#8ec0a9; --pr-chart-muted:#a0a0a6; --pr-chart-grid:rgba(255,255,255,.08); --pr-chart-hover:rgba(255,255,255,.04); --pr-chart-4:#b7a0d6; --pr-chart-5:#d99bb0; --pr-chart-6:#b8be86; color-scheme:dark }\n}\n.dark .pr-reader,[data-theme=dark] .pr-reader { --pr-code-keyword:#d9a0e5; --pr-code-string:#99cda7; --pr-code-number:#ebbb8a; --pr-code-function:#9bbef3; --pr-bg:#1c1c1f; --pr-soft:#262629; --pr-text:#ededed; --pr-muted:#aaa; --pr-border:#39393e; --pr-accent:#91b7f3; --pr-warning:#e3bb70; --pr-chart-1:#8cb0ed; --pr-chart-2:#dbab7f; --pr-chart-3:#8ec0a9; --pr-chart-muted:#a0a0a6; --pr-chart-grid:rgba(255,255,255,.08); --pr-chart-hover:rgba(255,255,255,.04); --pr-chart-4:#b7a0d6; --pr-chart-5:#d99bb0; --pr-chart-6:#b8be86; color-scheme:dark }\n.light .pr-reader,[data-theme=light] .pr-reader { --pr-bg:#fff; --pr-soft:#f7f7f8; --pr-text:#242424; --pr-muted:#666; --pr-border:#e5e5e7; --pr-accent:#3567b7; --pr-warning:#805b20; --pr-chart-1:#286dee; --pr-chart-2:#ba7039; --pr-chart-3:#548878; --pr-chart-muted:#96969b; --pr-chart-grid:rgba(13,13,13,.06); --pr-chart-hover:rgba(13,13,13,.03); --pr-chart-4:#8d6cb0; --pr-chart-5:#b46379; --pr-chart-6:#727c38; color-scheme:light }\n@media(max-width:640px) {\n .pr-reader { padding:28px 20px; font-size:15px }\n .pr-reader h1 { font-size:26px }\n .pr-block-markdown h2 { font-size:20px }\n .pr-blocks { gap:26px }\n .pr-source-dialog,.pr-dialog { width:calc(100vw - 24px); max-height:calc(100dvh - 24px); border-radius:18px }\n .pr-source-dialog-header,.pr-dialog-header { padding:16px 18px 4px }\n .pr-source-tabs { padding:0 18px }\n .pr-source-dialog-body { padding:18px }\n .pr-source-overview-grid { grid-template-columns:1fr; gap:16px }\n .pr-metric-group { gap:12px }\n .pr-block-metric { padding:16px }\n .pr-metric-value { font-size:25px }\n .pr-pagination { justify-content:space-between; gap:8px }\n .pr-tooltip { max-width:80vw }\n}\n@media(pointer:coarse) { .pr-reader summary,.pr-reader button { min-height:44px } .pr-reader .pr-icon-button { width:36px } .pr-block-metric>h2,.pr-block-chart>h2 { padding-right:44px } .pr-reader select,.pr-reader textarea { font-size:16px } }\n@media print {\n .pr-host-live { display:none!important }\n .pr-host-print { display:block!important }\n html[data-presentation-ready=true] body[data-presentation-portable] #presentation-fallback,body[data-presentation-portable] #presentation-fallback { display:block!important }\n body[data-presentation-portable] #reader,.pr-interactive { display:none!important }\n .pr-reader { --pr-bg:#fff; --pr-soft:#fff; --pr-text:#111; --pr-muted:#444; --pr-border:#bbb; --pr-accent:#222; --pr-warning:#333; max-width:none; padding:0; font-size:10pt; color-scheme:light }\n .pr-blocks { display:block }\n .pr-block { border:0; padding:12px 0; border-radius:0 }\n .pr-block-markdown { max-width:none }\n .pr-block-metric>h2,.pr-block-chart>h2,.pr-block-markdown .pr-markdown>:first-child { padding-right:0 }\n .pr-source-summary::details-content { content-visibility:visible }\n .pr-source-summary>* { display:block }\n .pr-source-dialog,.pr-dialog { display:none!important }\n .pr-metric-group { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)) }\n .pr-metric-group>.pr-block-metric { min-width:0; max-width:none }\n .pr-reader[data-mode] .pr-chart-row { display:block }\n .pr-reader[data-mode] .pr-chart-row>.pr-block-chart { min-width:0; max-width:none }\n .pr-header { break-after:avoid }\n .pr-reader h1,.pr-reader h2,.pr-reader h3 { break-after:avoid }\n .pr-table-scroll { overflow:visible }\n .pr-table table { table-layout:fixed; width:100%; font-size:8pt }\n .pr-table caption { padding-left:5px; padding-right:5px }\n .pr-table th,.pr-table td { min-width:0; padding:5px; white-space:pre-wrap!important; overflow-wrap:anywhere }\n .pr-table tr { break-inside:avoid }\n .pr-table thead { display:table-header-group }\n .pr-reader pre { white-space:pre-wrap }\n}\n.pr-region-label{color:var(--pr-muted);font-size:12px;letter-spacing:.02em;margin:0!important}\n.pr-interaction-region{min-width:0}\n.pr-region-divider{border:0;border-top:1px solid var(--pr-border);margin:0;width:100%}\n@media print{.pr-region-divider{margin:20px 0}}\n.pr-interaction-header{margin-bottom:28px}.pr-interaction-header h2{margin-bottom:4px}.pr-interaction-header>.pr-muted{margin:4px 0 16px}\n.pr-filter-toolbar{border:0;padding:0;margin:0;min-width:0;display:flex;flex-wrap:wrap;gap:8px;align-items:center;position:relative;z-index:5}\n.pr-filter-menu{position:relative;min-width:0;max-width:100%}\n.pr-reader .pr-filter-trigger{display:flex;align-items:center;gap:8px;border-radius:999px;padding:5px 12px;min-height:34px;font-size:14px;line-height:22px;max-width:100%}\n.pr-filter-label{color:var(--pr-muted);flex-shrink:0}.pr-filter-value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}\n.pr-filter-popup{position:absolute;top:calc(100% + 6px);left:0;width:260px;max-width:calc(100vw - 80px);padding:8px;border:1px solid var(--pr-border);border-radius:12px;background:var(--pr-bg);box-shadow:0 8px 24px #0002;z-index:10;animation:pr-filter-in .12s ease-out}\n.pr-filter-popup input{width:100%;min-width:0;padding:8px 10px;border:1px solid var(--pr-border);border-radius:7px;background:var(--pr-bg);color:var(--pr-text);font:inherit;font-size:14px;margin-bottom:6px}\n.pr-filter-options{max-height:260px;overflow-y:auto}.pr-reader .pr-filter-options button{display:flex;justify-content:space-between;align-items:center;gap:12px;text-align:left;width:100%;border:0;border-radius:6px;padding:8px 10px;font-size:14px}\n.pr-filter-options button[aria-checked=true]{background:var(--pr-soft);font-weight:600}\n.pr-reader .pr-filter-reset{border:0;background:transparent;font-size:13px;color:var(--pr-muted)}\n.pr-reader .pr-filter-status{font-size:12px;color:var(--pr-muted);margin:12px 0 0}\n@keyframes pr-filter-in{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}\n@media(prefers-reduced-motion:reduce){.pr-filter-popup{animation:none}}\n@media(max-width:600px){.pr-filter-menu{width:100%}.pr-reader .pr-filter-trigger{width:100%;justify-content:space-between}.pr-filter-popup{width:100%;max-width:100%}}\n\n.pr-special-frame { position:relative; min-width:0; margin:0 }\n.pr-special-scroll { overflow-x:auto; padding-bottom:4px; max-width:100% }\n.pr-special-chart { display:block; color:var(--pr-text); overflow:visible; font-size:12px; font-variant-numeric:tabular-nums }\n.pr-special-chart text { fill:var(--pr-text) }\n.pr-special-chart .pr-axis-tick { fill:var(--pr-chart-muted) }\n.pr-special-chart [data-chart-mark]:focus { outline:2px solid var(--pr-accent); outline-offset:3px }\n.pr-special-tooltip { position:absolute; top:0; left:0; z-index:2; max-width:100%; pointer-events:none }\n.pr-chart-sparkline { height:128px }\n.pr-chart-role { color:var(--pr-muted); font-size:11px }\n.pr-chart-label { fill:var(--pr-text); font-size:11px }\n.pr-special-chart .pr-chart-label { paint-order:stroke; stroke:var(--pr-bg); stroke-width:3px; stroke-linejoin:round }\n.pr-color-key { display:flex; gap:12px; flex-wrap:wrap; font-size:12px; color:var(--pr-muted); margin:8px 0 }\n.pr-color-key span { display:inline-flex; align-items:center; gap:5px }\n\n\n.pr-cell-editor{border:1px solid var(--pr-border);border-radius:8px;padding:12px;margin:8px 0 16px;min-width:0;background:var(--pr-soft)}\n.pr-editor-actions{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px}.pr-cell-editor label{display:block}.pr-cell-editor textarea{display:block;width:100%;min-height:120px;resize:vertical}.pr-cell-editor input:not([type=checkbox]),.pr-report-title-editor input{display:block;width:100%;min-width:0}.pr-cell-editor button{margin:4px;padding:5px 9px}.pr-cell-editor .pr-editor-column{display:inline-flex;align-items:center;gap:6px;margin:4px 12px 4px 0}\n.pr-report-title-editor{display:block;font-weight:600}.pr-report-title-editor input{font:inherit;font-size:24px;padding:8px}\n.pr-cell-editor input,.pr-cell-editor textarea,.pr-report-title-editor input{font-family:inherit;color:var(--pr-text);background:var(--pr-bg);border:1px solid var(--pr-border);border-radius:5px;padding:6px;box-sizing:border-box}\n";
@@ -1,12 +1,16 @@
1
1
  import type { TypedDataset } from '../../presentation/contracts/types.ts';
2
+ import type { TableSort } from './export-view.ts';
2
3
  import { type ReaderMode } from './model.ts';
3
- export declare function DatasetTable({ data, columns, mode, caption, showScope, showSelectionCount, rowIndices, filterKey, }: {
4
+ export declare function DatasetTable({ data, columns, mode, caption, hideCaption, showScope, showSelectionCount, rowIndices, filterKey, sort: controlledSort, onSortChange, }: {
4
5
  data: TypedDataset;
5
6
  columns?: string[];
6
7
  mode: ReaderMode;
7
8
  caption: string;
9
+ hideCaption?: boolean;
8
10
  showScope?: boolean;
9
11
  showSelectionCount?: boolean;
10
12
  rowIndices?: readonly number[];
11
13
  filterKey?: string;
14
+ sort?: TableSort;
15
+ onSortChange?: (sort: TableSort) => void;
12
16
  }): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { ToolCallOwnerProps } from '@deepseek-ai/dsh-client-ui-tool/client';
2
+ export declare function PythonToolCard({ block, inspect }: Pick<ToolCallOwnerProps, 'block' | 'inspect'>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { MarivoPythonExecutionSummary } from '../../datasource/python.ts';
2
+ /** Decode the plugin's error suffix after Harness has reduced Error to its message. */
3
+ export declare function executionErrorSummary(text: string): MarivoPythonExecutionSummary | undefined;
@@ -0,0 +1,2 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ export declare function installPythonTool(ctx: Context): void;
@@ -0,0 +1,20 @@
1
+ import type { ToolCallBlock } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ export type PythonToolState = 'running' | 'succeeded' | 'failed' | 'cancelled' | 'timed-out' | 'not-started' | 'warning' | 'unknown';
3
+ /** Read only the frozen Harness call; never fetch results or infer execution from settlement. */
4
+ export declare function pythonToolModel(block: ToolCallBlock): {
5
+ state: PythonToolState;
6
+ input: string;
7
+ output: string | undefined;
8
+ code: string | undefined;
9
+ facts: {
10
+ name: string;
11
+ value: string;
12
+ }[];
13
+ summary: string;
14
+ datasources: string[] | undefined;
15
+ timeoutMs: number | undefined;
16
+ stdout: string | undefined;
17
+ stderr: string | undefined;
18
+ notices: string[];
19
+ fallback: string | undefined;
20
+ };
@@ -0,0 +1,18 @@
1
+ import { resourceAddress } from './navigation.ts';
2
+ export declare const inject: string[];
3
+ /** Default browser integration. Layout belongs to Harness; mutable content belongs to occurrences. */
4
+ export declare function installRightTabs(ctx: any, { diagnostics }?: {
5
+ diagnostics?: boolean | undefined;
6
+ }): {
7
+ audit: {
8
+ opens: never[];
9
+ errors: never[];
10
+ changes: never[];
11
+ };
12
+ pages: Map<any, any>;
13
+ navigate: (sessionId: any, target: any, actions?: any, automatic?: boolean, params?: undefined) => void;
14
+ changed: (workspaceId: any, reportId: any) => void;
15
+ credentials: import("../credentials/model.ts").CredentialClientModel;
16
+ resourceAddress: typeof resourceAddress;
17
+ ask: (page: any, context: any) => void;
18
+ };
@@ -0,0 +1,8 @@
1
+ import type { SessionEventWindow } from '@deepseek-ai/dsh-api-session-controller/client';
2
+ import type { PresentationDelivery } from '../../presentation/receipt.ts';
3
+ /** Read-only Session window consumer. Initial history and replacement never navigate. */
4
+ export declare class LiveDeliveryObserver {
5
+ #private;
6
+ constructor(sessionId: string, onDelivery: (delivery: PresentationDelivery) => void);
7
+ consume(window: SessionEventWindow, baseline?: boolean): void;
8
+ }
@@ -0,0 +1,17 @@
1
+ import { type SemanticRef } from '../../semantic-reference/contracts.ts';
2
+ export type Directory = 'datasources' | 'semantic' | 'reports';
3
+ export type Resource = {
4
+ kind: 'report';
5
+ workspaceId: string;
6
+ reportId: string;
7
+ buildId?: string;
8
+ } | {
9
+ kind: 'semantic';
10
+ workspaceId: string;
11
+ ref: SemanticRef;
12
+ };
13
+ export declare const directoryKind: (page: Directory) => string;
14
+ export declare const definitionId: (kind: string) => string;
15
+ export declare function resourceAddress(target: Resource): string;
16
+ export declare function parseResource(address: string): Resource;
17
+ export declare function canOpenResource(address: string, kind: Resource['kind']): boolean;
@@ -0,0 +1,36 @@
1
+ import type { PresentationReceipt } from '../../presentation/contracts/types.ts';
2
+ import { CredentialClientModel } from '../credentials/model.ts';
3
+ import { ReportCatalogModel } from '../presentation/catalog-model.ts';
4
+ import { PresentationDeliveryModel, type PresentationRpc } from '../presentation/delivery-model.ts';
5
+ import type { ReaderViewMemory } from '../presentation/reader.tsx';
6
+ import { SemanticBrowserModel } from '../semantic-browser/model.ts';
7
+ import type { Directory, Resource } from './navigation.ts';
8
+ export type PageTarget = Resource | {
9
+ kind: Directory;
10
+ workspaceId: string;
11
+ };
12
+ export interface PageState {
13
+ error?: string;
14
+ notice?: string;
15
+ newer?: PresentationReceipt;
16
+ }
17
+ /** Lifetime belongs to a Host tab occurrence, never to a React body mount. */
18
+ export declare class TabPage {
19
+ #private;
20
+ readonly sessionId: string;
21
+ readonly target: PageTarget;
22
+ readonly reader: PresentationDeliveryModel;
23
+ readonly catalog: ReportCatalogModel;
24
+ readonly semantic: SemanticBrowserModel;
25
+ readonly datasources: CredentialClientModel;
26
+ readonly viewMemory: ReaderViewMemory;
27
+ constructor(sessionId: string, target: PageTarget, rpc: PresentationRpc, occurrenceId?: string);
28
+ getSnapshot: () => PageState;
29
+ subscribe: (listener: () => void) => () => void;
30
+ patch(change: Partial<PageState>): void;
31
+ navigate(revision: number, force?: boolean, history?: boolean): Promise<void>;
32
+ refresh(confirmDiscard?: () => boolean): Promise<void>;
33
+ publicationChanged(workspaceId: string, reportId?: string): Promise<void>;
34
+ unavailable(message: string): void;
35
+ dispose(): void;
36
+ }
@@ -0,0 +1,2 @@
1
+ /** Host-only chrome. Portable reports keep their own independent stylesheet. */
2
+ export declare const rightTabStyles = "\n.rt-page{height:100%;width:100%;min-width:0;overflow:auto;padding:16px;box-sizing:border-box;color:var(--dsw-alias-label-primary,#182a33);background:var(--dsw-alias-bg-base,#fff);container-type:inline-size;font:14px/1.6 system-ui,sans-serif}\n.rt-page *{box-sizing:border-box}.rt-page h2{font-size:18px;overflow-wrap:anywhere}.rt-page .rt-heading{margin:0 0 4px}.rt-heading-row{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:4px}.rt-page .rt-heading-row .rt-heading{margin:0}.rt-heading-row>button{flex:none}.rt-caption{color:var(--dsw-alias-label-secondary,#627580);font-size:12px;margin:0 0 16px;overflow-wrap:anywhere}\n.rt-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--dsw-alias-border-l2,#dce4e8);margin-bottom:16px}\n.rt-page button,.rt-page select,.rt-page input{font:inherit;color:inherit;max-width:100%}.rt-page button{cursor:pointer;border:1px solid var(--dsw-alias-border-l2,#dce4e8);background:var(--dsw-alias-bg-base,#fff);border-radius:7px;padding:6px 10px}.rt-page button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#edf4f3)}.rt-page button:disabled{opacity:.5;cursor:default}.rt-page :focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#087b70);outline-offset:3px}\n.rt-page select{padding:8px;border:1px solid var(--dsw-alias-border-l2,#dce4e8);border-radius:7px;background:var(--dsw-alias-bg-base,#fff)}.rt-page [role=alert]{color:var(--dsw-alias-state-warn-label,#b14927);overflow-wrap:anywhere}.rt-notice{padding:12px;border:1px solid var(--dsw-alias-border-l2,#dce4e8);border-radius:8px;background:var(--dsw-alias-bg-module-platform,#f5f7f9)}\n.rt-page .pd-catalog{padding:0;overflow:auto}.rt-page .pd-history{position:static;max-height:300px;border:1px solid var(--dsw-alias-border-l2,#dce4e8);border-radius:8px;margin-bottom:16px;width:100%}\n.rt-page .rt-refresh{display:grid;place-items:center;padding:7px;border-color:transparent;background:transparent}\n@container(max-width:650px){.rt-page .pr-reader{padding:24px 4px}.rt-page .pr-reader h1{font-size:25px}.rt-page .pr-block-metric{padding:14px}.rt-page .pr-metric-value{font-size:clamp(18px,7cqi,30px)}}\n";
@@ -0,0 +1,3 @@
1
+ /** Keep feature RPC names while using Harness's authenticated shared API transport. */
2
+ import type { ClientConnectionRpc } from '@deepseek-ai/dsh-client-connection/client';
3
+ export declare function createPluginRpc(rpc: ClientConnectionRpc): ClientConnectionRpc;
@@ -0,0 +1,4 @@
1
+ import type { ReferenceInsert } from '@deepseek-ai/dsh-client-ui-conversation/client';
2
+ import { type Envelope } from '../semantic-reference/contracts.ts';
3
+ /** Both the @ picker and semantic details insert exactly this Host reference. */
4
+ export declare function semanticReference(envelope: Envelope): ReferenceInsert;
@@ -1,6 +1,6 @@
1
1
  export declare function WorkspaceHeaderAction({ label, icon, disabled, title, onClick, }: {
2
2
  label: string;
3
- icon: 'semantic' | 'credentials';
3
+ icon: 'semantic' | 'credentials' | 'reports';
4
4
  disabled: boolean;
5
5
  title?: string;
6
6
  onClick: () => void;