@puredesktop/puredesktop-ui-bridge 1.0.0-beta.1

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 (412) hide show
  1. package/package.json +96 -0
  2. package/src/agents/runtime/agentLiveReducer.test.ts +72 -0
  3. package/src/agents/runtime/agentLiveReducer.ts +139 -0
  4. package/src/agents/runtime/agentRunEventTypes.ts +115 -0
  5. package/src/agents/runtime/contextWindowUsage.test.ts +38 -0
  6. package/src/agents/runtime/contextWindowUsage.ts +25 -0
  7. package/src/agents/runtime/index.ts +24 -0
  8. package/src/agents/runtime/mapAgentMessages.ts +54 -0
  9. package/src/agents/runtime/mapAgentSnapshot.ts +71 -0
  10. package/src/agents/runtime/mergeUsageTurn.ts +23 -0
  11. package/src/agents/runtime/pendingToolCalls.test.ts +85 -0
  12. package/src/agents/runtime/pendingToolCalls.ts +14 -0
  13. package/src/agents/runtime/toolRequiresApproval.ts +20 -0
  14. package/src/agents/runtime/unresolvedToolCalls.ts +42 -0
  15. package/src/bridge/agentModelTiers.ts +50 -0
  16. package/src/bridge/agentToolHandlers.ts +23 -0
  17. package/src/bridge/agentToolHelpers.test.ts +27 -0
  18. package/src/bridge/agentToolHelpers.ts +20 -0
  19. package/src/bridge/agentTypes.ts +294 -0
  20. package/src/bridge/agents.d.mts +113 -0
  21. package/src/bridge/agents.mjs +233 -0
  22. package/src/bridge/agents.ts +62 -0
  23. package/src/bridge/appSettings.d.mts +9 -0
  24. package/src/bridge/appSettings.mjs +18 -0
  25. package/src/bridge/appSettings.ts +4 -0
  26. package/src/bridge/applyThemeFromHost.d.mts +7 -0
  27. package/src/bridge/applyThemeFromHost.mjs +33 -0
  28. package/src/bridge/assets.d.mts +66 -0
  29. package/src/bridge/assets.mjs +121 -0
  30. package/src/bridge/catalog.d.mts +5 -0
  31. package/src/bridge/catalog.mjs +24 -0
  32. package/src/bridge/catalog.ts +1 -0
  33. package/src/bridge/client.d.mts +19 -0
  34. package/src/bridge/client.mjs +147 -0
  35. package/src/bridge/collectionAssetAdapter.ts +63 -0
  36. package/src/bridge/collectionAssets.d.mts +1 -0
  37. package/src/bridge/collectionAssets.mjs +2 -0
  38. package/src/bridge/collectionAssets.ts +1 -0
  39. package/src/bridge/collectionDocumentHtml.test.ts +71 -0
  40. package/src/bridge/collectionDocumentHtml.ts +118 -0
  41. package/src/bridge/collectionImagePaste.test.ts +32 -0
  42. package/src/bridge/collectionImagePaste.ts +130 -0
  43. package/src/bridge/context.mjs +12 -0
  44. package/src/bridge/credentials.mjs +22 -0
  45. package/src/bridge/dialog.d.mts +5 -0
  46. package/src/bridge/dialog.mjs +13 -0
  47. package/src/bridge/events.d.mts +14 -0
  48. package/src/bridge/events.mjs +12 -0
  49. package/src/bridge/filePreviewKind.test.ts +43 -0
  50. package/src/bridge/filePreviewKind.ts +76 -0
  51. package/src/bridge/fs.d.mts +41 -0
  52. package/src/bridge/fs.mjs +82 -0
  53. package/src/bridge/fs.test.ts +16 -0
  54. package/src/bridge/fs.ts +10 -0
  55. package/src/bridge/index.ts +12 -0
  56. package/src/bridge/inlinePreview.d.mts +35 -0
  57. package/src/bridge/inlinePreview.mjs +99 -0
  58. package/src/bridge/inlinePreview.test.ts +56 -0
  59. package/src/bridge/inlinePreview.ts +13 -0
  60. package/src/bridge/methods.d.mts +115 -0
  61. package/src/bridge/methods.mjs +132 -0
  62. package/src/bridge/os.d.mts +11 -0
  63. package/src/bridge/os.mjs +26 -0
  64. package/src/bridge/plugins.d.mts +9 -0
  65. package/src/bridge/plugins.mjs +31 -0
  66. package/src/bridge/plugins.ts +5 -0
  67. package/src/bridge/preferences.d.mts +7 -0
  68. package/src/bridge/preferences.mjs +17 -0
  69. package/src/bridge/preferences.ts +13 -0
  70. package/src/bridge/printDocument.test.ts +47 -0
  71. package/src/bridge/printDocument.ts +75 -0
  72. package/src/bridge/pureRender/adapters.test.ts +144 -0
  73. package/src/bridge/pureRender/adapters.ts +175 -0
  74. package/src/bridge/pureRender/assets.test.ts +44 -0
  75. package/src/bridge/pureRender/base.css +76 -0
  76. package/src/bridge/pureRender/compiler.test.ts +279 -0
  77. package/src/bridge/pureRender/compiler.ts +660 -0
  78. package/src/bridge/pureRender/document.test.ts +283 -0
  79. package/src/bridge/pureRender/document.ts +35 -0
  80. package/src/bridge/pureRender/extraction.test.ts +432 -0
  81. package/src/bridge/pureRender/extraction.ts +1023 -0
  82. package/src/bridge/pureRender/flow.css +3 -0
  83. package/src/bridge/pureRender/index.ts +66 -0
  84. package/src/bridge/pureRender/normalize.test.ts +442 -0
  85. package/src/bridge/pureRender/normalize.ts +682 -0
  86. package/src/bridge/pureRender/presets.ts +365 -0
  87. package/src/bridge/pureRender/profiles/book.css +19 -0
  88. package/src/bridge/pureRender/profiles/manuscript.css +11 -0
  89. package/src/bridge/pureRender/profiles/writer.css +10 -0
  90. package/src/bridge/pureRender/reset.css +5 -0
  91. package/src/bridge/pureRender/samples.ts +94 -0
  92. package/src/bridge/pureRender/styles.ts +164 -0
  93. package/src/bridge/pureRender/theme.test.ts +53 -0
  94. package/src/bridge/pureRender/theme.ts +258 -0
  95. package/src/bridge/pureRender/tokens/default.css +36 -0
  96. package/src/bridge/pureRender/tokens/default.json +32 -0
  97. package/src/bridge/pureRender/types.ts +264 -0
  98. package/src/bridge/pureRender/visualLayoutInspection.test.ts +57 -0
  99. package/src/bridge/pureRender/visualLayoutInspection.ts +161 -0
  100. package/src/bridge/react/useDebouncedEffect.ts +21 -0
  101. package/src/bridge/react/useIpc.tsx +75 -0
  102. package/src/bridge/react/usePlatformAgentRunLiveState.tsx +78 -0
  103. package/src/bridge/react/usePlatformAgentSessionDrive.tsx +729 -0
  104. package/src/bridge/react/usePlatformAgentSessions.tsx +60 -0
  105. package/src/bridge/react/usePlatformAgentTools.tsx +82 -0
  106. package/src/bridge/react/usePlatformAppManifest.tsx +32 -0
  107. package/src/bridge/react/usePlatformBridge.tsx +56 -0
  108. package/src/bridge/react/usePlatformDeepLink.tsx +57 -0
  109. package/src/bridge/react/usePlatformFileBinaryDataUrl.tsx +54 -0
  110. package/src/bridge/react/usePlatformFilePreview.tsx +92 -0
  111. package/src/bridge/react/usePlatformPreferences.tsx +77 -0
  112. package/src/bridge/react/usePlatformThemeDocumentAttrs.ts +35 -0
  113. package/src/bridge/react/usePlatformThemeFromBridge.tsx +16 -0
  114. package/src/bridge/react/usePlatformViewportResource.test.tsx +106 -0
  115. package/src/bridge/react/usePlatformViewportResource.tsx +72 -0
  116. package/src/bridge/react/useScheduledTask.tsx +59 -0
  117. package/src/bridge/render.d.mts +31 -0
  118. package/src/bridge/render.mjs +62 -0
  119. package/src/bridge/render.ts +8 -0
  120. package/src/bridge/screenAnnotation.test.ts +103 -0
  121. package/src/bridge/screenAnnotation.ts +269 -0
  122. package/src/bridge/theme.d.mts +3 -0
  123. package/src/bridge/theme.mjs +9 -0
  124. package/src/bridge/types.ts +439 -0
  125. package/src/bridge/watch.d.mts +9 -0
  126. package/src/bridge/watch.mjs +34 -0
  127. package/src/bridge/watch.ts +1 -0
  128. package/src/bridge/window.d.mts +44 -0
  129. package/src/bridge/window.mjs +33 -0
  130. package/src/chrome/index.ts +1 -0
  131. package/src/components/accessibility/AccessibilityReviewDialog.test.tsx +104 -0
  132. package/src/components/accessibility/AccessibilityReviewDialog.tsx +350 -0
  133. package/src/components/accessibility/accessibilityReview.test.ts +101 -0
  134. package/src/components/accessibility/accessibilityReview.ts +639 -0
  135. package/src/components/accessibility/index.ts +16 -0
  136. package/src/components/agent-feedback/ScreenAnnotationAgentDialog.tsx +509 -0
  137. package/src/components/agent-feedback/index.ts +5 -0
  138. package/src/components/agents/AgentComposer.tsx +34 -0
  139. package/src/components/agents/AgentContextUsageBar.tsx +127 -0
  140. package/src/components/agents/AgentDrawerPanel.tsx +82 -0
  141. package/src/components/agents/AgentMarkdown.tsx +12 -0
  142. package/src/components/agents/AgentMessageBubble.tsx +82 -0
  143. package/src/components/agents/AgentMessageList.tsx +47 -0
  144. package/src/components/agents/AgentModelMenu.tsx +55 -0
  145. package/src/components/agents/AgentThinkingBlock.tsx +66 -0
  146. package/src/components/agents/AgentToolApprovalActions.tsx +65 -0
  147. package/src/components/agents/AgentToolCallCard.tsx +26 -0
  148. package/src/components/agents/AgentToolPendingList.tsx +39 -0
  149. package/src/components/agents/AgentToolPendingReview.tsx +118 -0
  150. package/src/components/agents/agentPanelStyles.ts +79 -0
  151. package/src/components/agents/agentTypes.ts +96 -0
  152. package/src/components/agents/formatToolCallArguments.test.ts +16 -0
  153. package/src/components/agents/formatToolCallArguments.ts +9 -0
  154. package/src/components/agents/index.ts +40 -0
  155. package/src/components/assets/AssetLibraryDialog.tsx +5 -0
  156. package/src/components/assets/asset-library/AssetLibraryDialog.tsx +43 -0
  157. package/src/components/assets/asset-library/AssetLibraryWorkspace.tsx +54 -0
  158. package/src/components/assets/asset-library/detail/AssetLibraryDetailActions.tsx +68 -0
  159. package/src/components/assets/asset-library/detail/AssetLibraryDetailHeader.tsx +56 -0
  160. package/src/components/assets/asset-library/detail/AssetLibraryDetailPane.tsx +90 -0
  161. package/src/components/assets/asset-library/detail/AssetLibraryDetailPreview.tsx +67 -0
  162. package/src/components/assets/asset-library/detail/AssetLibraryInlinePreview.tsx +87 -0
  163. package/src/components/assets/asset-library/detail/AssetLibraryInlineSourceField.tsx +29 -0
  164. package/src/components/assets/asset-library/detail/AssetLibraryMetadataFields.tsx +34 -0
  165. package/src/components/assets/asset-library/detail/AssetLibraryUsagePanel.tsx +46 -0
  166. package/src/components/assets/asset-library/detail/AssetLibraryVersionsPanel.tsx +145 -0
  167. package/src/components/assets/asset-library/helpers/assetKind.ts +74 -0
  168. package/src/components/assets/asset-library/helpers.ts +41 -0
  169. package/src/components/assets/asset-library/hooks/useAssetDetailDraft.ts +81 -0
  170. package/src/components/assets/asset-library/hooks/useAssetLibraryDialog.ts +233 -0
  171. package/src/components/assets/asset-library/hooks/useAssetLibraryMutations.ts +266 -0
  172. package/src/components/assets/asset-library/hooks/useAssetLibrarySelectionSync.ts +24 -0
  173. package/src/components/assets/asset-library/hooks/useAssetLibraryVersions.ts +145 -0
  174. package/src/components/assets/asset-library/hooks/useInlineAssetPreview.ts +44 -0
  175. package/src/components/assets/asset-library/index.ts +19 -0
  176. package/src/components/assets/asset-library/layout/assetLibraryLayout.ts +201 -0
  177. package/src/components/assets/asset-library/shared/fieldStyles.ts +62 -0
  178. package/src/components/assets/asset-library/sidebar/AssetLibraryFilterPills.tsx +89 -0
  179. package/src/components/assets/asset-library/sidebar/AssetLibraryList.tsx +91 -0
  180. package/src/components/assets/asset-library/sidebar/AssetLibraryListRow.tsx +99 -0
  181. package/src/components/assets/asset-library/sidebar/AssetLibraryListStatus.tsx +24 -0
  182. package/src/components/assets/asset-library/sidebar/AssetLibrarySidebar.tsx +48 -0
  183. package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarActions.tsx +38 -0
  184. package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarToolbar.tsx +78 -0
  185. package/src/components/assets/asset-library/sidebar/AssetListThumbnail.tsx +86 -0
  186. package/src/components/assets/asset-library/types.ts +128 -0
  187. package/src/components/assets/asset-library/utils/assetLibraryUtils.ts +181 -0
  188. package/src/components/assets/asset-library/utils/pathBasename.ts +5 -0
  189. package/src/components/assets/asset-library/utils/sanitizeUploadFileName.ts +7 -0
  190. package/src/components/assets/asset-library/utils/uploadCollectionAsset.ts +52 -0
  191. package/src/components/chrome/OverlayActionCapsule.test.tsx +82 -0
  192. package/src/components/chrome/OverlayActionCapsule.tsx +90 -0
  193. package/src/components/chrome/PanelTabStrip.tsx +113 -0
  194. package/src/components/chrome/PlatformIcon.tsx +27 -0
  195. package/src/components/chrome/PureAppWordmark.tsx +89 -0
  196. package/src/components/chrome/ShellWindowControls.tsx +51 -0
  197. package/src/components/chrome/ThemeModeButton.tsx +16 -0
  198. package/src/components/chrome/Titlebar.tsx +79 -0
  199. package/src/components/chrome/WorkspaceTabStrip.tsx +300 -0
  200. package/src/components/chrome/index.ts +31 -0
  201. package/src/components/chrome/workspaceTabTypes.ts +29 -0
  202. package/src/components/common/buttons/Button.tsx +241 -0
  203. package/src/components/common/buttons/ChoiceChip.tsx +73 -0
  204. package/src/components/common/buttons/CleanButton.tsx +34 -0
  205. package/src/components/common/buttons/IconButton.tsx +89 -0
  206. package/src/components/common/buttons/QuietAction.tsx +29 -0
  207. package/src/components/common/buttons/SegmentedControl.tsx +67 -0
  208. package/src/components/common/buttons/TextActionButton.tsx +55 -0
  209. package/src/components/common/buttons/TextLink.tsx +38 -0
  210. package/src/components/common/canvas/CanvasElementFrame.test.tsx +79 -0
  211. package/src/components/common/canvas/CanvasElementFrame.tsx +182 -0
  212. package/src/components/common/canvas/canvasGeometry.test.ts +66 -0
  213. package/src/components/common/canvas/canvasGeometry.ts +133 -0
  214. package/src/components/common/canvas/index.ts +27 -0
  215. package/src/components/common/canvas/useCanvasDragResize.test.tsx +152 -0
  216. package/src/components/common/canvas/useCanvasDragResize.ts +161 -0
  217. package/src/components/common/chat/ChatAssistantMessage.tsx +81 -0
  218. package/src/components/common/chat/ChatBox.tsx +189 -0
  219. package/src/components/common/chat/ChatMarkdown.tsx +109 -0
  220. package/src/components/common/chat/ChatModelMenu.tsx +258 -0
  221. package/src/components/common/chat/ChatStatusRow.tsx +24 -0
  222. package/src/components/common/chat/ChatThinkingIndicator.tsx +54 -0
  223. package/src/components/common/chat/ChatThread.tsx +59 -0
  224. package/src/components/common/chat/ChatToolRow.tsx +141 -0
  225. package/src/components/common/chat/ChatUserBubble.tsx +45 -0
  226. package/src/components/common/chat/chatUtils.ts +7 -0
  227. package/src/components/common/chat/index.ts +24 -0
  228. package/src/components/common/connections/ConnectionSetup.tsx +529 -0
  229. package/src/components/common/connections/index.ts +26 -0
  230. package/src/components/common/containers/AppFrame.test.tsx +47 -0
  231. package/src/components/common/containers/AppFrame.tsx +65 -0
  232. package/src/components/common/containers/AppHeader.tsx +60 -0
  233. package/src/components/common/containers/AutoFillGrid.tsx +37 -0
  234. package/src/components/common/containers/Collapsible.tsx +43 -0
  235. package/src/components/common/containers/CollapsibleGrid.tsx +174 -0
  236. package/src/components/common/containers/MotionScope.tsx +32 -0
  237. package/src/components/common/containers/PageHeader.tsx +35 -0
  238. package/src/components/common/containers/PanelToolbarHeader.tsx +113 -0
  239. package/src/components/common/containers/QuietDisclosure.tsx +91 -0
  240. package/src/components/common/containers/QuietSurface.tsx +41 -0
  241. package/src/components/common/containers/ScrollPanel.tsx +33 -0
  242. package/src/components/common/containers/StatusBar.tsx +42 -0
  243. package/src/components/common/containers/SurfacePanel.tsx +66 -0
  244. package/src/components/common/containers/ToolbarStrip.tsx +80 -0
  245. package/src/components/common/containers/flex.ts +117 -0
  246. package/src/components/common/containers/useOpenTransition.ts +33 -0
  247. package/src/components/common/context/ContextSelector.tsx +269 -0
  248. package/src/components/common/context/index.ts +7 -0
  249. package/src/components/common/desk/ActionReader.tsx +270 -0
  250. package/src/components/common/desk/ActivityLedger.tsx +143 -0
  251. package/src/components/common/desk/CreationDesk.tsx +139 -0
  252. package/src/components/common/desk/DailyBrief.tsx +160 -0
  253. package/src/components/common/desk/DeskCard.tsx +157 -0
  254. package/src/components/common/desk/index.ts +30 -0
  255. package/src/components/common/dropdown/ContextMenu.tsx +87 -0
  256. package/src/components/common/dropdown/MenuButtonDropdown.tsx +121 -0
  257. package/src/components/common/dropdown/MenuDropdown.tsx +63 -0
  258. package/src/components/common/dropdown/MenuDropdownEntry.tsx +51 -0
  259. package/src/components/common/dropdown/MenuDropdownItem.tsx +82 -0
  260. package/src/components/common/dropdown/MenuDropdownSubmenu.tsx +145 -0
  261. package/src/components/common/dropdown/MenuPanel.tsx +69 -0
  262. package/src/components/common/dropdown/MenuPortal.tsx +162 -0
  263. package/src/components/common/dropdown/MenuPortalLayer.tsx +6 -0
  264. package/src/components/common/dropdown/SelectMenu.tsx +243 -0
  265. package/src/components/common/dropdown/SelectMenuControl.tsx +23 -0
  266. package/src/components/common/dropdown/SelectMenuOptions.tsx +38 -0
  267. package/src/components/common/dropdown/menuPortalConstants.ts +11 -0
  268. package/src/components/common/dropdown/menuTypes.ts +71 -0
  269. package/src/components/common/dropdown/menuViewportPosition.test.ts +139 -0
  270. package/src/components/common/dropdown/menuViewportPosition.ts +122 -0
  271. package/src/components/common/dropdown/selectMenuLayout.test.ts +42 -0
  272. package/src/components/common/dropdown/selectMenuLayout.ts +123 -0
  273. package/src/components/common/dropdown/useMenuAnchorPosition.ts +109 -0
  274. package/src/components/common/dropdown/useSelectMenuAnchor.ts +30 -0
  275. package/src/components/common/evidence/StructuredEvidenceView.test.tsx +77 -0
  276. package/src/components/common/evidence/StructuredEvidenceView.tsx +312 -0
  277. package/src/components/common/evidence/index.ts +13 -0
  278. package/src/components/common/feedback/Badge.tsx +33 -0
  279. package/src/components/common/feedback/CapabilityPills.tsx +36 -0
  280. package/src/components/common/feedback/EmptyState.tsx +132 -0
  281. package/src/components/common/feedback/InfoHint.tsx +67 -0
  282. package/src/components/common/feedback/InlineBanner.tsx +82 -0
  283. package/src/components/common/feedback/PlatformChip.tsx +104 -0
  284. package/src/components/common/feedback/QuietPill.tsx +75 -0
  285. package/src/components/common/feedback/WorkProgressPanel.tsx +156 -0
  286. package/src/components/common/feedback/index.ts +33 -0
  287. package/src/components/common/inputs/BareInput.tsx +31 -0
  288. package/src/components/common/inputs/BareTextarea.tsx +10 -0
  289. package/src/components/common/inputs/Checkbox.tsx +13 -0
  290. package/src/components/common/inputs/FieldControlShell.tsx +49 -0
  291. package/src/components/common/inputs/FormField.tsx +40 -0
  292. package/src/components/common/inputs/HybridSearchField.tsx +280 -0
  293. package/src/components/common/inputs/InlineComposer.tsx +197 -0
  294. package/src/components/common/inputs/PaletteCirclePicker.tsx +26 -0
  295. package/src/components/common/inputs/PaletteDropdown.tsx +413 -0
  296. package/src/components/common/inputs/Radio.tsx +19 -0
  297. package/src/components/common/inputs/SearchField.tsx +128 -0
  298. package/src/components/common/inputs/SelectField.tsx +169 -0
  299. package/src/components/common/inputs/SurfacePalettePicker.tsx +54 -0
  300. package/src/components/common/inputs/TextAreaField.tsx +22 -0
  301. package/src/components/common/inputs/TextField.tsx +51 -0
  302. package/src/components/common/inputs/ToggleSwitch.tsx +110 -0
  303. package/src/components/common/inputs/WorkspacePicker.tsx +349 -0
  304. package/src/components/common/inputs/fieldStyles.ts +137 -0
  305. package/src/components/common/layout/PanelGroup.tsx +479 -0
  306. package/src/components/common/layout/index.ts +31 -0
  307. package/src/components/common/layout/panelLayoutConstants.ts +7 -0
  308. package/src/components/common/layout/panelLayoutPersistence.ts +35 -0
  309. package/src/components/common/layout/panelLayoutState.test.ts +38 -0
  310. package/src/components/common/layout/panelLayoutState.ts +174 -0
  311. package/src/components/common/layout/panelLayoutTypes.ts +19 -0
  312. package/src/components/common/layout/tabs/Tabs.tsx +136 -0
  313. package/src/components/common/lists/listRowStyles.ts +32 -0
  314. package/src/components/common/lists/quiet-ledger/QuietActivityList.tsx +64 -0
  315. package/src/components/common/lists/quiet-ledger/QuietLedgerRow.tsx +119 -0
  316. package/src/components/common/lists/quiet-ledger/index.ts +9 -0
  317. package/src/components/common/lists/reorderable/DragHandle.tsx +65 -0
  318. package/src/components/common/lists/reorderable/ReorderableList.tsx +280 -0
  319. package/src/components/common/lists/reorderable/ReorderableListRow.tsx +102 -0
  320. package/src/components/common/lists/reorderable/ReorderableSections.tsx +344 -0
  321. package/src/components/common/lists/reorderable/ReorderableSectionsDemo.tsx +94 -0
  322. package/src/components/common/lists/reorderable/index.ts +15 -0
  323. package/src/components/common/lists/reorderable/reorderableUtils.test.ts +28 -0
  324. package/src/components/common/lists/reorderable/reorderableUtils.ts +23 -0
  325. package/src/components/common/lists/reorderable/types.ts +40 -0
  326. package/src/components/common/lists/reorderable/useReorderableDragState.ts +49 -0
  327. package/src/components/common/media/ImageReferencePicker.tsx +242 -0
  328. package/src/components/common/menubar/MenuBar.tsx +78 -0
  329. package/src/components/common/menubar/MenuBarTrigger.tsx +70 -0
  330. package/src/components/common/narrative/NarrativeMention.tsx +74 -0
  331. package/src/components/common/navigation/PathBreadcrumbs.tsx +78 -0
  332. package/src/components/common/navigation/UnderlineTabs.tsx +83 -0
  333. package/src/components/common/overlays/InstallAppPromptDialog.tsx +59 -0
  334. package/src/components/common/overlays/Modal.tsx +285 -0
  335. package/src/components/common/overlays/ModalChromeHeader.tsx +105 -0
  336. package/src/components/common/overlays/ObjectActionStrip.tsx +80 -0
  337. package/src/components/common/people/AutoUpdateReviewList.tsx +182 -0
  338. package/src/components/common/people/EntityList.tsx +122 -0
  339. package/src/components/common/people/EntityPortrait.tsx +64 -0
  340. package/src/components/common/people/LinkedDossierList.tsx +99 -0
  341. package/src/components/common/people/OpportunityList.tsx +94 -0
  342. package/src/components/common/people/PeopleSourceList.tsx +145 -0
  343. package/src/components/common/people/RelationshipDossier.tsx +168 -0
  344. package/src/components/common/people/RelationshipMap.tsx +362 -0
  345. package/src/components/common/people/index.ts +40 -0
  346. package/src/components/common/preview/FileAudioPreview.tsx +89 -0
  347. package/src/components/common/preview/FileImagePreview.tsx +88 -0
  348. package/src/components/common/preview/FilePdfPreview.tsx +87 -0
  349. package/src/components/common/preview/FileTextPreview.tsx +96 -0
  350. package/src/components/common/preview/FileVideoPreview.tsx +87 -0
  351. package/src/components/common/preview/PlatformFilePreview.tsx +166 -0
  352. package/src/components/common/preview/previewLayout.ts +27 -0
  353. package/src/components/common/render/Each.tsx +42 -0
  354. package/src/components/common/research/EvidenceDossier.tsx +894 -0
  355. package/src/components/common/research/index.ts +7 -0
  356. package/src/components/common/tiles/CatalogCard.tsx +116 -0
  357. package/src/components/common/tiles/Tile.tsx +45 -0
  358. package/src/components/common/tiles/TileGrid.tsx +13 -0
  359. package/src/components/common/typography/Heading.tsx +27 -0
  360. package/src/components/common/typography/Kicker.tsx +30 -0
  361. package/src/components/common/typography/Text.tsx +80 -0
  362. package/src/components/credentials/CredentialsPanel.tsx +169 -0
  363. package/src/components/credentials/credentialsTypes.ts +14 -0
  364. package/src/components/data/DataChart.tsx +913 -0
  365. package/src/components/data/dataTable.ts +99 -0
  366. package/src/components/editor/EditorCommentPromptDialog.tsx +124 -0
  367. package/src/components/editor/EditorLinkPromptDialog.tsx +65 -0
  368. package/src/components/print-design/PrintDesignPanel.test.tsx +1446 -0
  369. package/src/components/print-design/PrintDesignPanel.tsx +3043 -0
  370. package/src/components/print-design/index.ts +9 -0
  371. package/src/components/proofing/PagedProofDialog.tsx +453 -0
  372. package/src/components/proofing/index.ts +4 -0
  373. package/src/editor/DocumentEditor.tsx +28 -0
  374. package/src/editor/EditorViewModeToggle.tsx +35 -0
  375. package/src/editor/index.ts +97 -0
  376. package/src/editor/toolbarOverlays.ts +8 -0
  377. package/src/index.ts +209 -0
  378. package/src/theme/ThemeProvider.tsx +113 -0
  379. package/src/theme/appAccents.ts +87 -0
  380. package/src/theme/buildThemeBridgePayload.ts +23 -0
  381. package/src/theme/composePlatformTheme.test.ts +30 -0
  382. package/src/theme/composePlatformTheme.ts +23 -0
  383. package/src/theme/platformFont.d.mts +7 -0
  384. package/src/theme/platformFont.mjs +20 -0
  385. package/src/theme/platformFont.ts +6 -0
  386. package/src/theme/reportsShellChromeSelectors.ts +136 -0
  387. package/src/theme/styled.d.ts +5 -0
  388. package/src/theme/surfacePalettes.ts +178 -0
  389. package/src/theme/surfaceRoleSelectors.ts +113 -0
  390. package/src/theme/themeVars.ts +13 -0
  391. package/src/theme/themes/dark.ts +59 -0
  392. package/src/theme/themes/light.ts +60 -0
  393. package/src/theme/themes/palette.ts +44 -0
  394. package/src/theme/themes/shared.ts +68 -0
  395. package/src/theme/tokens.ts +114 -0
  396. package/src/theme/utils/GlobalStyles.ts +88 -0
  397. package/src/theme/utils/appFrameDocumentStyles.d.mts +5 -0
  398. package/src/theme/utils/appFrameDocumentStyles.mjs +89 -0
  399. package/src/theme/utils/appFrameDocumentStyles.ts +5 -0
  400. package/src/theme/utils/applyTheme.ts +50 -0
  401. package/src/theme/utils/cssVariables.ts +49 -0
  402. package/src/theme/utils/useInjectThemeIntoIframe.ts +40 -0
  403. package/src/utils/extensionIconMap.ts +123 -0
  404. package/src/utils/generalUtils.ts +157 -0
  405. package/src/writing/DraftAssistantDialog.tsx +279 -0
  406. package/src/writing/WritingStyleManager.tsx +416 -0
  407. package/src/writing/condenseWritingStyle.ts +103 -0
  408. package/src/writing/draftTextWithAgent.ts +134 -0
  409. package/src/writing/index.ts +39 -0
  410. package/src/writing/styleStore.ts +32 -0
  411. package/src/writing/writingStyle.test.ts +122 -0
  412. package/src/writing/writingStyle.ts +217 -0
@@ -0,0 +1,432 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+ import {
3
+ PRINT_STYLE_PROFILE_SCHEMA,
4
+ PRINT_TOKEN_EXTRACTION_PROMPT,
5
+ buildBookPrintStyleProfileFromReference,
6
+ buildPrintStyleProfilePrompt,
7
+ buildWriterPrintStyleProfileFromReference,
8
+ parsePrintStyleProfileResponse,
9
+ reconcilePrintStyleProfiles,
10
+ samplePrintReferenceImageColors,
11
+ } from './extraction.js'
12
+ import { compilePrintTheme } from './compiler.js'
13
+
14
+ describe('print style extraction contract', () => {
15
+ it('exports the prompt and schema used by image and description extraction', () => {
16
+ expect(PRINT_TOKEN_EXTRACTION_PROMPT).toContain(
17
+ 'print design-system extractor',
18
+ )
19
+ expect(PRINT_STYLE_PROFILE_SCHEMA.required).toContain('observations')
20
+ expect(PRINT_STYLE_PROFILE_SCHEMA.required).toContain('rules')
21
+ expect(PRINT_TOKEN_EXTRACTION_PROMPT).toContain('page furniture')
22
+ expect(PRINT_TOKEN_EXTRACTION_PROMPT).toContain('running_heads')
23
+ expect(PRINT_TOKEN_EXTRACTION_PROMPT).toContain('ornaments')
24
+ expect(
25
+ PRINT_STYLE_PROFILE_SCHEMA.properties.observations.properties,
26
+ ).toHaveProperty('running_heads')
27
+ expect(
28
+ PRINT_STYLE_PROFILE_SCHEMA.properties.observations.properties,
29
+ ).toHaveProperty('table_treatment')
30
+ })
31
+
32
+ it('builds a JSON-only model prompt with image pixel evidence', () => {
33
+ const prompt = buildPrintStyleProfilePrompt({
34
+ mode: 'image',
35
+ concerns: 'warm scholarly page, not too dense',
36
+ imageName: 'spread.png',
37
+ imageMimeType: 'image/png',
38
+ imagePixelSummary: 'surface #ffffff; ink #181818; accent #7a1f2b',
39
+ })
40
+
41
+ expect(prompt).toContain('Reference image: spread.png')
42
+ expect(prompt).toContain('Pixel pass summary')
43
+ expect(prompt).toContain('warm scholarly page')
44
+ expect(prompt).toContain('Return only one JSON object')
45
+ })
46
+
47
+ it('builds a text-only prompt that treats descriptions as valid evidence', () => {
48
+ const prompt = buildPrintStyleProfilePrompt({
49
+ mode: 'description',
50
+ concerns: 'sea colored academic article with blue table headers',
51
+ })
52
+
53
+ expect(prompt).toContain('Text-only design brief')
54
+ expect(prompt).toContain('valid style evidence')
55
+ expect(prompt).toContain(
56
+ 'Do not reject the exemplar merely because no image is attached.',
57
+ )
58
+ expect(prompt).toContain('sea colored academic article')
59
+ expect(prompt).not.toContain('No image is attached')
60
+ })
61
+
62
+ it('parses strict JSON profile responses and rejects non-profiles', () => {
63
+ const profile = parsePrintStyleProfileResponse(`{
64
+ "schema_version": "1.0",
65
+ "sources": [{ "id": "description" }],
66
+ "exemplar_quality": {
67
+ "usable": true,
68
+ "reason": "clean description",
69
+ "confidence": 0.7
70
+ },
71
+ "observations": {},
72
+ "rules": [{ "rule": "keep accent sparse", "confidence": 0.8 }],
73
+ "derived": null
74
+ }`)
75
+
76
+ expect(profile.rules?.[0]?.rule).toBe('keep accent sparse')
77
+ expect(() =>
78
+ parsePrintStyleProfileResponse('{"schema_version":"1.0"}'),
79
+ ).toThrow(/print style profile/)
80
+ })
81
+
82
+ it('reconciles multiple image profiles by confidence without averaging roles', () => {
83
+ const profile = reconcilePrintStyleProfiles([
84
+ {
85
+ schema_version: '1.0',
86
+ sources: [{ id: 'spread-a.png' }],
87
+ exemplar_quality: {
88
+ usable: true,
89
+ reason: 'usable',
90
+ confidence: 0.8,
91
+ },
92
+ observations: {
93
+ palette: [
94
+ {
95
+ role: 'accent',
96
+ approx_hex: '#aa0000',
97
+ confidence: 0.55,
98
+ },
99
+ ],
100
+ type: [{ role: 'body', class: 'serif', confidence: 0.9 }],
101
+ text_setting: { alignment: 'justified', confidence: 0.7 },
102
+ running_heads: {
103
+ presence: 'present',
104
+ position: 'top outside',
105
+ confidence: 0.65,
106
+ },
107
+ },
108
+ rules: [{ rule: 'keep rules sparse', confidence: 0.7 }],
109
+ derived: null,
110
+ },
111
+ {
112
+ schema_version: '1.0',
113
+ sources: [{ id: 'spread-b.png' }],
114
+ exemplar_quality: {
115
+ usable: true,
116
+ reason: 'usable',
117
+ confidence: 0.6,
118
+ },
119
+ observations: {
120
+ palette: [
121
+ {
122
+ role: 'accent',
123
+ approx_hex: '#005f7a',
124
+ confidence: 0.82,
125
+ },
126
+ ],
127
+ type: [{ role: 'body', class: 'sans', confidence: 0.45 }],
128
+ text_setting: { alignment: 'flush-left', confidence: 0.9 },
129
+ running_heads: {
130
+ presence: 'absent',
131
+ confidence: 0.4,
132
+ },
133
+ },
134
+ rules: [{ rule: 'keep rules sparse', confidence: 0.8 }],
135
+ derived: null,
136
+ },
137
+ ])
138
+
139
+ expect(profile.sources?.map(source => source.id)).toEqual([
140
+ 'spread-a.png',
141
+ 'spread-b.png',
142
+ ])
143
+ expect(profile.observations.palette?.[0]?.approx_hex).toBe('#005f7a')
144
+ expect(profile.observations.type?.[0]?.class).toBe('serif')
145
+ expect(profile.observations.text_setting?.alignment).toBe('flush-left')
146
+ expect(profile.observations.running_heads?.position).toBe('top outside')
147
+ expect(profile.rules).toEqual(
148
+ expect.arrayContaining([{ rule: 'keep rules sparse', confidence: 0.8 }]),
149
+ )
150
+ expect(profile.rules?.map(rule => rule.rule).join('\n')).toContain(
151
+ 'Reference conflict: text alignment disagrees',
152
+ )
153
+ expect(profile.rules?.map(rule => rule.rule).join('\n')).not.toContain(
154
+ 'running heads disagrees',
155
+ )
156
+ })
157
+
158
+ it('surfaces multi-image conflicts as compiler warnings, not renderer rules', () => {
159
+ const profile = reconcilePrintStyleProfiles([
160
+ {
161
+ schema_version: '1.0',
162
+ sources: [{ id: 'journal-page.png' }],
163
+ exemplar_quality: {
164
+ usable: true,
165
+ reason: 'usable',
166
+ confidence: 0.8,
167
+ },
168
+ observations: {
169
+ palette: [
170
+ {
171
+ role: 'accent',
172
+ approx_hex: '#aa0000',
173
+ confidence: 0.82,
174
+ },
175
+ ],
176
+ type: [
177
+ { role: 'body', class: 'serif', serif_detail: 'bracketed', confidence: 0.86 },
178
+ ],
179
+ text_setting: { alignment: 'justified', confidence: 0.82 },
180
+ page_model: { columns: 1, confidence: 0.8 },
181
+ opener: { ornament: 'none', confidence: 0.78 },
182
+ },
183
+ rules: [{ rule: 'keep rules sparse', confidence: 0.8 }],
184
+ derived: null,
185
+ },
186
+ {
187
+ schema_version: '1.0',
188
+ sources: [{ id: 'book-opener.png' }],
189
+ exemplar_quality: {
190
+ usable: true,
191
+ reason: 'usable',
192
+ confidence: 0.76,
193
+ },
194
+ observations: {
195
+ palette: [
196
+ {
197
+ role: 'accent',
198
+ approx_hex: '#005f7a',
199
+ confidence: 0.8,
200
+ },
201
+ ],
202
+ type: [
203
+ { role: 'body', class: 'sans', confidence: 0.72 },
204
+ ],
205
+ text_setting: { alignment: 'flush-left', confidence: 0.78 },
206
+ page_model: { columns: 2, confidence: 0.74 },
207
+ opener: { ornament: 'rule', confidence: 0.72 },
208
+ },
209
+ rules: [{ rule: 'keep ornaments restrained', confidence: 0.7 }],
210
+ derived: null,
211
+ },
212
+ ])
213
+
214
+ const result = compilePrintTheme(profile)
215
+ const decisionText = result.decisions.map(([, message]) => message).join('\n')
216
+
217
+ expect(decisionText).toContain('Reference conflict: accent color disagrees')
218
+ expect(decisionText).toContain('Reference conflict: body font class disagrees')
219
+ expect(decisionText).toContain('Reference conflict: page columns disagrees')
220
+ expect(result.theme?.enforced_rules).toEqual(
221
+ expect.arrayContaining(['keep rules sparse', 'keep ornaments restrained']),
222
+ )
223
+ expect(result.theme?.enforced_rules?.join('\n')).not.toContain(
224
+ 'Reference conflict:',
225
+ )
226
+ })
227
+
228
+ it('builds a safe book profile from sampled reference image colors', () => {
229
+ const profile = buildBookPrintStyleProfileFromReference({
230
+ source: 'quiet-atlas-spread.png',
231
+ prompt: 'airy literary page with hairline rule',
232
+ sample: {
233
+ paper: '#f8f4ed',
234
+ ink: '#181818',
235
+ accent: '#5a7258',
236
+ accentConfidence: 0.8,
237
+ },
238
+ })
239
+
240
+ expect(profile.observations.palette).toEqual([
241
+ expect.objectContaining({
242
+ role: 'surface',
243
+ approx_hex: '#f8f4ed',
244
+ }),
245
+ expect.objectContaining({
246
+ role: 'ink',
247
+ approx_hex: '#181818',
248
+ }),
249
+ expect.objectContaining({
250
+ role: 'accent',
251
+ approx_hex: '#5a7258',
252
+ }),
253
+ ])
254
+ expect(profile.observations.running_heads?.presence).toBe('present')
255
+ expect(profile.observations.running_heads?.rule).toBe('hairline')
256
+ expect(profile.observations.type_scale?.body_pt).toBe(10.8)
257
+ expect(profile.observations.type_scale?.chapter_title_scale).toBe(2.2)
258
+ expect(profile.observations.opener?.recto_start).toBe(true)
259
+ expect(profile.observations.opener?.ornament).toBe('rule')
260
+ expect(profile.observations.finish?.register).toBe('literary')
261
+ })
262
+
263
+ it('builds a safe writer profile from sampled reference image colors', () => {
264
+ const profile = buildWriterPrintStyleProfileFromReference({
265
+ source: 'writer-reference.png',
266
+ prompt: 'airy modern draft page with blue accents',
267
+ sample: {
268
+ paper: '#ffffff',
269
+ ink: '#202020',
270
+ accent: '#335f8f',
271
+ accentConfidence: 0.82,
272
+ },
273
+ })
274
+
275
+ expect(profile.observations.finish?.register).toBe('draft')
276
+ expect(profile.observations.palette).toEqual([
277
+ expect.objectContaining({
278
+ role: 'surface',
279
+ approx_hex: '#ffffff',
280
+ }),
281
+ expect.objectContaining({
282
+ role: 'ink',
283
+ approx_hex: '#202020',
284
+ }),
285
+ expect.objectContaining({
286
+ role: 'accent',
287
+ approx_hex: '#335f8f',
288
+ }),
289
+ ])
290
+ expect(profile.observations.text_setting).toEqual(
291
+ expect.objectContaining({
292
+ alignment: 'flush-left',
293
+ hyphenation: 'absent',
294
+ leading_feel: 'airy',
295
+ }),
296
+ )
297
+ expect(profile.observations.page_model?.running_heads).toBe('absent')
298
+ expect(profile.observations.caption_treatment?.label_style).toBe('plain')
299
+ })
300
+
301
+ it('samples reference image colors and releases the bitmap', async () => {
302
+ const close = vi.fn()
303
+ const bitmap = { close }
304
+ const pixels = new Uint8ClampedArray([
305
+ 250, 250, 250, 255, 250, 250, 250, 255, 250, 250, 250, 255, 250, 250,
306
+ 250, 255, 24, 24, 24, 255, 24, 24, 24, 255, 24, 24, 24, 255, 24, 24, 24,
307
+ 255, 96, 120, 72, 255, 96, 120, 72, 255, 96, 120, 72, 255, 96, 120,
308
+ 72, 255,
309
+ ])
310
+ vi.stubGlobal('createImageBitmap', vi.fn(async () => bitmap))
311
+ const originalCreateElement = document.createElement.bind(document)
312
+ const drawImage = vi.fn()
313
+ vi.spyOn(document, 'createElement').mockImplementation(tagName => {
314
+ if (tagName !== 'canvas') return originalCreateElement(tagName)
315
+ return {
316
+ width: 0,
317
+ height: 0,
318
+ getContext: vi.fn(() => ({
319
+ drawImage,
320
+ getImageData: vi.fn(() => ({ data: pixels })),
321
+ })),
322
+ } as unknown as HTMLElement
323
+ })
324
+
325
+ const sample = await samplePrintReferenceImageColors(
326
+ new File(['fake'], 'reference.png', { type: 'image/png' }),
327
+ )
328
+
329
+ expect(sample).toEqual({
330
+ paper: '#f0f0f0',
331
+ ink: '#181818',
332
+ accent: '#607848',
333
+ accentConfidence: 0.72,
334
+ })
335
+ expect(drawImage).toHaveBeenCalledWith(bitmap, 0, 0, 80, 80)
336
+ expect(close).toHaveBeenCalledTimes(1)
337
+ })
338
+
339
+ it('compiles book reference profiles with approximation warnings, not renderer rules', () => {
340
+ const profile = buildBookPrintStyleProfileFromReference({
341
+ source: 'ornamented-book-spread.png',
342
+ prompt:
343
+ 'airy literary page with dramatic type, outside folios, and ornamented opener',
344
+ sample: {
345
+ paper: '#f7f3ea',
346
+ ink: '#161616',
347
+ accent: '#6a7358',
348
+ accentConfidence: 0.8,
349
+ },
350
+ })
351
+
352
+ const result = compilePrintTheme(profile)
353
+ const decisionText = result.decisions.map(([, message]) => message)
354
+
355
+ expect(result.theme?.profile_rules).toEqual(
356
+ expect.objectContaining({
357
+ running_heads: expect.objectContaining({
358
+ presence: 'present',
359
+ position: 'outer top',
360
+ transform: 'small-caps',
361
+ }),
362
+ opener: expect.objectContaining({
363
+ recto_start: true,
364
+ ornament: 'rule',
365
+ }),
366
+ ornaments: expect.objectContaining({
367
+ kind: 'rule',
368
+ weight: 'hairline',
369
+ }),
370
+ }),
371
+ )
372
+ expect(decisionText).toEqual(
373
+ expect.arrayContaining([
374
+ 'font matching uses licensed substitutes; exact font identity is not guaranteed.',
375
+ 'point sizes are approximate; reference pages provide scale and contrast, not exact measurements.',
376
+ 'page geometry is approximate; margins and trim are applied only when confidence clears the compiler threshold.',
377
+ 'ornaments are mapped to supported rules/dividers; arbitrary custom ornament replication is unsupported.',
378
+ ]),
379
+ )
380
+ expect(result.theme?.enforced_rules).toEqual(
381
+ expect.arrayContaining([
382
+ 'emulate the uploaded book reference through safe Pure Render tokens',
383
+ 'Reference page furniture: running heads present at outer top.',
384
+ 'Reference opener: generous spacing, rule ornament.',
385
+ 'Reference ornaments: rule hairline',
386
+ ]),
387
+ )
388
+ expect(result.theme?.enforced_rules?.join(' ')).not.toMatch(
389
+ /exact font|exact point|exact page|custom ornament replication/,
390
+ )
391
+ })
392
+
393
+ it('compiles writer reference profiles without book furniture rules', () => {
394
+ const profile = buildWriterPrintStyleProfileFromReference({
395
+ source: 'writer-reference.png',
396
+ prompt: 'compact modern blue draft',
397
+ sample: {
398
+ paper: '#ffffff',
399
+ ink: '#202020',
400
+ accent: '#335f8f',
401
+ accentConfidence: 0.82,
402
+ },
403
+ })
404
+
405
+ const result = compilePrintTheme(profile)
406
+
407
+ expect(result.theme?.name).toBe('Extracted - draft')
408
+ expect(result.theme?.setting).toEqual(
409
+ expect.objectContaining({
410
+ align: 'flush-left',
411
+ hyphenate: false,
412
+ }),
413
+ )
414
+ expect(result.theme?.profile_rules).toEqual(
415
+ expect.objectContaining({
416
+ table: expect.objectContaining({ density: 'compact' }),
417
+ caption: expect.objectContaining({
418
+ position: 'below',
419
+ label_style: 'plain',
420
+ }),
421
+ }),
422
+ )
423
+ expect(result.theme?.profile_rules).not.toHaveProperty('running_heads')
424
+ expect(result.theme?.enforced_rules).toEqual(
425
+ expect.arrayContaining([
426
+ 'emulate the uploaded writer reference through safe Pure Render tokens',
427
+ 'Reference tables: hairline rules, compact density.',
428
+ 'Reference captions: below position, plain labels.',
429
+ ]),
430
+ )
431
+ })
432
+ })