@chengxianglibra/dsh-data-analysis 0.1.1 → 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 (303) hide show
  1. package/README.md +139 -53
  2. package/cordis.patch.yml +1 -1
  3. package/lib/bin/environment.js +9 -7
  4. package/lib/bin/presentation-lint.js +21 -0
  5. package/lib/bridges.js +2 -2
  6. package/lib/client/credentials/changes.js +74 -0
  7. package/lib/client/credentials/create-datasource.js +171 -0
  8. package/lib/client/credentials/credential-draft.js +42 -0
  9. package/lib/client/credentials/defaults.js +11 -0
  10. package/lib/client/credentials/descriptions.js +46 -0
  11. package/lib/client/credentials/install.js +319 -0
  12. package/lib/client/credentials/model.js +766 -0
  13. package/lib/client/credentials/report-publishing.js +96 -0
  14. package/lib/client/credentials/styles.js +21 -0
  15. package/lib/client/i18n/context.js +22 -0
  16. package/lib/client/i18n/copy.js +57 -0
  17. package/lib/client/i18n/credentials.js +475 -0
  18. package/lib/client/i18n/host.js +27 -0
  19. package/lib/client/i18n/navigation.js +41 -0
  20. package/lib/client/i18n/presentation.js +577 -0
  21. package/lib/client/i18n/python.js +36 -0
  22. package/lib/client/i18n/semantic.js +441 -0
  23. package/lib/client/input-context.js +21 -0
  24. package/lib/client/python-tool/card.js +35 -0
  25. package/lib/client/python-tool/execution-error.js +35 -0
  26. package/lib/client/python-tool/install.js +9 -0
  27. package/lib/client/python-tool/model.js +101 -0
  28. package/lib/client/right-tabs/install.js +535 -0
  29. package/lib/client/right-tabs/live-delivery.js +58 -0
  30. package/lib/client/right-tabs/navigation.js +47 -0
  31. package/lib/client/right-tabs/page.js +178 -0
  32. package/lib/client/right-tabs/styles.js +11 -0
  33. package/lib/client/rpc.js +5 -0
  34. package/lib/client/semantic-reference.js +10 -0
  35. package/lib/client/workspace-header-action.js +24 -0
  36. package/lib/client/workspace-shortcuts.js +26 -0
  37. package/lib/client.js +1250 -730
  38. package/lib/compatibility.js +2 -2
  39. package/lib/datasource/authoring.js +109 -0
  40. package/lib/datasource/bridge-programs.js +42 -27
  41. package/lib/datasource/bridge.js +144 -9
  42. package/lib/datasource/changes-contract.js +41 -0
  43. package/lib/datasource/changes.js +49 -0
  44. package/lib/datasource/configure.js +39 -0
  45. package/lib/datasource/defaults.js +25 -0
  46. package/lib/datasource/index.js +4 -2
  47. package/lib/datasource/python-options.js +21 -0
  48. package/lib/datasource/python.js +206 -0
  49. package/lib/datasource/resolver-program.js +112 -0
  50. package/lib/datasource/rpc.js +150 -0
  51. package/lib/datasource/service.js +962 -0
  52. package/lib/datasource/shell-env.js +2 -333
  53. package/lib/datasource/test.js +25 -51
  54. package/lib/disclosure/activation.js +19 -7
  55. package/lib/disclosure/execution-guidance.js +52 -0
  56. package/lib/disclosure/help.js +4 -1
  57. package/lib/environment/binding.js +54 -9
  58. package/lib/environment/runtime.js +120 -108
  59. package/lib/environment/subprocess.js +6 -1
  60. package/lib/environment/summary.js +3 -3
  61. package/lib/environment/workspace.js +23 -1
  62. package/lib/index.js +1 -1
  63. package/lib/lifecycle.js +33 -0
  64. package/lib/plugin-agents.js +154 -0
  65. package/lib/plugin.js +172 -133
  66. package/lib/presentation/asset.js +34 -0
  67. package/lib/presentation/assets/portable.js +606 -0
  68. package/lib/presentation/assets/static.js +1216 -0
  69. package/lib/presentation/build/index.js +72 -0
  70. package/lib/presentation/commit.js +163 -0
  71. package/lib/presentation/contracts/asset-path.js +9 -0
  72. package/lib/presentation/contracts/catalog.js +62 -0
  73. package/lib/presentation/contracts/charts.js +453 -0
  74. package/lib/presentation/contracts/editing.js +58 -0
  75. package/lib/presentation/contracts/index.js +663 -0
  76. package/lib/presentation/contracts/interaction.js +62 -0
  77. package/lib/presentation/contracts/types.js +15 -0
  78. package/lib/presentation/contracts/values.js +28 -0
  79. package/lib/presentation/delivery.js +71 -0
  80. package/lib/presentation/export-html.js +214 -0
  81. package/lib/presentation/files.js +82 -0
  82. package/lib/presentation/index.js +6 -0
  83. package/lib/presentation/lint.js +46 -0
  84. package/lib/presentation/projection/files.js +85 -0
  85. package/lib/presentation/projection/index.js +196 -0
  86. package/lib/presentation/projection/program.js +137 -0
  87. package/lib/presentation/projection/sql-code.js +79 -0
  88. package/lib/presentation/receipt.js +34 -0
  89. package/lib/presentation/reports.js +219 -0
  90. package/lib/presentation/rpc.js +186 -0
  91. package/lib/presentation/tool.js +118 -0
  92. package/lib/python-execution-contracts.js +1 -0
  93. package/lib/python-execution.js +232 -0
  94. package/lib/report-publishing/adapters.js +111 -0
  95. package/lib/report-publishing/config.js +69 -0
  96. package/lib/report-publishing/service.js +180 -0
  97. package/lib/rpc.js +49 -0
  98. package/lib/semantic-browser/contracts.js +97 -0
  99. package/lib/semantic-browser/definition.js +64 -0
  100. package/lib/semantic-browser/program.js +129 -0
  101. package/lib/semantic-browser/service.js +106 -0
  102. package/lib/semantic-reference/bridge.js +127 -0
  103. package/lib/semantic-reference/contracts.js +127 -0
  104. package/lib/semantic-reference/environment.js +56 -0
  105. package/lib/semantic-reference/index.js +3 -0
  106. package/lib/semantic-reference/labels.js +16 -0
  107. package/lib/semantic-reference/rpc.js +143 -0
  108. package/lib/semantic-reference/search.js +95 -0
  109. package/lib/semantic-reference/usage.js +152 -0
  110. package/lib/tool-lifecycle.js +22 -0
  111. package/lib/types/bridges.d.ts +2 -2
  112. package/lib/types/client/credentials/changes.d.ts +9 -0
  113. package/lib/types/client/credentials/create-datasource.d.ts +7 -0
  114. package/lib/types/client/credentials/credential-draft.d.ts +14 -0
  115. package/lib/types/client/credentials/defaults.d.ts +2 -0
  116. package/lib/types/client/credentials/descriptions.d.ts +1 -0
  117. package/lib/types/client/credentials/install.d.ts +19 -0
  118. package/lib/types/client/credentials/model.d.ts +79 -0
  119. package/lib/types/client/credentials/report-publishing.d.ts +5 -0
  120. package/lib/types/client/credentials/styles.d.ts +1 -0
  121. package/lib/types/client/i18n/context.d.ts +17 -0
  122. package/lib/types/client/i18n/copy.d.ts +806 -0
  123. package/lib/types/client/i18n/credentials.d.ts +475 -0
  124. package/lib/types/client/i18n/host.d.ts +16 -0
  125. package/lib/types/client/i18n/navigation.d.ts +41 -0
  126. package/lib/types/client/i18n/presentation.d.ts +577 -0
  127. package/lib/types/client/i18n/python.d.ts +19 -0
  128. package/lib/types/client/i18n/semantic.d.ts +441 -0
  129. package/lib/types/client/input-context.d.ts +19 -0
  130. package/lib/types/client/presentation/ask-dsh.d.ts +5 -0
  131. package/lib/types/client/presentation/catalog-model.d.ts +24 -0
  132. package/lib/types/client/presentation/catalog.d.ts +20 -0
  133. package/lib/types/client/presentation/chart-explorer.d.ts +12 -0
  134. package/lib/types/client/presentation/chart-geometry.d.ts +30 -0
  135. package/lib/types/client/presentation/chart-renderer.d.ts +10 -0
  136. package/lib/types/client/presentation/chart-specials.d.ts +10 -0
  137. package/lib/types/client/presentation/chart-styles.d.ts +1 -0
  138. package/lib/types/client/presentation/chart-tooltip.d.ts +13 -0
  139. package/lib/types/client/presentation/chart-view.d.ts +23 -0
  140. package/lib/types/client/presentation/context-reference.d.ts +12 -0
  141. package/lib/types/client/presentation/copy-context.d.ts +5 -0
  142. package/lib/types/client/presentation/delivery-model.d.ts +75 -0
  143. package/lib/types/client/presentation/delivery.d.ts +78 -0
  144. package/lib/types/client/presentation/download.d.ts +2 -0
  145. package/lib/types/client/presentation/editor-controls.d.ts +12 -0
  146. package/lib/types/client/presentation/export-menu.d.ts +26 -0
  147. package/lib/types/client/presentation/export-view.d.ts +63 -0
  148. package/lib/types/client/presentation/global-filters.d.ts +6 -0
  149. package/lib/types/client/presentation/host-entry.d.ts +18 -0
  150. package/lib/types/client/presentation/icons.d.ts +4 -0
  151. package/lib/types/client/presentation/markdown.d.ts +5 -0
  152. package/lib/types/client/presentation/model.d.ts +61 -0
  153. package/lib/types/client/presentation/reader.d.ts +24 -0
  154. package/lib/types/client/presentation/reference-source.d.ts +9 -0
  155. package/lib/types/client/presentation/source-code-model.d.ts +17 -0
  156. package/lib/types/client/presentation/source-code.d.ts +6 -0
  157. package/lib/types/client/presentation/source-dialog.d.ts +12 -0
  158. package/lib/types/client/presentation/source-facts.d.ts +20 -0
  159. package/lib/types/client/presentation/source-format.d.ts +5 -0
  160. package/lib/types/client/presentation/source-highlight.d.ts +7 -0
  161. package/lib/types/client/presentation/sources.d.ts +13 -0
  162. package/lib/types/client/presentation/styles.d.ts +1 -0
  163. package/lib/types/client/presentation/table.d.ts +16 -0
  164. package/lib/types/client/presentation/use-element-width.d.ts +5 -0
  165. package/lib/types/client/python-tool/card.d.ts +2 -0
  166. package/lib/types/client/python-tool/execution-error.d.ts +3 -0
  167. package/lib/types/client/python-tool/install.d.ts +2 -0
  168. package/lib/types/client/python-tool/model.d.ts +20 -0
  169. package/lib/types/client/right-tabs/install.d.ts +18 -0
  170. package/lib/types/client/right-tabs/live-delivery.d.ts +8 -0
  171. package/lib/types/client/right-tabs/navigation.d.ts +17 -0
  172. package/lib/types/client/right-tabs/page.d.ts +36 -0
  173. package/lib/types/client/right-tabs/styles.d.ts +2 -0
  174. package/lib/types/client/rpc.d.ts +3 -0
  175. package/lib/types/client/semantic-reference.d.ts +4 -0
  176. package/lib/types/client/workspace-header-action.d.ts +7 -0
  177. package/lib/types/client/workspace-shortcuts.d.ts +15 -0
  178. package/lib/types/client.d.ts +9 -124
  179. package/lib/types/compatibility.d.ts +3 -3
  180. package/lib/types/datasource/authoring.d.ts +35 -0
  181. package/lib/types/datasource/bridge.d.ts +43 -4
  182. package/lib/types/datasource/changes-contract.d.ts +18 -0
  183. package/lib/types/datasource/changes.d.ts +15 -0
  184. package/lib/types/datasource/configure.d.ts +7 -0
  185. package/lib/types/datasource/defaults.d.ts +7 -0
  186. package/lib/types/datasource/index.d.ts +8 -5
  187. package/lib/types/datasource/python-options.d.ts +9 -0
  188. package/lib/types/datasource/python.d.ts +19 -0
  189. package/lib/types/datasource/resolver-program.d.ts +6 -0
  190. package/lib/types/datasource/rpc.d.ts +5 -0
  191. package/lib/types/datasource/service.d.ts +155 -0
  192. package/lib/types/datasource/shell-env.d.ts +0 -29
  193. package/lib/types/datasource/test.d.ts +6 -29
  194. package/lib/types/disclosure/activation.d.ts +2 -1
  195. package/lib/types/disclosure/execution-guidance.d.ts +6 -0
  196. package/lib/types/disclosure/help.d.ts +1 -1
  197. package/lib/types/environment/binding.d.ts +5 -1
  198. package/lib/types/environment/errors.d.ts +1 -1
  199. package/lib/types/environment/runtime.d.ts +5 -5
  200. package/lib/types/environment/types.d.ts +15 -3
  201. package/lib/types/environment/workspace.d.ts +1 -0
  202. package/lib/types/index.d.ts +1 -1
  203. package/lib/types/lifecycle.d.ts +8 -0
  204. package/lib/types/plugin-agents.d.ts +27 -0
  205. package/lib/types/plugin.d.ts +14 -24
  206. package/lib/types/presentation/asset.d.ts +6 -0
  207. package/lib/types/presentation/build/index.d.ts +16 -0
  208. package/lib/types/presentation/commit.d.ts +4 -0
  209. package/lib/types/presentation/contracts/asset-path.d.ts +2 -0
  210. package/lib/types/presentation/contracts/catalog.d.ts +27 -0
  211. package/lib/types/presentation/contracts/charts.d.ts +11 -0
  212. package/lib/types/presentation/contracts/editing.d.ts +8 -0
  213. package/lib/types/presentation/contracts/index.d.ts +11 -0
  214. package/lib/types/presentation/contracts/interaction.d.ts +8 -0
  215. package/lib/types/presentation/contracts/types.d.ts +255 -0
  216. package/lib/types/presentation/contracts/values.d.ts +9 -0
  217. package/lib/types/presentation/delivery.d.ts +3 -0
  218. package/lib/types/presentation/export-html.d.ts +13 -0
  219. package/lib/types/presentation/files.d.ts +7 -0
  220. package/lib/types/presentation/index.d.ts +6 -0
  221. package/lib/types/presentation/lint.d.ts +13 -0
  222. package/lib/types/presentation/projection/files.d.ts +2 -0
  223. package/lib/types/presentation/projection/index.d.ts +20 -0
  224. package/lib/types/presentation/projection/program.d.ts +2 -0
  225. package/lib/types/presentation/projection/sql-code.d.ts +2 -0
  226. package/lib/types/presentation/receipt.d.ts +14 -0
  227. package/lib/types/presentation/reports.d.ts +10 -0
  228. package/lib/types/presentation/rpc.d.ts +25 -0
  229. package/lib/types/presentation/tool.d.ts +12 -0
  230. package/lib/types/python-execution-contracts.d.ts +10 -0
  231. package/lib/types/python-execution.d.ts +10 -0
  232. package/lib/types/report-publishing/adapters.d.ts +6 -0
  233. package/lib/types/report-publishing/config.d.ts +22 -0
  234. package/lib/types/report-publishing/service.d.ts +68 -0
  235. package/lib/types/rpc.d.ts +3 -0
  236. package/lib/types/semantic-browser/contracts.d.ts +47 -0
  237. package/lib/types/semantic-browser/definition.d.ts +20 -0
  238. package/lib/types/semantic-browser/program.d.ts +2 -0
  239. package/lib/types/semantic-browser/service.d.ts +26 -0
  240. package/lib/types/semantic-reference/bridge.d.ts +12 -0
  241. package/lib/types/semantic-reference/contracts.d.ts +54 -0
  242. package/lib/types/semantic-reference/environment.d.ts +22 -0
  243. package/lib/types/semantic-reference/index.d.ts +3 -0
  244. package/lib/types/semantic-reference/labels.d.ts +16 -0
  245. package/lib/types/semantic-reference/rpc.d.ts +15 -0
  246. package/lib/types/semantic-reference/search.d.ts +10 -0
  247. package/lib/types/semantic-reference/usage.d.ts +43 -0
  248. package/lib/types/tool-lifecycle.d.ts +4 -0
  249. package/lib/types/workspace-identity.d.ts +6 -0
  250. package/lib/workspace-identity.js +9 -0
  251. package/package.json +99 -53
  252. package/python/presentation-kit/dist/dsh_data_analysis_presentation_kit-1.1.0-py3-none-any.whl +0 -0
  253. package/skills/dsh-data-analysis-files/SKILL.md +32 -0
  254. package/skills/dsh-data-analysis-files/references/examples.md +93 -0
  255. package/skills/dsh-data-analysis-presentation/SKILL.md +28 -0
  256. package/skills/dsh-data-analysis-presentation/references/chart-examples.md +18 -0
  257. package/skills/dsh-data-analysis-presentation/references/charts.md +55 -0
  258. package/skills/dsh-data-analysis-presentation/references/examples/artifact.draft.json +36 -0
  259. package/skills/dsh-data-analysis-presentation/references/examples/charts-bins.dataset.json +33 -0
  260. package/skills/dsh-data-analysis-presentation/references/examples/charts-boxes.dataset.json +45 -0
  261. package/skills/dsh-data-analysis-presentation/references/examples/charts-composition.dataset.json +33 -0
  262. package/skills/dsh-data-analysis-presentation/references/examples/charts-funnel.dataset.json +27 -0
  263. package/skills/dsh-data-analysis-presentation/references/examples/charts-precision.dataset.json +21 -0
  264. package/skills/dsh-data-analysis-presentation/references/examples/charts-series.dataset.json +58 -0
  265. package/skills/dsh-data-analysis-presentation/references/examples/charts-shares.dataset.json +33 -0
  266. package/skills/dsh-data-analysis-presentation/references/examples/charts-waterfall.dataset.json +44 -0
  267. package/skills/dsh-data-analysis-presentation/references/examples/charts.draft.json +393 -0
  268. package/skills/dsh-data-analysis-presentation/references/examples/comparison-selected.dataset.json +24 -0
  269. package/skills/dsh-data-analysis-presentation/references/examples/comparison-summary.dataset.json +22 -0
  270. package/skills/dsh-data-analysis-presentation/references/examples/comparison.dataset.json +18 -0
  271. package/skills/dsh-data-analysis-presentation/references/examples/comparison.draft.json +80 -0
  272. package/skills/dsh-data-analysis-presentation/references/examples/computed-sources.draft.json +42 -0
  273. package/skills/dsh-data-analysis-presentation/references/examples/computed.dataset.json +12 -0
  274. package/skills/dsh-data-analysis-presentation/references/examples/computed.draft.json +58 -0
  275. package/skills/dsh-data-analysis-presentation/references/examples/interaction-detail.dataset.json +30 -0
  276. package/skills/dsh-data-analysis-presentation/references/examples/interaction-summary.dataset.json +22 -0
  277. package/skills/dsh-data-analysis-presentation/references/examples/interaction.draft.json +279 -0
  278. package/skills/dsh-data-analysis-presentation/references/examples/source-only.draft.json +27 -0
  279. package/skills/dsh-data-analysis-presentation/references/examples/write-charts.py +73 -0
  280. package/skills/dsh-data-analysis-presentation/references/examples/write-comparison.py +42 -0
  281. package/skills/dsh-data-analysis-presentation/references/examples/write-computed.py +21 -0
  282. package/skills/dsh-data-analysis-presentation/references/examples/write-interaction.py +33 -0
  283. package/skills/dsh-data-analysis-presentation/references/examples.md +44 -0
  284. package/skills/dsh-data-analysis-presentation/references/export-html.md +7 -0
  285. package/skills/dsh-data-analysis-presentation/references/interaction.md +56 -0
  286. package/skills/dsh-data-analysis-presentation/references/narrative.md +37 -0
  287. package/skills/dsh-data-analysis-presentation/references/publishing.md +3 -0
  288. package/skills/dsh-data-analysis-presentation/references/schema.md +162 -0
  289. package/lib/datasource/access.js +0 -60
  290. package/lib/datasource/credentials.js +0 -24
  291. package/lib/evidence/bridge-program.js +0 -153
  292. package/lib/evidence/bridge.js +0 -166
  293. package/lib/evidence/index.js +0 -2
  294. package/lib/evidence/sources.js +0 -263
  295. package/lib/types/datasource/access.d.ts +0 -27
  296. package/lib/types/evidence/bridge.d.ts +0 -40
  297. package/lib/types/evidence/index.d.ts +0 -4
  298. package/lib/types/evidence/sources.d.ts +0 -57
  299. package/python/report-kit/dist/dsh_data_analysis_report_kit-3.0.0-py3-none-any.whl +0 -0
  300. package/skills/dsh-data-analysis-report/SKILL.md +0 -57
  301. package/skills/dsh-data-analysis-report/assets/marivo-artifact.js +0 -113
  302. package/skills/dsh-data-analysis-report/assets/marivo-session-dag.js +0 -1201
  303. package/skills/dsh-data-analysis-report/assets/report-data.js +0 -449
@@ -0,0 +1,12 @@
1
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import { type ChartExploration } from './chart-view.ts';
3
+ import type { TableSort } from './export-view.ts';
4
+ export declare const PRESENTATION_CONTEXT_BYTES: number;
5
+ export interface PresentationContext {
6
+ label: string;
7
+ context: string;
8
+ }
9
+ /** Display only; the context retains the exact Cell ID, even for duplicate labels. */
10
+ export declare function presentationCellLabel(block: PresentationBlock): string;
11
+ export declare function wrapPresentationContext(context: string, separator?: string): string;
12
+ export declare function followUpContext(document: PresentationDocument, block: PresentationBlock, exploration?: ChartExploration, selection?: Record<string, string>, tableSort?: TableSort): string;
@@ -0,0 +1,5 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function CopyContext({ getText, children, }: {
3
+ getText: () => string;
4
+ children: (copy: (restoreFocusTo: HTMLElement) => void) => ReactNode;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,75 @@
1
+ export { savePresentationHtml } from './download.ts';
2
+ import { type ReportHistory } from '../../presentation/contracts/catalog.ts';
3
+ import { type PresentationEdits } from '../../presentation/contracts/editing.ts';
4
+ import { type PresentationDocument, type PresentationReceipt } from '../../presentation/contracts/index.ts';
5
+ import { type PresentationDelivery } from '../../presentation/receipt.ts';
6
+ export interface PresentationRpc {
7
+ call(channel: string, endpoint: string, payload: unknown, signal: AbortSignal): Promise<unknown>;
8
+ }
9
+ export type PresentationAsset = 'presentation.json' | 'index.html';
10
+ export interface WorkspaceReportTarget {
11
+ workspaceId: string;
12
+ reportId: string;
13
+ }
14
+ export interface PresentationDeliveryState {
15
+ readonly publishingConfigId?: string;
16
+ readonly publishingName?: string;
17
+ readonly publishingUnavailable?: boolean;
18
+ readonly publishingLoading?: boolean;
19
+ readonly publicationUrl?: string;
20
+ readonly reportTarget?: WorkspaceReportTarget;
21
+ readonly history?: ReportHistory;
22
+ readonly historyOpen?: boolean;
23
+ readonly historyLoading?: boolean;
24
+ readonly historyError?: string;
25
+ readonly historical?: boolean;
26
+ readonly resolvedReceipt?: PresentationReceipt;
27
+ readonly editing?: {
28
+ edits: PresentationEdits;
29
+ undo: PresentationEdits[];
30
+ redo: PresentationEdits[];
31
+ };
32
+ readonly saving?: boolean;
33
+ readonly editError?: string;
34
+ readonly open: boolean;
35
+ readonly delivery?: PresentationDelivery;
36
+ readonly loading: boolean;
37
+ readonly downloading: boolean;
38
+ readonly document?: PresentationDocument;
39
+ readonly error?: string;
40
+ readonly downloadError?: string;
41
+ readonly notice?: string;
42
+ }
43
+ export type SavePresentationHtml = (bytes: Uint8Array, filename: string) => void;
44
+ /** Check the exact receipt-bound bytes before either parsing JSON or downloading HTML. */
45
+ export declare function verifyPresentationAsset(value: unknown, receipt: PresentationReceipt, asset: PresentationAsset): Promise<Uint8Array>;
46
+ export declare function errorMessage(error: unknown): string;
47
+ /** Host file actions and editor state; never an Agent or data-source execution path. */
48
+ export declare class PresentationDeliveryModel {
49
+ #private;
50
+ constructor(rpc: PresentationRpc, save?: SavePresentationHtml);
51
+ getSnapshot: () => PresentationDeliveryState;
52
+ subscribe: (listener: () => void) => () => void;
53
+ show(delivery: PresentationDelivery, sessionId: string, workspaceId: string): Promise<void>;
54
+ showReport(workspaceId: string, reportId: string): Promise<void>;
55
+ /** Open a fixed published Build without first displaying the current pointer. */
56
+ showBuild(workspaceId: string, reportId: string, buildId: string): Promise<void>;
57
+ get dirty(): boolean;
58
+ /** Recheck the current pointer without replacing the displayed document or its view state. */
59
+ beginCurrentEdit(validate?: () => void): Promise<void>;
60
+ beginEdit(): void;
61
+ changeEdits(edits: PresentationEdits): void;
62
+ undoEdit(): void;
63
+ redoEdit(): void;
64
+ cancelEdit(): void;
65
+ saveEdit(): Promise<void>;
66
+ download(delivery: PresentationDelivery, sessionId: string, workspaceId: string, displayed?: boolean): Promise<void>;
67
+ publishDisplayed(viewBytes?: Uint8Array): Promise<void>;
68
+ downloadDisplayed(): Promise<void>;
69
+ toggleHistory(refresh?: boolean): Promise<void>;
70
+ selectVersion(buildId?: string): Promise<void>;
71
+ unavailable(message?: string): void;
72
+ close(): void;
73
+ resetConnection(): void;
74
+ dispose(): void;
75
+ }
@@ -0,0 +1,78 @@
1
+ import type { ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ import type { ConversationNodeContext } from '@deepseek-ai/dsh-client-ui-conversation/client';
3
+ import { type PresentationDelivery } from '../../presentation/receipt.ts';
4
+ export declare const PRESENTATION_TURN_DATA_KEY = "marivo-presentation-delivery";
5
+ export interface PresentationTurnDelivery {
6
+ readonly seq: number;
7
+ readonly delivery: PresentationDelivery;
8
+ }
9
+ export interface PresentationTurnData {
10
+ readonly deliveries: readonly PresentationTurnDelivery[];
11
+ }
12
+ interface PresentationTurnState extends PresentationTurnData {
13
+ readonly turn: number;
14
+ readonly calls: ReadonlyMap<string, string>;
15
+ }
16
+ declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
17
+ interface ConversationTurnDataMap {
18
+ 'marivo-presentation-delivery': PresentationTurnData;
19
+ }
20
+ }
21
+ declare module '@deepseek-ai/dsh-client-ui-chat/client' {
22
+ interface ChatNodeDataMap {
23
+ 'marivo-presentation-delivery': PresentationTurnData;
24
+ }
25
+ }
26
+ export declare function presentationDeliveryIdentity(delivery: PresentationDelivery): string;
27
+ /** Code Mode carries the same envelope as Native metadata, inside one durable block. */
28
+ export declare function parsePresentationDurableContent(value: unknown): PresentationDelivery | null;
29
+ /** Calls are collected only from this Harness-owned Turn, including the Code root call. */
30
+ export declare function presentationDeliveryFromEvent(value: unknown, calls: ReadonlyMap<string, string>, turn: number): PresentationTurnDelivery | null;
31
+ export declare const marivoPresentationDeliveryDefinition: {
32
+ kind: string;
33
+ target: string;
34
+ match(value: unknown): {
35
+ id: string;
36
+ role: "update" | "start";
37
+ } | null;
38
+ start(_context: unknown, match: {
39
+ event: any;
40
+ }): PresentationTurnState;
41
+ update(context: {
42
+ state: PresentationTurnState;
43
+ }, match: {
44
+ event: any;
45
+ }): PresentationTurnState;
46
+ buildLocationData(context: {
47
+ state?: PresentationTurnState;
48
+ }, scope: string): {
49
+ kind: "turn";
50
+ turn: number;
51
+ key: "marivo-presentation-delivery";
52
+ value: Readonly<{
53
+ deliveries: readonly PresentationTurnDelivery[];
54
+ }>;
55
+ } | null;
56
+ buildViewNode(context: ConversationNodeContext<PresentationTurnState>): {
57
+ key: string;
58
+ id: string;
59
+ kind: string;
60
+ target: "chat";
61
+ anchorSeq: number;
62
+ location: {
63
+ readonly kind: "turn";
64
+ readonly turn: import("@deepseek-ai/dsh-client-ui-conversation/client").TurnLocation;
65
+ } | {
66
+ readonly kind: "step";
67
+ readonly turn: import("@deepseek-ai/dsh-client-ui-conversation/client").TurnLocation;
68
+ readonly step: import("@deepseek-ai/dsh-client-ui-conversation/client").StepLocation;
69
+ };
70
+ visibility: "visible";
71
+ data: Readonly<{
72
+ deliveries: readonly PresentationTurnDelivery[];
73
+ }>;
74
+ } | null;
75
+ };
76
+ /** Session identity comes from the Host's keyed Chat slot, never from an event field. */
77
+ export declare function presentationsForNode(node: ChatConversationViewNode, sessionId: string): PresentationDelivery[];
78
+ export {};
@@ -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,12 @@
1
+ import type { PresentationEdits } from '../../presentation/contracts/editing.ts';
2
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
3
+ export interface ReaderEditing {
4
+ edits: PresentationEdits;
5
+ onChange: (edits: PresentationEdits) => void;
6
+ disabled?: boolean;
7
+ }
8
+ export declare function CellEditor({ block, document, editing, }: {
9
+ block: PresentationBlock;
10
+ document: PresentationDocument;
11
+ editing: ReaderEditing;
12
+ }): import("react").JSX.Element;
@@ -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
+ };
@@ -0,0 +1,6 @@
1
+ import type { PresentationInteraction } from '../../presentation/contracts/types.ts';
2
+ export declare function GlobalFilterControls({ interaction, selection, onChange, }: {
3
+ interaction: PresentationInteraction;
4
+ selection: Record<string, string>;
5
+ onChange: (selection: Record<string, string>) => void;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { PresentationDocument } from '../../presentation/contracts/types.ts';
3
+ import type { PresentationContext } from './context-reference.ts';
4
+ import type { ReaderEditing } from './editor-controls.tsx';
5
+ import type { ReaderExportActions } from './export-menu.tsx';
6
+ import { type ReaderViewMemory } from './reader.tsx';
7
+ import type { OpenSemanticRef } from './source-facts.ts';
8
+ /** Host integrations supply only outer actions; document interpretation stays shared. */
9
+ export declare function HostPresentationReader({ document, actions, editing, onOpenSemanticRef, onAskDsh, exportActions, viewMemory, closeSourceOnNavigate, }: {
10
+ document: PresentationDocument;
11
+ editing?: ReaderEditing;
12
+ actions?: ReactNode;
13
+ onOpenSemanticRef?: OpenSemanticRef;
14
+ onAskDsh?: (context: PresentationContext) => void;
15
+ exportActions?: ReaderExportActions;
16
+ viewMemory?: ReaderViewMemory;
17
+ closeSourceOnNavigate?: boolean;
18
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
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
+ export declare function CloseIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export declare function safeMarkdownHref(value: string): string | undefined;
2
+ export declare function Markdown({ text, depth }: {
3
+ text: string;
4
+ depth?: number;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,61 @@
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';
3
+ export type ReaderMode = 'interactive' | 'static';
4
+ export type ChartBlock = Extract<PresentationBlock, {
5
+ kind: 'chart';
6
+ }>;
7
+ export type MetricBlock = Extract<PresentationBlock, {
8
+ kind: 'metric';
9
+ }>;
10
+ export declare const TABLE_PAGE_SIZE = 20;
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;
15
+ /** A stable explicit timezone keeps portable and Host metadata equally readable. */
16
+ export declare function snapshotDate(locale: PresentationLocale, value: string): string;
17
+ export declare function columnLabel(column: DatasetColumn): string;
18
+ /** Axis labels are compact coordinates; tooltips and tables retain exact source text. */
19
+ export declare function formatAxisTick(locale: PresentationLocale, value: number): string;
20
+ export declare function formatCategoryTick(value: string): string;
21
+ export declare function datasetById(document: PresentationDocument, id: string): DocumentDataset;
22
+ export declare function columnIndex(dataset: TypedDataset, id: string): number;
23
+ export declare function selectMetric(locale: PresentationLocale, dataset: TypedDataset, block: MetricBlock, rowIndices?: readonly number[]): {
24
+ column: DatasetColumn;
25
+ value: string | number | boolean;
26
+ comparisons: {
27
+ label: string;
28
+ reference: {
29
+ value: string | number | boolean;
30
+ sign: number | undefined;
31
+ text: string;
32
+ } | undefined;
33
+ delta: {
34
+ value: string | number | boolean;
35
+ sign: number | undefined;
36
+ text: string;
37
+ } | undefined;
38
+ relative: {
39
+ value: string | number | boolean;
40
+ sign: number | undefined;
41
+ text: string;
42
+ } | undefined;
43
+ sign: number | undefined;
44
+ tone: string;
45
+ }[];
46
+ };
47
+ export declare function compareDecimalText(first: string, second: string): number;
48
+ export declare function sortedRowIndices(locale: PresentationLocale, dataset: TypedDataset, sort?: {
49
+ columnId: string;
50
+ direction: 'ascending' | 'descending';
51
+ }): number[];
52
+ export declare function datasetScope(locale: PresentationLocale, dataset: TypedDataset): string;
53
+ export interface ChartRow {
54
+ rowIndex: number;
55
+ xLabel: string;
56
+ [key: string]: number | string | null;
57
+ }
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;
60
+ export declare function selectedSources(document: PresentationDocument, ids: string[]): SourceSnapshot[];
61
+ export { followUpContext } from './context-reference.ts';
@@ -0,0 +1,24 @@
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';
4
+ import { type ReaderEditing } from './editor-controls.tsx';
5
+ import { type ReaderExportActions } from './export-menu.tsx';
6
+ import { type TableSort } from './export-view.ts';
7
+ import { type ReaderMode } from './model.ts';
8
+ import type { OpenSemanticRef } from './source-facts.ts';
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, }: {
16
+ document: PresentationDocument;
17
+ mode?: ReaderMode;
18
+ editing?: ReaderEditing;
19
+ onOpenSemanticRef?: OpenSemanticRef;
20
+ onAskDsh?: (context: PresentationContext) => void;
21
+ exportActions?: ReaderExportActions;
22
+ viewMemory?: ReaderViewMemory;
23
+ closeSourceOnNavigate?: boolean;
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;
@@ -0,0 +1,17 @@
1
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import { type Notice } from './../i18n/copy.ts';
3
+ export type SourceTab = 'overview' | 'preview' | 'code';
4
+ export declare function sourceTabs(hasDataset: boolean): SourceTab[];
5
+ export declare function sourceTabForKey(tabs: readonly SourceTab[], current: SourceTab, key: string): SourceTab | undefined;
6
+ interface CodeEntry {
7
+ key: string;
8
+ language: 'python' | 'sql';
9
+ text: string;
10
+ authorAssociated: boolean;
11
+ }
12
+ /** Read only the selected cell binding; prepared views are separate, unselected bindings. */
13
+ export declare function sourceCodeFacts(document: PresentationDocument, block?: PresentationBlock): {
14
+ entries: CodeEntry[];
15
+ notices: Notice[];
16
+ };
17
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ export declare function SourceCode({ document, block, interactive, }: {
3
+ document: PresentationDocument;
4
+ block?: PresentationBlock;
5
+ interactive?: boolean;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import type { PresentationBlock, PresentationDocument } from '../../presentation/contracts/types.ts';
2
+ import type { OpenSemanticRef } from './source-facts.ts';
3
+ export declare function SourceDialog({ document, block, onClose, restoreFocusTo, rowIndices, filterKey, filterSummary, onOpenSemanticRef, }: {
4
+ document: PresentationDocument;
5
+ block: PresentationBlock;
6
+ onClose: () => void;
7
+ restoreFocusTo?: HTMLElement | null;
8
+ rowIndices?: readonly number[];
9
+ filterKey?: string;
10
+ filterSummary?: string;
11
+ onOpenSemanticRef?: OpenSemanticRef;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import type { SourceSnapshot } from '../../presentation/contracts/types.ts';
2
+ import { type SemanticRef } from '../../semantic-reference/contracts.ts';
3
+ export type OpenSemanticRef = (ref: SemanticRef) => void;
4
+ export declare function sourceSemanticRef(kind: string, path: string): SemanticRef | undefined;
5
+ interface SemanticGroup {
6
+ kind: string;
7
+ paths: string[];
8
+ }
9
+ /** Read only the fields already projected into the saved source snapshot. */
10
+ export declare function sourceOverviewFacts(source: SourceSnapshot): {
11
+ createdAt: string | undefined;
12
+ semanticGroups: SemanticGroup[];
13
+ issues: {
14
+ kind: string;
15
+ severity?: string;
16
+ }[];
17
+ notices: string[];
18
+ };
19
+ export declare function semanticKindLabel(kind: string): string;
20
+ export {};
@@ -0,0 +1,5 @@
1
+ /** Presentation-only formatting; never execute code or change the saved snapshot. */
2
+ export declare function formatSource(text: string, language: 'python' | 'sql'): {
3
+ text: string;
4
+ formatted: boolean;
5
+ };
@@ -0,0 +1,7 @@
1
+ export interface SourceToken {
2
+ text: string;
3
+ offset: number;
4
+ color?: string;
5
+ }
6
+ /** Local, synchronous highlighting also works in the scripts-disabled HTML fallback. */
7
+ export declare function highlightSource(text: string, language: 'python' | 'sql'): SourceToken[];
@@ -0,0 +1,13 @@
1
+ import type { PresentationBlock, PresentationDocument, SourceSnapshot } from '../../presentation/contracts/types.ts';
2
+ import { type OpenSemanticRef } from './source-facts.ts';
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;
9
+ export declare function SourceOverview({ document, block, onOpenSemanticRef, }: {
10
+ document: PresentationDocument;
11
+ block?: PresentationBlock;
12
+ onOpenSemanticRef?: OpenSemanticRef;
13
+ }): import("react").JSX.Element;
@@ -0,0 +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-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";
@@ -0,0 +1,16 @@
1
+ import type { TypedDataset } from '../../presentation/contracts/types.ts';
2
+ import type { TableSort } from './export-view.ts';
3
+ import { type ReaderMode } from './model.ts';
4
+ export declare function DatasetTable({ data, columns, mode, caption, hideCaption, showScope, showSelectionCount, rowIndices, filterKey, sort: controlledSort, onSortChange, }: {
5
+ data: TypedDataset;
6
+ columns?: string[];
7
+ mode: ReaderMode;
8
+ caption: string;
9
+ hideCaption?: boolean;
10
+ showScope?: boolean;
11
+ showSelectionCount?: boolean;
12
+ rowIndices?: readonly number[];
13
+ filterKey?: string;
14
+ sort?: TableSort;
15
+ onSortChange?: (sort: TableSort) => void;
16
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ /** Measure the containing block, retaining its last usable width while it is hidden. */
2
+ export declare function useElementWidth(minimum: number, initial: number): {
3
+ ref: import("react").RefObject<HTMLDivElement>;
4
+ width: number;
5
+ };
@@ -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
+ };