@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,103 +1,103 @@
|
|
|
1
|
-
import {
|
|
2
|
-
callAgentRunModel,
|
|
3
|
-
createAgentSession,
|
|
4
|
-
deleteAgentSession,
|
|
5
|
-
startAgentRun,
|
|
6
|
-
} from '../bridge/agents.js'
|
|
7
|
-
|
|
8
|
-
interface AgentSessionRecord {
|
|
9
|
-
sessionId: string
|
|
10
|
-
config: { modelId: string }
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
interface AgentRunSnapshot {
|
|
14
|
-
runId: string
|
|
15
|
-
state: string
|
|
16
|
-
messages: Array<{ role: string; content: string }>
|
|
17
|
-
error?: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const MAX_TURNS = 4
|
|
21
|
-
|
|
22
|
-
const SYSTEM_PROMPT = [
|
|
23
|
-
'You distill writing-style guidance into a compact, reusable style guide.',
|
|
24
|
-
'Capture VOICE only — tone, register, sentence rhythm, word choice, and structural habits.',
|
|
25
|
-
'Output 4–8 short imperative bullet lines, each starting with "- ".',
|
|
26
|
-
'If the guidance lists words or phrases to PREFER or to AVOID, keep them verbatim as their own "- Prefer: …" and "- Avoid: …" bullets (these are in addition to the 4–8 voice bullets).',
|
|
27
|
-
'Do NOT include the sample text, its facts, or its subject matter.',
|
|
28
|
-
'Return plain text only — no preamble, no headings, no commentary.',
|
|
29
|
-
].join('\n')
|
|
30
|
-
|
|
31
|
-
function latestAssistant(snapshot: AgentRunSnapshot): string {
|
|
32
|
-
return (
|
|
33
|
-
[...snapshot.messages]
|
|
34
|
-
.reverse()
|
|
35
|
-
.find(message => message.role === 'assistant')
|
|
36
|
-
?.content.trim() ?? ''
|
|
37
|
-
)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Distill verbose style guidance (presets + voice samples) into a short,
|
|
42
|
-
* reusable style guide — the book's "style skill". Sent once and reused for
|
|
43
|
-
* every chapter draft/edit instead of the full samples, to save tokens.
|
|
44
|
-
* Falls back to the original guidance if the model is unavailable.
|
|
45
|
-
*/
|
|
46
|
-
export async function condenseWritingStyleWithAgent(
|
|
47
|
-
fullGuidance: string,
|
|
48
|
-
): Promise<string> {
|
|
49
|
-
const trimmed = fullGuidance.trim()
|
|
50
|
-
if (!trimmed) return ''
|
|
51
|
-
|
|
52
|
-
let session: AgentSessionRecord | null = null
|
|
53
|
-
try {
|
|
54
|
-
session = (await createAgentSession({
|
|
55
|
-
scope: 'app',
|
|
56
|
-
appSlug: 'book',
|
|
57
|
-
title: 'Condense writing style',
|
|
58
|
-
config: {
|
|
59
|
-
sessionPrompt: SYSTEM_PROMPT,
|
|
60
|
-
toolPolicy: {
|
|
61
|
-
allowedTargetApps: ['__purebook_style_no_tools__'],
|
|
62
|
-
defaultRequiresApproval: true,
|
|
63
|
-
},
|
|
64
|
-
} as never,
|
|
65
|
-
})) as AgentSessionRecord
|
|
66
|
-
|
|
67
|
-
let snapshot = (await startAgentRun({
|
|
68
|
-
session: { scope: 'app', sessionId: session.sessionId, appSlug: 'book' },
|
|
69
|
-
message: trimmed,
|
|
70
|
-
})) as AgentRunSnapshot
|
|
71
|
-
|
|
72
|
-
for (let turn = 0; turn < MAX_TURNS; turn += 1) {
|
|
73
|
-
if (snapshot.state === 'ready') {
|
|
74
|
-
snapshot = (await callAgentRunModel({
|
|
75
|
-
runId: snapshot.runId,
|
|
76
|
-
sessionId: session.sessionId,
|
|
77
|
-
})) as AgentRunSnapshot
|
|
78
|
-
continue
|
|
79
|
-
}
|
|
80
|
-
break
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (snapshot.state === 'awaiting_user') {
|
|
84
|
-
const condensed = latestAssistant(snapshot)
|
|
85
|
-
if (condensed) return condensed
|
|
86
|
-
}
|
|
87
|
-
return trimmed
|
|
88
|
-
} catch {
|
|
89
|
-
return trimmed
|
|
90
|
-
} finally {
|
|
91
|
-
if (session) {
|
|
92
|
-
try {
|
|
93
|
-
await deleteAgentSession({
|
|
94
|
-
scope: 'app',
|
|
95
|
-
sessionId: session.sessionId,
|
|
96
|
-
appSlug: 'book',
|
|
97
|
-
})
|
|
98
|
-
} catch {
|
|
99
|
-
/* best-effort cleanup */
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
callAgentRunModel,
|
|
3
|
+
createAgentSession,
|
|
4
|
+
deleteAgentSession,
|
|
5
|
+
startAgentRun,
|
|
6
|
+
} from '../bridge/agents.js'
|
|
7
|
+
|
|
8
|
+
interface AgentSessionRecord {
|
|
9
|
+
sessionId: string
|
|
10
|
+
config: { modelId: string }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface AgentRunSnapshot {
|
|
14
|
+
runId: string
|
|
15
|
+
state: string
|
|
16
|
+
messages: Array<{ role: string; content: string }>
|
|
17
|
+
error?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const MAX_TURNS = 4
|
|
21
|
+
|
|
22
|
+
const SYSTEM_PROMPT = [
|
|
23
|
+
'You distill writing-style guidance into a compact, reusable style guide.',
|
|
24
|
+
'Capture VOICE only — tone, register, sentence rhythm, word choice, and structural habits.',
|
|
25
|
+
'Output 4–8 short imperative bullet lines, each starting with "- ".',
|
|
26
|
+
'If the guidance lists words or phrases to PREFER or to AVOID, keep them verbatim as their own "- Prefer: …" and "- Avoid: …" bullets (these are in addition to the 4–8 voice bullets).',
|
|
27
|
+
'Do NOT include the sample text, its facts, or its subject matter.',
|
|
28
|
+
'Return plain text only — no preamble, no headings, no commentary.',
|
|
29
|
+
].join('\n')
|
|
30
|
+
|
|
31
|
+
function latestAssistant(snapshot: AgentRunSnapshot): string {
|
|
32
|
+
return (
|
|
33
|
+
[...snapshot.messages]
|
|
34
|
+
.reverse()
|
|
35
|
+
.find(message => message.role === 'assistant')
|
|
36
|
+
?.content.trim() ?? ''
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Distill verbose style guidance (presets + voice samples) into a short,
|
|
42
|
+
* reusable style guide — the book's "style skill". Sent once and reused for
|
|
43
|
+
* every chapter draft/edit instead of the full samples, to save tokens.
|
|
44
|
+
* Falls back to the original guidance if the model is unavailable.
|
|
45
|
+
*/
|
|
46
|
+
export async function condenseWritingStyleWithAgent(
|
|
47
|
+
fullGuidance: string,
|
|
48
|
+
): Promise<string> {
|
|
49
|
+
const trimmed = fullGuidance.trim()
|
|
50
|
+
if (!trimmed) return ''
|
|
51
|
+
|
|
52
|
+
let session: AgentSessionRecord | null = null
|
|
53
|
+
try {
|
|
54
|
+
session = (await createAgentSession({
|
|
55
|
+
scope: 'app',
|
|
56
|
+
appSlug: 'book',
|
|
57
|
+
title: 'Condense writing style',
|
|
58
|
+
config: {
|
|
59
|
+
sessionPrompt: SYSTEM_PROMPT,
|
|
60
|
+
toolPolicy: {
|
|
61
|
+
allowedTargetApps: ['__purebook_style_no_tools__'],
|
|
62
|
+
defaultRequiresApproval: true,
|
|
63
|
+
},
|
|
64
|
+
} as never,
|
|
65
|
+
})) as AgentSessionRecord
|
|
66
|
+
|
|
67
|
+
let snapshot = (await startAgentRun({
|
|
68
|
+
session: { scope: 'app', sessionId: session.sessionId, appSlug: 'book' },
|
|
69
|
+
message: trimmed,
|
|
70
|
+
})) as AgentRunSnapshot
|
|
71
|
+
|
|
72
|
+
for (let turn = 0; turn < MAX_TURNS; turn += 1) {
|
|
73
|
+
if (snapshot.state === 'ready') {
|
|
74
|
+
snapshot = (await callAgentRunModel({
|
|
75
|
+
runId: snapshot.runId,
|
|
76
|
+
sessionId: session.sessionId,
|
|
77
|
+
})) as AgentRunSnapshot
|
|
78
|
+
continue
|
|
79
|
+
}
|
|
80
|
+
break
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (snapshot.state === 'awaiting_user') {
|
|
84
|
+
const condensed = latestAssistant(snapshot)
|
|
85
|
+
if (condensed) return condensed
|
|
86
|
+
}
|
|
87
|
+
return trimmed
|
|
88
|
+
} catch {
|
|
89
|
+
return trimmed
|
|
90
|
+
} finally {
|
|
91
|
+
if (session) {
|
|
92
|
+
try {
|
|
93
|
+
await deleteAgentSession({
|
|
94
|
+
scope: 'app',
|
|
95
|
+
sessionId: session.sessionId,
|
|
96
|
+
appSlug: 'book',
|
|
97
|
+
})
|
|
98
|
+
} catch {
|
|
99
|
+
/* best-effort cleanup */
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
import {
|
|
2
|
-
callAgentRunModel,
|
|
3
|
-
createAgentSession,
|
|
4
|
-
deleteAgentSession,
|
|
5
|
-
startAgentRun,
|
|
6
|
-
} from '../bridge/agents.js'
|
|
7
|
-
|
|
8
|
-
interface AgentSessionRecord {
|
|
9
|
-
sessionId: string
|
|
10
|
-
config: { modelId: string }
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
interface AgentRunSnapshot {
|
|
14
|
-
runId: string
|
|
15
|
-
state: string
|
|
16
|
-
messages: Array<{ role: string; content: string }>
|
|
17
|
-
error?: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const MAX_TURNS = 4
|
|
21
|
-
|
|
22
|
-
export type DraftTextMode = 'write' | 'rewrite'
|
|
23
|
-
|
|
24
|
-
export interface DraftTextInput {
|
|
25
|
-
mode: DraftTextMode
|
|
26
|
-
instruction: string
|
|
27
|
-
selectionText?: string
|
|
28
|
-
styleGuidance?: string
|
|
29
|
-
/**
|
|
30
|
-
* Grounding/reference material (e.g. a manuscript's abstract and reference
|
|
31
|
-
* list). Used for ACCURACY — facts, terminology, claims — not for voice.
|
|
32
|
-
*/
|
|
33
|
-
context?: string
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function systemPrompt(mode: DraftTextMode): string {
|
|
37
|
-
return [
|
|
38
|
-
mode === 'rewrite'
|
|
39
|
-
? 'You rewrite a passage of a book to the author’s instruction, preserving its meaning.'
|
|
40
|
-
: 'You draft a passage of book prose from the author’s instruction.',
|
|
41
|
-
'Return clean HTML only — paragraphs <p>, sub-headings <h2>, lists where useful.',
|
|
42
|
-
'No markdown, no code fences, no <h1>, no preamble, no commentary.',
|
|
43
|
-
'Do not invent precise statistics, dates, quotations, or citations.',
|
|
44
|
-
].join('\n')
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function message(input: DraftTextInput): string {
|
|
48
|
-
return [
|
|
49
|
-
input.mode === 'rewrite' && input.selectionText
|
|
50
|
-
? `Passage to rewrite:\n"""${input.selectionText.slice(0, 6000)}"""`
|
|
51
|
-
: input.selectionText
|
|
52
|
-
? `Nearby text for context (do not repeat):\n"""${input.selectionText.slice(0, 2000)}"""`
|
|
53
|
-
: '',
|
|
54
|
-
`Instruction: ${input.instruction.trim() || (input.mode === 'rewrite' ? 'Improve this passage.' : 'Draft this.')}`,
|
|
55
|
-
input.context?.trim()
|
|
56
|
-
? `\nReference material — use it for facts, terminology, and claims; do NOT copy its wording as voice and do NOT invent beyond it:\n"""${input.context.trim().slice(0, 4000)}"""`
|
|
57
|
-
: '',
|
|
58
|
-
input.styleGuidance ? `\n${input.styleGuidance}` : '',
|
|
59
|
-
'',
|
|
60
|
-
'Return the HTML now.',
|
|
61
|
-
]
|
|
62
|
-
.filter(Boolean)
|
|
63
|
-
.join('\n')
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function cleanHtml(raw: string): string {
|
|
67
|
-
let value = raw.trim()
|
|
68
|
-
value = value.replace(/^```(?:html)?\s*/i, '').replace(/\s*```$/i, '')
|
|
69
|
-
value = value.replace(/<h1[\s\S]*?<\/h1>/gi, '')
|
|
70
|
-
return value.trim()
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function latestAssistant(snapshot: AgentRunSnapshot): string {
|
|
74
|
-
return (
|
|
75
|
-
[...snapshot.messages]
|
|
76
|
-
.reverse()
|
|
77
|
-
.find(entry => entry.role === 'assistant')
|
|
78
|
-
?.content.trim() ?? ''
|
|
79
|
-
)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** Draft or rewrite a passage via the agent. Returns HTML (empty on failure). */
|
|
83
|
-
export async function draftTextWithAgent(
|
|
84
|
-
input: DraftTextInput,
|
|
85
|
-
): Promise<string> {
|
|
86
|
-
let session: AgentSessionRecord | null = null
|
|
87
|
-
try {
|
|
88
|
-
session = (await createAgentSession({
|
|
89
|
-
scope: 'app',
|
|
90
|
-
appSlug: 'book',
|
|
91
|
-
title: 'Draft passage',
|
|
92
|
-
config: {
|
|
93
|
-
sessionPrompt: systemPrompt(input.mode),
|
|
94
|
-
toolPolicy: {
|
|
95
|
-
allowedTargetApps: ['__purebook_draft_text_no_tools__'],
|
|
96
|
-
defaultRequiresApproval: true,
|
|
97
|
-
},
|
|
98
|
-
} as never,
|
|
99
|
-
})) as AgentSessionRecord
|
|
100
|
-
|
|
101
|
-
let snapshot = (await startAgentRun({
|
|
102
|
-
session: { scope: 'app', sessionId: session.sessionId, appSlug: 'book' },
|
|
103
|
-
message: message(input),
|
|
104
|
-
})) as AgentRunSnapshot
|
|
105
|
-
|
|
106
|
-
for (let turn = 0; turn < MAX_TURNS; turn += 1) {
|
|
107
|
-
if (snapshot.state === 'ready') {
|
|
108
|
-
snapshot = (await callAgentRunModel({
|
|
109
|
-
runId: snapshot.runId,
|
|
110
|
-
sessionId: session.sessionId,
|
|
111
|
-
})) as AgentRunSnapshot
|
|
112
|
-
continue
|
|
113
|
-
}
|
|
114
|
-
break
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (snapshot.state === 'awaiting_user') {
|
|
118
|
-
return cleanHtml(latestAssistant(snapshot))
|
|
119
|
-
}
|
|
120
|
-
throw new Error(snapshot.error || `The model stopped at ${snapshot.state}.`)
|
|
121
|
-
} finally {
|
|
122
|
-
if (session) {
|
|
123
|
-
try {
|
|
124
|
-
await deleteAgentSession({
|
|
125
|
-
scope: 'app',
|
|
126
|
-
sessionId: session.sessionId,
|
|
127
|
-
appSlug: 'book',
|
|
128
|
-
})
|
|
129
|
-
} catch {
|
|
130
|
-
/* best-effort cleanup */
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
callAgentRunModel,
|
|
3
|
+
createAgentSession,
|
|
4
|
+
deleteAgentSession,
|
|
5
|
+
startAgentRun,
|
|
6
|
+
} from '../bridge/agents.js'
|
|
7
|
+
|
|
8
|
+
interface AgentSessionRecord {
|
|
9
|
+
sessionId: string
|
|
10
|
+
config: { modelId: string }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface AgentRunSnapshot {
|
|
14
|
+
runId: string
|
|
15
|
+
state: string
|
|
16
|
+
messages: Array<{ role: string; content: string }>
|
|
17
|
+
error?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const MAX_TURNS = 4
|
|
21
|
+
|
|
22
|
+
export type DraftTextMode = 'write' | 'rewrite'
|
|
23
|
+
|
|
24
|
+
export interface DraftTextInput {
|
|
25
|
+
mode: DraftTextMode
|
|
26
|
+
instruction: string
|
|
27
|
+
selectionText?: string
|
|
28
|
+
styleGuidance?: string
|
|
29
|
+
/**
|
|
30
|
+
* Grounding/reference material (e.g. a manuscript's abstract and reference
|
|
31
|
+
* list). Used for ACCURACY — facts, terminology, claims — not for voice.
|
|
32
|
+
*/
|
|
33
|
+
context?: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function systemPrompt(mode: DraftTextMode): string {
|
|
37
|
+
return [
|
|
38
|
+
mode === 'rewrite'
|
|
39
|
+
? 'You rewrite a passage of a book to the author’s instruction, preserving its meaning.'
|
|
40
|
+
: 'You draft a passage of book prose from the author’s instruction.',
|
|
41
|
+
'Return clean HTML only — paragraphs <p>, sub-headings <h2>, lists where useful.',
|
|
42
|
+
'No markdown, no code fences, no <h1>, no preamble, no commentary.',
|
|
43
|
+
'Do not invent precise statistics, dates, quotations, or citations.',
|
|
44
|
+
].join('\n')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function message(input: DraftTextInput): string {
|
|
48
|
+
return [
|
|
49
|
+
input.mode === 'rewrite' && input.selectionText
|
|
50
|
+
? `Passage to rewrite:\n"""${input.selectionText.slice(0, 6000)}"""`
|
|
51
|
+
: input.selectionText
|
|
52
|
+
? `Nearby text for context (do not repeat):\n"""${input.selectionText.slice(0, 2000)}"""`
|
|
53
|
+
: '',
|
|
54
|
+
`Instruction: ${input.instruction.trim() || (input.mode === 'rewrite' ? 'Improve this passage.' : 'Draft this.')}`,
|
|
55
|
+
input.context?.trim()
|
|
56
|
+
? `\nReference material — use it for facts, terminology, and claims; do NOT copy its wording as voice and do NOT invent beyond it:\n"""${input.context.trim().slice(0, 4000)}"""`
|
|
57
|
+
: '',
|
|
58
|
+
input.styleGuidance ? `\n${input.styleGuidance}` : '',
|
|
59
|
+
'',
|
|
60
|
+
'Return the HTML now.',
|
|
61
|
+
]
|
|
62
|
+
.filter(Boolean)
|
|
63
|
+
.join('\n')
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function cleanHtml(raw: string): string {
|
|
67
|
+
let value = raw.trim()
|
|
68
|
+
value = value.replace(/^```(?:html)?\s*/i, '').replace(/\s*```$/i, '')
|
|
69
|
+
value = value.replace(/<h1[\s\S]*?<\/h1>/gi, '')
|
|
70
|
+
return value.trim()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function latestAssistant(snapshot: AgentRunSnapshot): string {
|
|
74
|
+
return (
|
|
75
|
+
[...snapshot.messages]
|
|
76
|
+
.reverse()
|
|
77
|
+
.find(entry => entry.role === 'assistant')
|
|
78
|
+
?.content.trim() ?? ''
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Draft or rewrite a passage via the agent. Returns HTML (empty on failure). */
|
|
83
|
+
export async function draftTextWithAgent(
|
|
84
|
+
input: DraftTextInput,
|
|
85
|
+
): Promise<string> {
|
|
86
|
+
let session: AgentSessionRecord | null = null
|
|
87
|
+
try {
|
|
88
|
+
session = (await createAgentSession({
|
|
89
|
+
scope: 'app',
|
|
90
|
+
appSlug: 'book',
|
|
91
|
+
title: 'Draft passage',
|
|
92
|
+
config: {
|
|
93
|
+
sessionPrompt: systemPrompt(input.mode),
|
|
94
|
+
toolPolicy: {
|
|
95
|
+
allowedTargetApps: ['__purebook_draft_text_no_tools__'],
|
|
96
|
+
defaultRequiresApproval: true,
|
|
97
|
+
},
|
|
98
|
+
} as never,
|
|
99
|
+
})) as AgentSessionRecord
|
|
100
|
+
|
|
101
|
+
let snapshot = (await startAgentRun({
|
|
102
|
+
session: { scope: 'app', sessionId: session.sessionId, appSlug: 'book' },
|
|
103
|
+
message: message(input),
|
|
104
|
+
})) as AgentRunSnapshot
|
|
105
|
+
|
|
106
|
+
for (let turn = 0; turn < MAX_TURNS; turn += 1) {
|
|
107
|
+
if (snapshot.state === 'ready') {
|
|
108
|
+
snapshot = (await callAgentRunModel({
|
|
109
|
+
runId: snapshot.runId,
|
|
110
|
+
sessionId: session.sessionId,
|
|
111
|
+
})) as AgentRunSnapshot
|
|
112
|
+
continue
|
|
113
|
+
}
|
|
114
|
+
break
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (snapshot.state === 'awaiting_user') {
|
|
118
|
+
return cleanHtml(latestAssistant(snapshot))
|
|
119
|
+
}
|
|
120
|
+
throw new Error(snapshot.error || `The model stopped at ${snapshot.state}.`)
|
|
121
|
+
} finally {
|
|
122
|
+
if (session) {
|
|
123
|
+
try {
|
|
124
|
+
await deleteAgentSession({
|
|
125
|
+
scope: 'app',
|
|
126
|
+
sessionId: session.sessionId,
|
|
127
|
+
appSlug: 'book',
|
|
128
|
+
})
|
|
129
|
+
} catch {
|
|
130
|
+
/* best-effort cleanup */
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
package/src/writing/index.ts
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reusable writing-style + AI drafting toolkit.
|
|
3
|
-
*
|
|
4
|
-
* App-agnostic: the host owns persistence of the style library (pass `styles`
|
|
5
|
-
* and `onStylesChange`); everything else — the named-style manager, the
|
|
6
|
-
* "distill into skill" flow, and the draft/redraft dialog — lives here so any
|
|
7
|
-
* app can adopt it.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
DraftAssistantDialog,
|
|
12
|
-
type DraftAssistantDialogProps,
|
|
13
|
-
} from './DraftAssistantDialog.js'
|
|
14
|
-
export {
|
|
15
|
-
WritingStyleManager,
|
|
16
|
-
type WritingStyleManagerProps,
|
|
17
|
-
} from './WritingStyleManager.js'
|
|
18
|
-
export {
|
|
19
|
-
draftTextWithAgent,
|
|
20
|
-
type DraftTextInput,
|
|
21
|
-
type DraftTextMode,
|
|
22
|
-
} from './draftTextWithAgent.js'
|
|
23
|
-
export { condenseWritingStyleWithAgent } from './condenseWritingStyle.js'
|
|
24
|
-
export {
|
|
25
|
-
loadSharedWritingStyles,
|
|
26
|
-
saveSharedWritingStyles,
|
|
27
|
-
} from './styleStore.js'
|
|
28
|
-
export {
|
|
29
|
-
EMPTY_WRITING_STYLE,
|
|
30
|
-
buildStyleGuidance,
|
|
31
|
-
createStyleSource,
|
|
32
|
-
createWritingStyle,
|
|
33
|
-
normalizeWritingStyle,
|
|
34
|
-
styleHasContent,
|
|
35
|
-
styleRawGuidance,
|
|
36
|
-
type BookWritingStyle,
|
|
37
|
-
type StyleSource,
|
|
38
|
-
type WritingStyle,
|
|
39
|
-
} from './writingStyle.js'
|
|
1
|
+
/**
|
|
2
|
+
* Reusable writing-style + AI drafting toolkit.
|
|
3
|
+
*
|
|
4
|
+
* App-agnostic: the host owns persistence of the style library (pass `styles`
|
|
5
|
+
* and `onStylesChange`); everything else — the named-style manager, the
|
|
6
|
+
* "distill into skill" flow, and the draft/redraft dialog — lives here so any
|
|
7
|
+
* app can adopt it.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
DraftAssistantDialog,
|
|
12
|
+
type DraftAssistantDialogProps,
|
|
13
|
+
} from './DraftAssistantDialog.js'
|
|
14
|
+
export {
|
|
15
|
+
WritingStyleManager,
|
|
16
|
+
type WritingStyleManagerProps,
|
|
17
|
+
} from './WritingStyleManager.js'
|
|
18
|
+
export {
|
|
19
|
+
draftTextWithAgent,
|
|
20
|
+
type DraftTextInput,
|
|
21
|
+
type DraftTextMode,
|
|
22
|
+
} from './draftTextWithAgent.js'
|
|
23
|
+
export { condenseWritingStyleWithAgent } from './condenseWritingStyle.js'
|
|
24
|
+
export {
|
|
25
|
+
loadSharedWritingStyles,
|
|
26
|
+
saveSharedWritingStyles,
|
|
27
|
+
} from './styleStore.js'
|
|
28
|
+
export {
|
|
29
|
+
EMPTY_WRITING_STYLE,
|
|
30
|
+
buildStyleGuidance,
|
|
31
|
+
createStyleSource,
|
|
32
|
+
createWritingStyle,
|
|
33
|
+
normalizeWritingStyle,
|
|
34
|
+
styleHasContent,
|
|
35
|
+
styleRawGuidance,
|
|
36
|
+
type BookWritingStyle,
|
|
37
|
+
type StyleSource,
|
|
38
|
+
type WritingStyle,
|
|
39
|
+
} from './writingStyle.js'
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { bridge, PLATFORM_BRIDGE_METHODS } from '../bridge/client.mjs'
|
|
2
|
-
import { normalizeWritingStyle, type BookWritingStyle } from './writingStyle.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Shared writing-style library — ONE set of named styles across every app.
|
|
6
|
-
*
|
|
7
|
-
* Stored as a single JSON file in the suite data dir (`~/PureScience/`), so a
|
|
8
|
-
* style created (and distilled) in one app is available in all of them. The
|
|
9
|
-
* bridge requires an appSlug but does not use it to scope the path, so every
|
|
10
|
-
* app that reads/writes this filename shares the same library.
|
|
11
|
-
*/
|
|
12
|
-
const STORAGE_SLUG = 'writing'
|
|
13
|
-
const STORAGE_FILE = 'writing-styles.json'
|
|
14
|
-
|
|
15
|
-
export async function loadSharedWritingStyles(): Promise<BookWritingStyle> {
|
|
16
|
-
try {
|
|
17
|
-
const result = (await bridge.call(PLATFORM_BRIDGE_METHODS.STORAGE_READ_JSON, [
|
|
18
|
-
{ appSlug: STORAGE_SLUG, fileName: STORAGE_FILE },
|
|
19
|
-
])) as { value?: unknown } | null
|
|
20
|
-
return normalizeWritingStyle(result?.value)
|
|
21
|
-
} catch {
|
|
22
|
-
return normalizeWritingStyle(null)
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function saveSharedWritingStyles(
|
|
27
|
-
style: BookWritingStyle,
|
|
28
|
-
): Promise<void> {
|
|
29
|
-
await bridge.call(PLATFORM_BRIDGE_METHODS.STORAGE_WRITE_JSON, [
|
|
30
|
-
{ appSlug: STORAGE_SLUG, fileName: STORAGE_FILE, value: style },
|
|
31
|
-
])
|
|
32
|
-
}
|
|
1
|
+
import { bridge, PLATFORM_BRIDGE_METHODS } from '../bridge/client.mjs'
|
|
2
|
+
import { normalizeWritingStyle, type BookWritingStyle } from './writingStyle.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Shared writing-style library — ONE set of named styles across every app.
|
|
6
|
+
*
|
|
7
|
+
* Stored as a single JSON file in the suite data dir (`~/PureScience/`), so a
|
|
8
|
+
* style created (and distilled) in one app is available in all of them. The
|
|
9
|
+
* bridge requires an appSlug but does not use it to scope the path, so every
|
|
10
|
+
* app that reads/writes this filename shares the same library.
|
|
11
|
+
*/
|
|
12
|
+
const STORAGE_SLUG = 'writing'
|
|
13
|
+
const STORAGE_FILE = 'writing-styles.json'
|
|
14
|
+
|
|
15
|
+
export async function loadSharedWritingStyles(): Promise<BookWritingStyle> {
|
|
16
|
+
try {
|
|
17
|
+
const result = (await bridge.call(PLATFORM_BRIDGE_METHODS.STORAGE_READ_JSON, [
|
|
18
|
+
{ appSlug: STORAGE_SLUG, fileName: STORAGE_FILE },
|
|
19
|
+
])) as { value?: unknown } | null
|
|
20
|
+
return normalizeWritingStyle(result?.value)
|
|
21
|
+
} catch {
|
|
22
|
+
return normalizeWritingStyle(null)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function saveSharedWritingStyles(
|
|
27
|
+
style: BookWritingStyle,
|
|
28
|
+
): Promise<void> {
|
|
29
|
+
await bridge.call(PLATFORM_BRIDGE_METHODS.STORAGE_WRITE_JSON, [
|
|
30
|
+
{ appSlug: STORAGE_SLUG, fileName: STORAGE_FILE, value: style },
|
|
31
|
+
])
|
|
32
|
+
}
|