nolo-cli 0.1.40 → 0.1.42
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 +27 -12
- package/agent-runtime/agentThread.ts +222 -0
- package/agent-runtime/agentThreadAdmission.ts +74 -0
- package/agent-runtime/dialogWritePlan.ts +42 -0
- package/agent-runtime/hostAdapter.ts +1 -0
- package/agent-runtime/hybridRecordStore.ts +5 -3
- package/agent-runtime/index.ts +43 -0
- package/agent-runtime/localLoop.ts +31 -2
- package/agent-runtime/localToolPolicy.ts +1 -0
- package/agent-runtime/localWorkspaceTools.ts +1258 -78
- package/agent-runtime/noloWorkspaceTools.ts +20 -1
- package/agent-runtime/runtimeToolPolicy.ts +1 -5
- package/agent-runtime/runtimeToolSurface.ts +1 -0
- package/agentAliases.ts +29 -9
- package/agentInternalCommandEntries.ts +11 -3
- package/agentMachineCommands.ts +1 -0
- package/agentRecordCommands.ts +2 -2
- package/agentRecordHelpers.ts +59 -6
- package/agentRunCommand.ts +84 -19
- 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 +599 -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 +264 -46
- 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 +2135 -0
- package/ai/agent/streamAgentChatTurnUtils.ts +923 -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 +1165 -0
- package/ai/chat/accumulateToolCallChunks.ts +126 -0
- package/ai/chat/fetchUtils.ts +143 -0
- package/ai/chat/inlineImageUrlsForCustomProvider.ts +122 -0
- package/ai/chat/parseApiError.ts +67 -0
- package/ai/chat/parseMultilineSSE.ts +95 -0
- package/ai/chat/sendOpenAICompletionsRequest.ts +921 -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 +22 -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 +31 -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/policy.ts +49 -0
- package/ai/memory/queryShared.ts +167 -0
- package/ai/memory/recentRelationshipRecap.ts +251 -0
- package/ai/memory/remember.ts +111 -0
- package/ai/memory/scope.ts +74 -0
- package/ai/memory/store.ts +20 -0
- package/ai/memory/storeShared.ts +76 -0
- package/ai/memory/types.ts +52 -0
- package/ai/memory/understanding.ts +341 -0
- package/ai/memory/understandingGreeting.ts +264 -0
- package/ai/policy/personalizationDialog.ts +333 -0
- package/ai/policy/runtimePolicy.ts +526 -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 +214 -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 +54 -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 +2290 -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 +193 -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 +638 -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 +326 -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/toolPacks.ts +19 -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 +58 -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/deletedFavoriteProjection.ts +31 -0
- package/app/favorite/favoriteSlice.ts +690 -0
- package/app/favorite/type.ts +43 -0
- package/app/hooks/deleteDbKey.ts +254 -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 +2206 -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 +118 -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 +75 -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 +78 -0
- package/auth/authSlice.ts +531 -0
- package/auth/client/loginRequest.ts +14 -0
- package/auth/resetAuthScopedClientState.ts +27 -0
- package/auth/routes.ts +183 -0
- package/auth/token.ts +63 -0
- package/auth/types.ts +40 -0
- package/chat/chat.locale.ts +817 -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 +202 -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/dialogAttachmentCleanup.ts +135 -0
- package/chat/dialog/dialogSlice.ts +985 -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/activityCompletion.ts +97 -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/imagePayloadPersistence.ts +22 -0
- package/chat/messages/messageAgent.ts +8 -0
- package/chat/messages/messageContent.ts +203 -0
- package/chat/messages/messageContract.ts +88 -0
- package/chat/messages/messageSlice.ts +1386 -0
- package/chat/messages/toolThunks.ts +646 -0
- package/chat/messages/types.ts +8 -1
- package/chat/messages/web/toolDisplayName.ts +686 -0
- package/cli/agentAliases.ts +29 -9
- package/cli/agentInternalCommandEntries.ts +11 -3
- package/cli/agentMachineCommands.ts +1 -0
- package/cli/agentRecordCommands.ts +2 -2
- package/cli/agentRecordHelpers.ts +59 -6
- package/cli/agentRunCommand.ts +84 -19
- package/cli/client/agentRun.ts +92 -261
- package/cli/client/localRuntimeAdapter.ts +292 -50
- package/cli/commandRegistry.ts +7 -4
- package/cli/dialogAttachmentCleanup.ts +151 -0
- package/cli/dialogCommands.ts +163 -61
- package/cli/dialogInternalCommandEntries.ts +1 -1
- package/cli/docCreateCommands.ts +345 -0
- package/cli/docInternalCommandEntries.ts +11 -0
- package/cli/docPageHelpers.ts +80 -0
- package/cli/docSkillHelpers.ts +67 -0
- package/cli/docSpaceHelpers.ts +46 -0
- package/cli/internalCommandEntries.ts +4 -0
- package/cli/machineCommands.ts +18 -34
- package/cli/memoryCommands.ts +253 -0
- package/cli/memoryInternalCommandEntries.ts +9 -0
- package/cli/qoderUsageProbe.ts +252 -0
- package/cli/scriptCommandEntries.ts +0 -3
- package/cli/secretScan.ts +31 -0
- package/cli/tableCommands.ts +248 -13
- package/cli/workflowInternalCommandEntries.ts +2 -3
- package/client/agentRun.test.ts +119 -83
- package/client/agentRun.ts +92 -261
- package/client/localRuntimeAdapter.test.ts +894 -32
- package/client/localRuntimeAdapter.ts +292 -50
- package/commandRegistry.ts +7 -4
- package/connector-experimental/capabilities.ts +10 -9
- 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 +260 -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/tenantPlacement.ts +57 -0
- package/database/userPreferenceRegister.ts +131 -0
- package/database/utils/ulid.ts +1 -0
- package/dialogAttachmentCleanup.ts +151 -0
- package/dialogCommands.ts +163 -61
- package/dialogInternalCommandEntries.ts +1 -1
- package/docCreateCommands.ts +345 -0
- package/docInternalCommandEntries.ts +11 -0
- package/docPageHelpers.ts +80 -0
- package/docSkillHelpers.ts +67 -0
- package/docSpaceHelpers.ts +46 -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 +271 -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/redaction.ts +68 -0
- package/integrations/xhs-reader/types.ts +277 -0
- package/integrations/xhs-reader/url.ts +80 -0
- package/internalCommandEntries.ts +4 -0
- package/machineCommands.ts +18 -34
- package/memoryCommands.ts +253 -0
- package/memoryInternalCommandEntries.ts +9 -0
- package/package.json +454 -9
- package/qoderUsageProbe.ts +252 -0
- package/render/contentIcon/types.ts +167 -0
- package/render/page/createPageAction.ts +183 -0
- package/render/page/docSlice.ts +495 -0
- package/render/page/types.ts +19 -0
- package/render/table/createTableAction.ts +274 -0
- package/render/table/deleteTableAction.ts +193 -0
- package/render/table/fetchAndCacheTableRows.ts +174 -0
- package/render/table/tableSlice.ts +1167 -0
- package/render/table/toolValueUtils.ts +363 -0
- package/render/table/types.ts +262 -0
- package/render/table/utils/tableSerialization.ts +50 -0
- package/scriptCommandEntries.ts +0 -3
- package/secretScan.ts +31 -0
- package/server/handlers/agentRun/types.ts +105 -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
- package/tableCommands.ts +248 -13
- package/workflowInternalCommandEntries.ts +2 -3
- package/ai/tools/agent/taskRunTool.ts +0 -112
- package/cli/client/taskRunPrompt.ts +0 -27
- package/cli/taskRunCommand.ts +0 -265
- package/client/taskRunPrompt.ts +0 -27
- package/taskRunCommand.ts +0 -265
package/ai/types.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// packages/ai/types.ts
|
|
2
|
+
|
|
3
|
+
export type ModeType =
|
|
4
|
+
| "text"
|
|
5
|
+
| "image"
|
|
6
|
+
| "stream"
|
|
7
|
+
| "audio"
|
|
8
|
+
| "speech"
|
|
9
|
+
| "surf"
|
|
10
|
+
| "vision";
|
|
11
|
+
|
|
12
|
+
export interface PromptFormData {
|
|
13
|
+
name: string;
|
|
14
|
+
content: string;
|
|
15
|
+
category?: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface Contexts {
|
|
20
|
+
// High priority: context from the user's current input for this request.
|
|
21
|
+
currentInputContext?: string | null;
|
|
22
|
+
|
|
23
|
+
// Medium priority: references from past conversation messages.
|
|
24
|
+
historyContext?: string | null;
|
|
25
|
+
|
|
26
|
+
// Specific rules and processes for the bot/agent.
|
|
27
|
+
botInstructionsContext?: string | null;
|
|
28
|
+
|
|
29
|
+
// General knowledge base documents for lookup.
|
|
30
|
+
botKnowledgeContext?: string | null;
|
|
31
|
+
|
|
32
|
+
// 🔹 新增:用户级通用提示词
|
|
33
|
+
userGlobalPrompt?: string;
|
|
34
|
+
|
|
35
|
+
/** 当前正在编辑的对象描述(表格 / 页面 / 文章等),由 buildEditingContextSummary 构造 */
|
|
36
|
+
editingContext?: string | null;
|
|
37
|
+
|
|
38
|
+
/** 当前对话里最近一次 app 相关工具调用提炼出的工作记忆,不依赖右侧 editing target */
|
|
39
|
+
appWorkingMemory?: string | null;
|
|
40
|
+
|
|
41
|
+
/** 当前所在的 Space 信息(Agent 所处的工作台),包含标题、描述等 */
|
|
42
|
+
spaceContext?: string | null;
|
|
43
|
+
|
|
44
|
+
/** 用户偏好与自动化边界(tone / capture / read policy) */
|
|
45
|
+
userPolicyContext?: string | null;
|
|
46
|
+
|
|
47
|
+
/** 长期记忆召回层,由服务端 memory API 基于当前用户、space、agent 和输入生成 */
|
|
48
|
+
memoryOverlay?: string | null;
|
|
49
|
+
|
|
50
|
+
/** 对话增量摘要:已压缩的历史消息概要 */
|
|
51
|
+
dialogSummary?: string | null;
|
|
52
|
+
|
|
53
|
+
/** 主动工作摘要:阶段性沉淀,不代表原始消息已被裁剪 */
|
|
54
|
+
proactiveSummary?: string | null;
|
|
55
|
+
|
|
56
|
+
/** 压缩消息中提取的引用 Key */
|
|
57
|
+
referenceKeys?: string[];
|
|
58
|
+
}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Executor
|
|
3
|
+
*
|
|
4
|
+
* Deterministic execution engine — zero LLM orchestration tokens.
|
|
5
|
+
* Each step runs directly without asking LLM "what to do next".
|
|
6
|
+
* Only "llm" type steps call the model (single call, no tool loop).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { createAsyncThunk } from "@reduxjs/toolkit";
|
|
10
|
+
import type { RootState } from "../../app/store";
|
|
11
|
+
import { runLlm } from "../agent/agentSlice";
|
|
12
|
+
import { toolExecutors } from "../tools";
|
|
13
|
+
import {
|
|
14
|
+
setWorkflow,
|
|
15
|
+
updateStep,
|
|
16
|
+
incrementStepsExecuted,
|
|
17
|
+
incrementFailedSteps,
|
|
18
|
+
} from "./workflowSlice";
|
|
19
|
+
import type {
|
|
20
|
+
WorkflowDefinition,
|
|
21
|
+
WorkflowStep,
|
|
22
|
+
WorkflowToolStep,
|
|
23
|
+
WorkflowLlmStep,
|
|
24
|
+
WorkflowParallelStep,
|
|
25
|
+
WorkflowStepState,
|
|
26
|
+
WorkflowResult,
|
|
27
|
+
} from "./workflowTypes";
|
|
28
|
+
|
|
29
|
+
// --- Template Resolution ---
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Resolves {{steps.<id>.result}} and {{steps.<id>.result[N]}} templates.
|
|
33
|
+
* Walks nested objects/arrays recursively.
|
|
34
|
+
*/
|
|
35
|
+
function resolveTemplates(
|
|
36
|
+
value: any,
|
|
37
|
+
results: Record<string, any>
|
|
38
|
+
): any {
|
|
39
|
+
if (typeof value === "string") {
|
|
40
|
+
return value.replace(
|
|
41
|
+
/\{\{steps\.([^.}\s]+)\.result(\[\d+\])?\}\}/g,
|
|
42
|
+
(match, stepId, indexPart) => {
|
|
43
|
+
const stepResult = results[stepId];
|
|
44
|
+
if (stepResult === undefined) {
|
|
45
|
+
console.warn(`Workflow: cannot resolve {{steps.${stepId}.result}} — step not completed yet`);
|
|
46
|
+
return match;
|
|
47
|
+
}
|
|
48
|
+
let resolved = stepResult;
|
|
49
|
+
if (indexPart) {
|
|
50
|
+
const idx = parseInt(indexPart.slice(1, -1), 10);
|
|
51
|
+
if (Array.isArray(resolved) && idx < resolved.length) {
|
|
52
|
+
resolved = resolved[idx];
|
|
53
|
+
} else {
|
|
54
|
+
console.warn(`Workflow: index ${idx} out of range for steps.${stepId}.result`);
|
|
55
|
+
return match;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return typeof resolved === "object" ? JSON.stringify(resolved) : String(resolved);
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
return value.map((v) => resolveTemplates(v, results));
|
|
64
|
+
}
|
|
65
|
+
if (value !== null && typeof value === "object") {
|
|
66
|
+
return Object.fromEntries(
|
|
67
|
+
Object.entries(value).map(([k, v]) => [k, resolveTemplates(v, results)])
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// --- Condition Evaluation (safe allowlist interpreter) ---
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Validates that an expression contains ONLY:
|
|
77
|
+
* - steps.<identifier> property paths
|
|
78
|
+
* - comparison operators: === !== > < >= <=
|
|
79
|
+
* - logical operators: && || !
|
|
80
|
+
* - string literals, number literals, boolean/null keywords
|
|
81
|
+
* - parentheses and whitespace
|
|
82
|
+
*
|
|
83
|
+
* Strategy: substitute every safe token with a placeholder, then assert
|
|
84
|
+
* nothing else remains. This allowlist approach is far more robust than a
|
|
85
|
+
* blocklist, which can be bypassed with Unicode escapes or bracket notation.
|
|
86
|
+
*/
|
|
87
|
+
function isSafeConditionExpression(expr: string): boolean {
|
|
88
|
+
let s = expr.trim();
|
|
89
|
+
if (!s) return false;
|
|
90
|
+
|
|
91
|
+
// 1. Replace double/single-quoted string literals (no newlines inside)
|
|
92
|
+
s = s.replace(/"[^"\n\\]*(?:\\.[^"\n\\]*)*"/g, "0");
|
|
93
|
+
s = s.replace(/'[^'\n\\]*(?:\\.[^'\n\\]*)*/g, "0");
|
|
94
|
+
|
|
95
|
+
// 2. Replace number literals (int / float)
|
|
96
|
+
s = s.replace(/\b\d+(?:\.\d+)?\b/g, "0");
|
|
97
|
+
|
|
98
|
+
// 3. Replace allowed keywords
|
|
99
|
+
s = s.replace(/\b(true|false|null|undefined)\b/g, "0");
|
|
100
|
+
|
|
101
|
+
// 4. Replace steps.<dotted-path> (e.g. steps.fetchData.output)
|
|
102
|
+
s = s.replace(/\bsteps\.[a-zA-Z_][a-zA-Z0-9_.]*\b/g, "0");
|
|
103
|
+
|
|
104
|
+
// 5. What's left should only be operators, parens, whitespace
|
|
105
|
+
// Allowed characters: 0 (placeholder) space ( ) ! & | = < >
|
|
106
|
+
return /^[0\s()!&|=<>]+$/.test(s);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Safely resolves a dotted property path like "steps.fetchData.output"
|
|
111
|
+
* against the given results object. Returns undefined for any unknown path.
|
|
112
|
+
*/
|
|
113
|
+
function resolvePath(path: string, results: Record<string, any>): unknown {
|
|
114
|
+
// path must be "steps.<segment>[.<segment>...]"
|
|
115
|
+
const parts = path.split(".");
|
|
116
|
+
if (parts[0] !== "steps" || parts.length < 2) return undefined;
|
|
117
|
+
let cur: any = results;
|
|
118
|
+
for (let i = 1; i < parts.length; i++) {
|
|
119
|
+
if (cur === null || cur === undefined || typeof cur !== "object") return undefined;
|
|
120
|
+
cur = cur[parts[i]];
|
|
121
|
+
}
|
|
122
|
+
return cur;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Evaluates a condition expression against step results.
|
|
127
|
+
*
|
|
128
|
+
* Uses an allowlist validator to guarantee the expression contains nothing
|
|
129
|
+
* but property lookups, comparison/logical operators, and literals before
|
|
130
|
+
* delegating to the JS engine. This eliminates the code-execution surface
|
|
131
|
+
* that a keyword blocklist cannot reliably close.
|
|
132
|
+
*/
|
|
133
|
+
function evaluateCondition(
|
|
134
|
+
expression: string,
|
|
135
|
+
results: Record<string, any>
|
|
136
|
+
): boolean {
|
|
137
|
+
if (!isSafeConditionExpression(expression)) {
|
|
138
|
+
console.warn(
|
|
139
|
+
`Workflow: condition expression rejected by allowlist: "${expression}"`
|
|
140
|
+
);
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
// At this point the expression has been validated to contain only safe
|
|
145
|
+
// tokens. We substitute all steps.* paths with their runtime values so
|
|
146
|
+
// the final eval string never needs to reference external globals.
|
|
147
|
+
const resolved = expression.replace(
|
|
148
|
+
/\bsteps\.[a-zA-Z_][a-zA-Z0-9_.]*\b/g,
|
|
149
|
+
(match) => JSON.stringify(resolvePath(match, results))
|
|
150
|
+
);
|
|
151
|
+
// eslint-disable-next-line no-new-func
|
|
152
|
+
const fn = new Function(`"use strict"; return !!(${resolved})`);
|
|
153
|
+
return fn();
|
|
154
|
+
} catch (e) {
|
|
155
|
+
console.warn(`Workflow: condition eval failed: "${expression}"`, e);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Executes `fn` up to `maxRetries + 1` times total.
|
|
164
|
+
* Throws the last error if all attempts fail.
|
|
165
|
+
*/
|
|
166
|
+
async function executeWithRetry<T>(
|
|
167
|
+
fn: () => Promise<T>,
|
|
168
|
+
maxRetries: number
|
|
169
|
+
): Promise<T> {
|
|
170
|
+
let lastError: any;
|
|
171
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
172
|
+
try {
|
|
173
|
+
return await fn();
|
|
174
|
+
} catch (err) {
|
|
175
|
+
lastError = err;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
throw lastError;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// --- Single Step Executors ---
|
|
182
|
+
|
|
183
|
+
async function executeToolStep(
|
|
184
|
+
step: WorkflowToolStep,
|
|
185
|
+
results: Record<string, any>,
|
|
186
|
+
thunkApi: any
|
|
187
|
+
): Promise<any> {
|
|
188
|
+
const executor = toolExecutors[step.tool];
|
|
189
|
+
if (!executor) throw new Error(`Workflow: unknown tool "${step.tool}"`);
|
|
190
|
+
const resolvedArgs = resolveTemplates(step.args, results);
|
|
191
|
+
const result = await executor(resolvedArgs, thunkApi);
|
|
192
|
+
return result?.rawData ?? result;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async function executeLlmStep(
|
|
196
|
+
step: WorkflowLlmStep,
|
|
197
|
+
results: Record<string, any>,
|
|
198
|
+
thunkApi: any
|
|
199
|
+
): Promise<any> {
|
|
200
|
+
const { dispatch } = thunkApi;
|
|
201
|
+
const resolvedPrompt = resolveTemplates(step.prompt, results);
|
|
202
|
+
const result = await dispatch(
|
|
203
|
+
runLlm({
|
|
204
|
+
content: resolvedPrompt,
|
|
205
|
+
isStreaming: false,
|
|
206
|
+
...(step.model && { modelOverride: step.model }),
|
|
207
|
+
})
|
|
208
|
+
).unwrap();
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function executeParallelStep(
|
|
213
|
+
step: WorkflowParallelStep,
|
|
214
|
+
results: Record<string, any>,
|
|
215
|
+
thunkApi: any
|
|
216
|
+
): Promise<Record<string, any>> {
|
|
217
|
+
const subResults = await Promise.all(
|
|
218
|
+
step.steps.map(async (sub) => {
|
|
219
|
+
const subResult =
|
|
220
|
+
sub.type === "tool"
|
|
221
|
+
? await executeToolStep(sub as WorkflowToolStep, results, thunkApi)
|
|
222
|
+
: await executeLlmStep(sub as WorkflowLlmStep, results, thunkApi);
|
|
223
|
+
return [sub.id, subResult] as [string, any];
|
|
224
|
+
})
|
|
225
|
+
);
|
|
226
|
+
return Object.fromEntries(subResults);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// --- Main Executor Thunk ---
|
|
230
|
+
|
|
231
|
+
export const runWorkflow = createAsyncThunk<
|
|
232
|
+
WorkflowResult,
|
|
233
|
+
{ definition: WorkflowDefinition; dialogKey?: string },
|
|
234
|
+
{ state: RootState }
|
|
235
|
+
>("workflow/run", async ({ definition }, thunkApi) => {
|
|
236
|
+
const { dispatch } = thunkApi;
|
|
237
|
+
|
|
238
|
+
// Initialize Redux state for UI visibility
|
|
239
|
+
const initialStepStates: WorkflowStepState[] = definition.steps.map((s) => ({
|
|
240
|
+
id: s.id,
|
|
241
|
+
title: s.title,
|
|
242
|
+
type: s.type,
|
|
243
|
+
status: "pending",
|
|
244
|
+
}));
|
|
245
|
+
dispatch(setWorkflow({ title: definition.title, steps: initialStepStates }));
|
|
246
|
+
|
|
247
|
+
const results: Record<string, any> = {};
|
|
248
|
+
// Set of step IDs to skip (controlled by condition steps)
|
|
249
|
+
const skippedIds = new Set<string>();
|
|
250
|
+
|
|
251
|
+
for (const step of definition.steps) {
|
|
252
|
+
if (skippedIds.has(step.id)) {
|
|
253
|
+
dispatch(updateStep({ id: step.id, updates: { status: "skipped" } }));
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
dispatch(updateStep({ id: step.id, updates: { status: "in-progress" } }));
|
|
258
|
+
|
|
259
|
+
try {
|
|
260
|
+
let result: any;
|
|
261
|
+
|
|
262
|
+
if (step.type === "tool" || step.type === "llm") {
|
|
263
|
+
const retryable = step as WorkflowToolStep | WorkflowLlmStep;
|
|
264
|
+
const policy = retryable.onError ?? "stop";
|
|
265
|
+
const maxRetries =
|
|
266
|
+
policy === "retry" ? ((retryable as WorkflowToolStep).retryCount ?? 1) : 0;
|
|
267
|
+
|
|
268
|
+
result = await executeWithRetry(
|
|
269
|
+
() =>
|
|
270
|
+
step.type === "tool"
|
|
271
|
+
? executeToolStep(step as WorkflowToolStep, results, thunkApi)
|
|
272
|
+
: executeLlmStep(step as WorkflowLlmStep, results, thunkApi),
|
|
273
|
+
maxRetries
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
} else if (step.type === "parallel") {
|
|
277
|
+
result = await executeParallelStep(step, results, thunkApi);
|
|
278
|
+
// Flatten sub-step results into the top-level map so subsequent steps
|
|
279
|
+
// can reference them directly via {{steps.<subId>.result}}.
|
|
280
|
+
for (const [subId, subResult] of Object.entries(
|
|
281
|
+
result as Record<string, any>
|
|
282
|
+
)) {
|
|
283
|
+
results[subId] = subResult;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
} else if (step.type === "condition") {
|
|
287
|
+
const passed = evaluateCondition(step.check, results);
|
|
288
|
+
result = { passed, check: step.check };
|
|
289
|
+
const active = passed ? step.ifTrue : step.ifFalse;
|
|
290
|
+
const inactive = passed ? step.ifFalse : step.ifTrue;
|
|
291
|
+
// Mark steps not on the active branch as skipped
|
|
292
|
+
if (inactive) inactive.forEach((id) => skippedIds.add(id));
|
|
293
|
+
// Steps on the active branch are explicitly NOT skipped
|
|
294
|
+
if (active) active.forEach((id) => skippedIds.delete(id));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
results[step.id] = result;
|
|
298
|
+
dispatch(updateStep({ id: step.id, updates: { status: "completed", result } }));
|
|
299
|
+
dispatch(incrementStepsExecuted());
|
|
300
|
+
|
|
301
|
+
} catch (err: any) {
|
|
302
|
+
dispatch(incrementFailedSteps());
|
|
303
|
+
dispatch(
|
|
304
|
+
updateStep({ id: step.id, updates: { status: "failed", error: err?.message ?? String(err) } })
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
const policy = (step as WorkflowToolStep | WorkflowLlmStep).onError ?? "stop";
|
|
308
|
+
|
|
309
|
+
if (policy === "stop") {
|
|
310
|
+
return {
|
|
311
|
+
success: false,
|
|
312
|
+
results,
|
|
313
|
+
failedStep: step.id,
|
|
314
|
+
error: err?.message ?? String(err),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
// skip / retry-exhausted: record null and continue
|
|
318
|
+
results[step.id] = null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return { success: true, results };
|
|
323
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type PayloadAction, createSlice } from "@reduxjs/toolkit";
|
|
2
|
+
import type { RootState } from "../../app/store";
|
|
3
|
+
import type {
|
|
4
|
+
WorkflowStepState,
|
|
5
|
+
WorkflowExecutionStats,
|
|
6
|
+
} from "./workflowTypes";
|
|
7
|
+
|
|
8
|
+
interface WorkflowSliceState {
|
|
9
|
+
title: string | null;
|
|
10
|
+
steps: WorkflowStepState[];
|
|
11
|
+
stats: WorkflowExecutionStats;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const initialState: WorkflowSliceState = {
|
|
15
|
+
title: null,
|
|
16
|
+
steps: [],
|
|
17
|
+
stats: {
|
|
18
|
+
startTime: null,
|
|
19
|
+
totalStepsExecuted: 0,
|
|
20
|
+
failedSteps: 0,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const workflowSlice = createSlice({
|
|
25
|
+
name: "workflow",
|
|
26
|
+
initialState,
|
|
27
|
+
reducers: {
|
|
28
|
+
setWorkflow: (
|
|
29
|
+
state,
|
|
30
|
+
action: PayloadAction<{ title: string; steps: WorkflowStepState[] }>
|
|
31
|
+
) => {
|
|
32
|
+
state.title = action.payload.title;
|
|
33
|
+
state.steps = action.payload.steps;
|
|
34
|
+
state.stats = { startTime: Date.now(), totalStepsExecuted: 0, failedSteps: 0 };
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
updateStep: (
|
|
38
|
+
state,
|
|
39
|
+
action: PayloadAction<{ id: string; updates: Partial<WorkflowStepState> }>
|
|
40
|
+
) => {
|
|
41
|
+
const step = state.steps.find((s) => s.id === action.payload.id);
|
|
42
|
+
if (step) Object.assign(step, action.payload.updates);
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
incrementStepsExecuted: (state) => {
|
|
46
|
+
state.stats.totalStepsExecuted += 1;
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
incrementFailedSteps: (state) => {
|
|
50
|
+
state.stats.failedSteps += 1;
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
clearWorkflow: () => initialState,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export const {
|
|
58
|
+
setWorkflow,
|
|
59
|
+
updateStep,
|
|
60
|
+
incrementStepsExecuted,
|
|
61
|
+
incrementFailedSteps,
|
|
62
|
+
clearWorkflow,
|
|
63
|
+
} = workflowSlice.actions;
|
|
64
|
+
|
|
65
|
+
export const selectWorkflowSteps = (state: RootState) => state.workflow.steps;
|
|
66
|
+
export const selectWorkflowTitle = (state: RootState) => state.workflow.title;
|
|
67
|
+
export const selectWorkflowStats = (state: RootState) => state.workflow.stats;
|
|
68
|
+
export const selectPendingSteps = (state: RootState) =>
|
|
69
|
+
state.workflow.steps.filter((s) => s.status === "pending");
|
|
70
|
+
export const selectCompletedSteps = (state: RootState) =>
|
|
71
|
+
state.workflow.steps.filter((s) => s.status === "completed");
|
|
72
|
+
|
|
73
|
+
export default workflowSlice.reducer;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Workflow: deterministic execution engine, zero LLM orchestration tokens.
|
|
2
|
+
// LLM calls createWorkflow once to define steps; engine executes without further LLM involvement.
|
|
3
|
+
// Only "llm" type steps invoke the model; all others run as pure tool calls.
|
|
4
|
+
|
|
5
|
+
export type WorkflowStepStatus = "pending" | "in-progress" | "completed" | "failed" | "skipped";
|
|
6
|
+
|
|
7
|
+
export type OnErrorPolicy = "stop" | "skip" | "retry";
|
|
8
|
+
|
|
9
|
+
// --- Step Types ---
|
|
10
|
+
|
|
11
|
+
export interface WorkflowToolStep {
|
|
12
|
+
id: string;
|
|
13
|
+
type: "tool";
|
|
14
|
+
title?: string;
|
|
15
|
+
/** Registered tool name */
|
|
16
|
+
tool: string;
|
|
17
|
+
/** Args supporting {{steps.<id>.result}} and {{steps.<id>.result[N]}} templates */
|
|
18
|
+
args: Record<string, any>;
|
|
19
|
+
onError?: OnErrorPolicy;
|
|
20
|
+
retryCount?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface WorkflowLlmStep {
|
|
24
|
+
id: string;
|
|
25
|
+
type: "llm";
|
|
26
|
+
title?: string;
|
|
27
|
+
/** Prompt supporting {{steps.<id>.result}} templates */
|
|
28
|
+
prompt: string;
|
|
29
|
+
model?: string;
|
|
30
|
+
onError?: OnErrorPolicy;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** All steps inside run concurrently via Promise.all */
|
|
34
|
+
export interface WorkflowParallelStep {
|
|
35
|
+
id: string;
|
|
36
|
+
type: "parallel";
|
|
37
|
+
title?: string;
|
|
38
|
+
steps: (WorkflowToolStep | WorkflowLlmStep)[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Pure JS condition check — no LLM.
|
|
43
|
+
* `check` is a JS expression string evaluated with step results in scope.
|
|
44
|
+
*
|
|
45
|
+
* Supported syntax (allowlist):
|
|
46
|
+
* - Dotted property access: `steps.<stepId>.<property>[.<nested>...]`
|
|
47
|
+
* - Comparison operators: === !== > < >= <=
|
|
48
|
+
* - Logical operators: && || !
|
|
49
|
+
* - String / number / boolean / null literals
|
|
50
|
+
* - Parentheses for grouping
|
|
51
|
+
*
|
|
52
|
+
* Note: bracket notation (`steps['id']`) and `.result` wrappers are NOT supported.
|
|
53
|
+
* The value stored for each step is the raw executor return value, accessed directly:
|
|
54
|
+
* e.g. `"steps.validate.isValid === true"`
|
|
55
|
+
* `"steps.score.value >= 80 && steps.flag.ok !== false"`
|
|
56
|
+
*/
|
|
57
|
+
export interface WorkflowConditionStep {
|
|
58
|
+
id: string;
|
|
59
|
+
type: "condition";
|
|
60
|
+
title?: string;
|
|
61
|
+
check: string;
|
|
62
|
+
/** Step IDs to execute when check is truthy (skip others) */
|
|
63
|
+
ifTrue?: string[];
|
|
64
|
+
/** Step IDs to execute when check is falsy (skip others) */
|
|
65
|
+
ifFalse?: string[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type WorkflowStep =
|
|
69
|
+
| WorkflowToolStep
|
|
70
|
+
| WorkflowLlmStep
|
|
71
|
+
| WorkflowParallelStep
|
|
72
|
+
| WorkflowConditionStep;
|
|
73
|
+
|
|
74
|
+
// --- Workflow Definition ---
|
|
75
|
+
|
|
76
|
+
export interface WorkflowDefinition {
|
|
77
|
+
title: string;
|
|
78
|
+
steps: WorkflowStep[];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// --- Execution State (stored in Redux) ---
|
|
82
|
+
|
|
83
|
+
export interface WorkflowStepState {
|
|
84
|
+
id: string;
|
|
85
|
+
title?: string;
|
|
86
|
+
type: WorkflowStep["type"];
|
|
87
|
+
status: WorkflowStepStatus;
|
|
88
|
+
result?: any;
|
|
89
|
+
error?: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface WorkflowExecutionStats {
|
|
93
|
+
startTime: number | null;
|
|
94
|
+
totalStepsExecuted: number;
|
|
95
|
+
failedSteps: number;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// --- Result ---
|
|
99
|
+
|
|
100
|
+
export interface WorkflowResult {
|
|
101
|
+
success: boolean;
|
|
102
|
+
/** Results keyed by step id */
|
|
103
|
+
results: Record<string, any>;
|
|
104
|
+
failedStep?: string;
|
|
105
|
+
error?: string;
|
|
106
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// 文件路径: app/actions/syncAppRecord.ts
|
|
2
|
+
//
|
|
3
|
+
// 将 app record 同步到客户端本地 DB + 所有 syncServers。
|
|
4
|
+
// 适用场景:
|
|
5
|
+
// - 应用部署成功后(currentServer 已写入,syncServers 还没有)
|
|
6
|
+
// - 应用可见性/元数据更新后
|
|
7
|
+
//
|
|
8
|
+
// 不写 currentServer(它在 deploy/update 时已由服务端直接写入)。
|
|
9
|
+
|
|
10
|
+
import type { AppDispatch, RootState } from "../store";
|
|
11
|
+
import {
|
|
12
|
+
selectCurrentServer,
|
|
13
|
+
selectSyncServers,
|
|
14
|
+
} from "../settings/settingSlice";
|
|
15
|
+
import { DataType } from "../../create/types";
|
|
16
|
+
import { noloWriteRequest } from "../../database/requests";
|
|
17
|
+
|
|
18
|
+
interface SyncAppRecordOptions {
|
|
19
|
+
includeCurrentServer?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const syncAppRecord =
|
|
23
|
+
(
|
|
24
|
+
appKey: string,
|
|
25
|
+
appRecord: Record<string, any>,
|
|
26
|
+
options: SyncAppRecordOptions = {}
|
|
27
|
+
) =>
|
|
28
|
+
async (_dispatch: AppDispatch, getState: () => RootState, extra: any): Promise<void> => {
|
|
29
|
+
if (!appKey || !appRecord) return;
|
|
30
|
+
|
|
31
|
+
const state = getState();
|
|
32
|
+
const currentServer = selectCurrentServer(state);
|
|
33
|
+
const syncServers = selectSyncServers(state) ?? [];
|
|
34
|
+
const { db: clientDb } = extra ?? {};
|
|
35
|
+
|
|
36
|
+
// This path is intentionally still keyed off deployment settings instead of
|
|
37
|
+
// the shared runtime helpers. App records are mixed local/remote state:
|
|
38
|
+
// local cache for local-first reads, plus explicit fan-out to deploy peers.
|
|
39
|
+
// Keep this separate from generic content CRUD until app local-dev/deploy
|
|
40
|
+
// ownership is redesigned in the later app phase.
|
|
41
|
+
|
|
42
|
+
const normalizedRecord = {
|
|
43
|
+
...appRecord,
|
|
44
|
+
dbKey: appKey,
|
|
45
|
+
type: DataType.APP,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// 1. 写本地 DB(供离线读 / local-first 查询)
|
|
49
|
+
if (clientDb) {
|
|
50
|
+
await clientDb.put(appKey, normalizedRecord).catch((err: unknown) => {
|
|
51
|
+
console.warn("[syncAppRecord] local DB write failed:", appKey, err);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 2. 推送到目标服务器。
|
|
56
|
+
// 默认跳过 currentServer(deploy/update 主写路径已在当前 server 完成),
|
|
57
|
+
// 但在“远端回读后本地收敛”场景下可以显式要求把 currentServer 也补齐。
|
|
58
|
+
const rawServers = options.includeCurrentServer
|
|
59
|
+
? [currentServer, ...syncServers]
|
|
60
|
+
: syncServers.filter((s) => s !== currentServer);
|
|
61
|
+
const serversToSync = [...new Set(rawServers.filter((s): s is string => !!s))];
|
|
62
|
+
if (serversToSync.length === 0) return;
|
|
63
|
+
|
|
64
|
+
await Promise.allSettled(
|
|
65
|
+
serversToSync.map((server) =>
|
|
66
|
+
noloWriteRequest(
|
|
67
|
+
server,
|
|
68
|
+
{ data: normalizedRecord, customKey: appKey, userId: normalizedRecord.userId },
|
|
69
|
+
state
|
|
70
|
+
)
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const ANIMATION_SETS = [
|
|
2
|
+
["·", "◇", "◆", "◈", "❖"], // 菱形展开
|
|
3
|
+
["·", "+", "✚", "✛", "✜"], // 十字扩展
|
|
4
|
+
["✾", "❀", "✿", "❁", "❃"], // 开花
|
|
5
|
+
["✦", "✧", "✩", "✪", "✫"], // 星辰
|
|
6
|
+
["·", "❄", "❅", "❆", "❉"], // 雪花
|
|
7
|
+
["◌", "⊚", "⊛", "⊝", "◎"], // 螺旋
|
|
8
|
+
["☙", "❦", "❧", "⸙", "⸎"], // 禅意
|
|
9
|
+
] as const;
|
|
10
|
+
|
|
11
|
+
export const ANIMATION_SET_NAMES = [
|
|
12
|
+
"菱形展开",
|
|
13
|
+
"十字扩展",
|
|
14
|
+
"花开富贵",
|
|
15
|
+
"星辰大海",
|
|
16
|
+
"冬日雪花",
|
|
17
|
+
"螺旋上升",
|
|
18
|
+
"禅意时刻",
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
export const DEFAULT_ANIMATION_SET_INDEX = 0;
|