@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
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
import type { Editor } from '@tiptap/core'
|
|
2
|
-
import { insertCollectionImage } from '@purescience/platform-editor'
|
|
3
|
-
import { DEFAULT_COLLECTION_FIGURES_DIR } from './collectionAssets.js'
|
|
4
|
-
import { absoluteCollectionAssetPath } from './collectionDocumentHtml.js'
|
|
5
|
-
|
|
6
|
-
const SUPPORTED_MIME = new Set([
|
|
7
|
-
'image/png',
|
|
8
|
-
'image/jpeg',
|
|
9
|
-
'image/gif',
|
|
10
|
-
'image/webp',
|
|
11
|
-
'image/svg+xml',
|
|
12
|
-
])
|
|
13
|
-
|
|
14
|
-
const EXT_FOR_MIME: Record<string, string> = {
|
|
15
|
-
'image/png': 'png',
|
|
16
|
-
'image/jpeg': 'jpg',
|
|
17
|
-
'image/gif': 'gif',
|
|
18
|
-
'image/webp': 'webp',
|
|
19
|
-
'image/svg+xml': 'svg',
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface CollectionImagePastePayload {
|
|
23
|
-
name: string
|
|
24
|
-
bytes: Uint8Array
|
|
25
|
-
mimeType: string
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface CollectionImagePasteHandlerOptions {
|
|
29
|
-
collectionPath?: string
|
|
30
|
-
subdir?: string
|
|
31
|
-
onError?: (message: string) => void
|
|
32
|
-
getEditor: () => Editor | null | undefined
|
|
33
|
-
writeBinary: (absolutePath: string, bytes: Uint8Array) => Promise<void>
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function normalizeCollectionImageMimeType(
|
|
37
|
-
mimeType: string | undefined,
|
|
38
|
-
name: string,
|
|
39
|
-
): string | undefined {
|
|
40
|
-
const trimmed = mimeType?.trim().toLowerCase()
|
|
41
|
-
if (trimmed && SUPPORTED_MIME.has(trimmed)) return trimmed
|
|
42
|
-
const ext = name.split('.').pop()?.toLowerCase()
|
|
43
|
-
if (ext === 'png') return 'image/png'
|
|
44
|
-
if (ext === 'jpg' || ext === 'jpeg') return 'image/jpeg'
|
|
45
|
-
if (ext === 'gif') return 'image/gif'
|
|
46
|
-
if (ext === 'webp') return 'image/webp'
|
|
47
|
-
if (ext === 'svg') return 'image/svg+xml'
|
|
48
|
-
return undefined
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function stemFromImageFileName(name: string): string {
|
|
52
|
-
const base = name.replace(/\\/g, '/').split('/').pop() ?? name
|
|
53
|
-
const dot = base.lastIndexOf('.')
|
|
54
|
-
const stem = dot > 0 ? base.slice(0, dot) : base
|
|
55
|
-
return stem.replace(/\s+/g, '-').replace(/[^\w.-]+/g, '') || 'image'
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function extensionFromImageFileName(name: string): string | undefined {
|
|
59
|
-
const ext = name.split('.').pop()?.toLowerCase()
|
|
60
|
-
if (!ext) return undefined
|
|
61
|
-
if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(ext)) {
|
|
62
|
-
return ext === 'jpeg' ? 'jpg' : ext
|
|
63
|
-
}
|
|
64
|
-
return undefined
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function buildPastedFigureRelativePath(
|
|
68
|
-
subdir: string,
|
|
69
|
-
name: string,
|
|
70
|
-
mimeType?: string,
|
|
71
|
-
now = Date.now(),
|
|
72
|
-
): string {
|
|
73
|
-
const normalizedMime =
|
|
74
|
-
normalizeCollectionImageMimeType(mimeType, name) ?? 'image/png'
|
|
75
|
-
if (!SUPPORTED_MIME.has(normalizedMime)) {
|
|
76
|
-
throw new Error(
|
|
77
|
-
'Unsupported image type. Supported: PNG, JPEG, GIF, WebP, SVG.',
|
|
78
|
-
)
|
|
79
|
-
}
|
|
80
|
-
const ext =
|
|
81
|
-
EXT_FOR_MIME[normalizedMime] ?? extensionFromImageFileName(name) ?? 'png'
|
|
82
|
-
const stem = stemFromImageFileName(name) || 'image'
|
|
83
|
-
return `${subdir}/${stem}-${now}.${ext}`
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** Persist pasted bytes under the collection and insert into the active editor. */
|
|
87
|
-
export function createCollectionImagePasteHandler(
|
|
88
|
-
options: CollectionImagePasteHandlerOptions,
|
|
89
|
-
): (payload: CollectionImagePastePayload) => Promise<void> {
|
|
90
|
-
const {
|
|
91
|
-
collectionPath,
|
|
92
|
-
subdir = DEFAULT_COLLECTION_FIGURES_DIR,
|
|
93
|
-
onError,
|
|
94
|
-
getEditor,
|
|
95
|
-
writeBinary,
|
|
96
|
-
} = options
|
|
97
|
-
|
|
98
|
-
return async ({ name, bytes, mimeType }) => {
|
|
99
|
-
if (!collectionPath?.trim()) {
|
|
100
|
-
onError?.('Open a collection before inserting images.')
|
|
101
|
-
throw new Error('No collection path')
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const normalizedMime =
|
|
105
|
-
normalizeCollectionImageMimeType(mimeType, name) ?? 'image/png'
|
|
106
|
-
const relativePath = buildPastedFigureRelativePath(
|
|
107
|
-
subdir,
|
|
108
|
-
name,
|
|
109
|
-
normalizedMime,
|
|
110
|
-
)
|
|
111
|
-
const absolutePath = absoluteCollectionAssetPath(
|
|
112
|
-
collectionPath,
|
|
113
|
-
relativePath,
|
|
114
|
-
)
|
|
115
|
-
await writeBinary(absolutePath, bytes)
|
|
116
|
-
|
|
117
|
-
const stem = stemFromImageFileName(name)
|
|
118
|
-
const editor = getEditor()
|
|
119
|
-
if (
|
|
120
|
-
!insertCollectionImage(editor, {
|
|
121
|
-
relativePath,
|
|
122
|
-
alt: stem,
|
|
123
|
-
bytes,
|
|
124
|
-
mimeType: normalizedMime,
|
|
125
|
-
})
|
|
126
|
-
) {
|
|
127
|
-
onError?.('Image nodes are not available in this editor.')
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
1
|
+
import type { Editor } from '@tiptap/core'
|
|
2
|
+
import { insertCollectionImage } from '@purescience/platform-editor'
|
|
3
|
+
import { DEFAULT_COLLECTION_FIGURES_DIR } from './collectionAssets.js'
|
|
4
|
+
import { absoluteCollectionAssetPath } from './collectionDocumentHtml.js'
|
|
5
|
+
|
|
6
|
+
const SUPPORTED_MIME = new Set([
|
|
7
|
+
'image/png',
|
|
8
|
+
'image/jpeg',
|
|
9
|
+
'image/gif',
|
|
10
|
+
'image/webp',
|
|
11
|
+
'image/svg+xml',
|
|
12
|
+
])
|
|
13
|
+
|
|
14
|
+
const EXT_FOR_MIME: Record<string, string> = {
|
|
15
|
+
'image/png': 'png',
|
|
16
|
+
'image/jpeg': 'jpg',
|
|
17
|
+
'image/gif': 'gif',
|
|
18
|
+
'image/webp': 'webp',
|
|
19
|
+
'image/svg+xml': 'svg',
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface CollectionImagePastePayload {
|
|
23
|
+
name: string
|
|
24
|
+
bytes: Uint8Array
|
|
25
|
+
mimeType: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface CollectionImagePasteHandlerOptions {
|
|
29
|
+
collectionPath?: string
|
|
30
|
+
subdir?: string
|
|
31
|
+
onError?: (message: string) => void
|
|
32
|
+
getEditor: () => Editor | null | undefined
|
|
33
|
+
writeBinary: (absolutePath: string, bytes: Uint8Array) => Promise<void>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function normalizeCollectionImageMimeType(
|
|
37
|
+
mimeType: string | undefined,
|
|
38
|
+
name: string,
|
|
39
|
+
): string | undefined {
|
|
40
|
+
const trimmed = mimeType?.trim().toLowerCase()
|
|
41
|
+
if (trimmed && SUPPORTED_MIME.has(trimmed)) return trimmed
|
|
42
|
+
const ext = name.split('.').pop()?.toLowerCase()
|
|
43
|
+
if (ext === 'png') return 'image/png'
|
|
44
|
+
if (ext === 'jpg' || ext === 'jpeg') return 'image/jpeg'
|
|
45
|
+
if (ext === 'gif') return 'image/gif'
|
|
46
|
+
if (ext === 'webp') return 'image/webp'
|
|
47
|
+
if (ext === 'svg') return 'image/svg+xml'
|
|
48
|
+
return undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function stemFromImageFileName(name: string): string {
|
|
52
|
+
const base = name.replace(/\\/g, '/').split('/').pop() ?? name
|
|
53
|
+
const dot = base.lastIndexOf('.')
|
|
54
|
+
const stem = dot > 0 ? base.slice(0, dot) : base
|
|
55
|
+
return stem.replace(/\s+/g, '-').replace(/[^\w.-]+/g, '') || 'image'
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function extensionFromImageFileName(name: string): string | undefined {
|
|
59
|
+
const ext = name.split('.').pop()?.toLowerCase()
|
|
60
|
+
if (!ext) return undefined
|
|
61
|
+
if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(ext)) {
|
|
62
|
+
return ext === 'jpeg' ? 'jpg' : ext
|
|
63
|
+
}
|
|
64
|
+
return undefined
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function buildPastedFigureRelativePath(
|
|
68
|
+
subdir: string,
|
|
69
|
+
name: string,
|
|
70
|
+
mimeType?: string,
|
|
71
|
+
now = Date.now(),
|
|
72
|
+
): string {
|
|
73
|
+
const normalizedMime =
|
|
74
|
+
normalizeCollectionImageMimeType(mimeType, name) ?? 'image/png'
|
|
75
|
+
if (!SUPPORTED_MIME.has(normalizedMime)) {
|
|
76
|
+
throw new Error(
|
|
77
|
+
'Unsupported image type. Supported: PNG, JPEG, GIF, WebP, SVG.',
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
const ext =
|
|
81
|
+
EXT_FOR_MIME[normalizedMime] ?? extensionFromImageFileName(name) ?? 'png'
|
|
82
|
+
const stem = stemFromImageFileName(name) || 'image'
|
|
83
|
+
return `${subdir}/${stem}-${now}.${ext}`
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Persist pasted bytes under the collection and insert into the active editor. */
|
|
87
|
+
export function createCollectionImagePasteHandler(
|
|
88
|
+
options: CollectionImagePasteHandlerOptions,
|
|
89
|
+
): (payload: CollectionImagePastePayload) => Promise<void> {
|
|
90
|
+
const {
|
|
91
|
+
collectionPath,
|
|
92
|
+
subdir = DEFAULT_COLLECTION_FIGURES_DIR,
|
|
93
|
+
onError,
|
|
94
|
+
getEditor,
|
|
95
|
+
writeBinary,
|
|
96
|
+
} = options
|
|
97
|
+
|
|
98
|
+
return async ({ name, bytes, mimeType }) => {
|
|
99
|
+
if (!collectionPath?.trim()) {
|
|
100
|
+
onError?.('Open a collection before inserting images.')
|
|
101
|
+
throw new Error('No collection path')
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const normalizedMime =
|
|
105
|
+
normalizeCollectionImageMimeType(mimeType, name) ?? 'image/png'
|
|
106
|
+
const relativePath = buildPastedFigureRelativePath(
|
|
107
|
+
subdir,
|
|
108
|
+
name,
|
|
109
|
+
normalizedMime,
|
|
110
|
+
)
|
|
111
|
+
const absolutePath = absoluteCollectionAssetPath(
|
|
112
|
+
collectionPath,
|
|
113
|
+
relativePath,
|
|
114
|
+
)
|
|
115
|
+
await writeBinary(absolutePath, bytes)
|
|
116
|
+
|
|
117
|
+
const stem = stemFromImageFileName(name)
|
|
118
|
+
const editor = getEditor()
|
|
119
|
+
if (
|
|
120
|
+
!insertCollectionImage(editor, {
|
|
121
|
+
relativePath,
|
|
122
|
+
alt: stem,
|
|
123
|
+
bytes,
|
|
124
|
+
mimeType: normalizedMime,
|
|
125
|
+
})
|
|
126
|
+
) {
|
|
127
|
+
onError?.('Image nodes are not available in this editor.')
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
package/src/bridge/context.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { bridge } from './client.mjs'
|
|
2
|
-
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Publish structured context from this tab for agent sessions.
|
|
6
|
-
* Requires `agents` permission.
|
|
7
|
-
*
|
|
8
|
-
* @param {{ summary: string, label?: string }} request
|
|
9
|
-
*/
|
|
10
|
-
export async function publishContext(request) {
|
|
11
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.CONTEXT_PUBLISH, [request])
|
|
12
|
-
}
|
|
1
|
+
import { bridge } from './client.mjs'
|
|
2
|
+
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Publish structured context from this tab for agent sessions.
|
|
6
|
+
* Requires `agents` permission.
|
|
7
|
+
*
|
|
8
|
+
* @param {{ summary: string, label?: string }} request
|
|
9
|
+
*/
|
|
10
|
+
export async function publishContext(request) {
|
|
11
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.CONTEXT_PUBLISH, [request])
|
|
12
|
+
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { bridge } from './client.mjs'
|
|
2
|
-
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
-
|
|
4
|
-
/** Credential vault bridge — status/list/set/delete only (no get). Requires `agents` permission. */
|
|
5
|
-
|
|
6
|
-
export async function readCredentialStorageStatus() {
|
|
7
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_STORAGE_STATUS, [])
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export async function listCredentials() {
|
|
11
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_LIST, [])
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/** @param {{ id: string, value: string }} request */
|
|
15
|
-
export async function setCredential(request) {
|
|
16
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_SET, [request])
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** @param {{ id: string }} request */
|
|
20
|
-
export async function deleteCredential(request) {
|
|
21
|
-
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_DELETE, [request])
|
|
22
|
-
}
|
|
1
|
+
import { bridge } from './client.mjs'
|
|
2
|
+
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
+
|
|
4
|
+
/** Credential vault bridge — status/list/set/delete only (no get). Requires `agents` permission. */
|
|
5
|
+
|
|
6
|
+
export async function readCredentialStorageStatus() {
|
|
7
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_STORAGE_STATUS, [])
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function listCredentials() {
|
|
11
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_LIST, [])
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** @param {{ id: string, value: string }} request */
|
|
15
|
+
export async function setCredential(request) {
|
|
16
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_SET, [request])
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** @param {{ id: string }} request */
|
|
20
|
+
export async function deleteCredential(request) {
|
|
21
|
+
return bridge.call(PLATFORM_BRIDGE_METHODS.CREDENTIALS_DELETE, [request])
|
|
22
|
+
}
|
package/src/bridge/dialog.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export interface PlatformDialogPathResult {
|
|
2
|
-
path: string | null
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export declare function openPlatformImageDialog(): Promise<string | null>
|
|
1
|
+
export interface PlatformDialogPathResult {
|
|
2
|
+
path: string | null
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export declare function openPlatformImageDialog(): Promise<string | null>
|
package/src/bridge/dialog.mjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { bridge } from './client.mjs'
|
|
2
|
-
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @returns {Promise<string | null>} Absolute path to the picked image, or null if cancelled.
|
|
6
|
-
*/
|
|
7
|
-
export async function openPlatformImageDialog() {
|
|
8
|
-
const result = await bridge.call(
|
|
9
|
-
PLATFORM_BRIDGE_METHODS.DIALOG_OPEN_IMAGE,
|
|
10
|
-
[],
|
|
11
|
-
)
|
|
12
|
-
return result?.path ?? null
|
|
13
|
-
}
|
|
1
|
+
import { bridge } from './client.mjs'
|
|
2
|
+
import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @returns {Promise<string | null>} Absolute path to the picked image, or null if cancelled.
|
|
6
|
+
*/
|
|
7
|
+
export async function openPlatformImageDialog() {
|
|
8
|
+
const result = await bridge.call(
|
|
9
|
+
PLATFORM_BRIDGE_METHODS.DIALOG_OPEN_IMAGE,
|
|
10
|
+
[],
|
|
11
|
+
)
|
|
12
|
+
return result?.path ?? null
|
|
13
|
+
}
|
package/src/bridge/events.d.mts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export declare const PLATFORM_BRIDGE_EVENTS: {
|
|
2
|
-
readonly RESOURCE_OPEN: 'resource.open'
|
|
3
|
-
readonly THEME_CHANGED: 'theme.changed'
|
|
4
|
-
readonly RENDER_PROGRESS: 'render.progress'
|
|
5
|
-
readonly WATCH_CHANGE: 'watch.change'
|
|
6
|
-
readonly AGENT_RUN_EVENT: 'agents.run.event'
|
|
7
|
-
readonly AGENT_TOOL_INVOKE: 'agents.tool.invoke'
|
|
8
|
-
readonly DEBUG_TEST: 'debug.test'
|
|
9
|
-
readonly SCHEDULE_FIRE: 'schedule.fire'
|
|
10
|
-
readonly WINDOW_CAMERA_SHORTCUT: 'window.cameraShortcut'
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type PlatformBridgeEventName =
|
|
14
|
-
(typeof PLATFORM_BRIDGE_EVENTS)[keyof typeof PLATFORM_BRIDGE_EVENTS]
|
|
1
|
+
export declare const PLATFORM_BRIDGE_EVENTS: {
|
|
2
|
+
readonly RESOURCE_OPEN: 'resource.open'
|
|
3
|
+
readonly THEME_CHANGED: 'theme.changed'
|
|
4
|
+
readonly RENDER_PROGRESS: 'render.progress'
|
|
5
|
+
readonly WATCH_CHANGE: 'watch.change'
|
|
6
|
+
readonly AGENT_RUN_EVENT: 'agents.run.event'
|
|
7
|
+
readonly AGENT_TOOL_INVOKE: 'agents.tool.invoke'
|
|
8
|
+
readonly DEBUG_TEST: 'debug.test'
|
|
9
|
+
readonly SCHEDULE_FIRE: 'schedule.fire'
|
|
10
|
+
readonly WINDOW_CAMERA_SHORTCUT: 'window.cameraShortcut'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type PlatformBridgeEventName =
|
|
14
|
+
(typeof PLATFORM_BRIDGE_EVENTS)[keyof typeof PLATFORM_BRIDGE_EVENTS]
|
package/src/bridge/events.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/** Host → plugin bridge event names. Single source for shell + app SDK. */
|
|
2
|
-
export const PLATFORM_BRIDGE_EVENTS = {
|
|
3
|
-
RESOURCE_OPEN: 'resource.open',
|
|
4
|
-
THEME_CHANGED: 'theme.changed',
|
|
5
|
-
RENDER_PROGRESS: 'render.progress',
|
|
6
|
-
WATCH_CHANGE: 'watch.change',
|
|
7
|
-
AGENT_RUN_EVENT: 'agents.run.event',
|
|
8
|
-
AGENT_TOOL_INVOKE: 'agents.tool.invoke',
|
|
9
|
-
DEBUG_TEST: 'debug.test',
|
|
10
|
-
SCHEDULE_FIRE: 'schedule.fire',
|
|
11
|
-
WINDOW_CAMERA_SHORTCUT: 'window.cameraShortcut',
|
|
12
|
-
}
|
|
1
|
+
/** Host → plugin bridge event names. Single source for shell + app SDK. */
|
|
2
|
+
export const PLATFORM_BRIDGE_EVENTS = {
|
|
3
|
+
RESOURCE_OPEN: 'resource.open',
|
|
4
|
+
THEME_CHANGED: 'theme.changed',
|
|
5
|
+
RENDER_PROGRESS: 'render.progress',
|
|
6
|
+
WATCH_CHANGE: 'watch.change',
|
|
7
|
+
AGENT_RUN_EVENT: 'agents.run.event',
|
|
8
|
+
AGENT_TOOL_INVOKE: 'agents.tool.invoke',
|
|
9
|
+
DEBUG_TEST: 'debug.test',
|
|
10
|
+
SCHEDULE_FIRE: 'schedule.fire',
|
|
11
|
+
WINDOW_CAMERA_SHORTCUT: 'window.cameraShortcut',
|
|
12
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
entrySupportsFilePreview,
|
|
4
|
-
isPluginExcludedPreviewKind,
|
|
5
|
-
previewKindForEntry,
|
|
6
|
-
} from './filePreviewKind.js'
|
|
7
|
-
|
|
8
|
-
describe('filePreviewKind', () => {
|
|
9
|
-
it('detects previewable entries', () => {
|
|
10
|
-
expect(
|
|
11
|
-
entrySupportsFilePreview({
|
|
12
|
-
path: '/tmp/a.png',
|
|
13
|
-
name: 'a.png',
|
|
14
|
-
extension: '.png',
|
|
15
|
-
kind: 'image',
|
|
16
|
-
isDirectory: false,
|
|
17
|
-
}),
|
|
18
|
-
).toBe(true)
|
|
19
|
-
expect(
|
|
20
|
-
entrySupportsFilePreview({
|
|
21
|
-
path: '/tmp/a.bin',
|
|
22
|
-
name: 'a.bin',
|
|
23
|
-
extension: '.bin',
|
|
24
|
-
kind: 'other',
|
|
25
|
-
isDirectory: false,
|
|
26
|
-
}),
|
|
27
|
-
).toBe(false)
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
it('excludes pdf from plugin inline preview', () => {
|
|
31
|
-
expect(isPluginExcludedPreviewKind('pdf')).toBe(true)
|
|
32
|
-
expect(isPluginExcludedPreviewKind('image')).toBe(false)
|
|
33
|
-
expect(
|
|
34
|
-
previewKindForEntry({
|
|
35
|
-
path: '/tmp/a.pdf',
|
|
36
|
-
name: 'a.pdf',
|
|
37
|
-
extension: '.pdf',
|
|
38
|
-
kind: 'pdf',
|
|
39
|
-
isDirectory: false,
|
|
40
|
-
}),
|
|
41
|
-
).toBe('pdf')
|
|
42
|
-
})
|
|
43
|
-
})
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
entrySupportsFilePreview,
|
|
4
|
+
isPluginExcludedPreviewKind,
|
|
5
|
+
previewKindForEntry,
|
|
6
|
+
} from './filePreviewKind.js'
|
|
7
|
+
|
|
8
|
+
describe('filePreviewKind', () => {
|
|
9
|
+
it('detects previewable entries', () => {
|
|
10
|
+
expect(
|
|
11
|
+
entrySupportsFilePreview({
|
|
12
|
+
path: '/tmp/a.png',
|
|
13
|
+
name: 'a.png',
|
|
14
|
+
extension: '.png',
|
|
15
|
+
kind: 'image',
|
|
16
|
+
isDirectory: false,
|
|
17
|
+
}),
|
|
18
|
+
).toBe(true)
|
|
19
|
+
expect(
|
|
20
|
+
entrySupportsFilePreview({
|
|
21
|
+
path: '/tmp/a.bin',
|
|
22
|
+
name: 'a.bin',
|
|
23
|
+
extension: '.bin',
|
|
24
|
+
kind: 'other',
|
|
25
|
+
isDirectory: false,
|
|
26
|
+
}),
|
|
27
|
+
).toBe(false)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('excludes pdf from plugin inline preview', () => {
|
|
31
|
+
expect(isPluginExcludedPreviewKind('pdf')).toBe(true)
|
|
32
|
+
expect(isPluginExcludedPreviewKind('image')).toBe(false)
|
|
33
|
+
expect(
|
|
34
|
+
previewKindForEntry({
|
|
35
|
+
path: '/tmp/a.pdf',
|
|
36
|
+
name: 'a.pdf',
|
|
37
|
+
extension: '.pdf',
|
|
38
|
+
kind: 'pdf',
|
|
39
|
+
isDirectory: false,
|
|
40
|
+
}),
|
|
41
|
+
).toBe('pdf')
|
|
42
|
+
})
|
|
43
|
+
})
|
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
import type { PlatformFileKind, PlatformFilePreviewEntry } from './types.js'
|
|
2
|
-
|
|
3
|
-
const PREVIEWABLE_TEXT_KINDS = new Set<PlatformFileKind>([
|
|
4
|
-
'html',
|
|
5
|
-
'markdown',
|
|
6
|
-
'text',
|
|
7
|
-
'data',
|
|
8
|
-
'code',
|
|
9
|
-
])
|
|
10
|
-
|
|
11
|
-
const IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'])
|
|
12
|
-
const VIDEO_EXTENSIONS = new Set(['mp4', 'mov', 'webm', 'ogv'])
|
|
13
|
-
const AUDIO_EXTENSIONS = new Set(['mp3', 'm4a', 'wav', 'ogg'])
|
|
14
|
-
const PDF_EXTENSIONS = new Set(['pdf'])
|
|
15
|
-
|
|
16
|
-
export type FilePreviewKind =
|
|
17
|
-
| 'folder'
|
|
18
|
-
| 'image'
|
|
19
|
-
| 'video'
|
|
20
|
-
| 'audio'
|
|
21
|
-
| 'pdf'
|
|
22
|
-
| 'text'
|
|
23
|
-
| 'other'
|
|
24
|
-
|
|
25
|
-
export function previewKindForEntry(
|
|
26
|
-
entry: PlatformFilePreviewEntry,
|
|
27
|
-
): FilePreviewKind {
|
|
28
|
-
if (entry.isDirectory) return 'folder'
|
|
29
|
-
|
|
30
|
-
const extension = entry.extension.toLowerCase().replace(/^\./, '')
|
|
31
|
-
if (entry.kind === 'image' || IMAGE_EXTENSIONS.has(extension)) return 'image'
|
|
32
|
-
if (entry.kind === 'video' || VIDEO_EXTENSIONS.has(extension)) return 'video'
|
|
33
|
-
if (entry.kind === 'audio' || AUDIO_EXTENSIONS.has(extension)) return 'audio'
|
|
34
|
-
if (entry.kind === 'pdf' || PDF_EXTENSIONS.has(extension)) return 'pdf'
|
|
35
|
-
if (PREVIEWABLE_TEXT_KINDS.has(entry.kind)) return 'text'
|
|
36
|
-
|
|
37
|
-
return 'other'
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function shouldFetchTextPreview(
|
|
41
|
-
entry: PlatformFilePreviewEntry,
|
|
42
|
-
): boolean {
|
|
43
|
-
return previewKindForEntry(entry) === 'text'
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function shouldFetchPreviewUrl(
|
|
47
|
-
entry: PlatformFilePreviewEntry,
|
|
48
|
-
): boolean {
|
|
49
|
-
const kind = previewKindForEntry(entry)
|
|
50
|
-
return (
|
|
51
|
-
kind === 'image' || kind === 'video' || kind === 'audio' || kind === 'pdf'
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** Kinds with any inline preview surface in `PlatformFilePreview`. */
|
|
56
|
-
export function isPlatformFilePreviewKind(kind: FilePreviewKind): boolean {
|
|
57
|
-
return kind !== 'folder' && kind !== 'other'
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function entrySupportsFilePreview(
|
|
61
|
-
entry: PlatformFilePreviewEntry,
|
|
62
|
-
): boolean {
|
|
63
|
-
if (entry.isDirectory) return false
|
|
64
|
-
return isPlatformFilePreviewKind(previewKindForEntry(entry))
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* PDF uses an iframe — blocked inside nested plugin iframes.
|
|
69
|
-
* Inspector shows a hint; full PDF opens in a shell tab.
|
|
70
|
-
*/
|
|
71
|
-
export const PLATFORM_FILE_PREVIEW_PLUGIN_EXCLUDE_KINDS: readonly FilePreviewKind[] =
|
|
72
|
-
['pdf']
|
|
73
|
-
|
|
74
|
-
export function isPluginExcludedPreviewKind(kind: FilePreviewKind): boolean {
|
|
75
|
-
return PLATFORM_FILE_PREVIEW_PLUGIN_EXCLUDE_KINDS.includes(kind)
|
|
76
|
-
}
|
|
1
|
+
import type { PlatformFileKind, PlatformFilePreviewEntry } from './types.js'
|
|
2
|
+
|
|
3
|
+
const PREVIEWABLE_TEXT_KINDS = new Set<PlatformFileKind>([
|
|
4
|
+
'html',
|
|
5
|
+
'markdown',
|
|
6
|
+
'text',
|
|
7
|
+
'data',
|
|
8
|
+
'code',
|
|
9
|
+
])
|
|
10
|
+
|
|
11
|
+
const IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'])
|
|
12
|
+
const VIDEO_EXTENSIONS = new Set(['mp4', 'mov', 'webm', 'ogv'])
|
|
13
|
+
const AUDIO_EXTENSIONS = new Set(['mp3', 'm4a', 'wav', 'ogg'])
|
|
14
|
+
const PDF_EXTENSIONS = new Set(['pdf'])
|
|
15
|
+
|
|
16
|
+
export type FilePreviewKind =
|
|
17
|
+
| 'folder'
|
|
18
|
+
| 'image'
|
|
19
|
+
| 'video'
|
|
20
|
+
| 'audio'
|
|
21
|
+
| 'pdf'
|
|
22
|
+
| 'text'
|
|
23
|
+
| 'other'
|
|
24
|
+
|
|
25
|
+
export function previewKindForEntry(
|
|
26
|
+
entry: PlatformFilePreviewEntry,
|
|
27
|
+
): FilePreviewKind {
|
|
28
|
+
if (entry.isDirectory) return 'folder'
|
|
29
|
+
|
|
30
|
+
const extension = entry.extension.toLowerCase().replace(/^\./, '')
|
|
31
|
+
if (entry.kind === 'image' || IMAGE_EXTENSIONS.has(extension)) return 'image'
|
|
32
|
+
if (entry.kind === 'video' || VIDEO_EXTENSIONS.has(extension)) return 'video'
|
|
33
|
+
if (entry.kind === 'audio' || AUDIO_EXTENSIONS.has(extension)) return 'audio'
|
|
34
|
+
if (entry.kind === 'pdf' || PDF_EXTENSIONS.has(extension)) return 'pdf'
|
|
35
|
+
if (PREVIEWABLE_TEXT_KINDS.has(entry.kind)) return 'text'
|
|
36
|
+
|
|
37
|
+
return 'other'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function shouldFetchTextPreview(
|
|
41
|
+
entry: PlatformFilePreviewEntry,
|
|
42
|
+
): boolean {
|
|
43
|
+
return previewKindForEntry(entry) === 'text'
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function shouldFetchPreviewUrl(
|
|
47
|
+
entry: PlatformFilePreviewEntry,
|
|
48
|
+
): boolean {
|
|
49
|
+
const kind = previewKindForEntry(entry)
|
|
50
|
+
return (
|
|
51
|
+
kind === 'image' || kind === 'video' || kind === 'audio' || kind === 'pdf'
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Kinds with any inline preview surface in `PlatformFilePreview`. */
|
|
56
|
+
export function isPlatformFilePreviewKind(kind: FilePreviewKind): boolean {
|
|
57
|
+
return kind !== 'folder' && kind !== 'other'
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function entrySupportsFilePreview(
|
|
61
|
+
entry: PlatformFilePreviewEntry,
|
|
62
|
+
): boolean {
|
|
63
|
+
if (entry.isDirectory) return false
|
|
64
|
+
return isPlatformFilePreviewKind(previewKindForEntry(entry))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* PDF uses an iframe — blocked inside nested plugin iframes.
|
|
69
|
+
* Inspector shows a hint; full PDF opens in a shell tab.
|
|
70
|
+
*/
|
|
71
|
+
export const PLATFORM_FILE_PREVIEW_PLUGIN_EXCLUDE_KINDS: readonly FilePreviewKind[] =
|
|
72
|
+
['pdf']
|
|
73
|
+
|
|
74
|
+
export function isPluginExcludedPreviewKind(kind: FilePreviewKind): boolean {
|
|
75
|
+
return PLATFORM_FILE_PREVIEW_PLUGIN_EXCLUDE_KINDS.includes(kind)
|
|
76
|
+
}
|