@parhelia/core 0.1.12789 → 0.1.12791
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/dist/agents-view/AgentCard.js +2 -5
- package/dist/agents-view/AgentCard.js.map +1 -1
- package/dist/agents-view/AgentsTitlebar.js +1 -2
- package/dist/agents-view/AgentsTitlebar.js.map +1 -1
- package/dist/agents-view/AgentsView.js +53 -7
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/agents-view/AgentsWorkspaceView.d.ts +1 -1
- package/dist/agents-view/AgentsWorkspaceView.js +4 -9
- package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
- package/dist/agents-view/DateAgentsGroup.d.ts +17 -0
- package/dist/agents-view/DateAgentsGroup.js +8 -0
- package/dist/agents-view/DateAgentsGroup.js.map +1 -0
- package/dist/components/ui/LanguageSelector.d.ts +3 -1
- package/dist/components/ui/LanguageSelector.js +8 -4
- package/dist/components/ui/LanguageSelector.js.map +1 -1
- package/dist/components/ui/UserPicker.d.ts +34 -0
- package/dist/components/ui/UserPicker.js +73 -0
- package/dist/components/ui/UserPicker.js.map +1 -0
- package/dist/components/ui/copy-button.js +2 -1
- package/dist/components/ui/copy-button.js.map +1 -1
- package/dist/components/ui/popover.js +22 -4
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/select.js +1 -2
- package/dist/components/ui/select.js.map +1 -1
- package/dist/config/config.js +15 -2
- package/dist/config/config.js.map +1 -1
- package/dist/editor/ContentTree.d.ts +14 -1
- package/dist/editor/ContentTree.js +69 -19
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/Editor.js +5 -8
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/EditorLoadingOverlay.d.ts +1 -0
- package/dist/editor/EditorLoadingOverlay.js +7 -0
- package/dist/editor/EditorLoadingOverlay.js.map +1 -0
- package/dist/editor/FieldActionsOverlay.js +31 -4
- package/dist/editor/FieldActionsOverlay.js.map +1 -1
- package/dist/editor/FieldListField.js +6 -1
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/ai/AgentSharingSection.js +15 -2
- package/dist/editor/ai/AgentSharingSection.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +4 -0
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/ai/agentTodoExtraction.d.ts +7 -1
- package/dist/editor/ai/agentTodoExtraction.js +33 -0
- package/dist/editor/ai/agentTodoExtraction.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +13 -0
- package/dist/editor/ai/terminal/components/AgentDocumentList.js +61 -46
- package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentProfileModelSettingsSection.d.ts +4 -3
- package/dist/editor/ai/terminal/components/AgentProfileModelSettingsSection.js +6 -9
- package/dist/editor/ai/terminal/components/AgentProfileModelSettingsSection.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +10 -2
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +42 -9
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +19 -0
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +71 -0
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -0
- package/dist/editor/ai/terminal/components/AgentSettingsContent.d.ts +4 -3
- package/dist/editor/ai/terminal/components/AgentSettingsContent.js +2 -2
- package/dist/editor/ai/terminal/components/AgentSettingsContent.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalContextChrome.d.ts +2 -0
- package/dist/editor/ai/terminal/components/AgentTerminalContextChrome.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalContextPanels.js +4 -2
- package/dist/editor/ai/terminal/components/AgentTerminalContextPanels.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +3 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +2 -2
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullPromptControls.d.ts +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullPromptControls.js +2 -2
- package/dist/editor/ai/terminal/components/AgentTerminalFullPromptControls.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.d.ts +2 -1
- package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js +2 -2
- package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalView.d.ts +2 -1
- package/dist/editor/ai/terminal/components/AgentTerminalView.js +7 -2
- package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
- package/dist/editor/ai/terminal/components/ContextInfoBar.d.ts +3 -1
- package/dist/editor/ai/terminal/components/ContextInfoBar.js +12 -3
- package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/terminal/components/EditOperationsPanel.d.ts +3 -1
- package/dist/editor/ai/terminal/components/EditOperationsPanel.js +13 -2
- package/dist/editor/ai/terminal/components/EditOperationsPanel.js.map +1 -1
- package/dist/editor/ai/terminal/components/SpawnedAgentsPanel.d.ts +2 -1
- package/dist/editor/ai/terminal/components/SpawnedAgentsPanel.js +18 -14
- package/dist/editor/ai/terminal/components/SpawnedAgentsPanel.js.map +1 -1
- package/dist/editor/ai/terminal/components/TodoListPanel.d.ts +2 -1
- package/dist/editor/ai/terminal/components/TodoListPanel.js +10 -6
- package/dist/editor/ai/terminal/components/TodoListPanel.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentPromptComposerSurface.d.ts +3 -2
- package/dist/editor/ai/terminal/useAgentSettingsNavigation.d.ts +3 -2
- package/dist/editor/ai/terminal/useAgentSettingsNavigation.js +3 -21
- package/dist/editor/ai/terminal/useAgentSettingsNavigation.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentSettingsPanel.d.ts +3 -2
- package/dist/editor/ai/terminal/useAgentSettingsPanel.js +1 -2
- package/dist/editor/ai/terminal/useAgentSettingsPanel.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentSettingsSelectOptions.js +2 -2
- package/dist/editor/ai/terminal/useAgentSettingsSelectOptions.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentStatusBarContent.js +1 -1
- package/dist/editor/ai/terminal/useAgentStatusBarContent.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalActions.d.ts +6 -5
- package/dist/editor/ai/terminal/useAgentTerminalActions.js +3 -10
- package/dist/editor/ai/terminal/useAgentTerminalActions.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalController.js +13 -5
- package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalViewProps.d.ts +1 -0
- package/dist/editor/ai/terminal/useAgentTerminalViewProps.js +2 -1
- package/dist/editor/ai/terminal/useAgentTerminalViewProps.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTextareaDropHandlers.d.ts +25 -0
- package/dist/editor/ai/terminal/useAgentTextareaDropHandlers.js +187 -0
- package/dist/editor/ai/terminal/useAgentTextareaDropHandlers.js.map +1 -0
- package/dist/editor/client/AboutDialog.js +2 -1
- package/dist/editor/client/AboutDialog.js.map +1 -1
- package/dist/editor/client/EditorShell.js +118 -30
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +4 -1
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/fieldModificationStore.d.ts +5 -2
- package/dist/editor/client/fieldModificationStore.js +31 -21
- package/dist/editor/client/fieldModificationStore.js.map +1 -1
- package/dist/editor/client/hooks/useEditorWebSocket.js +0 -47
- package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.d.ts +1 -0
- package/dist/editor/client/hooks/useSocketMessageHandler.js +47 -49
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.d.ts +8 -5
- package/dist/editor/client/itemsRepository.js +30 -37
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/operations.d.ts +8 -1
- package/dist/editor/client/operations.js +29 -9
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/ui/EditorChrome.js +7 -1
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/commands/createVersionCommand.js +8 -2
- package/dist/editor/commands/createVersionCommand.js.map +1 -1
- package/dist/editor/field-types/DropLinkEditor.js +4 -1
- package/dist/editor/field-types/DropLinkEditor.js.map +1 -1
- package/dist/editor/field-types/MultiLineText.js +3 -1
- package/dist/editor/field-types/MultiLineText.js.map +1 -1
- package/dist/editor/field-types/NameValueListEditor.js +4 -1
- package/dist/editor/field-types/NameValueListEditor.js.map +1 -1
- package/dist/editor/field-types/PictureFieldEditor.js +8 -4
- package/dist/editor/field-types/PictureFieldEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +6 -2
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +3 -1
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/field-types/TreeListEditor.js +6 -1
- package/dist/editor/field-types/TreeListEditor.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.js +7 -5
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/hooks/useNavigationPanelLogic.d.ts +3 -3
- package/dist/editor/hooks/useNavigationPanelLogic.js +5 -5
- package/dist/editor/hooks/useNavigationPanelLogic.js.map +1 -1
- package/dist/editor/menubar/ItemLanguageVersion.d.ts +4 -1
- package/dist/editor/menubar/ItemLanguageVersion.js +11 -3
- package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
- package/dist/editor/menubar/VersionPreviewCard.js +26 -6
- package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
- package/dist/editor/menubar/VersionSelector.js +17 -6
- package/dist/editor/menubar/VersionSelector.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.d.ts +7 -0
- package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.js +37 -0
- package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.js.map +1 -0
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +2 -2
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js +7 -11
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/index.d.ts +1 -0
- package/dist/editor/menubar/toolbar-sections/index.js +1 -0
- package/dist/editor/menubar/toolbar-sections/index.js.map +1 -1
- package/dist/editor/notifications/useNotifications.js +11 -4
- package/dist/editor/notifications/useNotifications.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +3 -1
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.d.ts +4 -2
- package/dist/editor/page-editor-chrome/FrameMenu.js +33 -9
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/InlineEditor.d.ts +4 -2
- package/dist/editor/page-editor-chrome/InlineEditor.js +125 -20
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
- package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +4 -2
- package/dist/editor/page-editor-chrome/PageEditorChrome.js +16 -3
- package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +36 -13
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +24 -4
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +52 -22
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
- package/dist/editor/page-viewer/MiniMap.js +29 -21
- package/dist/editor/page-viewer/MiniMap.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.d.ts +4 -2
- package/dist/editor/page-viewer/PageViewer.js +14 -6
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.d.ts +4 -2
- package/dist/editor/page-viewer/PageViewerFrame.js +171 -52
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/reviews/Comment.js +24 -0
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +1 -1
- package/dist/editor/services/agentService.js +2 -3
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/aiService.d.ts +0 -36
- package/dist/editor/services/aiService.js +7 -64
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/services/manualService.d.ts +31 -0
- package/dist/editor/services/manualService.js +77 -0
- package/dist/editor/services/manualService.js.map +1 -0
- package/dist/editor/services/serviceHelper.js +0 -14
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/services/systemService.d.ts +4 -0
- package/dist/editor/services/systemService.js +3 -0
- package/dist/editor/services/systemService.js.map +1 -1
- package/dist/editor/services/userService.d.ts +6 -0
- package/dist/editor/services/userService.js +13 -0
- package/dist/editor/services/userService.js.map +1 -0
- package/dist/editor/settings/About.js +178 -1
- package/dist/editor/settings/About.js.map +1 -1
- package/dist/editor/settings/QuotaInfo.js +7 -7
- package/dist/editor/settings/QuotaInfo.js.map +1 -1
- package/dist/editor/settings/QuotaUserPicker.js +15 -55
- package/dist/editor/settings/QuotaUserPicker.js.map +1 -1
- package/dist/editor/settings/panels/AgentProfileConfigPanel.d.ts +2 -1
- package/dist/editor/settings/panels/AgentProfileConfigPanel.js +4 -2
- package/dist/editor/settings/panels/AgentProfileConfigPanel.js.map +1 -1
- package/dist/editor/settings/panels/AgentProfileEditorPanel.d.ts +1 -0
- package/dist/editor/settings/panels/AgentProfileEditorPanel.js +1 -1
- package/dist/editor/settings/panels/AgentProfileEditorPanel.js.map +1 -1
- package/dist/editor/settings/panels/AgentsPanel.js +15 -10
- package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
- package/dist/editor/settings/panels/ClusterInstancesPanel.js +37 -10
- package/dist/editor/settings/panels/ClusterInstancesPanel.js.map +1 -1
- package/dist/editor/settings/panels/CreateMcpServerDialog.d.ts +7 -0
- package/dist/editor/settings/panels/CreateMcpServerDialog.js +71 -0
- package/dist/editor/settings/panels/CreateMcpServerDialog.js.map +1 -0
- package/dist/editor/settings/panels/JavaScriptToolsPanel.js +13 -17
- package/dist/editor/settings/panels/JavaScriptToolsPanel.js.map +1 -1
- package/dist/editor/settings/panels/McpToolsPanel.js +17 -8
- package/dist/editor/settings/panels/McpToolsPanel.js.map +1 -1
- package/dist/editor/settings/panels/ModelsPanel.js +92 -56
- package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProvidersPanel.js +46 -47
- package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
- package/dist/editor/settings/panels/SearchConfigPanel.js +2 -2
- package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
- package/dist/editor/settings/panels/UserPreferencesPanel.d.ts +2 -0
- package/dist/editor/settings/panels/UserPreferencesPanel.js +17 -0
- package/dist/editor/settings/panels/UserPreferencesPanel.js.map +1 -0
- package/dist/editor/settings/panels/index.d.ts +1 -0
- package/dist/editor/settings/panels/index.js +1 -0
- package/dist/editor/settings/panels/index.js.map +1 -1
- package/dist/editor/sidebar/EditHistory.js +18 -3
- package/dist/editor/sidebar/EditHistory.js.map +1 -1
- package/dist/editor/sidebar/LabelButton.d.ts +3 -3
- package/dist/editor/sidebar/LabelButton.js +4 -4
- package/dist/editor/sidebar/LabelButton.js.map +1 -1
- package/dist/editor/sidebar/MobileWorkspacePopover.d.ts +2 -2
- package/dist/editor/sidebar/MobileWorkspacePopover.js +2 -2
- package/dist/editor/sidebar/MobileWorkspacePopover.js.map +1 -1
- package/dist/editor/sidebar/NavigationPanelItem.js +3 -3
- package/dist/editor/sidebar/NavigationPanelItem.js.map +1 -1
- package/dist/editor/sidebar/WorkspaceButton.d.ts +3 -1
- package/dist/editor/sidebar/WorkspaceButton.js +15 -7
- package/dist/editor/sidebar/WorkspaceButton.js.map +1 -1
- package/dist/editor/sidebar/WorkspaceRail.js +6 -5
- package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
- package/dist/editor/sidebar/WorkspaceRailMobile.js +2 -2
- package/dist/editor/sidebar/WorkspaceRailMobile.js.map +1 -1
- package/dist/editor/ui/ItemCollectionEditor.d.ts +27 -3
- package/dist/editor/ui/ItemCollectionEditor.js +44 -5
- package/dist/editor/ui/ItemCollectionEditor.js.map +1 -1
- package/dist/editor/ui/PerfectTree.js +1 -1
- package/dist/editor/ui/PerfectTree.js.map +1 -1
- package/dist/editor/utils.js +33 -11
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/version-diff/versionDiffTargets.js +7 -1
- package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
- package/dist/editor/views/EditorSlot.js +3 -2
- package/dist/editor/views/EditorSlot.js.map +1 -1
- package/dist/editor/views/ItemEditorPane.d.ts +11 -0
- package/dist/editor/views/ItemEditorPane.js +19 -0
- package/dist/editor/views/ItemEditorPane.js.map +1 -0
- package/dist/editor/views/editorSlotContext.d.ts +2 -0
- package/dist/editor/views/editorSlotContext.js +3 -0
- package/dist/editor/views/editorSlotContext.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/setup/services/setupWizardService.d.ts +10 -0
- package/dist/setup/services/setupWizardService.js +7 -0
- package/dist/setup/services/setupWizardService.js.map +1 -1
- package/dist/task-board/TaskBoardWorkspace.js +1 -0
- package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
- package/dist/task-board/components/ProjectExecutionUserPicker.js +15 -61
- package/dist/task-board/components/ProjectExecutionUserPicker.js.map +1 -1
- package/dist/task-board/components/ProjectListContent.d.ts +1 -0
- package/dist/task-board/components/ProjectListContent.js.map +1 -1
- package/dist/task-board/components/ProjectSelector.d.ts +1 -0
- package/dist/task-board/components/ProjectSelector.js +7 -1
- package/dist/task-board/components/ProjectSelector.js.map +1 -1
- package/dist/task-board/taskBoardNavStore.d.ts +1 -0
- package/dist/task-board/taskBoardNavStore.js +1 -0
- package/dist/task-board/taskBoardNavStore.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/package.json +1 -1
- package/dist/editor/debugSessionLog.d.ts +0 -9
- package/dist/editor/debugSessionLog.js +0 -19
- package/dist/editor/debugSessionLog.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgentTerminalViewProps.js","sourceRoot":"","sources":["../../../../src/editor/ai/terminal/useAgentTerminalViewProps.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"useAgentTerminalViewProps.js","sourceRoot":"","sources":["../../../../src/editor/ai/terminal/useAgentTerminalViewProps.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,yBAAyB,CAAC,KAczC;IACC,MAAM,EACJ,cAAc,EACd,WAAW,EACX,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,GAAG,KAAK,CAAC;IAEV,OAAO;QACL,cAAc;QACd,WAAW;QACX,kBAAkB,EAAE;YAClB,GAAG,uBAAuB;YAC1B,GAAG,oBAAoB;YACvB,GAAG,kBAAkB;SACtB;QACD,qBAAqB,EAAE;YACrB,GAAG,uBAAuB;YAC1B,GAAG,qBAAqB;SACzB;QACD,eAAe;QACf,uBAAuB;QACvB,mBAAmB;QACnB,uBAAuB;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type React from "react";
|
|
2
|
+
import { type AgentDetails, type AgentMetadata } from "../../services/agentService";
|
|
3
|
+
import type { AgentDocumentListHandle } from "./components/AgentDocumentList";
|
|
4
|
+
export interface UseAgentTextareaDropHandlersOptions {
|
|
5
|
+
agent: AgentDetails | undefined;
|
|
6
|
+
agentMetadata: AgentMetadata | null;
|
|
7
|
+
setAgentMetadata: React.Dispatch<React.SetStateAction<AgentMetadata | null>>;
|
|
8
|
+
setAgent: React.Dispatch<React.SetStateAction<AgentDetails | undefined>>;
|
|
9
|
+
documentListRef: React.RefObject<AgentDocumentListHandle | null>;
|
|
10
|
+
documentsEnabled: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface AgentTextareaDropHandlers {
|
|
13
|
+
isDragOver: boolean;
|
|
14
|
+
onDragOver: (e: React.DragEvent) => void;
|
|
15
|
+
onDragEnter: (e: React.DragEvent) => void;
|
|
16
|
+
onDragLeave: (e: React.DragEvent) => void;
|
|
17
|
+
onDrop: (e: React.DragEvent) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Returns drop handlers that the agent prompt textarea can use to accept:
|
|
21
|
+
* - File drops → forwarded to AgentDocumentList.uploadFiles
|
|
22
|
+
* - Editor item drops (pages) → appended to agent context
|
|
23
|
+
* - Editor component drops → appended to agent context
|
|
24
|
+
*/
|
|
25
|
+
export declare function useAgentTextareaDropHandlers({ agent, agentMetadata, setAgentMetadata, setAgent, documentListRef, documentsEnabled, }: UseAgentTextareaDropHandlersOptions): AgentTextareaDropHandlers;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { useCallback, useState } from "react";
|
|
2
|
+
import { useEditContext } from "../../client/editContext";
|
|
3
|
+
import { updateAgentContext, } from "../../services/agentService";
|
|
4
|
+
import { getComponentById } from "../../componentTreeHelper";
|
|
5
|
+
/**
|
|
6
|
+
* Returns drop handlers that the agent prompt textarea can use to accept:
|
|
7
|
+
* - File drops → forwarded to AgentDocumentList.uploadFiles
|
|
8
|
+
* - Editor item drops (pages) → appended to agent context
|
|
9
|
+
* - Editor component drops → appended to agent context
|
|
10
|
+
*/
|
|
11
|
+
export function useAgentTextareaDropHandlers({ agent, agentMetadata, setAgentMetadata, setAgent, documentListRef, documentsEnabled, }) {
|
|
12
|
+
const editContext = useEditContext();
|
|
13
|
+
const [isDragOver, setIsDragOver] = useState(false);
|
|
14
|
+
const addComponentIdsToContext = useCallback(async (ids) => {
|
|
15
|
+
if (!agent?.id || !ids?.length)
|
|
16
|
+
return;
|
|
17
|
+
const current = agentMetadata || {};
|
|
18
|
+
const currentComponents = current.components || [];
|
|
19
|
+
const existingIds = new Set(currentComponents.map((c) => c.componentId));
|
|
20
|
+
const newComponentIds = ids.filter((id) => !!id && !existingIds.has(id));
|
|
21
|
+
if (newComponentIds.length === 0)
|
|
22
|
+
return;
|
|
23
|
+
const pageItem = editContext?.currentItemDescriptor
|
|
24
|
+
? {
|
|
25
|
+
id: editContext.currentItemDescriptor.id,
|
|
26
|
+
language: editContext.currentItemDescriptor.language,
|
|
27
|
+
version: editContext.currentItemDescriptor.version,
|
|
28
|
+
name: editContext.item?.name,
|
|
29
|
+
path: undefined,
|
|
30
|
+
}
|
|
31
|
+
: undefined;
|
|
32
|
+
const newComponents = newComponentIds.map((componentId) => {
|
|
33
|
+
let componentName;
|
|
34
|
+
if (editContext?.page) {
|
|
35
|
+
try {
|
|
36
|
+
const comp = getComponentById(componentId, editContext.page);
|
|
37
|
+
componentName = comp?.name || undefined;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// ignore lookup errors
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
componentId,
|
|
45
|
+
componentName,
|
|
46
|
+
pageItem: pageItem,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
const next = {
|
|
50
|
+
...current,
|
|
51
|
+
components: [...currentComponents, ...newComponents],
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
if (agent.status === "new") {
|
|
55
|
+
setAgentMetadata(next);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
await updateAgentContext(agent.id, next);
|
|
59
|
+
setAgentMetadata(next);
|
|
60
|
+
setAgent((prev) => prev ? { ...prev, agentContext: JSON.stringify(next) } : prev);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
console.error("Failed to update agent context (add components)", e);
|
|
64
|
+
}
|
|
65
|
+
}, [agent, agentMetadata, editContext, setAgent, setAgentMetadata]);
|
|
66
|
+
const addPagesToContextFromItems = useCallback(async (items) => {
|
|
67
|
+
if (!agent?.id || !items?.length)
|
|
68
|
+
return;
|
|
69
|
+
const current = agentMetadata || {};
|
|
70
|
+
const currentPages = current.items || [];
|
|
71
|
+
const existingPageIds = new Set(currentPages.map((p) => `${p.id}-${p.language}-${p.version}`));
|
|
72
|
+
const pagesToAdd = items
|
|
73
|
+
.filter((it) => !!it?.id)
|
|
74
|
+
.map((it) => {
|
|
75
|
+
const anyIt = it;
|
|
76
|
+
const page = {
|
|
77
|
+
id: it.id,
|
|
78
|
+
language: it.language,
|
|
79
|
+
version: it.version,
|
|
80
|
+
};
|
|
81
|
+
const candidateName = anyIt?.displayName ||
|
|
82
|
+
anyIt?.name;
|
|
83
|
+
if (candidateName)
|
|
84
|
+
page.name = candidateName;
|
|
85
|
+
if (anyIt?.path)
|
|
86
|
+
page.path = anyIt.path;
|
|
87
|
+
return page;
|
|
88
|
+
})
|
|
89
|
+
.filter((p) => !existingPageIds.has(`${p.id}-${p.language}-${p.version}`));
|
|
90
|
+
if (pagesToAdd.length === 0)
|
|
91
|
+
return;
|
|
92
|
+
const next = {
|
|
93
|
+
...current,
|
|
94
|
+
items: [...currentPages, ...pagesToAdd],
|
|
95
|
+
};
|
|
96
|
+
try {
|
|
97
|
+
if (agent.status === "new") {
|
|
98
|
+
setAgentMetadata(next);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
await updateAgentContext(agent.id, next);
|
|
102
|
+
setAgentMetadata(next);
|
|
103
|
+
setAgent((prev) => prev ? { ...prev, agentContext: JSON.stringify(next) } : prev);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
console.error("Failed to update agent context (add items/pages)", e);
|
|
107
|
+
}
|
|
108
|
+
}, [agent, agentMetadata, setAgent, setAgentMetadata]);
|
|
109
|
+
const onDragOver = useCallback((e) => {
|
|
110
|
+
e.preventDefault();
|
|
111
|
+
e.dataTransfer.dropEffect = "copy";
|
|
112
|
+
if (!isDragOver)
|
|
113
|
+
setIsDragOver(true);
|
|
114
|
+
}, [isDragOver]);
|
|
115
|
+
const onDragEnter = onDragOver;
|
|
116
|
+
const onDragLeave = useCallback((e) => {
|
|
117
|
+
// Only clear state when the cursor actually leaves the wrapper.
|
|
118
|
+
// dragleave fires for every child element too.
|
|
119
|
+
if (e.currentTarget === e.target) {
|
|
120
|
+
setIsDragOver(false);
|
|
121
|
+
}
|
|
122
|
+
}, []);
|
|
123
|
+
const onDrop = useCallback(async (e) => {
|
|
124
|
+
e.preventDefault();
|
|
125
|
+
setIsDragOver(false);
|
|
126
|
+
try {
|
|
127
|
+
// 1) File drops → forward to documents upload
|
|
128
|
+
if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {
|
|
129
|
+
if (documentsEnabled) {
|
|
130
|
+
await documentListRef.current?.uploadFiles(e.dataTransfer.files);
|
|
131
|
+
}
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// 2) Editor drag objects → add to agent context
|
|
135
|
+
const dragObj = editContext?.dragObject;
|
|
136
|
+
if (dragObj?.type === "component") {
|
|
137
|
+
const idsFromComponents = (dragObj.components || [])
|
|
138
|
+
.map((c) => c.id)
|
|
139
|
+
.filter((x) => !!x);
|
|
140
|
+
const idFromData = e.dataTransfer.getData("componentId");
|
|
141
|
+
const allIds = Array.from(new Set([...idsFromComponents, idFromData].filter((x) => !!x)));
|
|
142
|
+
if (allIds.length) {
|
|
143
|
+
await addComponentIdsToContext(allIds);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (dragObj?.type === "items" && dragObj.items?.length) {
|
|
148
|
+
await addPagesToContextFromItems(dragObj.items);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// 3) Fallbacks
|
|
152
|
+
const fallbackComponentId = e.dataTransfer.getData("componentId");
|
|
153
|
+
if (fallbackComponentId) {
|
|
154
|
+
await addComponentIdsToContext([fallbackComponentId]);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const textData = e.dataTransfer.getData("text/plain");
|
|
159
|
+
if (textData) {
|
|
160
|
+
const parsed = JSON.parse(textData);
|
|
161
|
+
if (Array.isArray(parsed)) {
|
|
162
|
+
await addPagesToContextFromItems(parsed);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
else if (parsed?.id) {
|
|
166
|
+
await addPagesToContextFromItems([parsed]);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// not JSON, ignore
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
console.error("Textarea drop failed", err);
|
|
177
|
+
}
|
|
178
|
+
}, [
|
|
179
|
+
addComponentIdsToContext,
|
|
180
|
+
addPagesToContextFromItems,
|
|
181
|
+
documentListRef,
|
|
182
|
+
documentsEnabled,
|
|
183
|
+
editContext,
|
|
184
|
+
]);
|
|
185
|
+
return { isDragOver, onDragOver, onDragEnter, onDragLeave, onDrop };
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=useAgentTextareaDropHandlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentTextareaDropHandlers.js","sourceRoot":"","sources":["../../../../src/editor/ai/terminal/useAgentTextareaDropHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { ParheliaIconWhite } from "../ui/ParheliaIconWhite";
|
|
|
7
7
|
export const AboutDialog = forwardRef((props, ref) => {
|
|
8
8
|
const [visible, setVisible] = useState(false);
|
|
9
9
|
const license = useLicense();
|
|
10
|
+
const licenseeCompanyName = license.licenseStatus?.companyName?.trim();
|
|
10
11
|
useImperativeHandle(ref, () => ({
|
|
11
12
|
onClose: (result) => {
|
|
12
13
|
setVisible(false);
|
|
@@ -21,6 +22,6 @@ export const AboutDialog = forwardRef((props, ref) => {
|
|
|
21
22
|
setVisible(false);
|
|
22
23
|
props.onClose(null);
|
|
23
24
|
}
|
|
24
|
-
}, children: _jsxs(DialogContent, { className: "sm:max-w-[420px] p-0 overflow-hidden border-none bg-slate-950 text-slate-200 shadow-2xl", children: [_jsx(DialogTitle, { className: "sr-only", children: "About Parhelia" }), _jsxs("div", { className: "relative h-32 w-full overflow-hidden bg-black", children: [_jsx("div", { className: "absolute inset-0 bg-linear-to-br from-purple-600/20 via-blue-600/10 to-transparent" }), _jsx("div", { className: "absolute -bottom-12 -left-12 h-32 w-32 rounded-full bg-purple-500/10 blur-3xl" }), _jsx("div", { className: "absolute -top-12 -right-12 h-32 w-32 rounded-full bg-blue-500/10 blur-3xl" }), _jsx("div", { className: "relative flex h-full items-center justify-center pt-4", children: _jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute inset-0 blur-xl bg-white/20 rounded-full" }), _jsx(ParheliaIconWhite, { size: 48, className: "relative z-10 text-white" })] }) })] }), _jsxs("div", { className: "flex flex-col items-center gap-6 px-8 py-8 text-center", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("h2", { className: "text-2xl font-extralight tracking-[0.2em] text-white uppercase", children: "parhelia" }), _jsx("p", { className: "text-[10px] font-light tracking-[0.3em] text-slate-500 uppercase", children: "Experience content in a new light" })] }), _jsxs("div", { className: "w-full space-y-4 rounded-xl bg-white/5 p-6 border border-white/10 backdrop-blur-sm", children: [_jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsx("span", { className: "text-slate-500 font-light tracking-wide", children: "Version" }), _jsx("span", { className: "font-medium text-white tabular-nums", children: version })] }), _jsx("div", { className: "h-px bg-white/5" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsx("span", { className: "text-slate-500 font-light tracking-wide", children: "Build Date" }), _jsx("span", { className: "text-slate-300 tabular-nums", children: buildDate })] }), !license?.licenseStatus?.licensingDisabled && (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-px bg-white/5" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsx("span", { className: "text-slate-500 font-light tracking-wide", children: "License" }), _jsx(LicenseBadge, {})] })] }))] }), _jsxs("div", { className: "space-y-4", children: [_jsx("p", { className: "text-[11px] leading-relaxed text-slate-500 max-w-[280px]", children: "Built with passion by the Parhelia team at Canvas Reply. Focusing on the future of AI-driven content management." }), _jsxs("div", { className: "pt-2 text-[10px] font-light text-slate-600 tracking-wider", children: ["\u00A9 ", new Date().getFullYear(), " CANVAS REPLY GMBH. ALL RIGHTS RESERVED."] })] })] })] }) }));
|
|
25
|
+
}, children: _jsxs(DialogContent, { className: "sm:max-w-[420px] p-0 overflow-hidden border-none bg-slate-950 text-slate-200 shadow-2xl", children: [_jsx(DialogTitle, { className: "sr-only", children: "About Parhelia" }), _jsxs("div", { className: "relative h-32 w-full overflow-hidden bg-black", children: [_jsx("div", { className: "absolute inset-0 bg-linear-to-br from-purple-600/20 via-blue-600/10 to-transparent" }), _jsx("div", { className: "absolute -bottom-12 -left-12 h-32 w-32 rounded-full bg-purple-500/10 blur-3xl" }), _jsx("div", { className: "absolute -top-12 -right-12 h-32 w-32 rounded-full bg-blue-500/10 blur-3xl" }), _jsx("div", { className: "relative flex h-full items-center justify-center pt-4", children: _jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute inset-0 blur-xl bg-white/20 rounded-full" }), _jsx(ParheliaIconWhite, { size: 48, className: "relative z-10 text-white" })] }) })] }), _jsxs("div", { className: "flex flex-col items-center gap-6 px-8 py-8 text-center", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("h2", { className: "text-2xl font-extralight tracking-[0.2em] text-white uppercase", children: "parhelia" }), _jsx("p", { className: "text-[10px] font-light tracking-[0.3em] text-slate-500 uppercase", children: "Experience content in a new light" })] }), _jsxs("div", { className: "w-full space-y-4 rounded-xl bg-white/5 p-6 border border-white/10 backdrop-blur-sm", children: [_jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsx("span", { className: "text-slate-500 font-light tracking-wide", children: "Version" }), _jsx("span", { className: "font-medium text-white tabular-nums", children: version })] }), _jsx("div", { className: "h-px bg-white/5" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsx("span", { className: "text-slate-500 font-light tracking-wide", children: "Build Date" }), _jsx("span", { className: "text-slate-300 tabular-nums", children: buildDate })] }), !license?.licenseStatus?.licensingDisabled && (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-px bg-white/5" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsx("span", { className: "text-slate-500 font-light tracking-wide", children: "License" }), _jsx(LicenseBadge, {})] }), licenseeCompanyName && (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-px bg-white/5" }), _jsxs("div", { className: "flex min-w-0 items-center justify-between gap-4 text-sm", children: [_jsx("span", { className: "text-slate-500 font-light tracking-wide", children: "Licensee" }), _jsx("span", { className: "min-w-0 break-words text-right font-medium text-white", children: licenseeCompanyName })] })] }))] }))] }), _jsxs("div", { className: "space-y-4", children: [_jsx("p", { className: "text-[11px] leading-relaxed text-slate-500 max-w-[280px]", children: "Built with passion by the Parhelia team at Canvas Reply. Focusing on the future of AI-driven content management." }), _jsxs("div", { className: "pt-2 text-[10px] font-light text-slate-600 tracking-wider", children: ["\u00A9 ", new Date().getFullYear(), " CANVAS REPLY GMBH. ALL RIGHTS RESERVED."] })] })] })] }) }));
|
|
25
26
|
});
|
|
26
27
|
//# sourceMappingURL=AboutDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AboutDialog.js","sourceRoot":"","sources":["../../../src/editor/client/AboutDialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CACnC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACb,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"AboutDialog.js","sourceRoot":"","sources":["../../../src/editor/client/AboutDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import React, { useState, useEffect, useRef, useCallback,
|
|
3
|
+
import React, { useState, useEffect, useRef, useCallback, useMemo, startTransition, } from "react";
|
|
4
4
|
import { toast } from "sonner";
|
|
5
5
|
import { EditContextProvider, FieldsEditContextProvider, OperationsContextProvider, useEditContext, } from "./editContext";
|
|
6
|
-
import {
|
|
6
|
+
import { aggregateModifiedFieldsFromStores, areModifiedFieldSnapshotsEqual, FieldModificationStore, } from "./fieldModificationStore";
|
|
7
7
|
import { SplashScreenAgentProvider } from "../../splash-screen/SplashScreenAgentContext";
|
|
8
8
|
import { useRouter, useSearchParams, usePathname } from "./navigation";
|
|
9
9
|
import { findComponent, getComponentById } from "../componentTreeHelper";
|
|
@@ -57,6 +57,7 @@ import { useWorkbox } from "./hooks/useWorkbox";
|
|
|
57
57
|
import { useMediaSelector } from "./hooks/useMediaSelector";
|
|
58
58
|
import { useGlobalEditorKeyDown } from "./hooks/useGlobalEditorKeyDown";
|
|
59
59
|
import { useStartupChecks } from "../settings/status/index";
|
|
60
|
+
import { EditorLoadingOverlay } from "../EditorLoadingOverlay";
|
|
60
61
|
import { FeatureGate, LicenseFeatures, LicenseProvider, LicenseOverlay, } from "../../licensing";
|
|
61
62
|
// Sentinel written to the `sidebar` URL param when the user has explicitly closed
|
|
62
63
|
// every sidebar. Distinguishes "no preference yet" (param absent) from "user wants
|
|
@@ -372,6 +373,25 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
372
373
|
activeSlotIdRef.current = activeSlotId;
|
|
373
374
|
}, [activeSlotId]);
|
|
374
375
|
const [slotContexts, setSlotContexts] = useState(() => new Map());
|
|
376
|
+
const fieldModificationStoresBySlotRef = useRef(new Map());
|
|
377
|
+
const [fieldModificationStoreRegistryRevision, setFieldModificationStoreRegistryRevision,] = useState(0);
|
|
378
|
+
const getFieldModificationStoreForSlot = useCallback((slotId) => {
|
|
379
|
+
let store = fieldModificationStoresBySlotRef.current.get(slotId);
|
|
380
|
+
if (!store) {
|
|
381
|
+
store = new FieldModificationStore();
|
|
382
|
+
fieldModificationStoresBySlotRef.current.set(slotId, store);
|
|
383
|
+
}
|
|
384
|
+
return store;
|
|
385
|
+
}, []);
|
|
386
|
+
const getFieldModificationStores = useCallback(() => {
|
|
387
|
+
return Array.from(fieldModificationStoresBySlotRef.current.values());
|
|
388
|
+
}, []);
|
|
389
|
+
const ensureFieldModificationStoreRegistered = useCallback((slotId) => {
|
|
390
|
+
if (fieldModificationStoresBySlotRef.current.has(slotId))
|
|
391
|
+
return;
|
|
392
|
+
fieldModificationStoresBySlotRef.current.set(slotId, new FieldModificationStore());
|
|
393
|
+
setFieldModificationStoreRegistryRevision((previous) => previous + 1);
|
|
394
|
+
}, []);
|
|
375
395
|
const promptSessionReconnect = useCallback((reason) => {
|
|
376
396
|
const description = reason && reason !== "session-revoked"
|
|
377
397
|
? `${reason}. Click reconnect to continue in this browser.`
|
|
@@ -445,7 +465,23 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
445
465
|
const [itemLanguages, setItemLanguages] = useState([]);
|
|
446
466
|
const [itemVersions, setItemVersions] = useState([]);
|
|
447
467
|
const [isLoadingVersions, setIsLoadingVersions] = useState(false);
|
|
448
|
-
const modifiedFields
|
|
468
|
+
const [modifiedFields, setModifiedFields] = useState([]);
|
|
469
|
+
useEffect(() => {
|
|
470
|
+
const stores = getFieldModificationStores();
|
|
471
|
+
const recomputeModifiedFields = () => {
|
|
472
|
+
const next = aggregateModifiedFieldsFromStores(stores);
|
|
473
|
+
setModifiedFields((previous) => areModifiedFieldSnapshotsEqual(previous, next) ? previous : next);
|
|
474
|
+
};
|
|
475
|
+
const unsubscribes = stores.map((store) => store.subscribeAll(recomputeModifiedFields));
|
|
476
|
+
recomputeModifiedFields();
|
|
477
|
+
return () => {
|
|
478
|
+
unsubscribes.forEach((unsubscribe) => unsubscribe());
|
|
479
|
+
};
|
|
480
|
+
}, [
|
|
481
|
+
editorSlots,
|
|
482
|
+
fieldModificationStoreRegistryRevision,
|
|
483
|
+
getFieldModificationStores,
|
|
484
|
+
]);
|
|
449
485
|
const [comments, setComments] = useState([]);
|
|
450
486
|
const [suggestedEdits, setSuggestedEdits] = useState([]);
|
|
451
487
|
const [showSuggestedEdits, setShowSuggestedEdits] = useState(false);
|
|
@@ -648,7 +684,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
648
684
|
// Track the current page item descriptor for itemsRepository
|
|
649
685
|
const [currentPageItem, setCurrentPageItem] = useState();
|
|
650
686
|
// Create itemsRepository with current page item (will be updated when page loads)
|
|
651
|
-
const itemsRepository = useItemsRepository(addRecentEdit, currentPageItem);
|
|
687
|
+
const itemsRepository = useItemsRepository(addRecentEdit, currentPageItem, getFieldModificationStores);
|
|
652
688
|
const fallbackPageViewContext = usePageViewContext({
|
|
653
689
|
pageItemDescriptor: currentItemDescriptor,
|
|
654
690
|
itemsRepository,
|
|
@@ -682,9 +718,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
682
718
|
}, []);
|
|
683
719
|
const slotContextsRef = useRef(slotContexts);
|
|
684
720
|
const lastActiveSlotContextRef = useRef(null);
|
|
685
|
-
|
|
686
|
-
slotContextsRef.current = slotContexts;
|
|
687
|
-
}, [slotContexts]);
|
|
721
|
+
slotContextsRef.current = slotContexts;
|
|
688
722
|
const getActiveSlotContext = useCallback(() => {
|
|
689
723
|
const activeId = activeSlotIdRef.current;
|
|
690
724
|
if (!activeId)
|
|
@@ -1481,6 +1515,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1481
1515
|
const historyModeRef = useRef(historyMode);
|
|
1482
1516
|
const itemRef = useRef(item);
|
|
1483
1517
|
const historySearchQueryRef = useRef(historySearchQuery);
|
|
1518
|
+
const showOnlyMyChangesRef = useRef(showOnlyMyChanges);
|
|
1519
|
+
const filterByCurrentLanguageRef = useRef(filterByCurrentLanguage);
|
|
1484
1520
|
useEffect(() => {
|
|
1485
1521
|
historyModeRef.current = historyMode;
|
|
1486
1522
|
}, [historyMode]);
|
|
@@ -1490,6 +1526,12 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1490
1526
|
useEffect(() => {
|
|
1491
1527
|
historySearchQueryRef.current = historySearchQuery;
|
|
1492
1528
|
}, [historySearchQuery]);
|
|
1529
|
+
useEffect(() => {
|
|
1530
|
+
showOnlyMyChangesRef.current = showOnlyMyChanges;
|
|
1531
|
+
}, [showOnlyMyChanges]);
|
|
1532
|
+
useEffect(() => {
|
|
1533
|
+
filterByCurrentLanguageRef.current = filterByCurrentLanguage;
|
|
1534
|
+
}, [filterByCurrentLanguage]);
|
|
1493
1535
|
// Mirror the backend LIKE filter on MainItemPath/Title/Description so that
|
|
1494
1536
|
// ops arriving via WebSocket while a search is active don't bypass the filter.
|
|
1495
1537
|
const matchesHistorySearchQuery = useCallback((op) => {
|
|
@@ -1768,6 +1810,34 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1768
1810
|
: filterByCurrentLanguage;
|
|
1769
1811
|
const trimmedHistoryQuery = historySearchQuery.trim();
|
|
1770
1812
|
const historyQuery = trimmedHistoryQuery.length > 0 ? trimmedHistoryQuery : undefined;
|
|
1813
|
+
const requestMode = currentMode;
|
|
1814
|
+
const requestSearchQuery = trimmedHistoryQuery;
|
|
1815
|
+
const requestItem = item?.descriptor;
|
|
1816
|
+
const requestLanguage = item?.descriptor?.language || currentItemDescriptor?.language;
|
|
1817
|
+
const isStaleHistoryResponse = () => {
|
|
1818
|
+
if (historyModeRef.current !== requestMode)
|
|
1819
|
+
return true;
|
|
1820
|
+
if ((historySearchQueryRef.current || "").trim() !== requestSearchQuery) {
|
|
1821
|
+
return true;
|
|
1822
|
+
}
|
|
1823
|
+
if (showOnlyMyChangesRef.current !== shouldFilterBySession)
|
|
1824
|
+
return true;
|
|
1825
|
+
if (filterByCurrentLanguageRef.current !== shouldFilterByLanguage) {
|
|
1826
|
+
return true;
|
|
1827
|
+
}
|
|
1828
|
+
const latestItem = itemRef.current?.descriptor;
|
|
1829
|
+
if (requestMode !== "global") {
|
|
1830
|
+
return (!latestItem ||
|
|
1831
|
+
!requestItem ||
|
|
1832
|
+
latestItem.id !== requestItem.id ||
|
|
1833
|
+
latestItem.language !== requestItem.language ||
|
|
1834
|
+
latestItem.version !== requestItem.version);
|
|
1835
|
+
}
|
|
1836
|
+
return (shouldFilterByLanguage &&
|
|
1837
|
+
!!requestLanguage &&
|
|
1838
|
+
!!latestItem?.language &&
|
|
1839
|
+
latestItem.language !== requestLanguage);
|
|
1840
|
+
};
|
|
1771
1841
|
if (currentMode === "global") {
|
|
1772
1842
|
// Global mode: optionally filter by session and/or language
|
|
1773
1843
|
const currentLanguage = item?.descriptor?.language || currentItemDescriptor?.language;
|
|
@@ -1783,6 +1853,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1783
1853
|
console.error("[EditorShell] Failed to load history:", result);
|
|
1784
1854
|
return;
|
|
1785
1855
|
}
|
|
1856
|
+
if (isStaleHistoryResponse()) {
|
|
1857
|
+
return;
|
|
1858
|
+
}
|
|
1786
1859
|
setEditHistory((prev) => {
|
|
1787
1860
|
const next = normalizeEditHistoryPayload(result.data);
|
|
1788
1861
|
const scope = {
|
|
@@ -1870,6 +1943,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1870
1943
|
console.error("[EditorShell] Failed to load item history:", result);
|
|
1871
1944
|
return;
|
|
1872
1945
|
}
|
|
1946
|
+
if (isStaleHistoryResponse()) {
|
|
1947
|
+
return;
|
|
1948
|
+
}
|
|
1873
1949
|
let operations = normalizeEditHistoryPayload(result.data);
|
|
1874
1950
|
// Client-side version filtering for current-version mode
|
|
1875
1951
|
if (currentMode === "current-version") {
|
|
@@ -2263,15 +2339,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2263
2339
|
setItem(item);
|
|
2264
2340
|
if (!item)
|
|
2265
2341
|
return;
|
|
2266
|
-
if (itemRef.current?.descriptor.id === currentItemDescriptor.id &&
|
|
2267
|
-
itemRef.current?.descriptor.language ===
|
|
2268
|
-
currentItemDescriptor.language &&
|
|
2269
|
-
itemRef.current?.descriptor.version !== item.version) {
|
|
2270
|
-
showInfoToast({
|
|
2271
|
-
summary: "New version!",
|
|
2272
|
-
details: "New version of item loaded",
|
|
2273
|
-
});
|
|
2274
|
-
}
|
|
2275
2342
|
}
|
|
2276
2343
|
load();
|
|
2277
2344
|
}, [itemsRepository.revision]);
|
|
@@ -2359,6 +2426,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2359
2426
|
(activeSlotIdRef.current == null ||
|
|
2360
2427
|
existingSlotForItem.slotId === activeSlotIdRef.current)) {
|
|
2361
2428
|
const isExistingSlotActive = existingSlotForItem.slotId === activeSlotIdRef.current;
|
|
2429
|
+
ensureFieldModificationStoreRegistered(existingSlotForItem.slotId);
|
|
2362
2430
|
if (isExistingSlotActive) {
|
|
2363
2431
|
latestGlobalLoadKeyRef.current = requestedItemKey;
|
|
2364
2432
|
}
|
|
@@ -2417,6 +2485,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2417
2485
|
: (activeSlotId ?? editorSlots[0]?.slotId ?? null));
|
|
2418
2486
|
if (!targetSlotId)
|
|
2419
2487
|
return undefined;
|
|
2488
|
+
ensureFieldModificationStoreRegistered(targetSlotId);
|
|
2420
2489
|
setEditorSlots((prev) => {
|
|
2421
2490
|
if (shouldOpenNewSlot && !options?.targetSlotId) {
|
|
2422
2491
|
const existingIdx = prev.findIndex((s) => s.slotId === targetSlotId);
|
|
@@ -2494,6 +2563,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2494
2563
|
activeSlotId,
|
|
2495
2564
|
item,
|
|
2496
2565
|
workspaceId,
|
|
2566
|
+
ensureFieldModificationStoreRegistered,
|
|
2497
2567
|
]);
|
|
2498
2568
|
const setActiveSlot = useCallback(async (slotId) => {
|
|
2499
2569
|
if (activeSlotId === slotId)
|
|
@@ -2536,6 +2606,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2536
2606
|
// Remove the slot
|
|
2537
2607
|
setEditorSlots((prev) => prev.filter((s) => s.slotId !== slotId));
|
|
2538
2608
|
unregisterSlotContext(slotId);
|
|
2609
|
+
if (fieldModificationStoresBySlotRef.current.delete(slotId)) {
|
|
2610
|
+
setFieldModificationStoreRegistryRevision((previous) => previous + 1);
|
|
2611
|
+
}
|
|
2539
2612
|
// Activate the next slot if we closed the active one
|
|
2540
2613
|
if (isClosingActiveSlot) {
|
|
2541
2614
|
if (nextActiveSlotId) {
|
|
@@ -2603,6 +2676,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2603
2676
|
layoutMode,
|
|
2604
2677
|
setFocusFieldComponentId,
|
|
2605
2678
|
setInsertMode,
|
|
2679
|
+
getActiveSlotContext,
|
|
2680
|
+
getFieldModificationStoreForSlot,
|
|
2681
|
+
getActiveSlotId,
|
|
2606
2682
|
};
|
|
2607
2683
|
useEffect(() => {
|
|
2608
2684
|
if (currentOverlay !== "fields")
|
|
@@ -3227,9 +3303,10 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3227
3303
|
return false;
|
|
3228
3304
|
if (!isTaskboardWorkspace && isTaskboardSidebar)
|
|
3229
3305
|
return false;
|
|
3230
|
-
//
|
|
3306
|
+
// Keep agents-panel broadly available, except in dedicated workspaces
|
|
3307
|
+
// that own their full surface.
|
|
3231
3308
|
if (s.id === "agents-panel") {
|
|
3232
|
-
return
|
|
3309
|
+
return targetWorkspaceId !== "translation-management";
|
|
3233
3310
|
}
|
|
3234
3311
|
// If no workspace settings or no sidebars defined for current workspace, show all.
|
|
3235
3312
|
if (workspaceAllowedSidebarIds.length === 0) {
|
|
@@ -3377,7 +3454,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3377
3454
|
}
|
|
3378
3455
|
// Fallback: indexOf-based replacement/insertion for plain text fields
|
|
3379
3456
|
const { fieldId, item } = focusedField;
|
|
3380
|
-
const modifiedField = fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
|
|
3457
|
+
const modifiedField = getActiveSlotContext()?.fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
|
|
3381
3458
|
const currentValue = modifiedField
|
|
3382
3459
|
? modifiedField.value || ""
|
|
3383
3460
|
: (await itemsRepository.getField(focusedField))?.value ||
|
|
@@ -3416,7 +3493,13 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3416
3493
|
catch (error) {
|
|
3417
3494
|
console.error("Failed to replace/insert text:", error);
|
|
3418
3495
|
}
|
|
3419
|
-
}, [
|
|
3496
|
+
}, [
|
|
3497
|
+
selectedRange,
|
|
3498
|
+
focusedField,
|
|
3499
|
+
itemsRepository,
|
|
3500
|
+
operations,
|
|
3501
|
+
getActiveSlotContext,
|
|
3502
|
+
]);
|
|
3420
3503
|
// Insert text at cursor position (for when there's no selection)
|
|
3421
3504
|
const insertTextAtCursor = useCallback(async (newText) => {
|
|
3422
3505
|
if (!focusedField)
|
|
@@ -3457,7 +3540,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3457
3540
|
}
|
|
3458
3541
|
// Fallback: use field value length (append)
|
|
3459
3542
|
const { fieldId, item } = focusedField;
|
|
3460
|
-
const modifiedField = fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
|
|
3543
|
+
const modifiedField = getActiveSlotContext()?.fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
|
|
3461
3544
|
const currentValue = modifiedField
|
|
3462
3545
|
? modifiedField.value || ""
|
|
3463
3546
|
: (await itemsRepository.getField(focusedField))?.value ||
|
|
@@ -3476,7 +3559,13 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3476
3559
|
catch (error) {
|
|
3477
3560
|
console.error("Failed to insert text at cursor:", error);
|
|
3478
3561
|
}
|
|
3479
|
-
}, [
|
|
3562
|
+
}, [
|
|
3563
|
+
focusedField,
|
|
3564
|
+
selectedRange,
|
|
3565
|
+
itemsRepository,
|
|
3566
|
+
operations,
|
|
3567
|
+
getActiveSlotContext,
|
|
3568
|
+
]);
|
|
3480
3569
|
// Cleanup pending debounced operations on unmount to prevent stuck "saving" states
|
|
3481
3570
|
useEffect(() => {
|
|
3482
3571
|
return () => {
|
|
@@ -4377,6 +4466,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4377
4466
|
unregisterSlotContext,
|
|
4378
4467
|
getActiveSlotContext,
|
|
4379
4468
|
getActiveSlotId,
|
|
4469
|
+
getFieldModificationStoreForSlot,
|
|
4380
4470
|
closeEditorSlot,
|
|
4381
4471
|
setActiveSlot,
|
|
4382
4472
|
revision,
|
|
@@ -4645,6 +4735,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4645
4735
|
showAgentsPanel,
|
|
4646
4736
|
handleSetShowAgentsPanel,
|
|
4647
4737
|
activeSlotId,
|
|
4738
|
+
editorSlots,
|
|
4739
|
+
slotContexts,
|
|
4740
|
+
getFieldModificationStoreForSlot,
|
|
4648
4741
|
isEditorFormHiddenForSlot,
|
|
4649
4742
|
setEditorFormHiddenForSlot,
|
|
4650
4743
|
editorFormHintSeen,
|
|
@@ -4681,9 +4774,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4681
4774
|
const fieldsEditContext = {
|
|
4682
4775
|
modifiedFields,
|
|
4683
4776
|
recentEdits,
|
|
4684
|
-
clearModifiedFields: () => {
|
|
4685
|
-
fieldModificationStore.clear();
|
|
4686
|
-
},
|
|
4687
4777
|
clearRecentEdits: () => {
|
|
4688
4778
|
setRecentEdits([]);
|
|
4689
4779
|
},
|
|
@@ -4932,9 +5022,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4932
5022
|
selection,
|
|
4933
5023
|
workspaceId,
|
|
4934
5024
|
]);
|
|
4935
|
-
useEffect(() => {
|
|
4936
|
-
fieldsEditContext.clearModifiedFields();
|
|
4937
|
-
}, [currentItemDescriptor]);
|
|
4938
5025
|
if (!currentWorkspace)
|
|
4939
5026
|
return null;
|
|
4940
5027
|
const editorUi = fullscreen ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "fixed inset-0 flex", children: [_jsx(PageViewerFrame, { compareView: compareMode, pageViewContext: activePageViewContext }), _jsx(FullscreenControls, { device: activePageViewContext.device, setDevice: (d) => activePageViewContext.setDevice(d), canExit: !configuration.forceFullscreen, onExit: () => setFullscreen(false), firstMobileDeviceName: configuration.devices[0]?.name })] }), showFullscreenHint && !configuration.forceFullscreen && !isMobile && (_jsx("div", { className: "fixed inset-0 z-10000", onMouseMoveCapture: () => {
|
|
@@ -4953,8 +5040,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4953
5040
|
: window.location.pathname;
|
|
4954
5041
|
window.history.replaceState(getCurrentHistoryState(), "", newUrl);
|
|
4955
5042
|
}, configuration: configuration, restoredFromUrl: tourRestoredRef.current })), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(GuidanceOverlay, {}) }), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(AgentDialogHandler, {}) })] }));
|
|
4956
|
-
return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && (_jsx(
|
|
4957
|
-
currentWorkspace.id === "taskboard"
|
|
5043
|
+
return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && (_jsx(EditorLoadingOverlay, {})), editContext.isRefreshing && (_jsx("div", { className: "pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center text-gray-600 opacity-50 select-none", children: _jsx(Spinner, {}) })), (currentWorkspace.id === "agents" ||
|
|
5044
|
+
currentWorkspace.id === "taskboard" ||
|
|
5045
|
+
currentWorkspace.id === "translation-management") &&
|
|
4958
5046
|
showAgentsWorkspaceEditor && (_jsx(AgentsSlotContextBridgeHost, { slots: editorSlots })), startupChecks.state !== "loading" && (children || editorUi), startupChecks.state !== "loading" && dialog, _jsx(Toaster, { position: "top-center" }), " ", _jsx(ConfirmationDialog, { ref: confirmationDialogRef }), _jsx(ConcurrentUserLimitDialog, { open: concurrentUserLimitError !== null, onOpenChange: (open) => {
|
|
4959
5047
|
if (!open) {
|
|
4960
5048
|
setConcurrentUserLimitError(null);
|