nolo-cli 0.1.39 → 0.1.41
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/README.md +4 -4
- package/agent-runtime/dialogWritePlan.ts +39 -0
- package/agent-runtime/hostAdapter.ts +4 -0
- package/agent-runtime/hybridRecordStore.ts +5 -3
- package/agent-runtime/index.ts +15 -0
- package/agent-runtime/localLoop.ts +87 -7
- package/agent-runtime/localToolPolicy.ts +2 -13
- package/agent-runtime/localWorkspaceTools.ts +42 -110
- package/agent-runtime/runtimeToolPolicy.ts +2 -11
- package/agent-runtime/runtimeToolSurface.ts +198 -0
- package/agent-runtime/types.ts +1 -0
- package/agentAliases.ts +2 -1
- package/agentRunCommand.ts +10 -32
- package/agentRuntimeLocal.ts +1 -0
- package/ai/agent/_executeModel.ts +146 -0
- package/ai/agent/agentSlice.ts +556 -1
- package/ai/agent/appWorkingMemory.ts +126 -0
- package/ai/agent/buildEditingContext.ts +378 -0
- package/ai/agent/buildSystemPrompt.ts +585 -0
- package/ai/agent/canvasEditingContext.ts +49 -0
- package/ai/agent/cleanAgentMessages.ts +140 -0
- package/ai/agent/cliChatClient.ts +153 -0
- package/ai/agent/cliExecutor.ts +314 -40
- package/ai/agent/contextCompiler.ts +107 -0
- package/ai/agent/contextLayerContract.ts +44 -0
- package/ai/agent/createAgentSchema.ts +272 -0
- package/ai/agent/currentTimeContext.ts +65 -0
- package/ai/agent/executeToolCall.ts +58 -0
- package/ai/agent/fetchAgentContexts.ts +42 -0
- package/ai/agent/generatePrompt.ts +3 -0
- package/ai/agent/getFullChatContextKeys.ts +168 -0
- package/ai/agent/guidedCreation/capabilities.ts +84 -0
- package/ai/agent/guidedCreation/types.ts +38 -0
- package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
- package/ai/agent/liveAudioModel.ts +2 -0
- package/ai/agent/pageBuilderHandoffRules.ts +75 -0
- package/ai/agent/persistMessageWithFixedId.ts +37 -0
- package/ai/agent/planSlice.ts +259 -0
- package/ai/agent/referenceUtils.ts +229 -0
- package/ai/agent/runAgentBackground.ts +310 -0
- package/ai/agent/runAgentClientLoop.ts +164 -0
- package/ai/agent/runtimeGuidance.ts +116 -0
- package/ai/agent/serverOrigin.ts +7 -0
- package/ai/agent/startParallelAgentStreams.ts +424 -0
- package/ai/agent/startupProtocol.ts +53 -0
- package/ai/agent/streamAgentChatTurn.ts +2001 -0
- package/ai/agent/streamAgentChatTurnUtils.ts +860 -0
- package/ai/agent/toolFailureGuard.ts +99 -0
- package/ai/agent/types.ts +73 -0
- package/ai/agent/utils/imageOutput.ts +37 -0
- package/ai/agent/utils/publicImageAgentMode.ts +26 -0
- package/ai/ai.locale.ts +1095 -0
- package/ai/chat/accumulateToolCallChunks.ts +126 -0
- package/ai/chat/fetchUtils.ts +143 -0
- package/ai/chat/inlineImageUrlsForCustomProvider.ts +117 -0
- package/ai/chat/parseApiError.ts +67 -0
- package/ai/chat/parseMultilineSSE.ts +95 -0
- package/ai/chat/sendOpenAICompletionsRequest.ts +897 -0
- package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
- package/ai/chat/serverProxyRetry.ts +102 -0
- package/ai/chat/shouldUseServerProxy.ts +18 -0
- package/ai/chat/streamRetry.ts +46 -0
- package/ai/chat/updateTotalUsage.ts +89 -0
- package/ai/context/buildReferenceContext.ts +437 -0
- package/ai/context/retention.ts +165 -0
- package/ai/context/tokenUtils.ts +78 -0
- package/ai/llm/agentCapabilities.ts +74 -0
- package/ai/llm/deepinfra.ts +79 -0
- package/ai/llm/fireworks.ts +68 -0
- package/ai/llm/generateRequestBody.ts +165 -0
- package/ai/llm/getModelContextWindow.ts +93 -0
- package/ai/llm/getPricing.ts +252 -0
- package/ai/llm/imagePricing.ts +66 -0
- package/ai/llm/isResponseAPIModel.ts +13 -0
- package/ai/llm/kimi.ts +23 -0
- package/ai/llm/mimo.ts +99 -0
- package/ai/llm/mistral.ts +21 -0
- package/ai/llm/models.ts +45 -0
- package/ai/llm/openrouterModels.ts +6 -0
- package/ai/llm/providers.ts +313 -0
- package/ai/llm/reasoningModels.ts +27 -0
- package/ai/llm/types.ts +82 -0
- package/ai/llm/usageRequestOptions.ts +59 -0
- package/ai/memory/queryShared.ts +161 -0
- package/ai/memory/recentRelationshipRecap.ts +247 -0
- package/ai/memory/remember.ts +167 -0
- package/ai/memory/store.ts +20 -0
- package/ai/memory/storeShared.ts +76 -0
- package/ai/memory/types.ts +46 -0
- package/ai/memory/understanding.ts +349 -0
- package/ai/memory/understandingGreeting.ts +264 -0
- package/ai/policy/personalizationDialog.ts +333 -0
- package/ai/policy/runtimePolicy.ts +454 -0
- package/ai/policy/selfUpdateFields.ts +48 -0
- package/ai/policy/types.ts +64 -0
- package/ai/skills/referenceRuntime.ts +274 -0
- package/ai/skills/skillDiagnostics.ts +251 -0
- package/ai/skills/skillDocBuilder.ts +139 -0
- package/ai/skills/skillSummaryMarker.ts +26 -0
- package/ai/token/calculatePrice.ts +576 -0
- package/ai/token/missingUsageEstimate.ts +42 -0
- package/ai/token/normalizeUsage.ts +124 -0
- package/ai/token/openaiImageGenerationUsage.ts +56 -0
- package/ai/token/prepareTokenUsageData.ts +93 -0
- package/ai/token/resolveBillingTarget.ts +52 -0
- package/ai/token/saveTokenRecord.ts +53 -0
- package/ai/token/types.ts +103 -0
- package/ai/tools/agent/agentTools.ts +235 -0
- package/ai/tools/agent/agentUpdateShared.ts +311 -0
- package/ai/tools/agent/callAgentTool.ts +139 -0
- package/ai/tools/agent/createAgentTool.ts +512 -0
- package/ai/tools/agent/createDialogTool.ts +69 -0
- package/ai/tools/agent/createSkillAgentTool.ts +62 -0
- package/ai/tools/agent/parallelBudget.ts +221 -0
- package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
- package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
- package/ai/tools/agent/runLlmTool.ts +96 -0
- package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
- package/ai/tools/agent/skillAgentArgs.ts +106 -0
- package/ai/tools/agent/startAgentDialogTool.ts +53 -0
- package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
- package/ai/tools/agent/updateAgentTool.ts +96 -0
- package/ai/tools/agent/updateSelfTool.ts +113 -0
- package/ai/tools/amazonProductScraperTool.ts +86 -0
- package/ai/tools/apifyActorClient.ts +45 -0
- package/ai/tools/appEditGuard.ts +372 -0
- package/ai/tools/appReadSnapshot.ts +153 -0
- package/ai/tools/appTools.ts +1549 -0
- package/ai/tools/applyEditTool.ts +259 -0
- package/ai/tools/applyLineEditsTool.ts +315 -0
- package/ai/tools/browserTools/click.ts +33 -0
- package/ai/tools/browserTools/closeSession.ts +29 -0
- package/ai/tools/browserTools/common.ts +27 -0
- package/ai/tools/browserTools/openSession.ts +48 -0
- package/ai/tools/browserTools/readContent.ts +38 -0
- package/ai/tools/browserTools/selectOption.ts +46 -0
- package/ai/tools/browserTools/typeText.ts +42 -0
- package/ai/tools/category/createCategoryTool.ts +66 -0
- package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
- package/ai/tools/category/updateContentCategoryTool.ts +75 -0
- package/ai/tools/cfBrowserTools.ts +319 -0
- package/ai/tools/cfSpeechToTextTool.ts +49 -0
- package/ai/tools/checkEnvTool.ts +102 -0
- package/ai/tools/cloudflareCrawlTool.ts +289 -0
- package/ai/tools/codeSearchTool.ts +123 -0
- package/ai/tools/codeTools.ts +101 -0
- package/ai/tools/convertMarxistsBookTool.ts +103 -0
- package/ai/tools/createDocTool.ts +132 -0
- package/ai/tools/createSkillDocTool.ts +155 -0
- package/ai/tools/createWorkflowTool.ts +154 -0
- package/ai/tools/delayTool.ts +31 -0
- package/ai/tools/deleteSpacesTool.ts +325 -0
- package/ai/tools/deleteSpacesToolModel.ts +159 -0
- package/ai/tools/devReloadUtils.ts +29 -0
- package/ai/tools/dialogMessageSearch.ts +137 -0
- package/ai/tools/doctorSkillTool.ts +72 -0
- package/ai/tools/ecommerceScraperTool.ts +86 -0
- package/ai/tools/emailTools.ts +549 -0
- package/ai/tools/evalSkillTool.ts +92 -0
- package/ai/tools/exaSearchTool.ts +63 -0
- package/ai/tools/execShellTool.ts +266 -0
- package/ai/tools/executeSqlTool.ts +192 -0
- package/ai/tools/fetchWebpageSupport.ts +333 -0
- package/ai/tools/fetchWebpageTool.ts +97 -0
- package/ai/tools/geminiImagePreviewTool.ts +386 -0
- package/ai/tools/generateDocxTool.ts +215 -0
- package/ai/tools/googleSearchScraperTool.ts +106 -0
- package/ai/tools/importDataTool.ts +133 -0
- package/ai/tools/importSkillTool.ts +162 -0
- package/ai/tools/index.ts +2308 -0
- package/ai/tools/jdProductScraperTool.ts +821 -0
- package/ai/tools/listUserSpacesTool.ts +113 -0
- package/ai/tools/localFilesTool.ts +276 -0
- package/ai/tools/marxistsOfflineBook.ts +253 -0
- package/ai/tools/modelUsageTools.ts +206 -0
- package/ai/tools/noloWorkspaceReadTools.ts +467 -0
- package/ai/tools/olmOcrTool.ts +33 -0
- package/ai/tools/openaiImageTool.ts +267 -0
- package/ai/tools/prepareTools.ts +23 -0
- package/ai/tools/readDocTool.ts +88 -0
- package/ai/tools/readFileTool.ts +214 -0
- package/ai/tools/readTool.ts +194 -0
- package/ai/tools/readXPostTool.ts +229 -0
- package/ai/tools/readXhsProfileTool.ts +627 -0
- package/ai/tools/rememberMemoryTool.ts +84 -0
- package/ai/tools/remotionVideoTool.ts +151 -0
- package/ai/tools/searchDialogMessagesTool.ts +222 -0
- package/ai/tools/searchWorkspaceTool.ts +259 -0
- package/ai/tools/skillFollowup.ts +86 -0
- package/ai/tools/surfWeatherTool.ts +169 -0
- package/ai/tools/table/addTableRowTool.ts +217 -0
- package/ai/tools/table/createTableTool.ts +315 -0
- package/ai/tools/table/rowTools.ts +386 -0
- package/ai/tools/table/schemaTools.ts +244 -0
- package/ai/tools/table/shareTableTool.ts +148 -0
- package/ai/tools/table/toolShared.ts +129 -0
- package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
- package/ai/tools/toolApiClient.ts +279 -0
- package/ai/tools/toolResultError.ts +42 -0
- package/ai/tools/toolRunSlice.ts +303 -0
- package/ai/tools/toolSchemaCompatibility.ts +53 -0
- package/ai/tools/uiAskChoiceTool.ts +104 -0
- package/ai/tools/updateContentTitleTool.ts +84 -0
- package/ai/tools/updateDocTool.ts +105 -0
- package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
- package/ai/tools/wereadGatewayTool.ts +152 -0
- package/ai/tools/whisperTool.ts +76 -0
- package/ai/tools/writeFileTool.ts +213 -0
- package/ai/tools/youtubeScraperTool.ts +116 -0
- package/ai/tools/ziweiChartTool.ts +678 -0
- package/ai/types.ts +55 -0
- package/ai/workflow/workflowExecutor.ts +323 -0
- package/ai/workflow/workflowSlice.ts +73 -0
- package/ai/workflow/workflowTypes.ts +106 -0
- package/app/actions/syncAppRecord.ts +73 -0
- package/app/constants/animationSets.ts +21 -0
- package/app/constants/appEditor.ts +99 -0
- package/app/favorite/favoriteSlice.ts +690 -0
- package/app/favorite/type.ts +43 -0
- package/app/hooks/deleteDbKey.ts +233 -0
- package/app/i18n/client.ts +13 -0
- package/app/i18n/i18n.base.ts +14 -0
- package/app/i18n/i18n.config.ts +77 -0
- package/app/i18n/index.ts +15 -0
- package/app/i18n/mapLanguage.ts +11 -0
- package/app/i18n/translations/appBuilder.locale.ts +453 -0
- package/app/i18n/translations/error.locale.ts +246 -0
- package/app/i18n/translations/interface.locale.ts +2174 -0
- package/app/i18n/translations/pricing.locale.ts +397 -0
- package/app/i18n/translations/privacy.locale.ts +168 -0
- package/app/i18n/translations/seo.locale.ts +129 -0
- package/app/i18n/translations/terms.locale.ts +124 -0
- package/app/i18n/types.ts +6 -0
- package/app/notifications/model.ts +77 -0
- package/app/notifications/notificationSlice.ts +141 -0
- package/app/reducer.ts +36 -0
- package/app/settings/dbActionThunks.ts +34 -0
- package/app/settings/defaultSpacePreference.ts +87 -0
- package/app/settings/settingSlice.tsx +1212 -0
- package/app/settings/settingsRecord.ts +8 -0
- package/app/stateViews/runtime.ts +90 -0
- package/app/store.ts +55 -0
- package/app/theme/colors.ts +280 -0
- package/app/theme/fontPreference.ts +77 -0
- package/app/theme/theme.config.ts +120 -0
- package/app/theme/themeModeBootstrap.ts +123 -0
- package/app/types/appSummary.ts +114 -0
- package/app/types.ts +358 -0
- package/app/utils/appKeys.ts +55 -0
- package/app/utils/async.ts +28 -0
- package/app/utils/desktopAgentRuntimeTurnClient.ts +73 -0
- package/app/utils/env.ts +17 -0
- package/app/utils/fileUtils.ts +229 -0
- package/app/utils/imageUtils.ts +274 -0
- package/app/utils/myContentItems.ts +289 -0
- package/app/utils/retryAfter.ts +36 -0
- package/app/utils/retryFetch.ts +61 -0
- package/app/utils/toast.ts +3 -0
- package/auth/action/signUpAction.ts +227 -0
- package/auth/adminPermissions.ts +18 -0
- package/auth/authSlice.ts +531 -0
- package/auth/client/loginRequest.ts +14 -0
- package/auth/resetAuthScopedClientState.ts +27 -0
- package/auth/routes.ts +178 -0
- package/auth/token.ts +63 -0
- package/auth/types.ts +40 -0
- package/chat/chat.locale.ts +813 -0
- package/chat/dialog/actions/addCybotAction.ts +52 -0
- package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
- package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
- package/chat/dialog/actions/cleanupCliSession.ts +40 -0
- package/chat/dialog/actions/createDialogAction.ts +379 -0
- package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
- package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
- package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
- package/chat/dialog/actions/removeCybotAction.ts +6 -0
- package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
- package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
- package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
- package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
- package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
- package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
- package/chat/dialog/actions/updateTokensAction.ts +233 -0
- package/chat/dialog/dialogAgents.ts +72 -0
- package/chat/dialog/dialogSlice.ts +872 -0
- package/chat/dialog/dialogTitle.ts +81 -0
- package/chat/dialog/dialogTokenStats.ts +12 -0
- package/chat/dialog/dialogUrl.ts +6 -0
- package/chat/dialog/goal.ts +108 -0
- package/chat/dialog/objectAssistantRegistry.ts +286 -0
- package/chat/dialog/schedule.ts +17 -0
- package/chat/messages/fetchAndCacheMessages.ts +119 -0
- package/chat/messages/fetchConvMsgs.ts +51 -0
- package/chat/messages/fileUrl.ts +13 -0
- package/chat/messages/messageAgent.ts +8 -0
- package/chat/messages/messageContent.ts +199 -0
- package/chat/messages/messageContract.ts +88 -0
- package/chat/messages/messageSlice.ts +1367 -0
- package/chat/messages/toolThunks.ts +625 -0
- package/cli/agentAliases.ts +2 -1
- package/cli/agentRunCommand.ts +10 -32
- package/cli/agentRuntimeLocal.ts +1 -0
- package/cli/client/agentRun.ts +67 -95
- package/cli/client/localRuntimeAdapter.ts +323 -54
- package/cli/commandRegistry.ts +2 -2
- package/cli/machineWsRunDispatch.ts +51 -6
- package/cli/offlineMarxistsAgentCommand.ts +6 -4
- package/client/agentConfigResolver.test.ts +2 -2
- package/client/agentRun.test.ts +175 -57
- package/client/agentRun.ts +67 -95
- package/client/localRuntimeAdapter.test.ts +682 -37
- package/client/localRuntimeAdapter.ts +323 -54
- package/client/localRuntimeDryRun.test.ts +23 -9
- package/client/localToolPolicy.test.ts +4 -4
- package/commandRegistry.ts +2 -2
- package/core/builtinAgents.ts +209 -0
- package/core/config.ts +15 -0
- package/core/crypto.ts +51 -0
- package/core/generateKeyPairFromSeedV1.ts +15 -0
- package/core/generateMainKey.ts +22 -0
- package/core/init.ts +41 -0
- package/core/localOrigins.ts +8 -0
- package/core/password.ts +13 -0
- package/core/prefix.ts +23 -0
- package/create/editor/transforms/fromMarkdown/index.ts +260 -0
- package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
- package/create/editor/transforms/fromMarkdown/table.ts +130 -0
- package/create/editor/transforms/markdownToSlate.ts +24 -0
- package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
- package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
- package/create/editor/transforms/slateToText.ts +33 -0
- package/create/editor/utils/slateUtils.ts +233 -0
- package/create/space/addSpaceAction.ts +193 -0
- package/create/space/category/categoryActions.ts +427 -0
- package/create/space/changeSpaceAction.ts +36 -0
- package/create/space/constants.ts +8 -0
- package/create/space/content/addContentAction.ts +116 -0
- package/create/space/content/contentThunks.ts +90 -0
- package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
- package/create/space/content/deleteMultipleContentAction.ts +112 -0
- package/create/space/content/moveContentAction.ts +285 -0
- package/create/space/content/updateContentCategoryAction.ts +154 -0
- package/create/space/content/updateContentTitleAction.ts +151 -0
- package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
- package/create/space/contentKeyUtils.ts +117 -0
- package/create/space/deleteSpaceAction.ts +276 -0
- package/create/space/fetchSpaceAction.ts +70 -0
- package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
- package/create/space/loadDefaultSpaceAction.ts +57 -0
- package/create/space/member/addMemberAction.ts +79 -0
- package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
- package/create/space/member/memberThunks.ts +47 -0
- package/create/space/member/removeMemberAction.ts +67 -0
- package/create/space/resolvePreferredSpaceId.ts +113 -0
- package/create/space/sidebarVisibleTypes.ts +241 -0
- package/create/space/space.locale.ts +1087 -0
- package/create/space/spaceAccess.ts +182 -0
- package/create/space/spaceCollapsedState.ts +54 -0
- package/create/space/spaceKeys.ts +65 -0
- package/create/space/spaceSlice.ts +328 -0
- package/create/space/spaceThunks.ts +410 -0
- package/create/space/types.ts +27 -0
- package/create/space/updateSpaceAction.ts +107 -0
- package/create/space/utils/permissions.ts +47 -0
- package/create/types.ts +21 -0
- package/database/actions/agentReadResolution.ts +33 -0
- package/database/actions/common.ts +243 -0
- package/database/actions/deleteFile.ts +40 -0
- package/database/actions/fileContent.ts +125 -0
- package/database/actions/patch.ts +155 -0
- package/database/actions/read.ts +358 -0
- package/database/actions/readAndWait.ts +260 -0
- package/database/actions/readRequestManager.ts +120 -0
- package/database/actions/readResolution.ts +125 -0
- package/database/actions/remove.ts +94 -0
- package/database/actions/replication.ts +477 -0
- package/database/actions/upload.ts +186 -0
- package/database/actions/upsert.ts +56 -0
- package/database/actions/write.ts +146 -0
- package/database/authority/ownerKey.ts +80 -0
- package/database/authority/recordAuthority.ts +67 -0
- package/database/authority/userAuthorityRegistry.ts +54 -0
- package/database/client/fetchUserData.ts +61 -0
- package/database/dbActionThunks.ts +1 -0
- package/database/dbSlice.ts +149 -0
- package/database/fileRing.ts +51 -0
- package/database/fileStorage.ts +232 -0
- package/database/fileUrl.ts +34 -0
- package/database/keys.ts +767 -0
- package/database/queryPrefixes.ts +14 -0
- package/database/requests.ts +443 -0
- package/database/runtimeServerContext.ts +54 -0
- package/database/server/levelAuthorityStore.ts +20 -1
- package/database/tenantPlacement.ts +57 -0
- package/database/userPreferenceRegister.ts +131 -0
- package/database/utils/ulid.ts +1 -0
- package/integrations/anthropic/anthropicModels.ts +47 -0
- package/integrations/deepseek/models.ts +37 -0
- package/integrations/google/models.ts +341 -0
- package/integrations/openai/chatCompletionStreamMode.ts +10 -0
- package/integrations/openai/filterAndCleanMessages.ts +284 -0
- package/integrations/openai/flexTier.ts +102 -0
- package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
- package/integrations/openai/generateResponseRequestBody.ts +77 -0
- package/integrations/openai/models.ts +271 -0
- package/integrations/openai/providerBodyCompatibility.ts +23 -0
- package/integrations/openai/responsesHelpers.ts +297 -0
- package/integrations/x-reader/types.ts +109 -0
- package/integrations/xai/models.ts +13 -0
- package/integrations/xhs-reader/analyze/profileAnalyzer.ts +205 -0
- package/integrations/xhs-reader/backends/playwrightProfileCollector.ts +624 -0
- package/integrations/xhs-reader/bridge/readXhsProfileWithBridge.ts +227 -0
- package/integrations/xhs-reader/client/xhsWebApiClient.ts +229 -0
- package/integrations/xhs-reader/normalize.ts +390 -0
- package/integrations/xhs-reader/orchestrator.ts +178 -0
- package/integrations/xhs-reader/redaction.ts +68 -0
- package/integrations/xhs-reader/types.ts +244 -0
- package/integrations/xhs-reader/url.ts +57 -0
- package/machineWsRunDispatch.ts +51 -6
- package/offlineMarxistsAgentCommand.ts +6 -4
- package/package.json +430 -3
- package/render/page/createPageAction.ts +183 -0
- package/render/page/docSlice.ts +468 -0
- package/render/page/types.ts +17 -0
- package/render/table/createTableAction.ts +270 -0
- package/render/table/deleteTableAction.ts +193 -0
- package/render/table/fetchAndCacheTableRows.ts +174 -0
- package/render/table/tableSlice.ts +1106 -0
- package/render/table/toolValueUtils.ts +363 -0
- package/render/table/types.ts +252 -0
- package/render/table/utils/tableSerialization.ts +50 -0
- package/server/handlers/agentRun/types.ts +104 -0
- package/share/action.ts +225 -0
- package/share/helpers.ts +302 -0
- package/share/keys.ts +243 -0
- package/share/publicSharePolicy.ts +27 -0
- package/share/shareSlice.ts +53 -0
- package/share/types.ts +100 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// src/app/i18n/translations/seo.locale.ts
|
|
2
|
+
import { Language } from "../../i18n/types";
|
|
3
|
+
|
|
4
|
+
const seoLocale: Record<
|
|
5
|
+
Language,
|
|
6
|
+
{
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
home: {
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
pricing: {
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
explore: {
|
|
18
|
+
title: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
shareCommunity: {
|
|
22
|
+
title: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
> = {
|
|
27
|
+
[Language.EN]: {
|
|
28
|
+
title: "Nolo.Chat | Not Just a Chatbot — Your Private AI Team",
|
|
29
|
+
description:
|
|
30
|
+
"While others chat, Nolo.Chat works. Orchestrate multiple AI agents that remember your rules, collaborate on complex tasks, and keep running overnight — delivering real results by morning.",
|
|
31
|
+
home: {
|
|
32
|
+
title: "Nolo.Chat | AI that Remembers You and Gets the Work Done",
|
|
33
|
+
description:
|
|
34
|
+
"Work with GPT, Claude, DeepSeek and more in one AI workspace. Nolo remembers your context, lets multiple agents debate and collaborate, and turns ideas into docs, images, apps, and deliverables.",
|
|
35
|
+
},
|
|
36
|
+
pricing: {
|
|
37
|
+
title: "Pricing | Pay for What You Use with Nolo Credits",
|
|
38
|
+
description:
|
|
39
|
+
"Start free, then top up credits only when you need more. Compare model costs, understand how credits work, and unlock advanced features without being locked into a subscription.",
|
|
40
|
+
},
|
|
41
|
+
explore: {
|
|
42
|
+
title: "AI Plaza | Explore Public AI Agents on Nolo.Chat",
|
|
43
|
+
description:
|
|
44
|
+
"Browse public AI agents, compare their specialties, and discover real workflows built by the Nolo community before starting your own workspace.",
|
|
45
|
+
},
|
|
46
|
+
shareCommunity: {
|
|
47
|
+
title: "Community Shares | See What People Build with Nolo.Chat",
|
|
48
|
+
description:
|
|
49
|
+
"Explore public chats, docs, apps, and shared outputs from the Nolo community to see how people use AI agents for real work.",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
[Language.ZH_CN]: {
|
|
53
|
+
title: "Nolo.Chat | 让 Nolo 认识你,记住你,和你一起创造",
|
|
54
|
+
description:
|
|
55
|
+
"别人是一个 AI 帮你聊,我们是多个 Agent 帮你做完。记住你的规则、多模型协作、夜间自动执行——今晚委托,明早交付网页、图片、文档。",
|
|
56
|
+
home: {
|
|
57
|
+
title: "Nolo.Chat | 让 Nolo 认识你,记住你,和你一起创造",
|
|
58
|
+
description:
|
|
59
|
+
"把 GPT、Claude、DeepSeek 放进同一个 AI 工作台。Nolo 能记住你的上下文,让多个 Agent 协作或辩论,并直接产出文档、图片、网页和可交付结果。",
|
|
60
|
+
},
|
|
61
|
+
pricing: {
|
|
62
|
+
title: "Nolo 定价 | 用多少,付多少",
|
|
63
|
+
description:
|
|
64
|
+
"注册即可免费开始,按实际模型消耗扣积分。查看积分规则、模型价格对比,以及如何在不订阅的情况下随时充值、随时使用。",
|
|
65
|
+
},
|
|
66
|
+
explore: {
|
|
67
|
+
title: "Nolo AI 广场 | 发现公开 AI 与现成工作流",
|
|
68
|
+
description:
|
|
69
|
+
"在 AI 广场浏览公开 AI、查看它们擅长的任务与真实能力,再决定要不要把它加入你的工作流。",
|
|
70
|
+
},
|
|
71
|
+
shareCommunity: {
|
|
72
|
+
title: "Nolo 社区分享 | 看别人怎样用 AI 把事做完",
|
|
73
|
+
description:
|
|
74
|
+
"浏览社区公开分享的对话、文档、应用与成果,了解真实用户如何用 Nolo 完成研究、写作、开发与自动化任务。",
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
[Language.ZH_HANT]: {
|
|
78
|
+
title: "Nolo.Chat | 讓 Nolo 認識你,記住你,和你一起創造",
|
|
79
|
+
description:
|
|
80
|
+
"別人是一個 AI 幫你聊,我們是多個 Agent 幫你做完。記住你的規則、多模型協作、夜間自動執行——今晚委託,明早交付網頁、圖片、文件。",
|
|
81
|
+
home: {
|
|
82
|
+
title: "Nolo.Chat | 讓 Nolo 認識你,記住你,和你一起創造",
|
|
83
|
+
description:
|
|
84
|
+
"把 GPT、Claude、DeepSeek 放進同一個 AI 工作台。Nolo 能記住你的上下文,讓多個 Agent 協作或辯論,並直接產出文件、圖片、網頁和可交付結果。",
|
|
85
|
+
},
|
|
86
|
+
pricing: {
|
|
87
|
+
title: "Nolo 定價 | 用多少,付多少",
|
|
88
|
+
description:
|
|
89
|
+
"註冊即可免費開始,按實際模型消耗扣積分。查看積分規則、模型價格對比,以及如何在不訂閱的情況下隨時儲值、隨時使用。",
|
|
90
|
+
},
|
|
91
|
+
explore: {
|
|
92
|
+
title: "Nolo AI 廣場 | 發現公開 AI 與現成工作流",
|
|
93
|
+
description:
|
|
94
|
+
"在 AI 廣場瀏覽公開 AI、查看它們擅長的任務與真實能力,再決定要不要把它加入你的工作流。",
|
|
95
|
+
},
|
|
96
|
+
shareCommunity: {
|
|
97
|
+
title: "Nolo 社群分享 | 看別人如何用 AI 把事做完",
|
|
98
|
+
description:
|
|
99
|
+
"瀏覽社群公開分享的對話、文件、應用與成果,了解真實使用者如何用 Nolo 完成研究、寫作、開發與自動化任務。",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
[Language.JA]: {
|
|
103
|
+
title: "Nolo.Chat | チャットを超えた、あなた専属の AI チーム",
|
|
104
|
+
description:
|
|
105
|
+
"他社が「一対一の会話」なら、Nolo.Chat は「複数 Agent が協力して仕事を完遂」。ルールを記憶し、夜間も自動実行。朝には成果物が届きます。",
|
|
106
|
+
home: {
|
|
107
|
+
title: "Nolo.Chat | 文脈を覚えて、仕事を仕上げる AI ワークスペース",
|
|
108
|
+
description:
|
|
109
|
+
"GPT、Claude、DeepSeek などを 1 つの AI ワークスペースで活用。Nolo は文脈を覚え、複数 Agent の協調や議論を通じて、文書・画像・Web・成果物まで形にします。",
|
|
110
|
+
},
|
|
111
|
+
pricing: {
|
|
112
|
+
title: "Nolo 料金 | 使った分だけ支払うクレジット制",
|
|
113
|
+
description:
|
|
114
|
+
"無料ではじめて、必要な時だけクレジットを追加。モデルごとの消費量、クレジットの仕組み、サブスクなしで上位機能を使う方法を確認できます。",
|
|
115
|
+
},
|
|
116
|
+
explore: {
|
|
117
|
+
title: "AI Plaza | Nolo.Chat の公開 AI を探す",
|
|
118
|
+
description:
|
|
119
|
+
"公開 AI エージェントを一覧で見比べ、それぞれの得意分野や実際の使い道を確認してから自分のワークフローに取り込めます。",
|
|
120
|
+
},
|
|
121
|
+
shareCommunity: {
|
|
122
|
+
title: "コミュニティ共有 | Nolo.Chat で作られた実例を見る",
|
|
123
|
+
description:
|
|
124
|
+
"コミュニティが公開した対話、文書、アプリ、成果物を見ながら、Nolo が実務でどう使われているかを確認できます。",
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export default seoLocale;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Language } from "../types";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
[Language.EN]: {
|
|
5
|
+
translation: {
|
|
6
|
+
terms: {
|
|
7
|
+
title: "Terms of Service",
|
|
8
|
+
lastUpdated: "Last updated: May 30, 2026",
|
|
9
|
+
intro:
|
|
10
|
+
"Welcome to Nolo. By accessing or using our services, you agree to be bound by these Terms of Service.",
|
|
11
|
+
section1: {
|
|
12
|
+
title: "1. Account Registration",
|
|
13
|
+
desc:
|
|
14
|
+
"You must provide accurate information when creating an account. You are responsible for safeguarding your account credentials.",
|
|
15
|
+
},
|
|
16
|
+
section2: {
|
|
17
|
+
title: "2. Acceptable Use",
|
|
18
|
+
desc:
|
|
19
|
+
"You agree not to use the service for any unlawful purposes or to conduct any activity that violates the rights of others.",
|
|
20
|
+
},
|
|
21
|
+
section3: {
|
|
22
|
+
title: "3. Intellectual Property",
|
|
23
|
+
desc:
|
|
24
|
+
"All content and software provided through the service are the property of Nolo or its licensors and are protected by intellectual property laws.",
|
|
25
|
+
},
|
|
26
|
+
section4: {
|
|
27
|
+
title: "4. Termination",
|
|
28
|
+
desc:
|
|
29
|
+
"We may suspend or terminate your account at any time for violations of these Terms of Service.",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
[Language.ZH_CN]: {
|
|
35
|
+
translation: {
|
|
36
|
+
terms: {
|
|
37
|
+
title: "服务条款",
|
|
38
|
+
lastUpdated: "最后更新日期:2026年5月30日",
|
|
39
|
+
intro:
|
|
40
|
+
"欢迎使用 Nolo。访问或使用我们的服务,即表示您同意受本服务条款的约束。",
|
|
41
|
+
section1: {
|
|
42
|
+
title: "1. 账号注册",
|
|
43
|
+
desc:
|
|
44
|
+
"您在创建账号时必须提供准确的信息。您有责任妥善保管您的账号凭证。",
|
|
45
|
+
},
|
|
46
|
+
section2: {
|
|
47
|
+
title: "2. 合规使用",
|
|
48
|
+
desc:
|
|
49
|
+
"您同意不将本服务用于任何非法目的,也不从事任何侵犯他人合法权益的活动。",
|
|
50
|
+
},
|
|
51
|
+
section3: {
|
|
52
|
+
title: "3. 知识产权",
|
|
53
|
+
desc:
|
|
54
|
+
"通过本服务提供的所有内容和软件均归 Nolo 或其许可方所有,受知识产权法律保护。",
|
|
55
|
+
},
|
|
56
|
+
section4: {
|
|
57
|
+
title: "4. 终止服务",
|
|
58
|
+
desc:
|
|
59
|
+
"如果您违反本服务条款,我们有权随时暂停或终止您的账号。",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
[Language.ZH_HANT]: {
|
|
65
|
+
translation: {
|
|
66
|
+
terms: {
|
|
67
|
+
title: "服務條款",
|
|
68
|
+
lastUpdated: "最後更新日期:2026年5月30日",
|
|
69
|
+
intro:
|
|
70
|
+
"歡迎使用 Nolo。造訪或使用我們的服務,即表示您同意受本服務條款的約束。",
|
|
71
|
+
section1: {
|
|
72
|
+
title: "1. 帳號註冊",
|
|
73
|
+
desc:
|
|
74
|
+
"您在建立帳號時必須提供準確的資訊。您有責任妥善保管您的帳號憑證。",
|
|
75
|
+
},
|
|
76
|
+
section2: {
|
|
77
|
+
title: "2. 合規使用",
|
|
78
|
+
desc:
|
|
79
|
+
"您同意不將本服務用於任何非法目的,也不從事任何侵犯他人合法權益的活動。",
|
|
80
|
+
},
|
|
81
|
+
section3: {
|
|
82
|
+
title: "3. 智慧財產權",
|
|
83
|
+
desc:
|
|
84
|
+
"透過本服務提供的所有內容和軟體均歸 Nolo 或其授權方所有,受智慧財產權法律保護。",
|
|
85
|
+
},
|
|
86
|
+
section4: {
|
|
87
|
+
title: "4. 終止服務",
|
|
88
|
+
desc:
|
|
89
|
+
"如果您違反本服務條款,我們有權隨時暫停或終止您的帳號。",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
[Language.JA]: {
|
|
95
|
+
translation: {
|
|
96
|
+
terms: {
|
|
97
|
+
title: "利用規約",
|
|
98
|
+
lastUpdated: "最終更新日:2026年5月30日",
|
|
99
|
+
intro:
|
|
100
|
+
"Nolo へようこそ。当社のサービスにアクセスまたは利用することにより、お客様は本利用規約に拘束されることに同意するものとします。",
|
|
101
|
+
section1: {
|
|
102
|
+
title: "1. アカウント登録",
|
|
103
|
+
desc:
|
|
104
|
+
"アカウントを作成する際、正確な情報を提供する必要があります。アカウントの認証情報の管理はご自身の責任で行ってください。",
|
|
105
|
+
},
|
|
106
|
+
section2: {
|
|
107
|
+
title: "2. 適切な利用",
|
|
108
|
+
desc:
|
|
109
|
+
"お客様は、本サービスを違法な目的で使用しないこと、他者の権利を侵害する活動を行わないことに同意するものとします。",
|
|
110
|
+
},
|
|
111
|
+
section3: {
|
|
112
|
+
title: "3. 知的財産権",
|
|
113
|
+
desc:
|
|
114
|
+
"本サービスを通じて提供されるすべてのコンテンツおよびソフトウェアは、Nolo またはそのライセンサーの財産であり、知的財産法によって保護されています。",
|
|
115
|
+
},
|
|
116
|
+
section4: {
|
|
117
|
+
title: "4. 利用停止",
|
|
118
|
+
desc:
|
|
119
|
+
"本利用規約に違反した場合、当社はいつでもアカウントを停止または終了することができます。",
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { DataType } from "../../create/types";
|
|
2
|
+
import { createNotificationKey } from "../../database/keys";
|
|
3
|
+
|
|
4
|
+
export type NotificationKind =
|
|
5
|
+
| "space_member_added"
|
|
6
|
+
| "dialog_done"
|
|
7
|
+
| "dialog_failed"
|
|
8
|
+
| "agent_notice";
|
|
9
|
+
|
|
10
|
+
export interface NotificationRecord {
|
|
11
|
+
dbKey: string;
|
|
12
|
+
type: DataType.NOTIFICATION;
|
|
13
|
+
userId: string;
|
|
14
|
+
notificationId: string;
|
|
15
|
+
kind: NotificationKind;
|
|
16
|
+
createdAt: number;
|
|
17
|
+
updatedAt: number;
|
|
18
|
+
href?: string;
|
|
19
|
+
spaceId?: string;
|
|
20
|
+
dialogId?: string;
|
|
21
|
+
sourceUserId?: string;
|
|
22
|
+
readAt?: number | null;
|
|
23
|
+
archivedAt?: number | null;
|
|
24
|
+
payload?: Record<string, unknown>;
|
|
25
|
+
deletedAt?: number | string;
|
|
26
|
+
serverOrigin?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface NotificationEventPayload {
|
|
30
|
+
type: "notification.upsert";
|
|
31
|
+
notification: NotificationRecord;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const NOTIFICATION_LIMIT = 100;
|
|
35
|
+
|
|
36
|
+
export const createNotificationRecord = ({
|
|
37
|
+
userId,
|
|
38
|
+
notificationId,
|
|
39
|
+
kind,
|
|
40
|
+
createdAt,
|
|
41
|
+
updatedAt = createdAt,
|
|
42
|
+
href,
|
|
43
|
+
spaceId,
|
|
44
|
+
dialogId,
|
|
45
|
+
sourceUserId,
|
|
46
|
+
readAt,
|
|
47
|
+
archivedAt,
|
|
48
|
+
payload,
|
|
49
|
+
}: {
|
|
50
|
+
userId: string;
|
|
51
|
+
notificationId: string;
|
|
52
|
+
kind: NotificationKind;
|
|
53
|
+
createdAt: number;
|
|
54
|
+
updatedAt?: number;
|
|
55
|
+
href?: string;
|
|
56
|
+
spaceId?: string;
|
|
57
|
+
dialogId?: string;
|
|
58
|
+
sourceUserId?: string;
|
|
59
|
+
readAt?: number | null;
|
|
60
|
+
archivedAt?: number | null;
|
|
61
|
+
payload?: Record<string, unknown>;
|
|
62
|
+
}): NotificationRecord => ({
|
|
63
|
+
dbKey: createNotificationKey.single(userId, notificationId),
|
|
64
|
+
type: DataType.NOTIFICATION,
|
|
65
|
+
userId,
|
|
66
|
+
notificationId,
|
|
67
|
+
kind,
|
|
68
|
+
createdAt,
|
|
69
|
+
updatedAt,
|
|
70
|
+
...(href ? { href } : {}),
|
|
71
|
+
...(spaceId ? { spaceId } : {}),
|
|
72
|
+
...(dialogId ? { dialogId } : {}),
|
|
73
|
+
...(sourceUserId ? { sourceUserId } : {}),
|
|
74
|
+
...(typeof readAt === "number" ? { readAt } : {}),
|
|
75
|
+
...(typeof archivedAt === "number" ? { archivedAt } : {}),
|
|
76
|
+
...(payload ? { payload } : {}),
|
|
77
|
+
});
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { createSelector, createSlice, type PayloadAction } from "@reduxjs/toolkit";
|
|
2
|
+
import type { RootState } from "../store";
|
|
3
|
+
import type {
|
|
4
|
+
NotificationKind,
|
|
5
|
+
NotificationRecord,
|
|
6
|
+
} from "../notifications/model";
|
|
7
|
+
|
|
8
|
+
export type AppNotification = {
|
|
9
|
+
id: string;
|
|
10
|
+
kind: NotificationKind;
|
|
11
|
+
title: string;
|
|
12
|
+
message?: string;
|
|
13
|
+
createdAt: number;
|
|
14
|
+
updatedAt: number;
|
|
15
|
+
read: boolean;
|
|
16
|
+
href?: string;
|
|
17
|
+
dialogId?: string;
|
|
18
|
+
spaceId?: string;
|
|
19
|
+
record: NotificationRecord;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type NotificationState = {
|
|
23
|
+
items: AppNotification[];
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const MAX_NOTIFICATION_ITEMS = 100;
|
|
27
|
+
|
|
28
|
+
const initialState: NotificationState = {
|
|
29
|
+
items: [],
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const sortItems = (items: AppNotification[]): AppNotification[] =>
|
|
33
|
+
[...items].sort((left, right) => {
|
|
34
|
+
if (right.createdAt !== left.createdAt) {
|
|
35
|
+
return right.createdAt - left.createdAt;
|
|
36
|
+
}
|
|
37
|
+
return right.updatedAt - left.updatedAt;
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const dedupeItems = (items: AppNotification[]): AppNotification[] => {
|
|
41
|
+
const nextMap = new Map<string, AppNotification>();
|
|
42
|
+
for (const item of items) {
|
|
43
|
+
const existing = nextMap.get(item.id);
|
|
44
|
+
if (!existing || item.updatedAt >= existing.updatedAt) {
|
|
45
|
+
nextMap.set(item.id, item);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return Array.from(nextMap.values());
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const notificationSlice = createSlice({
|
|
52
|
+
name: "notifications",
|
|
53
|
+
initialState,
|
|
54
|
+
reducers: {
|
|
55
|
+
replaceNotifications: (
|
|
56
|
+
state,
|
|
57
|
+
action: PayloadAction<AppNotification[]>
|
|
58
|
+
) => {
|
|
59
|
+
state.items = sortItems(dedupeItems(action.payload)).slice(
|
|
60
|
+
0,
|
|
61
|
+
MAX_NOTIFICATION_ITEMS
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
addNotification: (state, action: PayloadAction<AppNotification>) => {
|
|
65
|
+
const next = action.payload;
|
|
66
|
+
const existingIndex = state.items.findIndex((item) => item.id === next.id);
|
|
67
|
+
if (existingIndex >= 0) {
|
|
68
|
+
const prev = state.items[existingIndex];
|
|
69
|
+
state.items[existingIndex] = {
|
|
70
|
+
...next,
|
|
71
|
+
read: prev.read || next.read,
|
|
72
|
+
record: {
|
|
73
|
+
...next.record,
|
|
74
|
+
readAt:
|
|
75
|
+
typeof prev.record.readAt === "number"
|
|
76
|
+
? prev.record.readAt
|
|
77
|
+
: next.record.readAt,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
} else {
|
|
81
|
+
state.items.unshift(next);
|
|
82
|
+
}
|
|
83
|
+
state.items = sortItems(state.items).slice(0, MAX_NOTIFICATION_ITEMS);
|
|
84
|
+
},
|
|
85
|
+
markNotificationRead: (
|
|
86
|
+
state,
|
|
87
|
+
action: PayloadAction<{ id: string; readAt: number }>
|
|
88
|
+
) => {
|
|
89
|
+
const item = state.items.find((entry) => entry.id === action.payload.id);
|
|
90
|
+
if (!item) return;
|
|
91
|
+
item.read = true;
|
|
92
|
+
item.updatedAt = Math.max(item.updatedAt, action.payload.readAt);
|
|
93
|
+
item.record = {
|
|
94
|
+
...item.record,
|
|
95
|
+
readAt: action.payload.readAt,
|
|
96
|
+
updatedAt: Math.max(item.record.updatedAt, action.payload.readAt),
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
markAllNotificationsRead: (
|
|
100
|
+
state,
|
|
101
|
+
action: PayloadAction<{ readAt: number }>
|
|
102
|
+
) => {
|
|
103
|
+
state.items.forEach((item) => {
|
|
104
|
+
item.read = true;
|
|
105
|
+
item.updatedAt = Math.max(item.updatedAt, action.payload.readAt);
|
|
106
|
+
item.record = {
|
|
107
|
+
...item.record,
|
|
108
|
+
readAt: action.payload.readAt,
|
|
109
|
+
updatedAt: Math.max(item.record.updatedAt, action.payload.readAt),
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
export const {
|
|
117
|
+
replaceNotifications,
|
|
118
|
+
addNotification,
|
|
119
|
+
markNotificationRead,
|
|
120
|
+
markAllNotificationsRead,
|
|
121
|
+
} = notificationSlice.actions;
|
|
122
|
+
|
|
123
|
+
const selectNotificationState = (state: RootState) =>
|
|
124
|
+
state.notifications ?? initialState;
|
|
125
|
+
|
|
126
|
+
export const selectNotifications = createSelector(
|
|
127
|
+
selectNotificationState,
|
|
128
|
+
(notifications) => sortItems(notifications.items)
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
export const selectUnreadNotifications = createSelector(
|
|
132
|
+
selectNotifications,
|
|
133
|
+
(items) => items.filter((item) => item.read === false)
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
export const selectUnreadNotificationCount = createSelector(
|
|
137
|
+
selectUnreadNotifications,
|
|
138
|
+
(items) => items.length
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
export default notificationSlice.reducer;
|
package/app/reducer.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import authReducer from "../auth/authSlice";
|
|
2
|
+
import databaseReducer from "../database/dbSlice";
|
|
3
|
+
import settingReducer from ".//settings/settingSlice";
|
|
4
|
+
|
|
5
|
+
import docReducer from "../render/page/docSlice";
|
|
6
|
+
import tableReducer from "../render/table/tableSlice";
|
|
7
|
+
import cybotReducer from "../ai/agent/agentSlice";
|
|
8
|
+
import spaceReducer from "../create/space/spaceSlice";
|
|
9
|
+
|
|
10
|
+
import dialogReducer from "../chat/dialog/dialogSlice";
|
|
11
|
+
import messageReducer from "../chat/messages/messageSlice";
|
|
12
|
+
import planSlice from "../ai/agent/planSlice";
|
|
13
|
+
import workflowReducer from "../ai/workflow/workflowSlice";
|
|
14
|
+
import favoriteReducer from ".//favorite/favoriteSlice";
|
|
15
|
+
import notificationReducer from ".//notifications/notificationSlice";
|
|
16
|
+
// 新增:工具调用 trace
|
|
17
|
+
import toolRunReducer from "../ai/tools/toolRunSlice";
|
|
18
|
+
import shareReducer from "../share/shareSlice";
|
|
19
|
+
|
|
20
|
+
export const reducer = {
|
|
21
|
+
dialog: dialogReducer,
|
|
22
|
+
plan: planSlice,
|
|
23
|
+
workflow: workflowReducer,
|
|
24
|
+
message: messageReducer,
|
|
25
|
+
auth: authReducer,
|
|
26
|
+
doc: docReducer,
|
|
27
|
+
db: databaseReducer,
|
|
28
|
+
settings: settingReducer,
|
|
29
|
+
space: spaceReducer,
|
|
30
|
+
notifications: notificationReducer,
|
|
31
|
+
cybot: cybotReducer,
|
|
32
|
+
table: tableReducer,
|
|
33
|
+
toolRun: toolRunReducer,
|
|
34
|
+
favorite: favoriteReducer,
|
|
35
|
+
share: shareReducer,
|
|
36
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as databaseDbActionThunks from "../../database/dbActionThunks";
|
|
2
|
+
|
|
3
|
+
const getDefaultSettingDbActionThunks = () => ({
|
|
4
|
+
readAndWait: databaseDbActionThunks.readAndWait,
|
|
5
|
+
patch: databaseDbActionThunks.patch,
|
|
6
|
+
upsert: databaseDbActionThunks.upsert,
|
|
7
|
+
write: databaseDbActionThunks.write,
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
type SettingDbActionThunks = ReturnType<typeof getDefaultSettingDbActionThunks>;
|
|
11
|
+
|
|
12
|
+
const settingDbActionThunksOverrideKey = Symbol.for(
|
|
13
|
+
"bun-nolo.app.settings.dbActionThunksOverride"
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export const getSettingDbActionThunks = (): SettingDbActionThunks => {
|
|
17
|
+
const globalOverride = (globalThis as Record<PropertyKey, unknown>)[
|
|
18
|
+
settingDbActionThunksOverrideKey
|
|
19
|
+
];
|
|
20
|
+
return (
|
|
21
|
+
(globalOverride as SettingDbActionThunks | undefined) ??
|
|
22
|
+
getDefaultSettingDbActionThunks()
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const setSettingDbActionThunksForTests = (
|
|
27
|
+
override: SettingDbActionThunks | null
|
|
28
|
+
) => {
|
|
29
|
+
if (override) {
|
|
30
|
+
(globalThis as Record<PropertyKey, unknown>)[settingDbActionThunksOverrideKey] = override;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
delete (globalThis as Record<PropertyKey, unknown>)[settingDbActionThunksOverrideKey];
|
|
34
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { createUserPreferenceKey } from "../../database/keys";
|
|
2
|
+
import {
|
|
3
|
+
USER_PREFERENCE_NAMES,
|
|
4
|
+
buildDefaultSpacePreferenceRegisterRecord,
|
|
5
|
+
readUserPreferenceRegisterValue,
|
|
6
|
+
} from "../../database/userPreferenceRegister";
|
|
7
|
+
import { normalizeSpaceId } from "../../create/space/spaceKeys";
|
|
8
|
+
|
|
9
|
+
import { getSettingDbActionThunks } from "./dbActionThunks";
|
|
10
|
+
|
|
11
|
+
export const normalizeDefaultSpaceIdPreference = (
|
|
12
|
+
value: unknown
|
|
13
|
+
): string | null | undefined => {
|
|
14
|
+
if (value === undefined) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (value === null) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (typeof value !== "string") {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const trimmedValue = value.trim();
|
|
27
|
+
if (trimmedValue === "") {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return normalizeSpaceId(trimmedValue);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const readDefaultSpaceIdPreference = async (
|
|
35
|
+
dispatch: any,
|
|
36
|
+
userId?: string | null
|
|
37
|
+
): Promise<string | null> => {
|
|
38
|
+
if (!userId) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const registerKey = createUserPreferenceKey.defaultSpace(userId);
|
|
43
|
+
const record = await dispatch(getSettingDbActionThunks().readAndWait(registerKey))
|
|
44
|
+
.unwrap()
|
|
45
|
+
.catch(() => null);
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
normalizeDefaultSpaceIdPreference(
|
|
49
|
+
readUserPreferenceRegisterValue<string>(
|
|
50
|
+
record,
|
|
51
|
+
USER_PREFERENCE_NAMES.DEFAULT_SPACE
|
|
52
|
+
)
|
|
53
|
+
) ?? null
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const persistDefaultSpacePreference = async (
|
|
58
|
+
dispatch: any,
|
|
59
|
+
userId: string,
|
|
60
|
+
defaultSpaceId: string | null
|
|
61
|
+
) => {
|
|
62
|
+
const registerKey = createUserPreferenceKey.defaultSpace(userId);
|
|
63
|
+
const previousRecord = await dispatch(getSettingDbActionThunks().readAndWait(registerKey))
|
|
64
|
+
.unwrap()
|
|
65
|
+
.catch(() => null);
|
|
66
|
+
|
|
67
|
+
const previousValue =
|
|
68
|
+
readUserPreferenceRegisterValue<string>(
|
|
69
|
+
previousRecord,
|
|
70
|
+
USER_PREFERENCE_NAMES.DEFAULT_SPACE
|
|
71
|
+
) ?? null;
|
|
72
|
+
|
|
73
|
+
if (previousRecord && previousValue === defaultSpaceId) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
await dispatch(
|
|
78
|
+
getSettingDbActionThunks().write({
|
|
79
|
+
customKey: registerKey,
|
|
80
|
+
data: buildDefaultSpacePreferenceRegisterRecord({
|
|
81
|
+
userId,
|
|
82
|
+
defaultSpaceId,
|
|
83
|
+
previousRecord,
|
|
84
|
+
}),
|
|
85
|
+
})
|
|
86
|
+
).unwrap();
|
|
87
|
+
};
|