@puredesktop/puredesktop-ui-bridge 1.0.0-beta.1 → 2.1.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.
- package/package.json +4 -2
- package/src/agents/appAgentConnectors.test.ts +37 -0
- package/src/agents/appAgentConnectors.ts +138 -0
- package/src/agents/runtime/agentLiveReducer.test.ts +72 -72
- package/src/agents/runtime/agentLiveReducer.ts +139 -139
- package/src/agents/runtime/agentRunEventTypes.ts +115 -115
- package/src/agents/runtime/contextWindowUsage.test.ts +38 -38
- package/src/agents/runtime/contextWindowUsage.ts +25 -25
- package/src/agents/runtime/index.ts +24 -24
- package/src/agents/runtime/mapAgentMessages.ts +79 -54
- package/src/agents/runtime/mapAgentSnapshot.test.ts +98 -0
- package/src/agents/runtime/mapAgentSnapshot.ts +124 -71
- package/src/agents/runtime/mergeUsageTurn.ts +23 -23
- package/src/agents/runtime/pendingToolCalls.test.ts +85 -85
- package/src/agents/runtime/pendingToolCalls.ts +14 -14
- package/src/agents/runtime/toolRequiresApproval.ts +20 -20
- package/src/agents/runtime/unresolvedToolCalls.ts +42 -42
- package/src/bridge/agentModelTiers.ts +50 -50
- package/src/bridge/agentToolHandlers.ts +23 -23
- package/src/bridge/agentToolHelpers.test.ts +27 -27
- package/src/bridge/agentToolHelpers.ts +20 -20
- package/src/bridge/agentTypes.ts +377 -294
- package/src/bridge/agents.d.mts +144 -113
- package/src/bridge/agents.mjs +287 -233
- package/src/bridge/agents.ts +77 -62
- package/src/bridge/appSettings.d.mts +9 -9
- package/src/bridge/appSettings.mjs +18 -18
- package/src/bridge/appSettings.ts +4 -4
- package/src/bridge/applyThemeFromHost.d.mts +7 -7
- package/src/bridge/applyThemeFromHost.mjs +33 -33
- package/src/bridge/assets.d.mts +66 -66
- package/src/bridge/assets.mjs +121 -121
- package/src/bridge/calendarDraftIntent.ts +55 -0
- package/src/bridge/calendarInviteIntent.ts +64 -0
- package/src/bridge/catalog.d.mts +5 -5
- package/src/bridge/catalog.mjs +24 -24
- package/src/bridge/catalog.ts +1 -1
- package/src/bridge/client.d.mts +19 -19
- package/src/bridge/client.mjs +102 -102
- package/src/bridge/collectionAssetAdapter.ts +63 -63
- package/src/bridge/collectionAssets.d.mts +1 -1
- package/src/bridge/collectionAssets.mjs +2 -2
- package/src/bridge/collectionAssets.ts +1 -1
- package/src/bridge/collectionDocumentHtml.test.ts +71 -71
- package/src/bridge/collectionDocumentHtml.ts +118 -118
- package/src/bridge/collectionImagePaste.test.ts +32 -32
- package/src/bridge/collectionImagePaste.ts +130 -130
- package/src/bridge/context.mjs +12 -12
- package/src/bridge/credentials.mjs +22 -22
- package/src/bridge/dialog.d.mts +5 -5
- package/src/bridge/dialog.mjs +13 -13
- package/src/bridge/events.d.mts +14 -14
- package/src/bridge/events.mjs +12 -12
- package/src/bridge/filePreviewKind.test.ts +43 -43
- package/src/bridge/filePreviewKind.ts +76 -76
- package/src/bridge/fs.d.mts +41 -41
- package/src/bridge/fs.mjs +82 -82
- package/src/bridge/fs.test.ts +16 -16
- package/src/bridge/fs.ts +10 -10
- package/src/bridge/googleAuth.ts +159 -0
- package/src/bridge/googleProviderConfig.ts +73 -0
- package/src/bridge/index.ts +12 -12
- package/src/bridge/inlinePreview.d.mts +35 -35
- package/src/bridge/inlinePreview.mjs +99 -99
- package/src/bridge/inlinePreview.test.ts +56 -56
- package/src/bridge/inlinePreview.ts +13 -13
- package/src/bridge/methods.d.mts +125 -115
- package/src/bridge/methods.mjs +143 -132
- package/src/bridge/os.d.mts +11 -11
- package/src/bridge/os.mjs +26 -26
- package/src/bridge/plugins.d.mts +9 -9
- package/src/bridge/plugins.mjs +31 -31
- package/src/bridge/plugins.ts +5 -5
- package/src/bridge/preferences.d.mts +7 -7
- package/src/bridge/preferences.mjs +17 -17
- package/src/bridge/preferences.ts +13 -13
- package/src/bridge/printDocument.test.ts +47 -47
- package/src/bridge/printDocument.ts +75 -75
- package/src/bridge/pureRender/adapters.test.ts +144 -144
- package/src/bridge/pureRender/adapters.ts +175 -175
- package/src/bridge/pureRender/assets.test.ts +44 -44
- package/src/bridge/pureRender/base.css +76 -76
- package/src/bridge/pureRender/compiler.test.ts +279 -279
- package/src/bridge/pureRender/compiler.ts +660 -660
- package/src/bridge/pureRender/document.test.ts +283 -283
- package/src/bridge/pureRender/document.ts +35 -35
- package/src/bridge/pureRender/extraction.test.ts +432 -432
- package/src/bridge/pureRender/extraction.ts +1023 -1023
- package/src/bridge/pureRender/flow.css +3 -3
- package/src/bridge/pureRender/index.ts +66 -66
- package/src/bridge/pureRender/normalize.test.ts +442 -442
- package/src/bridge/pureRender/normalize.ts +682 -682
- package/src/bridge/pureRender/presets.ts +365 -365
- package/src/bridge/pureRender/profiles/book.css +19 -19
- package/src/bridge/pureRender/profiles/manuscript.css +11 -11
- package/src/bridge/pureRender/profiles/writer.css +10 -10
- package/src/bridge/pureRender/reset.css +5 -5
- package/src/bridge/pureRender/samples.ts +94 -94
- package/src/bridge/pureRender/styles.ts +164 -164
- package/src/bridge/pureRender/theme.test.ts +53 -53
- package/src/bridge/pureRender/theme.ts +258 -258
- package/src/bridge/pureRender/tokens/default.css +36 -36
- package/src/bridge/pureRender/tokens/default.json +32 -32
- package/src/bridge/pureRender/types.ts +264 -264
- package/src/bridge/pureRender/visualLayoutInspection.test.ts +57 -57
- package/src/bridge/pureRender/visualLayoutInspection.ts +161 -161
- package/src/bridge/react/useDebouncedEffect.ts +21 -21
- package/src/bridge/react/useIpc.tsx +75 -75
- package/src/bridge/react/usePlatformAgentRunLiveState.tsx +78 -78
- package/src/bridge/react/usePlatformAgentSessionDrive.test.tsx +134 -0
- package/src/bridge/react/usePlatformAgentSessionDrive.tsx +749 -729
- package/src/bridge/react/usePlatformAgentSessions.tsx +60 -60
- package/src/bridge/react/usePlatformAgentTools.tsx +82 -82
- package/src/bridge/react/usePlatformAppManifest.tsx +32 -32
- package/src/bridge/react/usePlatformBridge.tsx +56 -56
- package/src/bridge/react/usePlatformDeepLink.tsx +57 -57
- package/src/bridge/react/usePlatformFileBinaryDataUrl.tsx +54 -54
- package/src/bridge/react/usePlatformFilePreview.tsx +92 -92
- package/src/bridge/react/usePlatformPreferences.tsx +77 -77
- package/src/bridge/react/usePlatformThemeDocumentAttrs.ts +35 -35
- package/src/bridge/react/usePlatformThemeFromBridge.tsx +16 -16
- package/src/bridge/react/usePlatformViewportResource.test.tsx +106 -106
- package/src/bridge/react/usePlatformViewportResource.tsx +72 -72
- package/src/bridge/react/useScheduledTask.tsx +59 -59
- package/src/bridge/render.d.mts +31 -31
- package/src/bridge/render.mjs +62 -62
- package/src/bridge/render.ts +8 -8
- package/src/bridge/screenAnnotation.test.ts +103 -103
- package/src/bridge/screenAnnotation.ts +269 -269
- package/src/bridge/theme.d.mts +3 -3
- package/src/bridge/theme.mjs +9 -9
- package/src/bridge/types.ts +447 -439
- package/src/bridge/vision.d.mts +22 -0
- package/src/bridge/vision.mjs +20 -0
- package/src/bridge/watch.d.mts +9 -9
- package/src/bridge/watch.mjs +34 -34
- package/src/bridge/watch.ts +1 -1
- package/src/bridge/window.d.mts +44 -44
- package/src/bridge/window.mjs +33 -33
- package/src/chrome/index.ts +1 -1
- package/src/commitments/commitments.test.ts +201 -0
- package/src/commitments/commitments.ts +358 -0
- package/src/components/accessibility/AccessibilityReviewDialog.test.tsx +104 -104
- package/src/components/accessibility/AccessibilityReviewDialog.tsx +350 -350
- package/src/components/accessibility/accessibilityReview.test.ts +101 -101
- package/src/components/accessibility/accessibilityReview.ts +639 -639
- package/src/components/accessibility/index.ts +16 -16
- package/src/components/agent-feedback/ScreenAnnotationAgentDialog.tsx +509 -509
- package/src/components/agent-feedback/index.ts +5 -5
- package/src/components/agents/AgentComposer.tsx +135 -34
- package/src/components/agents/AgentContextUsageBar.tsx +127 -127
- package/src/components/agents/AgentDrawerPanel.test.tsx +361 -0
- package/src/components/agents/AgentDrawerPanel.tsx +122 -82
- package/src/components/agents/AgentFollowUpList.tsx +56 -0
- package/src/components/agents/AgentMarkdown.tsx +12 -12
- package/src/components/agents/AgentMessageBubble.tsx +171 -82
- package/src/components/agents/AgentMessageList.tsx +50 -47
- package/src/components/agents/AgentModelMenu.tsx +59 -55
- package/src/components/agents/AgentQuestionPromptList.tsx +284 -0
- package/src/components/agents/AgentThinkingBlock.tsx +66 -66
- package/src/components/agents/AgentToolApprovalActions.tsx +65 -65
- package/src/components/agents/AgentToolCallCard.tsx +13 -8
- package/src/components/agents/AgentToolPendingList.tsx +39 -39
- package/src/components/agents/AgentToolPendingReview.tsx +118 -118
- package/src/components/agents/agentPanelStyles.ts +150 -79
- package/src/components/agents/agentToolDisplay.ts +87 -0
- package/src/components/agents/agentTypes.ts +139 -96
- package/src/components/agents/formatToolCallArguments.test.ts +16 -16
- package/src/components/agents/formatToolCallArguments.ts +9 -9
- package/src/components/agents/index.ts +40 -40
- package/src/components/assets/AssetLibraryDialog.tsx +5 -5
- package/src/components/assets/asset-library/AssetLibraryDialog.tsx +43 -43
- package/src/components/assets/asset-library/AssetLibraryWorkspace.tsx +54 -54
- package/src/components/assets/asset-library/detail/AssetLibraryDetailActions.tsx +68 -68
- package/src/components/assets/asset-library/detail/AssetLibraryDetailHeader.tsx +56 -56
- package/src/components/assets/asset-library/detail/AssetLibraryDetailPane.tsx +90 -90
- package/src/components/assets/asset-library/detail/AssetLibraryDetailPreview.tsx +67 -67
- package/src/components/assets/asset-library/detail/AssetLibraryInlinePreview.tsx +87 -87
- package/src/components/assets/asset-library/detail/AssetLibraryInlineSourceField.tsx +29 -29
- package/src/components/assets/asset-library/detail/AssetLibraryMetadataFields.tsx +34 -34
- package/src/components/assets/asset-library/detail/AssetLibraryUsagePanel.tsx +46 -46
- package/src/components/assets/asset-library/detail/AssetLibraryVersionsPanel.tsx +145 -145
- package/src/components/assets/asset-library/helpers/assetKind.ts +74 -74
- package/src/components/assets/asset-library/helpers.ts +41 -41
- package/src/components/assets/asset-library/hooks/useAssetDetailDraft.ts +81 -81
- package/src/components/assets/asset-library/hooks/useAssetLibraryDialog.ts +233 -233
- package/src/components/assets/asset-library/hooks/useAssetLibraryMutations.ts +266 -266
- package/src/components/assets/asset-library/hooks/useAssetLibrarySelectionSync.ts +24 -24
- package/src/components/assets/asset-library/hooks/useAssetLibraryVersions.ts +145 -145
- package/src/components/assets/asset-library/hooks/useInlineAssetPreview.ts +44 -44
- package/src/components/assets/asset-library/index.ts +19 -19
- package/src/components/assets/asset-library/layout/assetLibraryLayout.ts +201 -201
- package/src/components/assets/asset-library/shared/fieldStyles.ts +62 -62
- package/src/components/assets/asset-library/sidebar/AssetLibraryFilterPills.tsx +89 -89
- package/src/components/assets/asset-library/sidebar/AssetLibraryList.tsx +91 -91
- package/src/components/assets/asset-library/sidebar/AssetLibraryListRow.tsx +99 -99
- package/src/components/assets/asset-library/sidebar/AssetLibraryListStatus.tsx +24 -24
- package/src/components/assets/asset-library/sidebar/AssetLibrarySidebar.tsx +48 -48
- package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarActions.tsx +38 -38
- package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarToolbar.tsx +78 -78
- package/src/components/assets/asset-library/sidebar/AssetListThumbnail.tsx +86 -86
- package/src/components/assets/asset-library/types.ts +128 -128
- package/src/components/assets/asset-library/utils/assetLibraryUtils.ts +181 -181
- package/src/components/assets/asset-library/utils/pathBasename.ts +5 -5
- package/src/components/assets/asset-library/utils/sanitizeUploadFileName.ts +7 -7
- package/src/components/assets/asset-library/utils/uploadCollectionAsset.ts +52 -52
- package/src/components/chrome/OverlayActionCapsule.test.tsx +82 -82
- package/src/components/chrome/OverlayActionCapsule.tsx +90 -90
- package/src/components/chrome/PanelTabStrip.tsx +113 -113
- package/src/components/chrome/PlatformIcon.tsx +27 -27
- package/src/components/chrome/PureAppWordmark.tsx +94 -89
- package/src/components/chrome/ShellWindowControls.tsx +58 -51
- package/src/components/chrome/ThemeModeButton.tsx +16 -16
- package/src/components/chrome/Titlebar.tsx +79 -79
- package/src/components/chrome/WorkspaceTabStrip.tsx +321 -300
- package/src/components/chrome/index.ts +31 -31
- package/src/components/chrome/workspaceTabTypes.ts +29 -29
- package/src/components/common/buttons/Button.tsx +241 -241
- package/src/components/common/buttons/ChoiceChip.tsx +73 -73
- package/src/components/common/buttons/CleanButton.tsx +34 -34
- package/src/components/common/buttons/IconButton.tsx +89 -89
- package/src/components/common/buttons/QuietAction.tsx +29 -29
- package/src/components/common/buttons/SegmentedControl.tsx +67 -67
- package/src/components/common/buttons/TextActionButton.tsx +55 -55
- package/src/components/common/buttons/TextLink.tsx +38 -38
- package/src/components/common/canvas/CanvasElementFrame.test.tsx +79 -79
- package/src/components/common/canvas/CanvasElementFrame.tsx +182 -182
- package/src/components/common/canvas/canvasGeometry.test.ts +66 -66
- package/src/components/common/canvas/canvasGeometry.ts +133 -133
- package/src/components/common/canvas/index.ts +27 -27
- package/src/components/common/canvas/useCanvasDragResize.test.tsx +152 -152
- package/src/components/common/canvas/useCanvasDragResize.ts +161 -161
- package/src/components/common/cards/OpenReviewCard.tsx +209 -0
- package/src/components/common/cards/index.ts +5 -0
- package/src/components/common/chat/ChatAssistantMessage.tsx +81 -81
- package/src/components/common/chat/ChatBox.test.tsx +61 -0
- package/src/components/common/chat/ChatBox.tsx +193 -189
- package/src/components/common/chat/ChatMarkdown.tsx +109 -109
- package/src/components/common/chat/ChatModelMenu.tsx +290 -258
- package/src/components/common/chat/ChatStatusRow.tsx +24 -24
- package/src/components/common/chat/ChatThinkingIndicator.tsx +54 -54
- package/src/components/common/chat/ChatThread.tsx +59 -59
- package/src/components/common/chat/ChatToolRow.tsx +147 -141
- package/src/components/common/chat/ChatUserBubble.tsx +45 -45
- package/src/components/common/chat/chatUtils.ts +7 -7
- package/src/components/common/chat/index.ts +24 -24
- package/src/components/common/connections/ConnectionSetup.tsx +534 -529
- package/src/components/common/connections/index.ts +26 -26
- package/src/components/common/containers/AppFrame.test.tsx +87 -41
- package/src/components/common/containers/AppFrame.tsx +66 -65
- package/src/components/common/containers/AppHeader.tsx +60 -60
- package/src/components/common/containers/AutoFillGrid.tsx +43 -37
- package/src/components/common/containers/Collapsible.tsx +43 -43
- package/src/components/common/containers/CollapsibleGrid.tsx +185 -174
- package/src/components/common/containers/MotionScope.tsx +32 -32
- package/src/components/common/containers/PageHeader.tsx +35 -35
- package/src/components/common/containers/PanelToolbarHeader.tsx +114 -113
- package/src/components/common/containers/QuietDisclosure.tsx +91 -91
- package/src/components/common/containers/QuietSurface.tsx +40 -41
- package/src/components/common/containers/ScrollPanel.tsx +33 -33
- package/src/components/common/containers/StatusBar.tsx +42 -42
- package/src/components/common/containers/SurfacePanel.tsx +66 -66
- package/src/components/common/containers/ToolbarStrip.tsx +80 -80
- package/src/components/common/containers/flex.ts +117 -117
- package/src/components/common/containers/useOpacityPresence.ts +80 -0
- package/src/components/common/containers/useOpenTransition.ts +33 -33
- package/src/components/common/context/ContextSelector.tsx +277 -269
- package/src/components/common/context/index.ts +7 -7
- package/src/components/common/desk/ActionReader.tsx +270 -270
- package/src/components/common/desk/ActivityLedger.tsx +143 -143
- package/src/components/common/desk/CreationDesk.tsx +139 -139
- package/src/components/common/desk/DailyBrief.tsx +160 -160
- package/src/components/common/desk/DeskCard.tsx +157 -157
- package/src/components/common/desk/index.ts +30 -30
- package/src/components/common/dropdown/ContextMenu.tsx +87 -87
- package/src/components/common/dropdown/MenuButtonDropdown.tsx +121 -121
- package/src/components/common/dropdown/MenuDropdown.tsx +63 -63
- package/src/components/common/dropdown/MenuDropdownEntry.tsx +51 -51
- package/src/components/common/dropdown/MenuDropdownItem.tsx +82 -82
- package/src/components/common/dropdown/MenuDropdownSubmenu.tsx +145 -145
- package/src/components/common/dropdown/MenuPanel.tsx +75 -69
- package/src/components/common/dropdown/MenuPortal.tsx +164 -162
- package/src/components/common/dropdown/MenuPortalLayer.tsx +6 -6
- package/src/components/common/dropdown/SelectMenu.tsx +246 -243
- package/src/components/common/dropdown/SelectMenuControl.tsx +23 -23
- package/src/components/common/dropdown/SelectMenuOptions.tsx +60 -38
- package/src/components/common/dropdown/menuPortalConstants.ts +11 -11
- package/src/components/common/dropdown/menuTypes.ts +71 -71
- package/src/components/common/dropdown/menuViewportPosition.test.ts +139 -139
- package/src/components/common/dropdown/menuViewportPosition.ts +122 -122
- package/src/components/common/dropdown/selectMenuLayout.test.ts +42 -42
- package/src/components/common/dropdown/selectMenuLayout.ts +123 -123
- package/src/components/common/dropdown/useMenuAnchorPosition.ts +109 -109
- package/src/components/common/dropdown/useSelectMenuAnchor.ts +30 -30
- package/src/components/common/evidence/StructuredEvidenceView.test.tsx +77 -77
- package/src/components/common/evidence/StructuredEvidenceView.tsx +312 -312
- package/src/components/common/evidence/index.ts +13 -13
- package/src/components/common/feedback/Badge.tsx +35 -33
- package/src/components/common/feedback/CapabilityPills.tsx +36 -36
- package/src/components/common/feedback/EmptyState.tsx +166 -132
- package/src/components/common/feedback/InfoHint.tsx +67 -67
- package/src/components/common/feedback/InlineBanner.tsx +82 -82
- package/src/components/common/feedback/PlatformChip.tsx +104 -104
- package/src/components/common/feedback/QuietPill.tsx +75 -75
- package/src/components/common/feedback/WorkProgressPanel.tsx +156 -156
- package/src/components/common/feedback/index.ts +33 -33
- package/src/components/common/files/FileTable.tsx +225 -0
- package/src/components/common/inputs/BareInput.tsx +31 -31
- package/src/components/common/inputs/BareTextarea.tsx +10 -10
- package/src/components/common/inputs/Checkbox.tsx +13 -13
- package/src/components/common/inputs/EditableSecretField.tsx +292 -0
- package/src/components/common/inputs/FieldControlShell.tsx +49 -49
- package/src/components/common/inputs/FormField.tsx +40 -40
- package/src/components/common/inputs/HybridSearchField.tsx +295 -280
- package/src/components/common/inputs/InlineComposer.tsx +197 -197
- package/src/components/common/inputs/PaletteCirclePicker.tsx +26 -26
- package/src/components/common/inputs/PaletteDropdown.tsx +418 -413
- package/src/components/common/inputs/Radio.tsx +19 -19
- package/src/components/common/inputs/SearchField.tsx +128 -128
- package/src/components/common/inputs/SelectField.tsx +170 -169
- package/src/components/common/inputs/SurfacePalettePicker.tsx +54 -54
- package/src/components/common/inputs/TextAreaField.tsx +22 -22
- package/src/components/common/inputs/TextField.tsx +51 -51
- package/src/components/common/inputs/ToggleSwitch.tsx +110 -110
- package/src/components/common/inputs/WorkspacePicker.tsx +349 -349
- package/src/components/common/inputs/fieldStyles.ts +141 -137
- package/src/components/common/layout/PanelGroup.tsx +485 -479
- package/src/components/common/layout/index.ts +31 -31
- package/src/components/common/layout/panelLayoutConstants.ts +7 -7
- package/src/components/common/layout/panelLayoutPersistence.ts +35 -35
- package/src/components/common/layout/panelLayoutState.test.ts +38 -38
- package/src/components/common/layout/panelLayoutState.ts +174 -174
- package/src/components/common/layout/panelLayoutTypes.ts +19 -19
- package/src/components/common/layout/tabs/Tabs.tsx +136 -136
- package/src/components/common/lists/listRowStyles.ts +32 -32
- package/src/components/common/lists/quiet-ledger/QuietActivityList.tsx +64 -64
- package/src/components/common/lists/quiet-ledger/QuietLedgerRow.tsx +119 -119
- package/src/components/common/lists/quiet-ledger/index.ts +9 -9
- package/src/components/common/lists/reorderable/DragHandle.tsx +65 -65
- package/src/components/common/lists/reorderable/ReorderableList.tsx +280 -280
- package/src/components/common/lists/reorderable/ReorderableListRow.tsx +102 -102
- package/src/components/common/lists/reorderable/ReorderableSections.tsx +344 -344
- package/src/components/common/lists/reorderable/ReorderableSectionsDemo.tsx +94 -94
- package/src/components/common/lists/reorderable/index.ts +15 -15
- package/src/components/common/lists/reorderable/reorderableUtils.test.ts +28 -28
- package/src/components/common/lists/reorderable/reorderableUtils.ts +23 -23
- package/src/components/common/lists/reorderable/types.ts +40 -40
- package/src/components/common/lists/reorderable/useReorderableDragState.ts +49 -49
- package/src/components/common/media/ImageReferencePicker.tsx +242 -242
- package/src/components/common/menubar/MenuBar.tsx +78 -78
- package/src/components/common/menubar/MenuBarTrigger.tsx +70 -70
- package/src/components/common/narrative/NarrativeMention.tsx +74 -74
- package/src/components/common/navigation/NavigationCardRow.tsx +98 -0
- package/src/components/common/navigation/PathBreadcrumbs.tsx +78 -78
- package/src/components/common/navigation/UnderlineTabs.tsx +83 -83
- package/src/components/common/navigation/index.ts +15 -0
- package/src/components/common/overlays/InstallAppPromptDialog.tsx +59 -59
- package/src/components/common/overlays/Modal.tsx +292 -285
- package/src/components/common/overlays/ModalChromeHeader.tsx +105 -105
- package/src/components/common/overlays/ObjectActionStrip.tsx +80 -80
- package/src/components/common/people/AutoUpdateReviewList.tsx +182 -182
- package/src/components/common/people/EntityList.tsx +122 -122
- package/src/components/common/people/EntityPortrait.tsx +64 -64
- package/src/components/common/people/LinkedDossierList.tsx +99 -99
- package/src/components/common/people/OpportunityList.tsx +94 -94
- package/src/components/common/people/PeopleSourceList.tsx +145 -145
- package/src/components/common/people/RelationshipDossier.tsx +168 -168
- package/src/components/common/people/RelationshipMap.tsx +362 -362
- package/src/components/common/people/index.ts +40 -40
- package/src/components/common/preview/FileAudioPreview.tsx +89 -89
- package/src/components/common/preview/FileImagePreview.tsx +88 -88
- package/src/components/common/preview/FilePdfPreview.tsx +87 -87
- package/src/components/common/preview/FileTextPreview.tsx +96 -96
- package/src/components/common/preview/FileVideoPreview.tsx +87 -87
- package/src/components/common/preview/PlatformFilePreview.tsx +166 -166
- package/src/components/common/preview/previewLayout.ts +27 -27
- package/src/components/common/render/Each.tsx +42 -42
- package/src/components/common/research/EvidenceDossier.tsx +904 -894
- package/src/components/common/research/index.ts +7 -7
- package/src/components/common/tiles/CatalogCard.tsx +116 -116
- package/src/components/common/tiles/Tile.tsx +45 -45
- package/src/components/common/tiles/TileGrid.tsx +19 -13
- package/src/components/common/typography/Heading.tsx +27 -27
- package/src/components/common/typography/Kicker.tsx +36 -30
- package/src/components/common/typography/Text.tsx +80 -80
- package/src/components/credentials/CredentialsPanel.tsx +236 -169
- package/src/components/credentials/credentialProviderIcon.tsx +79 -0
- package/src/components/credentials/credentialsTypes.ts +14 -14
- package/src/components/credentials/lobeIcons.d.ts +4 -0
- package/src/components/data/DataChart.tsx +913 -913
- package/src/components/data/dataTable.ts +99 -99
- package/src/components/editor/EditorCommentPromptDialog.tsx +124 -124
- package/src/components/editor/EditorLinkPromptDialog.tsx +65 -65
- package/src/components/print-design/PrintDesignPanel.test.tsx +1446 -1446
- package/src/components/print-design/PrintDesignPanel.tsx +3045 -3043
- package/src/components/print-design/index.ts +9 -9
- package/src/components/proofing/PagedProofDialog.tsx +453 -453
- package/src/components/proofing/index.ts +4 -4
- package/src/editor/DocumentEditor.tsx +28 -28
- package/src/editor/EditorViewModeToggle.tsx +38 -35
- package/src/editor/index.ts +98 -97
- package/src/editor/toolbarOverlays.ts +8 -8
- package/src/index.ts +231 -209
- package/src/theme/ThemeProvider.tsx +115 -113
- package/src/theme/appAccents.ts +115 -87
- package/src/theme/buildThemeBridgePayload.ts +23 -23
- package/src/theme/composePlatformTheme.test.ts +47 -30
- package/src/theme/composePlatformTheme.ts +23 -23
- package/src/theme/platformFont.d.mts +7 -7
- package/src/theme/platformFont.mjs +20 -20
- package/src/theme/platformFont.ts +6 -6
- package/src/theme/reportsShellChromeSelectors.ts +136 -136
- package/src/theme/styled.d.ts +5 -5
- package/src/theme/surfacePalettes.ts +179 -178
- package/src/theme/surfaceRoleSelectors.ts +113 -113
- package/src/theme/themeVars.ts +13 -13
- package/src/theme/themes/dark.ts +59 -59
- package/src/theme/themes/light.ts +60 -60
- package/src/theme/themes/palette.ts +44 -44
- package/src/theme/themes/shared.ts +68 -68
- package/src/theme/tokens.ts +114 -114
- package/src/theme/utils/GlobalStyles.ts +88 -88
- package/src/theme/utils/appFrameDocumentStyles.d.mts +5 -5
- package/src/theme/utils/appFrameDocumentStyles.mjs +89 -89
- package/src/theme/utils/appFrameDocumentStyles.ts +5 -5
- package/src/theme/utils/applyTheme.test.ts +19 -0
- package/src/theme/utils/applyTheme.ts +59 -50
- package/src/theme/utils/cssVariables.ts +49 -49
- package/src/theme/utils/useInjectThemeIntoIframe.ts +40 -40
- package/src/utils/extensionIconMap.ts +123 -123
- package/src/utils/generalUtils.ts +157 -157
- package/src/writing/DraftAssistantDialog.tsx +279 -279
- package/src/writing/WritingStyleManager.tsx +416 -416
- package/src/writing/condenseWritingStyle.ts +103 -103
- package/src/writing/draftTextWithAgent.ts +134 -134
- package/src/writing/index.ts +39 -39
- package/src/writing/styleStore.ts +32 -32
- package/src/writing/writingStyle.test.ts +122 -122
- package/src/writing/writingStyle.ts +217 -217
package/src/bridge/fs.d.mts
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
PlatformFilePreviewUrlResult,
|
|
3
|
-
PlatformFileReadBinaryResult,
|
|
4
|
-
PlatformFileReadPreviewResult,
|
|
5
|
-
} from './types.js'
|
|
6
|
-
|
|
7
|
-
export declare const PLATFORM_FILE_TEXT_PREVIEW_MAX_BYTES: number
|
|
8
|
-
export declare const PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES: number
|
|
9
|
-
|
|
10
|
-
export declare function readPlatformFilePreview(
|
|
11
|
-
path: string,
|
|
12
|
-
maxBytes?: number,
|
|
13
|
-
): Promise<PlatformFileReadPreviewResult>
|
|
14
|
-
|
|
15
|
-
export declare function readPlatformFileBinary(
|
|
16
|
-
path: string,
|
|
17
|
-
maxBytes?: number,
|
|
18
|
-
): Promise<PlatformFileReadBinaryResult>
|
|
19
|
-
|
|
20
|
-
export declare function readPlatformFilePreviewUrl(
|
|
21
|
-
path: string,
|
|
22
|
-
): Promise<PlatformFilePreviewUrlResult>
|
|
23
|
-
|
|
24
|
-
export declare function dataUrlFromFileBinary(
|
|
25
|
-
result: PlatformFileReadBinaryResult,
|
|
26
|
-
): string
|
|
27
|
-
|
|
28
|
-
export declare function readPlatformFileBinaryDataUrl(
|
|
29
|
-
path: string,
|
|
30
|
-
maxBytes?: number,
|
|
31
|
-
): Promise<string>
|
|
32
|
-
|
|
33
|
-
export declare function writePlatformFileBinary(
|
|
34
|
-
path: string,
|
|
35
|
-
base64: string,
|
|
36
|
-
): Promise<{ ok: true }>
|
|
37
|
-
|
|
38
|
-
export declare function createPlatformFolder(
|
|
39
|
-
parentPath: string,
|
|
40
|
-
name: string,
|
|
41
|
-
): Promise<{ path: string }>
|
|
1
|
+
import type {
|
|
2
|
+
PlatformFilePreviewUrlResult,
|
|
3
|
+
PlatformFileReadBinaryResult,
|
|
4
|
+
PlatformFileReadPreviewResult,
|
|
5
|
+
} from './types.js'
|
|
6
|
+
|
|
7
|
+
export declare const PLATFORM_FILE_TEXT_PREVIEW_MAX_BYTES: number
|
|
8
|
+
export declare const PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES: number
|
|
9
|
+
|
|
10
|
+
export declare function readPlatformFilePreview(
|
|
11
|
+
path: string,
|
|
12
|
+
maxBytes?: number,
|
|
13
|
+
): Promise<PlatformFileReadPreviewResult>
|
|
14
|
+
|
|
15
|
+
export declare function readPlatformFileBinary(
|
|
16
|
+
path: string,
|
|
17
|
+
maxBytes?: number,
|
|
18
|
+
): Promise<PlatformFileReadBinaryResult>
|
|
19
|
+
|
|
20
|
+
export declare function readPlatformFilePreviewUrl(
|
|
21
|
+
path: string,
|
|
22
|
+
): Promise<PlatformFilePreviewUrlResult>
|
|
23
|
+
|
|
24
|
+
export declare function dataUrlFromFileBinary(
|
|
25
|
+
result: PlatformFileReadBinaryResult,
|
|
26
|
+
): string
|
|
27
|
+
|
|
28
|
+
export declare function readPlatformFileBinaryDataUrl(
|
|
29
|
+
path: string,
|
|
30
|
+
maxBytes?: number,
|
|
31
|
+
): Promise<string>
|
|
32
|
+
|
|
33
|
+
export declare function writePlatformFileBinary(
|
|
34
|
+
path: string,
|
|
35
|
+
base64: string,
|
|
36
|
+
): Promise<{ ok: true }>
|
|
37
|
+
|
|
38
|
+
export declare function createPlatformFolder(
|
|
39
|
+
parentPath: string,
|
|
40
|
+
name: string,
|
|
41
|
+
): Promise<{ path: string }>
|
package/src/bridge/fs.mjs
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import { bridge } from './client.mjs'
|
|
2
|
-
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
-
|
|
4
|
-
/** Default text preview cap — matches shell `readPlatformFilePreview`. */
|
|
5
|
-
export const PLATFORM_FILE_TEXT_PREVIEW_MAX_BYTES = 64 * 1024
|
|
6
|
-
|
|
7
|
-
/** Default binary preview cap for legacy inline image reads. Prefer `fs.previewUrl`. */
|
|
8
|
-
export const PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES = 5 * 1024 * 1024
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @param {string} path
|
|
12
|
-
* @returns {Promise<import('./types.ts').PlatformFilePreviewUrlResult>}
|
|
13
|
-
*/
|
|
14
|
-
export async function readPlatformFilePreviewUrl(path) {
|
|
15
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_PREVIEW_URL, [{ path }])
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* @param {string} path
|
|
20
|
-
* @param {number | undefined} maxBytes
|
|
21
|
-
* @returns {Promise<import('./types.ts').PlatformFileReadPreviewResult>}
|
|
22
|
-
*/
|
|
23
|
-
export async function readPlatformFilePreview(path, maxBytes) {
|
|
24
|
-
const request = maxBytes === undefined ? { path } : { path, maxBytes }
|
|
25
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_READ_PREVIEW, [request])
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @param {string} path
|
|
30
|
-
* @param {number | undefined} maxBytes
|
|
31
|
-
* @returns {Promise<import('./types.ts').PlatformFileReadBinaryResult>}
|
|
32
|
-
*/
|
|
33
|
-
export async function readPlatformFileBinary(path, maxBytes) {
|
|
34
|
-
const request = maxBytes === undefined ? { path } : { path, maxBytes }
|
|
35
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_READ_BINARY, [request])
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* @param {import('./types.ts').PlatformFileReadBinaryResult} result
|
|
40
|
-
* @returns {string}
|
|
41
|
-
*/
|
|
42
|
-
export function dataUrlFromFileBinary(result) {
|
|
43
|
-
return `data:${result.mimeType};base64,${result.base64}`
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Read file bytes via bridge and return an inline data URL (non-React).
|
|
48
|
-
* Default cap matches asset thumbnails and legacy inline image reads.
|
|
49
|
-
*
|
|
50
|
-
* @param {string} path
|
|
51
|
-
* @param {number | undefined} maxBytes
|
|
52
|
-
* @returns {Promise<string>}
|
|
53
|
-
*/
|
|
54
|
-
export async function readPlatformFileBinaryDataUrl(path, maxBytes) {
|
|
55
|
-
const result = await readPlatformFileBinary(
|
|
56
|
-
path,
|
|
57
|
-
maxBytes ?? PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES,
|
|
58
|
-
)
|
|
59
|
-
return dataUrlFromFileBinary(result)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* @param {string} path
|
|
64
|
-
* @param {string} base64
|
|
65
|
-
* @returns {Promise<{ ok: true }>}
|
|
66
|
-
*/
|
|
67
|
-
export async function writePlatformFileBinary(path, base64) {
|
|
68
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_WRITE_BINARY, [
|
|
69
|
-
{ path, base64 },
|
|
70
|
-
])
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* @param {string} parentPath
|
|
75
|
-
* @param {string} name
|
|
76
|
-
* @returns {Promise<{ path: string }>}
|
|
77
|
-
*/
|
|
78
|
-
export async function createPlatformFolder(parentPath, name) {
|
|
79
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_CREATE_FOLDER, [
|
|
80
|
-
{ parentPath, name },
|
|
81
|
-
])
|
|
82
|
-
}
|
|
1
|
+
import { bridge } from './client.mjs'
|
|
2
|
+
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
+
|
|
4
|
+
/** Default text preview cap — matches shell `readPlatformFilePreview`. */
|
|
5
|
+
export const PLATFORM_FILE_TEXT_PREVIEW_MAX_BYTES = 64 * 1024
|
|
6
|
+
|
|
7
|
+
/** Default binary preview cap for legacy inline image reads. Prefer `fs.previewUrl`. */
|
|
8
|
+
export const PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES = 5 * 1024 * 1024
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @param {string} path
|
|
12
|
+
* @returns {Promise<import('./types.ts').PlatformFilePreviewUrlResult>}
|
|
13
|
+
*/
|
|
14
|
+
export async function readPlatformFilePreviewUrl(path) {
|
|
15
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_PREVIEW_URL, [{ path }])
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {string} path
|
|
20
|
+
* @param {number | undefined} maxBytes
|
|
21
|
+
* @returns {Promise<import('./types.ts').PlatformFileReadPreviewResult>}
|
|
22
|
+
*/
|
|
23
|
+
export async function readPlatformFilePreview(path, maxBytes) {
|
|
24
|
+
const request = maxBytes === undefined ? { path } : { path, maxBytes }
|
|
25
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_READ_PREVIEW, [request])
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {string} path
|
|
30
|
+
* @param {number | undefined} maxBytes
|
|
31
|
+
* @returns {Promise<import('./types.ts').PlatformFileReadBinaryResult>}
|
|
32
|
+
*/
|
|
33
|
+
export async function readPlatformFileBinary(path, maxBytes) {
|
|
34
|
+
const request = maxBytes === undefined ? { path } : { path, maxBytes }
|
|
35
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_READ_BINARY, [request])
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param {import('./types.ts').PlatformFileReadBinaryResult} result
|
|
40
|
+
* @returns {string}
|
|
41
|
+
*/
|
|
42
|
+
export function dataUrlFromFileBinary(result) {
|
|
43
|
+
return `data:${result.mimeType};base64,${result.base64}`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Read file bytes via bridge and return an inline data URL (non-React).
|
|
48
|
+
* Default cap matches asset thumbnails and legacy inline image reads.
|
|
49
|
+
*
|
|
50
|
+
* @param {string} path
|
|
51
|
+
* @param {number | undefined} maxBytes
|
|
52
|
+
* @returns {Promise<string>}
|
|
53
|
+
*/
|
|
54
|
+
export async function readPlatformFileBinaryDataUrl(path, maxBytes) {
|
|
55
|
+
const result = await readPlatformFileBinary(
|
|
56
|
+
path,
|
|
57
|
+
maxBytes ?? PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES,
|
|
58
|
+
)
|
|
59
|
+
return dataUrlFromFileBinary(result)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param {string} path
|
|
64
|
+
* @param {string} base64
|
|
65
|
+
* @returns {Promise<{ ok: true }>}
|
|
66
|
+
*/
|
|
67
|
+
export async function writePlatformFileBinary(path, base64) {
|
|
68
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_WRITE_BINARY, [
|
|
69
|
+
{ path, base64 },
|
|
70
|
+
])
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @param {string} parentPath
|
|
75
|
+
* @param {string} name
|
|
76
|
+
* @returns {Promise<{ path: string }>}
|
|
77
|
+
*/
|
|
78
|
+
export async function createPlatformFolder(parentPath, name) {
|
|
79
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.FS_CREATE_FOLDER, [
|
|
80
|
+
{ parentPath, name },
|
|
81
|
+
])
|
|
82
|
+
}
|
package/src/bridge/fs.test.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { dataUrlFromFileBinary } from './fs.mjs'
|
|
3
|
-
|
|
4
|
-
describe('dataUrlFromFileBinary', () => {
|
|
5
|
-
it('builds a data URL from bridge binary result', () => {
|
|
6
|
-
expect(
|
|
7
|
-
dataUrlFromFileBinary({
|
|
8
|
-
path: '/tmp/image.png',
|
|
9
|
-
mimeType: 'image/png',
|
|
10
|
-
base64: 'abc123',
|
|
11
|
-
truncated: false,
|
|
12
|
-
byteLength: 3,
|
|
13
|
-
}),
|
|
14
|
-
).toBe('data:image/png;base64,abc123')
|
|
15
|
-
})
|
|
16
|
-
})
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { dataUrlFromFileBinary } from './fs.mjs'
|
|
3
|
+
|
|
4
|
+
describe('dataUrlFromFileBinary', () => {
|
|
5
|
+
it('builds a data URL from bridge binary result', () => {
|
|
6
|
+
expect(
|
|
7
|
+
dataUrlFromFileBinary({
|
|
8
|
+
path: '/tmp/image.png',
|
|
9
|
+
mimeType: 'image/png',
|
|
10
|
+
base64: 'abc123',
|
|
11
|
+
truncated: false,
|
|
12
|
+
byteLength: 3,
|
|
13
|
+
}),
|
|
14
|
+
).toBe('data:image/png;base64,abc123')
|
|
15
|
+
})
|
|
16
|
+
})
|
package/src/bridge/fs.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export {
|
|
2
|
-
dataUrlFromFileBinary,
|
|
3
|
-
readPlatformFileBinary,
|
|
4
|
-
readPlatformFileBinaryDataUrl,
|
|
5
|
-
readPlatformFilePreview,
|
|
6
|
-
readPlatformFilePreviewUrl,
|
|
7
|
-
writePlatformFileBinary,
|
|
8
|
-
PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES,
|
|
9
|
-
PLATFORM_FILE_TEXT_PREVIEW_MAX_BYTES,
|
|
10
|
-
} from './fs.mjs'
|
|
1
|
+
export {
|
|
2
|
+
dataUrlFromFileBinary,
|
|
3
|
+
readPlatformFileBinary,
|
|
4
|
+
readPlatformFileBinaryDataUrl,
|
|
5
|
+
readPlatformFilePreview,
|
|
6
|
+
readPlatformFilePreviewUrl,
|
|
7
|
+
writePlatformFileBinary,
|
|
8
|
+
PLATFORM_FILE_BINARY_PREVIEW_MAX_BYTES,
|
|
9
|
+
PLATFORM_FILE_TEXT_PREVIEW_MAX_BYTES,
|
|
10
|
+
} from './fs.mjs'
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
export interface GoogleOauthTokens {
|
|
2
|
+
accessToken: string
|
|
3
|
+
refreshToken?: string
|
|
4
|
+
expiresAt: number
|
|
5
|
+
scope: string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const GMAIL_SCOPES = [
|
|
9
|
+
'https://www.googleapis.com/auth/gmail.modify',
|
|
10
|
+
'https://www.googleapis.com/auth/gmail.send',
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
export const CALENDAR_SCOPES = [
|
|
14
|
+
'https://www.googleapis.com/auth/calendar.events',
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
export const GOOGLE_AUTHORIZATION_ENDPOINT =
|
|
18
|
+
'https://accounts.google.com/o/oauth2/v2/auth'
|
|
19
|
+
export const GOOGLE_TOKEN_ENDPOINT = 'https://oauth2.googleapis.com/token'
|
|
20
|
+
|
|
21
|
+
const EXPIRY_SLACK_MS = 60_000
|
|
22
|
+
|
|
23
|
+
export interface PkcePair {
|
|
24
|
+
verifier: string
|
|
25
|
+
challenge: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function base64UrlEncode(bytes: Uint8Array): string {
|
|
29
|
+
let binary = ''
|
|
30
|
+
for (const byte of bytes) {
|
|
31
|
+
binary += String.fromCharCode(byte)
|
|
32
|
+
}
|
|
33
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function randomUrlSafeString(byteLength = 32): string {
|
|
37
|
+
const bytes = new Uint8Array(byteLength)
|
|
38
|
+
crypto.getRandomValues(bytes)
|
|
39
|
+
return base64UrlEncode(bytes)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function createPkcePair(): Promise<PkcePair> {
|
|
43
|
+
const verifier = randomUrlSafeString(48)
|
|
44
|
+
const digest = await crypto.subtle.digest(
|
|
45
|
+
'SHA-256',
|
|
46
|
+
new TextEncoder().encode(verifier),
|
|
47
|
+
)
|
|
48
|
+
return { verifier, challenge: base64UrlEncode(new Uint8Array(digest)) }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface GoogleAuthUrlInput {
|
|
52
|
+
clientId: string
|
|
53
|
+
challenge: string
|
|
54
|
+
state: string
|
|
55
|
+
scopes?: string[]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function buildGoogleAuthorizationUrl(input: GoogleAuthUrlInput): string {
|
|
59
|
+
const url = new URL(GOOGLE_AUTHORIZATION_ENDPOINT)
|
|
60
|
+
url.searchParams.set('client_id', input.clientId)
|
|
61
|
+
url.searchParams.set('response_type', 'code')
|
|
62
|
+
url.searchParams.set('scope', (input.scopes ?? CALENDAR_SCOPES).join(' '))
|
|
63
|
+
url.searchParams.set('code_challenge', input.challenge)
|
|
64
|
+
url.searchParams.set('code_challenge_method', 'S256')
|
|
65
|
+
url.searchParams.set('state', input.state)
|
|
66
|
+
url.searchParams.set('access_type', 'offline')
|
|
67
|
+
url.searchParams.set('prompt', 'consent')
|
|
68
|
+
return url.toString()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
interface GoogleTokenResponse {
|
|
72
|
+
access_token: string
|
|
73
|
+
refresh_token?: string
|
|
74
|
+
expires_in: number
|
|
75
|
+
scope: string
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function tokensFromTokenResponse(
|
|
79
|
+
payload: GoogleTokenResponse,
|
|
80
|
+
previousRefreshToken?: string,
|
|
81
|
+
now = Date.now(),
|
|
82
|
+
): GoogleOauthTokens {
|
|
83
|
+
const refreshToken = payload.refresh_token ?? previousRefreshToken
|
|
84
|
+
return {
|
|
85
|
+
accessToken: payload.access_token,
|
|
86
|
+
...(refreshToken === undefined ? {} : { refreshToken }),
|
|
87
|
+
expiresAt: now + payload.expires_in * 1000,
|
|
88
|
+
scope: payload.scope,
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function accessTokenIsFresh(
|
|
93
|
+
tokens: GoogleOauthTokens,
|
|
94
|
+
now = Date.now(),
|
|
95
|
+
): boolean {
|
|
96
|
+
return tokens.expiresAt - EXPIRY_SLACK_MS > now
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface TokenExchangeInput {
|
|
100
|
+
clientId: string
|
|
101
|
+
clientSecret?: string
|
|
102
|
+
code: string
|
|
103
|
+
verifier: string
|
|
104
|
+
redirectUri: string
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
type FormPost = (
|
|
108
|
+
url: string,
|
|
109
|
+
body: string,
|
|
110
|
+
) => Promise<{ ok: boolean; status: number; body: string }>
|
|
111
|
+
|
|
112
|
+
export async function exchangeCodeForTokens(
|
|
113
|
+
post: FormPost,
|
|
114
|
+
input: TokenExchangeInput,
|
|
115
|
+
): Promise<GoogleOauthTokens> {
|
|
116
|
+
const body = new URLSearchParams({
|
|
117
|
+
client_id: input.clientId,
|
|
118
|
+
grant_type: 'authorization_code',
|
|
119
|
+
code: input.code,
|
|
120
|
+
code_verifier: input.verifier,
|
|
121
|
+
redirect_uri: input.redirectUri,
|
|
122
|
+
})
|
|
123
|
+
if (input.clientSecret) body.set('client_secret', input.clientSecret)
|
|
124
|
+
const response = await post(GOOGLE_TOKEN_ENDPOINT, body.toString())
|
|
125
|
+
if (!response.ok) {
|
|
126
|
+
throw new Error(
|
|
127
|
+
`Google token exchange failed (${response.status}): ${response.body}`,
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
return tokensFromTokenResponse(JSON.parse(response.body) as GoogleTokenResponse)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface TokenRefreshInput {
|
|
134
|
+
clientId: string
|
|
135
|
+
clientSecret?: string
|
|
136
|
+
refreshToken: string
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export async function refreshAccessToken(
|
|
140
|
+
post: FormPost,
|
|
141
|
+
input: TokenRefreshInput,
|
|
142
|
+
): Promise<GoogleOauthTokens> {
|
|
143
|
+
const body = new URLSearchParams({
|
|
144
|
+
client_id: input.clientId,
|
|
145
|
+
grant_type: 'refresh_token',
|
|
146
|
+
refresh_token: input.refreshToken,
|
|
147
|
+
})
|
|
148
|
+
if (input.clientSecret) body.set('client_secret', input.clientSecret)
|
|
149
|
+
const response = await post(GOOGLE_TOKEN_ENDPOINT, body.toString())
|
|
150
|
+
if (!response.ok) {
|
|
151
|
+
throw new Error(
|
|
152
|
+
`Google token refresh failed (${response.status}): ${response.body}`,
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
return tokensFromTokenResponse(
|
|
156
|
+
JSON.parse(response.body) as GoogleTokenResponse,
|
|
157
|
+
input.refreshToken,
|
|
158
|
+
)
|
|
159
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { GoogleOauthTokens } from './googleAuth.js'
|
|
2
|
+
|
|
3
|
+
export const GOOGLE_OAUTH_CLIENT_SECRET_KEY = 'google-oauth-client'
|
|
4
|
+
export const PUREMAIL_GOOGLE_SECRET_KEY = 'puremail-google'
|
|
5
|
+
export const PURECALENDAR_GOOGLE_SECRET_KEY = 'purecalendar-google'
|
|
6
|
+
|
|
7
|
+
export interface GoogleProviderPublicSettings {
|
|
8
|
+
clientId?: string
|
|
9
|
+
email?: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface GoogleOAuthClientSecretPayload {
|
|
13
|
+
clientSecret?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface GoogleProviderSecretPayload {
|
|
17
|
+
tokens?: GoogleOauthTokens
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface GoogleProviderSettingsSource {
|
|
21
|
+
label: string
|
|
22
|
+
publicSettings: GoogleProviderPublicSettings | undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface ResolvedGoogleProviderPublicSettings {
|
|
26
|
+
publicSettings: GoogleProviderPublicSettings
|
|
27
|
+
sourceLabel?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function normalizeGooglePublicSettings(
|
|
31
|
+
value: GoogleProviderPublicSettings | undefined,
|
|
32
|
+
): GoogleProviderPublicSettings {
|
|
33
|
+
return {
|
|
34
|
+
clientId: value?.clientId?.trim() || undefined,
|
|
35
|
+
email: value?.email?.trim() || undefined,
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function resolveGooglePublicSettings(
|
|
40
|
+
sources: GoogleProviderSettingsSource[],
|
|
41
|
+
): ResolvedGoogleProviderPublicSettings {
|
|
42
|
+
for (const source of sources) {
|
|
43
|
+
const publicSettings = normalizeGooglePublicSettings(source.publicSettings)
|
|
44
|
+
if (publicSettings.clientId || publicSettings.email) {
|
|
45
|
+
return { publicSettings, sourceLabel: source.label }
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { publicSettings: {} }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function parseGoogleClientSecretPayload(
|
|
52
|
+
raw: string | null,
|
|
53
|
+
): GoogleOAuthClientSecretPayload {
|
|
54
|
+
if (!raw) return {}
|
|
55
|
+
try {
|
|
56
|
+
const parsed = JSON.parse(raw) as GoogleOAuthClientSecretPayload
|
|
57
|
+
return { clientSecret: parsed.clientSecret?.trim() || undefined }
|
|
58
|
+
} catch {
|
|
59
|
+
return {}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function parseGoogleProviderSecretPayload(
|
|
64
|
+
raw: string | null,
|
|
65
|
+
): GoogleProviderSecretPayload {
|
|
66
|
+
if (!raw) return {}
|
|
67
|
+
try {
|
|
68
|
+
const parsed = JSON.parse(raw) as GoogleProviderSecretPayload
|
|
69
|
+
return parsed.tokens ? { tokens: parsed.tokens } : {}
|
|
70
|
+
} catch {
|
|
71
|
+
return {}
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/bridge/index.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export type { PlatformBridgeEventName } from './events.mjs'
|
|
2
|
-
export type {
|
|
3
|
-
PlatformFileKind,
|
|
4
|
-
PlatformAppManifest,
|
|
5
|
-
PlatformShellManifest,
|
|
6
|
-
PlatformBridgeReadyMeta,
|
|
7
|
-
PlatformBridgeViewportBinding,
|
|
8
|
-
PlatformThemeBridgePayload,
|
|
9
|
-
ResourceOpenEvent,
|
|
10
|
-
PlatformBridgeEventHandler,
|
|
11
|
-
PlatformBridgeClient,
|
|
12
|
-
} from './types.js'
|
|
1
|
+
export type { PlatformBridgeEventName } from './events.mjs'
|
|
2
|
+
export type {
|
|
3
|
+
PlatformFileKind,
|
|
4
|
+
PlatformAppManifest,
|
|
5
|
+
PlatformShellManifest,
|
|
6
|
+
PlatformBridgeReadyMeta,
|
|
7
|
+
PlatformBridgeViewportBinding,
|
|
8
|
+
PlatformThemeBridgePayload,
|
|
9
|
+
ResourceOpenEvent,
|
|
10
|
+
PlatformBridgeEventHandler,
|
|
11
|
+
PlatformBridgeClient,
|
|
12
|
+
} from './types.js'
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
export type InlineAssetPreviewKind = 'mermaid' | 'table' | 'math'
|
|
2
|
-
|
|
3
|
-
export interface InlineAssetPreviewResult {
|
|
4
|
-
html: string
|
|
5
|
-
error?: string
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export declare function extractMermaidSourceFromHtml(html: string): string
|
|
9
|
-
|
|
10
|
-
export interface ExpandMermaidBlocksOptions {
|
|
11
|
-
theme?: 'default' | 'dark'
|
|
12
|
-
/** Wrapper div class around rendered SVG. Default `platform-print-mermaid`. */
|
|
13
|
-
wrapperClass?: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export declare function expandMermaidBlocksForPrint(
|
|
17
|
-
html: string,
|
|
18
|
-
options?: ExpandMermaidBlocksOptions,
|
|
19
|
-
): Promise<string>
|
|
20
|
-
|
|
21
|
-
export declare function sanitizeInlineTableHtml(source: string): string
|
|
22
|
-
|
|
23
|
-
export declare function renderMermaidPreviewSvg(
|
|
24
|
-
sourceCode: string,
|
|
25
|
-
options?: { theme?: 'default' | 'dark' },
|
|
26
|
-
): Promise<string>
|
|
27
|
-
|
|
28
|
-
export declare function renderMathPreviewHtml(
|
|
29
|
-
sourceCode: string,
|
|
30
|
-
): Promise<string>
|
|
31
|
-
|
|
32
|
-
export declare function renderInlineAssetPreview(
|
|
33
|
-
kind: InlineAssetPreviewKind,
|
|
34
|
-
sourceCode: string,
|
|
35
|
-
): Promise<InlineAssetPreviewResult>
|
|
1
|
+
export type InlineAssetPreviewKind = 'mermaid' | 'table' | 'math'
|
|
2
|
+
|
|
3
|
+
export interface InlineAssetPreviewResult {
|
|
4
|
+
html: string
|
|
5
|
+
error?: string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export declare function extractMermaidSourceFromHtml(html: string): string
|
|
9
|
+
|
|
10
|
+
export interface ExpandMermaidBlocksOptions {
|
|
11
|
+
theme?: 'default' | 'dark'
|
|
12
|
+
/** Wrapper div class around rendered SVG. Default `platform-print-mermaid`. */
|
|
13
|
+
wrapperClass?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export declare function expandMermaidBlocksForPrint(
|
|
17
|
+
html: string,
|
|
18
|
+
options?: ExpandMermaidBlocksOptions,
|
|
19
|
+
): Promise<string>
|
|
20
|
+
|
|
21
|
+
export declare function sanitizeInlineTableHtml(source: string): string
|
|
22
|
+
|
|
23
|
+
export declare function renderMermaidPreviewSvg(
|
|
24
|
+
sourceCode: string,
|
|
25
|
+
options?: { theme?: 'default' | 'dark' },
|
|
26
|
+
): Promise<string>
|
|
27
|
+
|
|
28
|
+
export declare function renderMathPreviewHtml(
|
|
29
|
+
sourceCode: string,
|
|
30
|
+
): Promise<string>
|
|
31
|
+
|
|
32
|
+
export declare function renderInlineAssetPreview(
|
|
33
|
+
kind: InlineAssetPreviewKind,
|
|
34
|
+
sourceCode: string,
|
|
35
|
+
): Promise<InlineAssetPreviewResult>
|