@lobehub/lobehub 2.0.0-next.96 → 2.0.0-next.98
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/.console-log-whitelist.json +14 -0
- package/.github/workflows/check-console-log.yml +117 -0
- package/.github/workflows/desktop-pr-build.yml +4 -4
- package/.github/workflows/release-desktop-beta.yml +4 -4
- package/.github/workflows/release.yml +1 -1
- package/.github/workflows/test.yml +5 -5
- package/CHANGELOG.md +66 -0
- package/apps/desktop/src/preload/index.ts +2 -2
- package/apps/desktop/src/preload/invoke.ts +1 -1
- package/apps/desktop/src/preload/routeInterceptor.ts +41 -41
- package/changelog/v1.json +21 -0
- package/docs/development/database-schema.dbml +1 -0
- package/e2e/package.json +1 -1
- package/locales/ar/file.json +9 -11
- package/locales/ar/models.json +6 -0
- package/locales/bg-BG/file.json +8 -10
- package/locales/bg-BG/models.json +6 -0
- package/locales/de-DE/file.json +9 -11
- package/locales/de-DE/models.json +6 -0
- package/locales/en-US/file.json +12 -14
- package/locales/en-US/models.json +6 -0
- package/locales/es-ES/file.json +7 -9
- package/locales/es-ES/models.json +6 -0
- package/locales/fa-IR/file.json +9 -11
- package/locales/fa-IR/models.json +6 -0
- package/locales/fr-FR/file.json +6 -8
- package/locales/fr-FR/models.json +6 -0
- package/locales/it-IT/file.json +8 -10
- package/locales/it-IT/models.json +6 -0
- package/locales/ja-JP/file.json +10 -12
- package/locales/ja-JP/models.json +6 -0
- package/locales/ko-KR/file.json +8 -10
- package/locales/ko-KR/models.json +6 -0
- package/locales/nl-NL/file.json +8 -10
- package/locales/nl-NL/models.json +6 -0
- package/locales/pl-PL/file.json +7 -9
- package/locales/pl-PL/models.json +6 -0
- package/locales/pt-BR/file.json +7 -9
- package/locales/pt-BR/models.json +6 -0
- package/locales/ru-RU/file.json +9 -11
- package/locales/ru-RU/models.json +6 -0
- package/locales/tr-TR/file.json +8 -10
- package/locales/tr-TR/models.json +6 -0
- package/locales/vi-VN/file.json +9 -11
- package/locales/vi-VN/models.json +6 -0
- package/locales/zh-CN/file.json +10 -12
- package/locales/zh-CN/models.json +6 -0
- package/locales/zh-TW/file.json +10 -12
- package/locales/zh-TW/models.json +6 -0
- package/package.json +3 -2
- package/packages/database/migrations/0047_add_slug_document.sql +6 -0
- package/packages/database/migrations/meta/0047_snapshot.json +7891 -0
- package/packages/database/migrations/meta/_journal.json +7 -0
- package/packages/database/src/client/db.ts +12 -12
- package/packages/database/src/core/migrations.json +16 -7
- package/packages/database/src/models/document.ts +2 -2
- package/packages/database/src/repositories/dataImporter/index.ts +10 -10
- package/packages/database/src/schemas/file.ts +7 -1
- package/packages/database/src/schemas/topic.ts +1 -1
- package/packages/database/src/server/models/ragEval/evaluation.ts +1 -1
- package/packages/model-bank/src/aiModels/qwen.ts +5 -3
- package/packages/model-runtime/src/core/openaiCompatibleFactory/index.ts +21 -21
- package/packages/obervability-otel/package.json +2 -2
- package/scripts/checkConsoleLog.mts +148 -0
- package/scripts/prebuild.mts +5 -5
- package/src/app/[variants]/(main)/changelog/index.tsx +1 -1
- package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/ClassicChat.tsx +1 -1
- package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/GroupChat.tsx +1 -1
- package/src/app/[variants]/(main)/chat/components/conversation/features/ChatList/ChatItem/index.tsx +1 -1
- package/src/app/[variants]/(main)/chat/components/conversation/features/ChatList/Content.tsx +2 -2
- package/src/app/[variants]/(main)/chat/components/conversation/features/ChatList/index.tsx +1 -1
- package/src/app/[variants]/(main)/chat/components/conversation/features/ChatMinimap/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +20 -16
- package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +6 -3
- package/src/app/[variants]/(main)/settings/provider/(list)/index.tsx +3 -2
- package/src/app/[variants]/(main)/settings/provider/detail/index.tsx +14 -4
- package/src/app/[variants]/desktopRouter.config.tsx +23 -0
- package/src/app/[variants]/mobileRouter.config.tsx +23 -0
- package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +1 -1
- package/src/components/InvalidAPIKey/APIKeyForm/ComfyUIForm.tsx +1 -1
- package/src/components/InvalidAPIKey/APIKeyForm/ProviderApiKeyForm.tsx +1 -1
- package/src/components/InvalidAPIKey/APIKeyForm/__tests__/ComfyUIForm.test.tsx +1 -1
- package/src/components/InvalidAPIKey/index.tsx +1 -1
- package/src/features/{Conversation → ChatList}/MarkdownElements/remarkPlugins/getNodeContent.test.ts +1 -2
- package/src/features/{Conversation → ChatList}/Messages/Assistant/Actions/index.tsx +2 -2
- package/src/features/{Conversation → ChatList}/Messages/Assistant/Extra/index.test.tsx +3 -3
- package/src/features/{Conversation → ChatList}/Messages/Assistant/Extra/index.tsx +6 -5
- package/src/features/{Conversation → ChatList}/Messages/Assistant/MessageContent.tsx +1 -1
- package/src/features/{Conversation → ChatList}/Messages/Group/Actions/WithContentId.tsx +2 -2
- package/src/features/{Conversation → ChatList}/Messages/Group/ContentBlock.tsx +2 -2
- package/src/features/{Conversation → ChatList}/Messages/Group/Error/index.tsx +2 -1
- package/src/features/{Conversation → ChatList}/Messages/Group/Group.tsx +1 -1
- package/src/features/{Conversation → ChatList}/Messages/Group/GroupItem.tsx +3 -2
- package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Intervention/ApprovalActions.tsx +1 -1
- package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/index.tsx +1 -2
- package/src/features/{Conversation → ChatList}/Messages/Group/index.tsx +1 -1
- package/src/features/{Conversation → ChatList}/Messages/User/Extra.tsx +3 -3
- package/src/features/{Conversation → ChatList}/Messages/User/index.tsx +1 -1
- package/src/features/{Conversation → ChatList}/Messages/index.tsx +1 -1
- package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareImage/Preview.tsx +1 -1
- package/src/features/{Conversation → ChatList}/components/SkeletonList.tsx +1 -1
- package/src/features/{Conversation → ChatList}/components/VirtualizedList/index.tsx +1 -1
- package/src/features/KnowledgeManager/DocumentExplorer/NoteEditorModal.tsx +0 -20
- package/src/features/KnowledgeManager/DocumentExplorer/index.tsx +3 -3
- package/src/features/KnowledgeManager/FileExplorer/MasonryFileItem/index.tsx +0 -20
- package/src/features/KnowledgeManager/Header/AddButton.tsx +0 -1
- package/src/features/KnowledgeManager/Header/NewNoteButton.tsx +1 -1
- package/src/features/KnowledgeManager/Header/TogglePanelButton.tsx +2 -2
- package/src/features/KnowledgeManager/Home/UploadEntries.tsx +2 -2
- package/src/features/KnowledgeManager/Home/index.tsx +4 -4
- package/src/features/OllamaSetupGuide/index.tsx +1 -1
- package/src/features/PluginsUI/Render/MCPType/index.tsx +1 -1
- package/src/features/Portal/GroupThread/Body/ThreadChatItem.tsx +1 -1
- package/src/features/Portal/GroupThread/Body/ThreadChatList.tsx +1 -1
- package/src/features/Portal/Thread/Chat/ChatInput/index.tsx +1 -1
- package/src/features/Portal/Thread/Chat/ChatItem.tsx +1 -1
- package/src/features/Portal/Thread/Chat/ChatList.tsx +1 -1
- package/src/features/Portal/Thread/Chat/index.tsx +1 -1
- package/src/features/ShareModal/ShareImage/ChatList/index.tsx +1 -1
- package/src/features/User/UserPanel/useMenu.tsx +7 -3
- package/src/locales/default/file.ts +11 -13
- package/src/services/debug.ts +4 -4
- package/src/services/electron/remoteServer.ts +5 -5
- package/src/services/electron/settings.ts +6 -6
- package/src/services/mcp.ts +18 -18
- package/src/services/models.ts +20 -20
- package/src/store/chat/agents/__tests__/createAgentExecutors/helpers/testExecutor.ts +1 -4
- /package/src/features/{Conversation → ChatList}/Error/AccessCodeForm.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/ChatInvalidApiKey.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/ClerkLogin/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/ErrorJsonViewer.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/OAuthForm.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/OllamaBizError/InvalidOllamaModel.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/OllamaBizError/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Error/style.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LobeArtifact/Render/Icon.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LobeArtifact/Render/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LobeArtifact/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LobeArtifact/rehypePlugin.test.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LobeArtifact/rehypePlugin.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LobeThinking/Render.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LobeThinking/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LocalFile/Render/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/LocalFile/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/Mention/Render.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/Mention/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/Thinking/Render.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/Thinking/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/remarkPlugins/__snapshots__/createRemarkSelfClosingTagPlugin.test.ts.snap +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/remarkPlugins/createRemarkCustomTagPlugin.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/remarkPlugins/createRemarkCustomTagWithAttributesPlugin.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/remarkPlugins/createRemarkSelfClosingTagPlugin.test.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/remarkPlugins/createRemarkSelfClosingTagPlugin.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/remarkPlugins/getNodeContent.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/type.ts +0 -0
- /package/src/features/{Conversation → ChatList}/MarkdownElements/utils.ts +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/Actions/Error.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/CollapsedMessage.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/FileChunks/Item/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/FileChunks/Item/style.ts +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/FileChunks/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/IntentUnderstanding.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/Reasoning/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/SearchGrounding.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Assistant/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Default.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Actions/WithoutContentId.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Actions/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/CollapsedMessage.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/EditState.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/GroupContext.ts +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/MessageContent.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/BuiltinPluginTitle.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/Debug.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/PluginResult.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/PluginState.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/Settings.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/StatusIndicator.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/ToolTitle.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Inspector/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/AbortResponse.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Arguments/ObjectEntity.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Arguments/ValueCell.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Arguments/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/CustomRender.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/ErrorResponse.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Intervention/Fallback.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Intervention/KeyValueEditor.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Intervention/ModeSelector.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/Intervention/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/LoadingPlaceholder/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/PluginSettings.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/Render/RejectedResponse.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tool/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Group/Tools.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Supervisor/TodoList.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Supervisor/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Inspector/BuiltinPluginTitle.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Inspector/Debug.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Inspector/PluginResult.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Inspector/PluginState.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Inspector/Settings.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Inspector/ToolTitle.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Inspector/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/Arguments/ObjectEntity.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/Arguments/ValueCell.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/Arguments/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/CustomRender.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/ErrorResponse.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/KeyValueEditor.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/PluginSettings.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/Render/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/ToolItem.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/Tool/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/Actions/ActionsBar.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/Actions/MessageBranch.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/Actions/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/BelowMessage.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/FileListViewer/Item.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/FileListViewer/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/ImageFileListViewer.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/MarkdownRender/ContentPreview.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/MarkdownRender/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/MessageContent.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/Messages/User/VideoFileListViewer.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/AutoScroll.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/BackBottom/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/BackBottom/style.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ChatItem/ShareMessageModal/SharePdf/PdfPreview.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/ChatItem/ShareMessageModal/SharePdf/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/ChatItem/ShareMessageModal/SharePdf/style.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ChatItem/ShareMessageModal/SharePdf/template.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ChatItem/ShareMessageModal/SharePdf/usePdfGeneration.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/ExtraContainer.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/TTS/FilePlayer.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/TTS/InitPlayer.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/TTS/Player.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/TTS/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Translate.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/UsageDetail/AnimatedNumber.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/UsageDetail/ModelCard.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/UsageDetail/TokenProgress.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/UsageDetail/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/UsageDetail/pricing.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/UsageDetail/tokens.test.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/UsageDetail/tokens.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/Extras/Usage/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/History/HistoryDivider.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/History/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/OTPInput.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareImage/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareImage/style.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareImage/type.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareText/Preview.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareText/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareText/template.test.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareText/template.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/ShareText/type.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/ShareMessageModal/style.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/ThreadDivider/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/components/VirtualizedList/VirtuosoContext.ts +0 -0
- /package/src/features/{Conversation → ChatList}/components/WideScreenContainer/index.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/context/InPortalThreadContext.ts +0 -0
- /package/src/features/{Conversation → ChatList}/hooks/useChatListActionsBar.tsx +0 -0
- /package/src/features/{Conversation → ChatList}/hooks/useDoubleClickEdit.ts +0 -0
- /package/src/features/{Conversation → ChatList}/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/types/index.ts +0 -0
- /package/src/features/{Conversation → ChatList}/utils/markdown.test.ts +0 -0
- /package/src/features/{Conversation → ChatList}/utils/markdown.ts +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
name: Check Console Log (Warning)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
- next
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pull-requests: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
check-console-log:
|
|
15
|
+
name: Check for console.log statements (non-blocking)
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v5
|
|
20
|
+
|
|
21
|
+
- name: Install bun
|
|
22
|
+
uses: oven-sh/setup-bun@v2
|
|
23
|
+
|
|
24
|
+
- name: Run console.log check
|
|
25
|
+
id: check
|
|
26
|
+
run: |
|
|
27
|
+
OUTPUT=$(bunx tsx scripts/checkConsoleLog.mts 2>&1)
|
|
28
|
+
echo "$OUTPUT"
|
|
29
|
+
|
|
30
|
+
# Save output to file for later use
|
|
31
|
+
echo "$OUTPUT" > /tmp/console-log-output.txt
|
|
32
|
+
|
|
33
|
+
# Check if violations were found
|
|
34
|
+
if echo "$OUTPUT" | grep -q "Total violations:"; then
|
|
35
|
+
echo "has_violations=true" >> $GITHUB_OUTPUT
|
|
36
|
+
TOTAL=$(echo "$OUTPUT" | grep -oP "Total violations: \K\d+")
|
|
37
|
+
echo "total=$TOTAL" >> $GITHUB_OUTPUT
|
|
38
|
+
else
|
|
39
|
+
echo "has_violations=false" >> $GITHUB_OUTPUT
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
- name: Comment on PR
|
|
43
|
+
if: steps.check.outputs.has_violations == 'true'
|
|
44
|
+
uses: actions/github-script@v7
|
|
45
|
+
env:
|
|
46
|
+
VIOLATION_COUNT: ${{ steps.check.outputs.total }}
|
|
47
|
+
with:
|
|
48
|
+
script: |
|
|
49
|
+
const fs = require('fs');
|
|
50
|
+
const output = fs.readFileSync('/tmp/console-log-output.txt', 'utf8');
|
|
51
|
+
const total = process.env.VIOLATION_COUNT || '0';
|
|
52
|
+
|
|
53
|
+
// Parse violations from output (format: " file:line" followed by " content")
|
|
54
|
+
const lines = output.split('\n');
|
|
55
|
+
const violations = [];
|
|
56
|
+
for (let i = 0; i < lines.length; i++) {
|
|
57
|
+
const line = lines[i];
|
|
58
|
+
// Match lines like " packages/database/src/client/db.ts:258"
|
|
59
|
+
const fileMatch = line.match(/^\s{2}(\S+:\d+)\s*$/);
|
|
60
|
+
if (fileMatch) {
|
|
61
|
+
const file = fileMatch[1];
|
|
62
|
+
const content = lines[i + 1]?.trim() || '';
|
|
63
|
+
violations.push({ file, content });
|
|
64
|
+
i++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Build comment body
|
|
69
|
+
const maxDisplay = 30;
|
|
70
|
+
let body = `## ⚠️ Console.log Check Warning\n\n`;
|
|
71
|
+
body += `Found **${total}** \`console.log\` statement(s) in this PR.\n\n`;
|
|
72
|
+
|
|
73
|
+
if (violations.length > 0) {
|
|
74
|
+
body += `<details>\n<summary>📋 Click to see violations (${Math.min(violations.length, maxDisplay)} of ${total} shown)</summary>\n\n`;
|
|
75
|
+
body += `| File | Code |\n|------|------|\n`;
|
|
76
|
+
violations.slice(0, maxDisplay).forEach(v => {
|
|
77
|
+
const escapedContent = v.content
|
|
78
|
+
.substring(0, 60)
|
|
79
|
+
.replace(/\|/g, '\\|')
|
|
80
|
+
.replace(/`/g, "'");
|
|
81
|
+
body += `| \`${v.file}\` | \`${escapedContent}${v.content.length > 60 ? '...' : ''}\` |\n`;
|
|
82
|
+
});
|
|
83
|
+
if (parseInt(total) > maxDisplay) {
|
|
84
|
+
body += `\n*...and ${parseInt(total) - maxDisplay} more violations*\n`;
|
|
85
|
+
}
|
|
86
|
+
body += `\n</details>\n\n`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
body += `> 💡 **Tip:** Remove \`console.log\` or add files to \`.console-log-whitelist.json\`\n`;
|
|
90
|
+
body += `> ✅ This check is **non-blocking** and won't prevent merging.`;
|
|
91
|
+
|
|
92
|
+
// Find existing comment to update instead of creating duplicates
|
|
93
|
+
const { data: comments } = await github.rest.issues.listComments({
|
|
94
|
+
owner: context.repo.owner,
|
|
95
|
+
repo: context.repo.repo,
|
|
96
|
+
issue_number: context.issue.number,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const botComment = comments.find(c =>
|
|
100
|
+
c.user.type === 'Bot' && c.body.includes('Console.log Check Warning')
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
if (botComment) {
|
|
104
|
+
await github.rest.issues.updateComment({
|
|
105
|
+
owner: context.repo.owner,
|
|
106
|
+
repo: context.repo.repo,
|
|
107
|
+
comment_id: botComment.id,
|
|
108
|
+
body,
|
|
109
|
+
});
|
|
110
|
+
} else {
|
|
111
|
+
await github.rest.issues.createComment({
|
|
112
|
+
owner: context.repo.owner,
|
|
113
|
+
repo: context.repo.repo,
|
|
114
|
+
issue_number: context.issue.number,
|
|
115
|
+
body,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
- name: Setup Node.js
|
|
33
33
|
uses: actions/setup-node@v6
|
|
34
34
|
with:
|
|
35
|
-
node-version: 24
|
|
35
|
+
node-version: 24.11.1
|
|
36
36
|
package-manager-cache: false
|
|
37
37
|
|
|
38
38
|
- name: Install bun
|
|
@@ -66,7 +66,7 @@ jobs:
|
|
|
66
66
|
- name: Setup Node.js
|
|
67
67
|
uses: actions/setup-node@v6
|
|
68
68
|
with:
|
|
69
|
-
node-version: 24
|
|
69
|
+
node-version: 24.11.1
|
|
70
70
|
package-manager-cache: false
|
|
71
71
|
|
|
72
72
|
# 主要逻辑:确定构建版本号
|
|
@@ -111,7 +111,7 @@ jobs:
|
|
|
111
111
|
- name: Setup Node.js
|
|
112
112
|
uses: actions/setup-node@v6
|
|
113
113
|
with:
|
|
114
|
-
node-version: 24
|
|
114
|
+
node-version: 24.11.1
|
|
115
115
|
package-manager-cache: false
|
|
116
116
|
|
|
117
117
|
# node-linker=hoisted 模式将可以确保 asar 压缩可用
|
|
@@ -232,7 +232,7 @@ jobs:
|
|
|
232
232
|
- name: Setup Node.js
|
|
233
233
|
uses: actions/setup-node@v6
|
|
234
234
|
with:
|
|
235
|
-
node-version: 24
|
|
235
|
+
node-version: 24.11.1
|
|
236
236
|
package-manager-cache: false
|
|
237
237
|
|
|
238
238
|
- name: Install bun
|
|
@@ -26,7 +26,7 @@ jobs:
|
|
|
26
26
|
- name: Setup Node.js
|
|
27
27
|
uses: actions/setup-node@v6
|
|
28
28
|
with:
|
|
29
|
-
node-version: 24
|
|
29
|
+
node-version: 24.11.1
|
|
30
30
|
package-manager-cache: false
|
|
31
31
|
|
|
32
32
|
- name: Install bun
|
|
@@ -55,7 +55,7 @@ jobs:
|
|
|
55
55
|
- name: Setup Node.js
|
|
56
56
|
uses: actions/setup-node@v6
|
|
57
57
|
with:
|
|
58
|
-
node-version: 24
|
|
58
|
+
node-version: 24.11.1
|
|
59
59
|
package-manager-cache: false
|
|
60
60
|
|
|
61
61
|
# 主要逻辑:确定构建版本号
|
|
@@ -96,7 +96,7 @@ jobs:
|
|
|
96
96
|
- name: Setup Node.js
|
|
97
97
|
uses: actions/setup-node@v6
|
|
98
98
|
with:
|
|
99
|
-
node-version: 24
|
|
99
|
+
node-version: 24.11.1
|
|
100
100
|
package-manager-cache: false
|
|
101
101
|
|
|
102
102
|
# node-linker=hoisted 模式将可以确保 asar 压缩可用
|
|
@@ -210,7 +210,7 @@ jobs:
|
|
|
210
210
|
- name: Setup Node.js
|
|
211
211
|
uses: actions/setup-node@v6
|
|
212
212
|
with:
|
|
213
|
-
node-version: 24
|
|
213
|
+
node-version: 24.11.1
|
|
214
214
|
package-manager-cache: false
|
|
215
215
|
|
|
216
216
|
- name: Install bun
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
- name: Setup Node.js
|
|
32
32
|
uses: actions/setup-node@v6
|
|
33
33
|
with:
|
|
34
|
-
node-version: 24
|
|
34
|
+
node-version: 24.11.1
|
|
35
35
|
package-manager-cache: false
|
|
36
36
|
|
|
37
37
|
- name: Install bun
|
|
@@ -66,7 +66,7 @@ jobs:
|
|
|
66
66
|
- name: Setup Node.js
|
|
67
67
|
uses: actions/setup-node@v6
|
|
68
68
|
with:
|
|
69
|
-
node-version: 24
|
|
69
|
+
node-version: 24.11.1
|
|
70
70
|
package-manager-cache: false
|
|
71
71
|
|
|
72
72
|
- name: Install bun
|
|
@@ -99,7 +99,7 @@ jobs:
|
|
|
99
99
|
- name: Setup Node.js
|
|
100
100
|
uses: actions/setup-node@v6
|
|
101
101
|
with:
|
|
102
|
-
node-version: 24
|
|
102
|
+
node-version: 24.11.1
|
|
103
103
|
package-manager-cache: false
|
|
104
104
|
|
|
105
105
|
- name: Install bun
|
|
@@ -131,7 +131,7 @@ jobs:
|
|
|
131
131
|
- name: Setup Node.js
|
|
132
132
|
uses: actions/setup-node@v6
|
|
133
133
|
with:
|
|
134
|
-
node-version: 24
|
|
134
|
+
node-version: 24.11.1
|
|
135
135
|
package-manager-cache: false
|
|
136
136
|
|
|
137
137
|
- name: Setup pnpm
|
|
@@ -179,7 +179,7 @@ jobs:
|
|
|
179
179
|
- name: Setup Node.js
|
|
180
180
|
uses: actions/setup-node@v6
|
|
181
181
|
with:
|
|
182
|
-
node-version: 24
|
|
182
|
+
node-version: 24.11.1
|
|
183
183
|
package-manager-cache: false
|
|
184
184
|
|
|
185
185
|
- name: Install pnpm
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,72 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
## [Version 2.0.0-next.98](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.97...v2.0.0-next.98)
|
|
6
|
+
|
|
7
|
+
<sup>Released on **2025-11-21**</sup>
|
|
8
|
+
|
|
9
|
+
#### 🐛 Bug Fixes
|
|
10
|
+
|
|
11
|
+
- **misc**: Fixed changelog pages and open again.
|
|
12
|
+
|
|
13
|
+
#### 💄 Styles
|
|
14
|
+
|
|
15
|
+
- **misc**: Fix some translations.
|
|
16
|
+
|
|
17
|
+
<br/>
|
|
18
|
+
|
|
19
|
+
<details>
|
|
20
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
21
|
+
|
|
22
|
+
#### What's fixed
|
|
23
|
+
|
|
24
|
+
- **misc**: Fixed changelog pages and open again, closes [#10285](https://github.com/lobehub/lobe-chat/issues/10285) ([871d141](https://github.com/lobehub/lobe-chat/commit/871d141))
|
|
25
|
+
|
|
26
|
+
#### Styles
|
|
27
|
+
|
|
28
|
+
- **misc**: Fix some translations, closes [#10343](https://github.com/lobehub/lobe-chat/issues/10343) ([ed193e0](https://github.com/lobehub/lobe-chat/commit/ed193e0))
|
|
29
|
+
|
|
30
|
+
</details>
|
|
31
|
+
|
|
32
|
+
<div align="right">
|
|
33
|
+
|
|
34
|
+
[](#readme-top)
|
|
35
|
+
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
## [Version 2.0.0-next.97](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.96...v2.0.0-next.97)
|
|
39
|
+
|
|
40
|
+
<sup>Released on **2025-11-21**</sup>
|
|
41
|
+
|
|
42
|
+
#### ♻ Code Refactoring
|
|
43
|
+
|
|
44
|
+
- **misc**: Refactor Conversation to ChatList.
|
|
45
|
+
|
|
46
|
+
#### 💄 Styles
|
|
47
|
+
|
|
48
|
+
- **misc**: Update i18n.
|
|
49
|
+
|
|
50
|
+
<br/>
|
|
51
|
+
|
|
52
|
+
<details>
|
|
53
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
54
|
+
|
|
55
|
+
#### Code refactoring
|
|
56
|
+
|
|
57
|
+
- **misc**: Refactor Conversation to ChatList, closes [#10330](https://github.com/lobehub/lobe-chat/issues/10330) ([bca70e2](https://github.com/lobehub/lobe-chat/commit/bca70e2))
|
|
58
|
+
|
|
59
|
+
#### Styles
|
|
60
|
+
|
|
61
|
+
- **misc**: Update i18n, closes [#10338](https://github.com/lobehub/lobe-chat/issues/10338) ([9c8cf81](https://github.com/lobehub/lobe-chat/commit/9c8cf81))
|
|
62
|
+
|
|
63
|
+
</details>
|
|
64
|
+
|
|
65
|
+
<div align="right">
|
|
66
|
+
|
|
67
|
+
[](#readme-top)
|
|
68
|
+
|
|
69
|
+
</div>
|
|
70
|
+
|
|
5
71
|
## [Version 2.0.0-next.96](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.95...v2.0.0-next.96)
|
|
6
72
|
|
|
7
73
|
<sup>Released on **2025-11-20**</sup>
|
|
@@ -4,9 +4,9 @@ import { setupRouteInterceptors } from './routeInterceptor';
|
|
|
4
4
|
const setupPreload = () => {
|
|
5
5
|
setupElectronApi();
|
|
6
6
|
|
|
7
|
-
//
|
|
7
|
+
// Setup route interception logic
|
|
8
8
|
window.addEventListener('DOMContentLoaded', () => {
|
|
9
|
-
//
|
|
9
|
+
// Setup client-side route interceptor
|
|
10
10
|
setupRouteInterceptors();
|
|
11
11
|
});
|
|
12
12
|
};
|
|
@@ -2,7 +2,7 @@ import { ClientDispatchEventKey, DispatchInvoke } from '@lobechat/electron-clien
|
|
|
2
2
|
import { ipcRenderer } from 'electron';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Client-side method to invoke electron main process
|
|
6
6
|
*/
|
|
7
7
|
export const invoke: DispatchInvoke = async <T extends ClientDispatchEventKey>(
|
|
8
8
|
event: T,
|
|
@@ -9,7 +9,7 @@ const interceptRoute = async (
|
|
|
9
9
|
) => {
|
|
10
10
|
console.log(`[preload] Intercepted ${source} and prevented default behavior:`, path);
|
|
11
11
|
|
|
12
|
-
//
|
|
12
|
+
// Use electron-client-ipc's dispatch method
|
|
13
13
|
try {
|
|
14
14
|
await invoke('interceptRoute', { path, source, url });
|
|
15
15
|
} catch (e) {
|
|
@@ -17,15 +17,15 @@ const interceptRoute = async (
|
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* Route interceptor - Responsible for capturing and intercepting client-side route navigation
|
|
21
21
|
*/
|
|
22
22
|
export const setupRouteInterceptors = function () {
|
|
23
23
|
console.log('[preload] Setting up route interceptors');
|
|
24
24
|
|
|
25
|
-
//
|
|
25
|
+
// Store prevented paths to avoid pushState duplicate triggers
|
|
26
26
|
const preventedPaths = new Set<string>();
|
|
27
27
|
|
|
28
|
-
//
|
|
28
|
+
// Override window.open method to intercept JavaScript calls
|
|
29
29
|
const originalWindowOpen = window.open;
|
|
30
30
|
window.open = function (url?: string | URL, target?: string, features?: string) {
|
|
31
31
|
if (url) {
|
|
@@ -33,15 +33,15 @@ export const setupRouteInterceptors = function () {
|
|
|
33
33
|
const urlString = typeof url === 'string' ? url : url.toString();
|
|
34
34
|
const urlObj = new URL(urlString, window.location.href);
|
|
35
35
|
|
|
36
|
-
//
|
|
36
|
+
// Check if it's an external link
|
|
37
37
|
if (urlObj.origin !== window.location.origin) {
|
|
38
38
|
console.log(`[preload] Intercepted window.open for external URL:`, urlString);
|
|
39
|
-
//
|
|
39
|
+
// Call main process to handle external link
|
|
40
40
|
invoke('openExternalLink', urlString);
|
|
41
|
-
return null; //
|
|
41
|
+
return null; // Return null to indicate no window was opened
|
|
42
42
|
}
|
|
43
43
|
} catch (error) {
|
|
44
|
-
//
|
|
44
|
+
// Handle invalid URL or special protocol
|
|
45
45
|
console.error(`[preload] Intercepted window.open for special protocol:`, url);
|
|
46
46
|
console.error(error);
|
|
47
47
|
invoke('openExternalLink', typeof url === 'string' ? url : url.toString());
|
|
@@ -49,11 +49,11 @@ export const setupRouteInterceptors = function () {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
//
|
|
52
|
+
// For internal links, call original window.open
|
|
53
53
|
return originalWindowOpen.call(window, url, target, features);
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
-
//
|
|
56
|
+
// Intercept all a tag click events - For Next.js Link component
|
|
57
57
|
document.addEventListener(
|
|
58
58
|
'click',
|
|
59
59
|
async (e) => {
|
|
@@ -62,30 +62,30 @@ export const setupRouteInterceptors = function () {
|
|
|
62
62
|
try {
|
|
63
63
|
const url = new URL(link.href);
|
|
64
64
|
|
|
65
|
-
//
|
|
65
|
+
// Check if it's an external link
|
|
66
66
|
if (url.origin !== window.location.origin) {
|
|
67
67
|
console.log(`[preload] Intercepted external link click:`, url.href);
|
|
68
|
-
//
|
|
68
|
+
// Prevent default link navigation behavior
|
|
69
69
|
e.preventDefault();
|
|
70
70
|
e.stopPropagation();
|
|
71
|
-
//
|
|
71
|
+
// Call main process to handle external link
|
|
72
72
|
await invoke('openExternalLink', url.href);
|
|
73
|
-
return false; //
|
|
73
|
+
return false; // Explicitly prevent subsequent processing
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
//
|
|
77
|
-
//
|
|
76
|
+
// If not external link, continue with internal route interception logic
|
|
77
|
+
// Use shared config to check if interception is needed
|
|
78
78
|
const matchedRoute = findMatchingRoute(url.pathname);
|
|
79
79
|
|
|
80
|
-
//
|
|
80
|
+
// If it's a path that needs interception
|
|
81
81
|
if (matchedRoute) {
|
|
82
82
|
const currentPath = window.location.pathname;
|
|
83
83
|
const isAlreadyInTargetPage = currentPath.startsWith(matchedRoute.pathPrefix);
|
|
84
84
|
|
|
85
|
-
//
|
|
85
|
+
// If already in target page, don't intercept, let default navigation continue
|
|
86
86
|
if (isAlreadyInTargetPage) return;
|
|
87
87
|
|
|
88
|
-
//
|
|
88
|
+
// Immediately prevent default behavior to avoid Next.js taking over routing
|
|
89
89
|
e.preventDefault();
|
|
90
90
|
e.stopPropagation();
|
|
91
91
|
|
|
@@ -94,15 +94,15 @@ export const setupRouteInterceptors = function () {
|
|
|
94
94
|
return false;
|
|
95
95
|
}
|
|
96
96
|
} catch (err) {
|
|
97
|
-
//
|
|
98
|
-
//
|
|
97
|
+
// Handle possible URL parsing errors or other issues
|
|
98
|
+
// For example mailto:, tel: protocols will cause new URL() to throw error
|
|
99
99
|
if (err instanceof TypeError && err.message.includes('Invalid URL')) {
|
|
100
100
|
console.log(
|
|
101
101
|
'[preload] Non-HTTP link clicked, allowing default browser behavior:',
|
|
102
102
|
link.href,
|
|
103
103
|
);
|
|
104
|
-
//
|
|
105
|
-
//
|
|
104
|
+
// For non-HTTP/HTTPS links, allow browser default handling
|
|
105
|
+
// No need for e.preventDefault() or invoke
|
|
106
106
|
} else {
|
|
107
107
|
console.error('[preload] Link interception error:', err);
|
|
108
108
|
}
|
|
@@ -112,28 +112,28 @@ export const setupRouteInterceptors = function () {
|
|
|
112
112
|
true,
|
|
113
113
|
);
|
|
114
114
|
|
|
115
|
-
//
|
|
115
|
+
// Intercept history API (for capturing Next.js useRouter().push/replace etc.)
|
|
116
116
|
const originalPushState = history.pushState;
|
|
117
117
|
const originalReplaceState = history.replaceState;
|
|
118
118
|
|
|
119
|
-
//
|
|
119
|
+
// Override pushState
|
|
120
120
|
history.pushState = function () {
|
|
121
121
|
const url = arguments[2];
|
|
122
122
|
if (typeof url === 'string') {
|
|
123
123
|
try {
|
|
124
|
-
//
|
|
124
|
+
// Only handle relative paths or current domain URLs
|
|
125
125
|
const parsedUrl = new URL(url, window.location.origin);
|
|
126
126
|
|
|
127
|
-
//
|
|
127
|
+
// Use shared config to check if interception is needed
|
|
128
128
|
const matchedRoute = findMatchingRoute(parsedUrl.pathname);
|
|
129
129
|
|
|
130
|
-
//
|
|
130
|
+
// Check if this navigation needs interception
|
|
131
131
|
if (matchedRoute) {
|
|
132
|
-
//
|
|
132
|
+
// Check if current page is already under target path, if so don't intercept
|
|
133
133
|
const currentPath = window.location.pathname;
|
|
134
134
|
const isAlreadyInTargetPage = currentPath.startsWith(matchedRoute.pathPrefix);
|
|
135
135
|
|
|
136
|
-
//
|
|
136
|
+
// If already in target page, don't intercept, let default navigation continue
|
|
137
137
|
if (isAlreadyInTargetPage) {
|
|
138
138
|
console.log(
|
|
139
139
|
`[preload] Skip pushState interception for ${parsedUrl.pathname} because already in target page ${matchedRoute.pathPrefix}`,
|
|
@@ -141,13 +141,13 @@ export const setupRouteInterceptors = function () {
|
|
|
141
141
|
return Reflect.apply(originalPushState, this, arguments);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
//
|
|
144
|
+
// Add this path to prevented set
|
|
145
145
|
preventedPaths.add(parsedUrl.pathname);
|
|
146
146
|
|
|
147
147
|
interceptRoute(parsedUrl.pathname, 'push-state', parsedUrl.href);
|
|
148
148
|
|
|
149
|
-
//
|
|
150
|
-
//
|
|
149
|
+
// Don't execute original pushState operation, prevent navigation
|
|
150
|
+
// But return undefined to avoid errors
|
|
151
151
|
return;
|
|
152
152
|
}
|
|
153
153
|
} catch (err) {
|
|
@@ -157,23 +157,23 @@ export const setupRouteInterceptors = function () {
|
|
|
157
157
|
return Reflect.apply(originalPushState, this, arguments);
|
|
158
158
|
};
|
|
159
159
|
|
|
160
|
-
//
|
|
160
|
+
// Override replaceState
|
|
161
161
|
history.replaceState = function () {
|
|
162
162
|
const url = arguments[2];
|
|
163
163
|
if (typeof url === 'string') {
|
|
164
164
|
try {
|
|
165
165
|
const parsedUrl = new URL(url, window.location.origin);
|
|
166
166
|
|
|
167
|
-
//
|
|
167
|
+
// Use shared config to check if interception is needed
|
|
168
168
|
const matchedRoute = findMatchingRoute(parsedUrl.pathname);
|
|
169
169
|
|
|
170
|
-
//
|
|
170
|
+
// Check if this navigation needs interception
|
|
171
171
|
if (matchedRoute) {
|
|
172
|
-
//
|
|
172
|
+
// Check if current page is already under target path, if so don't intercept
|
|
173
173
|
const currentPath = window.location.pathname;
|
|
174
174
|
const isAlreadyInTargetPage = currentPath.startsWith(matchedRoute.pathPrefix);
|
|
175
175
|
|
|
176
|
-
//
|
|
176
|
+
// If already in target page, don't intercept, let default navigation continue
|
|
177
177
|
if (isAlreadyInTargetPage) {
|
|
178
178
|
console.log(
|
|
179
179
|
`[preload] Skip replaceState interception for ${parsedUrl.pathname} because already in target page ${matchedRoute.pathPrefix}`,
|
|
@@ -181,12 +181,12 @@ export const setupRouteInterceptors = function () {
|
|
|
181
181
|
return Reflect.apply(originalReplaceState, this, arguments);
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
//
|
|
184
|
+
// Add to prevented set
|
|
185
185
|
preventedPaths.add(parsedUrl.pathname);
|
|
186
186
|
|
|
187
187
|
interceptRoute(parsedUrl.pathname, 'replace-state', parsedUrl.href);
|
|
188
188
|
|
|
189
|
-
//
|
|
189
|
+
// Prevent navigation
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
192
|
} catch (err) {
|
|
@@ -196,7 +196,7 @@ export const setupRouteInterceptors = function () {
|
|
|
196
196
|
return Reflect.apply(originalReplaceState, this, arguments);
|
|
197
197
|
};
|
|
198
198
|
|
|
199
|
-
//
|
|
199
|
+
// Listen and intercept routing errors - Sometimes Next.js tries to recover navigation on routing errors
|
|
200
200
|
window.addEventListener(
|
|
201
201
|
'error',
|
|
202
202
|
function (e) {
|
package/changelog/v1.json
CHANGED
|
@@ -1,4 +1,25 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"children": {
|
|
4
|
+
"fixes": [
|
|
5
|
+
"Fixed changelog pages and open again."
|
|
6
|
+
],
|
|
7
|
+
"improvements": [
|
|
8
|
+
"Fix some translations."
|
|
9
|
+
]
|
|
10
|
+
},
|
|
11
|
+
"date": "2025-11-21",
|
|
12
|
+
"version": "2.0.0-next.98"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"children": {
|
|
16
|
+
"improvements": [
|
|
17
|
+
"Update i18n."
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"date": "2025-11-21",
|
|
21
|
+
"version": "2.0.0-next.97"
|
|
22
|
+
},
|
|
2
23
|
{
|
|
3
24
|
"children": {
|
|
4
25
|
"features": [
|
|
@@ -214,6 +214,7 @@ table files {
|
|
|
214
214
|
metadata jsonb
|
|
215
215
|
chunk_task_id uuid
|
|
216
216
|
embedding_task_id uuid
|
|
217
|
+
slug text [unique]
|
|
217
218
|
accessed_at "timestamp with time zone" [not null, default: `now()`]
|
|
218
219
|
created_at "timestamp with time zone" [not null, default: `now()`]
|
|
219
220
|
updated_at "timestamp with time zone" [not null, default: `now()`]
|