nolo-cli 0.1.40 → 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/agent-runtime/hybridRecordStore.ts +5 -3
- 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 +65 -6
- 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/client/agentRun.ts +27 -8
- package/cli/client/localRuntimeAdapter.ts +144 -28
- package/client/agentRun.test.ts +52 -0
- package/client/agentRun.ts +27 -8
- package/client/localRuntimeAdapter.test.ts +437 -6
- package/client/localRuntimeAdapter.ts +144 -28
- 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/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/package.json +430 -4
- 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
|
@@ -42,6 +42,8 @@ import {
|
|
|
42
42
|
type HybridRecordStore,
|
|
43
43
|
} from "./hybridRecordStore";
|
|
44
44
|
import { executeLocalToolWithPolicy } from "./localToolPolicy";
|
|
45
|
+
import { inferCaptureIntent } from "../ai/policy/runtimePolicy";
|
|
46
|
+
import { prepareTools } from "../ai/tools/prepareTools";
|
|
45
47
|
import { taskRunFunctionSchema } from "../ai/tools/agent/taskRunTool";
|
|
46
48
|
import {
|
|
47
49
|
MIMO_MONTH_AGENT_KEY,
|
|
@@ -56,6 +58,11 @@ import {
|
|
|
56
58
|
} from "../agent-runtime/noloWorkspaceTools";
|
|
57
59
|
import { executeCli as defaultExecuteCli, type CliExecuteResult, type CliImageInput } from "../ai/agent/cliExecutor";
|
|
58
60
|
import { buildCliPrompt } from "../ai/agent/cliPrompt";
|
|
61
|
+
import {
|
|
62
|
+
readXhsProfileFunc,
|
|
63
|
+
readXhsProfileFunctionSchema,
|
|
64
|
+
} from "../ai/tools/readXhsProfileTool";
|
|
65
|
+
import { resolveDefaultXhsProfileDir } from "../integrations/xhs-reader/bridge/readXhsProfileWithBridge";
|
|
59
66
|
|
|
60
67
|
type EnvLike = Record<string, string | undefined>;
|
|
61
68
|
type FetchInput = Parameters<typeof fetch>[0];
|
|
@@ -78,6 +85,14 @@ export const BUILTIN_NOLO_AGENT_ID = NOLO_DEFAULT_AGENT_ID;
|
|
|
78
85
|
export const BUILTIN_NOLO_AGENT_KEY = NOLO_DEFAULT_AGENT_KEY;
|
|
79
86
|
const CLI_DIR = dirname(fileURLToPath(import.meta.url));
|
|
80
87
|
const CLI_ENTRYPOINT = join(CLI_DIR, "..", "index.ts");
|
|
88
|
+
const LOCAL_SERVER_TABLE_TOOL_NAMES = [
|
|
89
|
+
"createTable",
|
|
90
|
+
"addTableRow",
|
|
91
|
+
"addTableRows",
|
|
92
|
+
"updateTableRow",
|
|
93
|
+
"updateTableRows",
|
|
94
|
+
] as const;
|
|
95
|
+
const LOCAL_SERVER_TABLE_TOOL_NAME_SET = new Set<string>(LOCAL_SERVER_TABLE_TOOL_NAMES);
|
|
81
96
|
|
|
82
97
|
export type CliLocalRuntimeDb = CliKvDb;
|
|
83
98
|
|
|
@@ -91,6 +106,7 @@ export type CliLocalRuntimeAdapterDeps = {
|
|
|
91
106
|
cwd?: string;
|
|
92
107
|
output?: { write(chunk: string): unknown };
|
|
93
108
|
localToolExecutors?: Record<string, (call: any) => Promise<{ content: string; metadata?: Record<string, unknown> }>>;
|
|
109
|
+
readXhsProfile?: typeof readXhsProfileFunc;
|
|
94
110
|
executeCli?: LocalCliExecutor;
|
|
95
111
|
sleep?: (ms: number) => Promise<void>;
|
|
96
112
|
loopbackRequest?: (input: FetchInput, init?: FetchInit) => Promise<Response>;
|
|
@@ -235,12 +251,14 @@ function buildRequestTimeoutSignal(timeoutMs?: number) {
|
|
|
235
251
|
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
236
252
|
return undefined;
|
|
237
253
|
}
|
|
238
|
-
if (typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function") {
|
|
239
|
-
return AbortSignal.timeout(timeoutMs);
|
|
240
|
-
}
|
|
241
254
|
const controller = new AbortController();
|
|
242
|
-
setTimeout(() =>
|
|
243
|
-
|
|
255
|
+
const timeout = setTimeout(() => {
|
|
256
|
+
controller.abort(new Error(`request timed out after ${timeoutMs}ms`));
|
|
257
|
+
}, timeoutMs);
|
|
258
|
+
return {
|
|
259
|
+
signal: controller.signal,
|
|
260
|
+
clear: () => clearTimeout(timeout),
|
|
261
|
+
};
|
|
244
262
|
}
|
|
245
263
|
|
|
246
264
|
function summarizeEndpoint(value: unknown) {
|
|
@@ -383,12 +401,17 @@ function buildLocalPolicyToolNames(args: { toolNames?: string[]; env: EnvLike })
|
|
|
383
401
|
exposeShellTools: true,
|
|
384
402
|
}),
|
|
385
403
|
...((args.toolNames ?? []).includes("taskRun") ? ["taskRun"] : []),
|
|
404
|
+
...((args.toolNames ?? []).includes("read_xhs_profile") ? ["read_xhs_profile"] : []),
|
|
405
|
+
...(args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
|
|
386
406
|
...filterNoloWorkspaceToolNames(args.toolNames),
|
|
387
407
|
];
|
|
388
408
|
}
|
|
389
409
|
|
|
390
410
|
function buildServerPlatformOpenAiTools(args: { toolNames?: string[] }) {
|
|
391
411
|
const toolNames = new Set(args.toolNames ?? []);
|
|
412
|
+
const tableTools = prepareTools(
|
|
413
|
+
(args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
|
|
414
|
+
);
|
|
392
415
|
return [
|
|
393
416
|
...(toolNames.has("taskRun")
|
|
394
417
|
? [{
|
|
@@ -396,6 +419,13 @@ function buildServerPlatformOpenAiTools(args: { toolNames?: string[] }) {
|
|
|
396
419
|
function: taskRunFunctionSchema,
|
|
397
420
|
}]
|
|
398
421
|
: []),
|
|
422
|
+
...(toolNames.has("read_xhs_profile")
|
|
423
|
+
? [{
|
|
424
|
+
type: "function",
|
|
425
|
+
function: readXhsProfileFunctionSchema,
|
|
426
|
+
}]
|
|
427
|
+
: []),
|
|
428
|
+
...tableTools,
|
|
399
429
|
];
|
|
400
430
|
}
|
|
401
431
|
|
|
@@ -467,29 +497,72 @@ function buildServerPlatformToolExecutors(args: {
|
|
|
467
497
|
env: EnvLike;
|
|
468
498
|
fetchImpl: typeof fetch;
|
|
469
499
|
}) {
|
|
500
|
+
const postServer = async (path: string, body: object) => {
|
|
501
|
+
const serverUrl = resolveRuntimeServerUrl(args.env);
|
|
502
|
+
const authToken = resolveRuntimeAuthToken(args.env);
|
|
503
|
+
if (!serverUrl) throw new Error("server platform tools require NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
|
|
504
|
+
if (!authToken) throw new Error("server platform tools require AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
|
|
505
|
+
const response = await args.fetchImpl(`${serverUrl}${path}`, {
|
|
506
|
+
method: "POST",
|
|
507
|
+
headers: {
|
|
508
|
+
"Content-Type": "application/json",
|
|
509
|
+
Authorization: `Bearer ${authToken}`,
|
|
510
|
+
},
|
|
511
|
+
body: JSON.stringify(body),
|
|
512
|
+
});
|
|
513
|
+
const text = await response.text().catch(() => "");
|
|
514
|
+
if (!response.ok) {
|
|
515
|
+
throw new Error(`server platform tool bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
|
|
516
|
+
}
|
|
517
|
+
return text;
|
|
518
|
+
};
|
|
519
|
+
const guardExplicitTableCapture = (call: any) => {
|
|
520
|
+
if (inferCaptureIntent(String(call.userInput ?? "")) === "strong") return null;
|
|
521
|
+
return JSON.stringify({
|
|
522
|
+
error: "knowledge_capture_requires_confirmation",
|
|
523
|
+
message:
|
|
524
|
+
"当前本地运行不允许自动写入表格。只有当用户在当前请求里明确要求保存、建表、写入 table 或做成数据集时,才能继续;否则请先询问用户。",
|
|
525
|
+
policy: {
|
|
526
|
+
capability: "knowledge_capture",
|
|
527
|
+
target: "table",
|
|
528
|
+
mode: "explicit-only-local",
|
|
529
|
+
},
|
|
530
|
+
});
|
|
531
|
+
};
|
|
532
|
+
const tableExecutors = Object.fromEntries(
|
|
533
|
+
LOCAL_SERVER_TABLE_TOOL_NAMES.map((toolName) => [
|
|
534
|
+
toolName,
|
|
535
|
+
async (call: any) => {
|
|
536
|
+
const blocked = guardExplicitTableCapture(call);
|
|
537
|
+
if (blocked) {
|
|
538
|
+
return {
|
|
539
|
+
content: blocked,
|
|
540
|
+
metadata: { serverPlatformTool: true, tableWriteBlocked: true },
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
const parsed = parseNoloWorkspaceToolArguments(call.arguments);
|
|
544
|
+
const path =
|
|
545
|
+
toolName === "createTable" ? "/api/table/create"
|
|
546
|
+
: toolName === "addTableRow" ? "/api/table/add-row"
|
|
547
|
+
: toolName === "addTableRows" ? "/api/table/add-rows"
|
|
548
|
+
: toolName === "updateTableRow" ? "/api/table/update-row"
|
|
549
|
+
: "/api/table/update-rows";
|
|
550
|
+
const content = await postServer(path, parsed);
|
|
551
|
+
return {
|
|
552
|
+
content,
|
|
553
|
+
metadata: { serverPlatformTool: true, tableWrite: true },
|
|
554
|
+
};
|
|
555
|
+
},
|
|
556
|
+
]),
|
|
557
|
+
);
|
|
470
558
|
return {
|
|
471
559
|
taskRun: async (call: any) => {
|
|
472
|
-
const serverUrl = resolveRuntimeServerUrl(args.env);
|
|
473
|
-
const authToken = resolveRuntimeAuthToken(args.env);
|
|
474
|
-
if (!serverUrl) throw new Error("taskRun requires NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
|
|
475
|
-
if (!authToken) throw new Error("taskRun requires AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
|
|
476
|
-
const response = await args.fetchImpl(`${serverUrl}/api/task-run`, {
|
|
477
|
-
method: "POST",
|
|
478
|
-
headers: {
|
|
479
|
-
"Content-Type": "application/json",
|
|
480
|
-
Authorization: `Bearer ${authToken}`,
|
|
481
|
-
},
|
|
482
|
-
body: JSON.stringify(parseNoloWorkspaceToolArguments(call.arguments)),
|
|
483
|
-
});
|
|
484
|
-
const text = await response.text().catch(() => "");
|
|
485
|
-
if (!response.ok) {
|
|
486
|
-
throw new Error(`taskRun bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
|
|
487
|
-
}
|
|
488
560
|
return {
|
|
489
|
-
content:
|
|
561
|
+
content: await postServer("/api/task-run", parseNoloWorkspaceToolArguments(call.arguments)),
|
|
490
562
|
metadata: { serverPlatformTool: true },
|
|
491
563
|
};
|
|
492
564
|
},
|
|
565
|
+
...tableExecutors,
|
|
493
566
|
};
|
|
494
567
|
}
|
|
495
568
|
|
|
@@ -498,9 +571,34 @@ function buildLocalToolExecutors(args: {
|
|
|
498
571
|
env: EnvLike;
|
|
499
572
|
fetchImpl: typeof fetch;
|
|
500
573
|
localToolExecutors?: CliLocalRuntimeAdapterDeps["localToolExecutors"];
|
|
574
|
+
readXhsProfile?: CliLocalRuntimeAdapterDeps["readXhsProfile"];
|
|
501
575
|
commandTimeoutMs?: number;
|
|
502
576
|
commandOutputLimit?: number;
|
|
503
577
|
}) {
|
|
578
|
+
const resolveCliDefaultXhsArgs = (parsedArgs: any) => {
|
|
579
|
+
if (
|
|
580
|
+
parsedArgs?.profileDir ||
|
|
581
|
+
parsedArgs?.profile_dir ||
|
|
582
|
+
args.env.NOLO_XHS_READER_PROFILE_DIR
|
|
583
|
+
) {
|
|
584
|
+
return parsedArgs;
|
|
585
|
+
}
|
|
586
|
+
return {
|
|
587
|
+
...parsedArgs,
|
|
588
|
+
profileDir: resolveDefaultXhsProfileDir({
|
|
589
|
+
env: {
|
|
590
|
+
...process.env,
|
|
591
|
+
...args.env,
|
|
592
|
+
NOLO_DESKTOP: "1",
|
|
593
|
+
NOLO_DESKTOP_CHANNEL:
|
|
594
|
+
args.env.NOLO_DESKTOP_CHANNEL?.trim() ||
|
|
595
|
+
args.env.NOLO_XHS_READER_DESKTOP_CHANNEL?.trim() ||
|
|
596
|
+
"stable",
|
|
597
|
+
},
|
|
598
|
+
}),
|
|
599
|
+
};
|
|
600
|
+
};
|
|
601
|
+
|
|
504
602
|
return {
|
|
505
603
|
...createLocalWorkspaceToolExecutors({
|
|
506
604
|
workspaceRoot: args.workspaceRoot,
|
|
@@ -514,6 +612,22 @@ function buildLocalToolExecutors(args: {
|
|
|
514
612
|
...buildCliWorkspaceToolExecutors({
|
|
515
613
|
env: args.env,
|
|
516
614
|
}),
|
|
615
|
+
read_xhs_profile: async (call: any) => {
|
|
616
|
+
const parsedArgs = (() => {
|
|
617
|
+
try { return JSON.parse(call.arguments || "{}"); } catch { return {}; }
|
|
618
|
+
})();
|
|
619
|
+
const result = await (args.readXhsProfile ?? readXhsProfileFunc)(
|
|
620
|
+
resolveCliDefaultXhsArgs(parsedArgs),
|
|
621
|
+
undefined,
|
|
622
|
+
);
|
|
623
|
+
return {
|
|
624
|
+
content: JSON.stringify(result.rawData),
|
|
625
|
+
metadata: {
|
|
626
|
+
xhsLocalBridge: true,
|
|
627
|
+
displayData: result.displayData,
|
|
628
|
+
},
|
|
629
|
+
};
|
|
630
|
+
},
|
|
517
631
|
...(args.localToolExecutors ?? {}),
|
|
518
632
|
};
|
|
519
633
|
}
|
|
@@ -599,6 +713,7 @@ export function createCliLocalRuntimeAdapter(
|
|
|
599
713
|
env: deps.env,
|
|
600
714
|
fetchImpl,
|
|
601
715
|
localToolExecutors: deps.localToolExecutors,
|
|
716
|
+
readXhsProfile: deps.readXhsProfile,
|
|
602
717
|
...runtimeToolExecutionLimits,
|
|
603
718
|
});
|
|
604
719
|
|
|
@@ -629,6 +744,7 @@ export function createCliLocalRuntimeAdapter(
|
|
|
629
744
|
env: deps.env,
|
|
630
745
|
fetchImpl,
|
|
631
746
|
localToolExecutors: deps.localToolExecutors,
|
|
747
|
+
readXhsProfile: deps.readXhsProfile,
|
|
632
748
|
...runtimeToolExecutionLimits,
|
|
633
749
|
});
|
|
634
750
|
return agentConfig;
|
|
@@ -725,7 +841,7 @@ export function createCliLocalRuntimeAdapter(
|
|
|
725
841
|
messages,
|
|
726
842
|
tools,
|
|
727
843
|
});
|
|
728
|
-
const
|
|
844
|
+
const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
|
|
729
845
|
logLocalRuntimeDiagnostic("provider.request.start", {
|
|
730
846
|
agentKey: agentConfig.key,
|
|
731
847
|
transport: "platform-proxy",
|
|
@@ -740,11 +856,11 @@ export function createCliLocalRuntimeAdapter(
|
|
|
740
856
|
});
|
|
741
857
|
const res = await fetchWithTransientRetry(fetchImpl, request.url, {
|
|
742
858
|
...request.init,
|
|
743
|
-
...(
|
|
859
|
+
...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
|
|
744
860
|
}, {
|
|
745
861
|
sleep: deps.sleep,
|
|
746
862
|
loopbackRequest,
|
|
747
|
-
});
|
|
863
|
+
}).finally(() => timeoutSignal?.clear());
|
|
748
864
|
const raw = await res.text().catch(() => "");
|
|
749
865
|
logLocalRuntimeDiagnostic("provider.request.result", {
|
|
750
866
|
agentKey: agentConfig.key,
|
|
@@ -798,7 +914,7 @@ export function createCliLocalRuntimeAdapter(
|
|
|
798
914
|
messages,
|
|
799
915
|
tools,
|
|
800
916
|
});
|
|
801
|
-
const
|
|
917
|
+
const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
|
|
802
918
|
logLocalRuntimeDiagnostic("provider.request.start", {
|
|
803
919
|
agentKey: agentConfig.key,
|
|
804
920
|
transport: "direct-openai-compatible",
|
|
@@ -812,11 +928,11 @@ export function createCliLocalRuntimeAdapter(
|
|
|
812
928
|
});
|
|
813
929
|
const res = await fetchWithTransientRetry(fetchImpl, request.url, {
|
|
814
930
|
...request.init,
|
|
815
|
-
...(
|
|
931
|
+
...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
|
|
816
932
|
}, {
|
|
817
933
|
sleep: deps.sleep,
|
|
818
934
|
loopbackRequest,
|
|
819
|
-
});
|
|
935
|
+
}).finally(() => timeoutSignal?.clear());
|
|
820
936
|
const raw = await res.text().catch(() => "");
|
|
821
937
|
logLocalRuntimeDiagnostic("provider.request.result", {
|
|
822
938
|
agentKey: agentConfig.key,
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { APP_BUILDER_PRESET } from "../ai/tools/agent/presets/appBuilderPreset";
|
|
2
|
+
import { FIREWORKS_KIMI_LATEST_MODEL } from "../ai/llm/kimi";
|
|
3
|
+
|
|
4
|
+
export const BUILTIN_NOLO_AGENT_KEY = "agent-pub-01NOLOAPPBLD000000019KCKT0";
|
|
5
|
+
export const BUILTIN_APP_BUILDER_AGENT_KEY =
|
|
6
|
+
"agent-pub-01APPBUILDER00000001YAII3I";
|
|
7
|
+
export const BUILTIN_ECOMMERCE_AGENT_KEY =
|
|
8
|
+
"agent-pub-01ECOMMERCEAG00000001PYQ2J";
|
|
9
|
+
export const BUILTIN_AGENT_CREATOR_AGENT_KEY =
|
|
10
|
+
"agent-pub-01NOLOAGENTCRT000000000001";
|
|
11
|
+
export const BUILTIN_NOLO_AGENT_ID = "01NOLOAPPBLD000000019KCKT0";
|
|
12
|
+
export const BUILTIN_APP_BUILDER_AGENT_ID = "01APPBUILDER00000001YAII3I";
|
|
13
|
+
export const BUILTIN_ECOMMERCE_AGENT_ID = "01ECOMMERCEAG00000001PYQ2J";
|
|
14
|
+
export const BUILTIN_AGENT_CREATOR_AGENT_ID = "01NOLOAGENTCRT000000000001";
|
|
15
|
+
|
|
16
|
+
const BUILTIN_PUBLIC_RUNTIME_SERVER_BASE = "https://nolo.chat";
|
|
17
|
+
|
|
18
|
+
const buildBuiltinBaseAgent = (overrides: Record<string, unknown>) => {
|
|
19
|
+
const timestamp = Date.now();
|
|
20
|
+
return {
|
|
21
|
+
type: "agent",
|
|
22
|
+
isPublic: true,
|
|
23
|
+
userId: "builtin",
|
|
24
|
+
createdAt: timestamp,
|
|
25
|
+
updatedAt: timestamp,
|
|
26
|
+
references: [],
|
|
27
|
+
...overrides,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const BUILTIN_NOLO_PROMPT = [
|
|
32
|
+
"你是 nolo,负责帮助刚进入产品的用户理解现在能做什么,并把他们带到合适的下一步。",
|
|
33
|
+
"优先直接回答、解释入口、帮用户开始对话、创建 AI、创建文档,或把任务交给更合适的 agent。",
|
|
34
|
+
"用户只是泛泛提问时,先收敛问题,不要立刻切换到重型流程。",
|
|
35
|
+
`当用户明确要创建、定制或发布 AI / Agent / 智能体时,调用 runStreamingAgent 转交给 AI 创建助手,agentKey 是 ${BUILTIN_AGENT_CREATOR_AGENT_KEY}。`,
|
|
36
|
+
"不要自己调用 prepareAgentDraft 或 createAgent;AI 创建助手负责草稿预览、用户确认和最终创建。",
|
|
37
|
+
"不要调用 deleteSpaces 这类高风险能力。",
|
|
38
|
+
].join("\n");
|
|
39
|
+
|
|
40
|
+
export const BUILTIN_AGENT_CREATOR_PROMPT = [
|
|
41
|
+
"你是 Nolo 的 AI 创建助手,只负责通过对话帮助用户创建或调整一个新的 Agent。",
|
|
42
|
+
"先理解用户想让这个 AI 服务谁、完成什么任务、使用什么语气、需要哪些能力、是否需要知识引用,以及是否适合公开。",
|
|
43
|
+
"当信息足够形成初版配置时,先调用 prepareAgentDraft,生成可预览草稿;信息不足时每次只问一个关键问题。",
|
|
44
|
+
"prepareAgentDraft 只生成草稿,不代表已经创建真实 Agent。",
|
|
45
|
+
"草稿展示后,等待用户明确确认,例如“确认创建”“就按这个创建”“创建这个 AI”。",
|
|
46
|
+
"只有得到明确确认后,才调用 createAgent 创建真实 Agent。",
|
|
47
|
+
"用户只是讨论、补充、修改或说“先看看”时,不要调用 createAgent。",
|
|
48
|
+
"默认模型使用 provider=fireworks, model=accounts/fireworks/models/kimi-latest;除非用户明确要求且平台已知支持,不要选择 Claude/Anthropic 等当前 runtime 不支持的 provider。",
|
|
49
|
+
"公开状态保持保守:你可以建议公开,但只有用户明确要求公开发布时,createAgent 的 isPublic 才能为 true。",
|
|
50
|
+
"如果用户想手动微调模型、工具、知识引用或发布状态,可以引导用户进入 /create/agent 高级编辑页。",
|
|
51
|
+
].join("\n");
|
|
52
|
+
|
|
53
|
+
export const buildBuiltinNoloRecord = () =>
|
|
54
|
+
buildBuiltinBaseAgent({
|
|
55
|
+
dbKey: BUILTIN_NOLO_AGENT_KEY,
|
|
56
|
+
id: BUILTIN_NOLO_AGENT_ID,
|
|
57
|
+
name: "nolo",
|
|
58
|
+
introduction:
|
|
59
|
+
"专门用来引导用户理解 Nolo 能做什么,并把问题带到正确入口或更合适的 Agent。",
|
|
60
|
+
greeting:
|
|
61
|
+
"你好,我是 nolo。你可以直接说你想做什么,我会帮你开始、解释入口,或把任务交给更合适的能力。",
|
|
62
|
+
provider: "fireworks",
|
|
63
|
+
model: FIREWORKS_KIMI_LATEST_MODEL,
|
|
64
|
+
useServerProxy: true,
|
|
65
|
+
apiSource: "platform",
|
|
66
|
+
runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
|
|
67
|
+
inputPrice: 0.95 * 8,
|
|
68
|
+
outputPrice: 4 * 8,
|
|
69
|
+
hasVision: true,
|
|
70
|
+
tags: ["nolo", "引导", "分发"],
|
|
71
|
+
tools: ["fetchWebpage", "runStreamingAgent"],
|
|
72
|
+
prompt: BUILTIN_NOLO_PROMPT,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
export const buildBuiltinAppBuilderRecord = () =>
|
|
76
|
+
buildBuiltinBaseAgent({
|
|
77
|
+
...APP_BUILDER_PRESET,
|
|
78
|
+
dbKey: BUILTIN_APP_BUILDER_AGENT_KEY,
|
|
79
|
+
id: BUILTIN_APP_BUILDER_AGENT_ID,
|
|
80
|
+
runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
|
|
81
|
+
tags: ["应用构建", "App Builder", "无代码"],
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
export const buildBuiltinEcommerceAgentRecord = () =>
|
|
85
|
+
buildBuiltinBaseAgent({
|
|
86
|
+
dbKey: BUILTIN_ECOMMERCE_AGENT_KEY,
|
|
87
|
+
id: BUILTIN_ECOMMERCE_AGENT_ID,
|
|
88
|
+
name: "电商商品参数助手",
|
|
89
|
+
introduction:
|
|
90
|
+
"专门获取淘宝、天猫、京东等电商商品真实参数、SKU、价格、库存和店铺信息,并做结构化对比。",
|
|
91
|
+
greeting: "发给我淘宝、天猫或京东商品链接,我会尽量获取真实商品参数。",
|
|
92
|
+
provider: "fireworks",
|
|
93
|
+
model: FIREWORKS_KIMI_LATEST_MODEL,
|
|
94
|
+
useServerProxy: true,
|
|
95
|
+
apiSource: "platform",
|
|
96
|
+
runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
|
|
97
|
+
inputPrice: 0.95 * 8,
|
|
98
|
+
outputPrice: 4 * 8,
|
|
99
|
+
hasVision: false,
|
|
100
|
+
tags: ["电商", "商品参数", "数据抓取"],
|
|
101
|
+
tools: ["taobaoTmallProductScraper", "jdProductScraper"],
|
|
102
|
+
prompt: [
|
|
103
|
+
"你是电商商品参数助手,只负责获取和整理电商商品真实数据。",
|
|
104
|
+
"当用户给淘宝/天猫链接或商品 ID 时,先提取数字 itemId,再调用 taobaoTmallProductScraper。",
|
|
105
|
+
"当用户给京东链接或 SKU 时,先提取数字 skuId,再调用 jdProductScraper。",
|
|
106
|
+
"输出要结构化:商品标题、品牌、型号、店铺、价格、SKU/规格、库存、尺寸重量、质保、数据来源和缺失项。",
|
|
107
|
+
"用户问参数或详情时,必须展开工具返回的详细参数,不要只摘要基础字段。",
|
|
108
|
+
"只输出用户请求的数据结果;不要输出寒暄、确认、过渡句或结尾追问。",
|
|
109
|
+
"如果用户给多个商品,逐个调用对应工具后再做对比表。",
|
|
110
|
+
"如果工具返回缺失字段,如实说明缺失;不要编造参数,也不要要求用户手抄页面。",
|
|
111
|
+
].join("\n"),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export const buildBuiltinAgentCreatorRecord = () =>
|
|
115
|
+
buildBuiltinBaseAgent({
|
|
116
|
+
dbKey: BUILTIN_AGENT_CREATOR_AGENT_KEY,
|
|
117
|
+
id: BUILTIN_AGENT_CREATOR_AGENT_ID,
|
|
118
|
+
name: "AI 创建助手",
|
|
119
|
+
introduction:
|
|
120
|
+
"通过对话帮你整理专属 AI 的用途、能力、Prompt、知识引用和发布建议,并在确认后创建。",
|
|
121
|
+
greeting:
|
|
122
|
+
"告诉我你想创建一个什么样的 AI:它要帮谁、完成什么、需要哪些能力或资料?",
|
|
123
|
+
provider: "fireworks",
|
|
124
|
+
model: "accounts/fireworks/models/kimi-latest",
|
|
125
|
+
useServerProxy: true,
|
|
126
|
+
apiSource: "platform",
|
|
127
|
+
runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
|
|
128
|
+
inputPrice: 0.95 * 8,
|
|
129
|
+
outputPrice: 4 * 8,
|
|
130
|
+
hasVision: false,
|
|
131
|
+
tags: ["AI 创建", "Agent 创建", "配置助手"],
|
|
132
|
+
tools: ["prepareAgentDraft", "createAgent"],
|
|
133
|
+
prompt: BUILTIN_AGENT_CREATOR_PROMPT,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
export const normalizeBuiltinPublicAgentRecord = <T extends Record<string, any>>(
|
|
137
|
+
agent: T,
|
|
138
|
+
): T => {
|
|
139
|
+
if (!agent || typeof agent !== "object") return agent;
|
|
140
|
+
const key = typeof agent.dbKey === "string" ? agent.dbKey : "";
|
|
141
|
+
const id = typeof agent.id === "string" ? agent.id : "";
|
|
142
|
+
const isBuiltinCreator =
|
|
143
|
+
key === BUILTIN_AGENT_CREATOR_AGENT_KEY || id === BUILTIN_AGENT_CREATOR_AGENT_ID;
|
|
144
|
+
|
|
145
|
+
if (!isBuiltinCreator) return agent;
|
|
146
|
+
|
|
147
|
+
const builtin = buildBuiltinAgentCreatorRecord();
|
|
148
|
+
return {
|
|
149
|
+
...agent,
|
|
150
|
+
name: builtin.name,
|
|
151
|
+
introduction: builtin.introduction,
|
|
152
|
+
greeting: builtin.greeting,
|
|
153
|
+
provider: builtin.provider,
|
|
154
|
+
model: builtin.model,
|
|
155
|
+
useServerProxy: builtin.useServerProxy,
|
|
156
|
+
apiSource: builtin.apiSource,
|
|
157
|
+
runtimeServerBase: builtin.runtimeServerBase,
|
|
158
|
+
inputPrice: builtin.inputPrice,
|
|
159
|
+
outputPrice: builtin.outputPrice,
|
|
160
|
+
hasVision: builtin.hasVision,
|
|
161
|
+
references: builtin.references,
|
|
162
|
+
tags: builtin.tags,
|
|
163
|
+
tools: builtin.tools,
|
|
164
|
+
prompt: builtin.prompt,
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export const BUILTIN_PLATFORM_AGENT_KEYS = [
|
|
169
|
+
BUILTIN_NOLO_AGENT_KEY,
|
|
170
|
+
BUILTIN_APP_BUILDER_AGENT_KEY,
|
|
171
|
+
BUILTIN_ECOMMERCE_AGENT_KEY,
|
|
172
|
+
BUILTIN_AGENT_CREATOR_AGENT_KEY,
|
|
173
|
+
] as const;
|
|
174
|
+
|
|
175
|
+
const BUILTIN_PLATFORM_AGENT_KEY_SET = new Set<string>(BUILTIN_PLATFORM_AGENT_KEYS);
|
|
176
|
+
|
|
177
|
+
export const isBuiltinPlatformAgentRecord = (agent: {
|
|
178
|
+
dbKey?: string | null;
|
|
179
|
+
id?: string | null;
|
|
180
|
+
}): boolean => {
|
|
181
|
+
const dbKey = typeof agent?.dbKey === "string" ? agent.dbKey : "";
|
|
182
|
+
if (dbKey && BUILTIN_PLATFORM_AGENT_KEY_SET.has(dbKey)) return true;
|
|
183
|
+
|
|
184
|
+
const id = typeof agent?.id === "string" ? agent.id : "";
|
|
185
|
+
if (!id) return false;
|
|
186
|
+
|
|
187
|
+
return BUILTIN_PLATFORM_AGENT_KEYS.some((key) => key.endsWith(id));
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
export const shouldHideBuiltinAgentFromPublicPlaza = (agent: {
|
|
191
|
+
dbKey?: string | null;
|
|
192
|
+
id?: string | null;
|
|
193
|
+
}): boolean => isBuiltinPlatformAgentRecord(agent);
|
|
194
|
+
|
|
195
|
+
export const buildBuiltinPlatformAgentRecord = (dbKey: string) => {
|
|
196
|
+
if (dbKey === BUILTIN_NOLO_AGENT_KEY) {
|
|
197
|
+
return buildBuiltinNoloRecord();
|
|
198
|
+
}
|
|
199
|
+
if (dbKey === BUILTIN_APP_BUILDER_AGENT_KEY) {
|
|
200
|
+
return buildBuiltinAppBuilderRecord();
|
|
201
|
+
}
|
|
202
|
+
if (dbKey === BUILTIN_ECOMMERCE_AGENT_KEY) {
|
|
203
|
+
return buildBuiltinEcommerceAgentRecord();
|
|
204
|
+
}
|
|
205
|
+
if (dbKey === BUILTIN_AGENT_CREATOR_AGENT_KEY) {
|
|
206
|
+
return buildBuiltinAgentCreatorRecord();
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
};
|
package/core/config.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const providerName = "nolotus";
|
|
2
|
+
|
|
3
|
+
const slogonforYou =
|
|
4
|
+
"The goodness or badness of this world concerns every individual.";
|
|
5
|
+
|
|
6
|
+
// be cart CryptoJS.PBKDF2 keySize: 256 / AUTH_VERSION[1].keylen,
|
|
7
|
+
// even keylen same ,maybe error rn with web version
|
|
8
|
+
export const AUTH_VERSION = {
|
|
9
|
+
"1": {
|
|
10
|
+
iterations: 10000,
|
|
11
|
+
salt: providerName + slogonforYou,
|
|
12
|
+
keylen: 32,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
export const SALT = AUTH_VERSION[1].salt;
|
package/core/crypto.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import nacl from "tweetnacl";
|
|
2
|
+
import { Base64 } from "js-base64";
|
|
3
|
+
|
|
4
|
+
export const signMessage = (
|
|
5
|
+
message: string,
|
|
6
|
+
secretKeyBase64: string
|
|
7
|
+
): string => {
|
|
8
|
+
const messageUint8 = new TextEncoder().encode(message);
|
|
9
|
+
const signedMessage = nacl.sign(
|
|
10
|
+
messageUint8,
|
|
11
|
+
Base64.toUint8Array(secretKeyBase64)
|
|
12
|
+
);
|
|
13
|
+
return Base64.fromUint8Array(signedMessage);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const verifySignedMessage = (
|
|
17
|
+
signedMessageBase64: string,
|
|
18
|
+
publicKeyBase64: string
|
|
19
|
+
): string => {
|
|
20
|
+
const message = nacl.sign.open(
|
|
21
|
+
Base64.toUint8Array(signedMessageBase64),
|
|
22
|
+
Base64.toUint8Array(publicKeyBase64)
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
if (!message) throw new Error("Decoding failed");
|
|
26
|
+
return new TextDecoder().decode(message);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const detachedSign = (message: string, secretKeyBase64: string) => {
|
|
30
|
+
const signature = nacl.sign.detached(
|
|
31
|
+
new TextEncoder().encode(message),
|
|
32
|
+
Base64.toUint8Array(secretKeyBase64)
|
|
33
|
+
);
|
|
34
|
+
return Base64.fromUint8Array(signature, true);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const verifyDetachedSignature = (
|
|
38
|
+
message: string,
|
|
39
|
+
signatureBase64: string,
|
|
40
|
+
publicKeyBase64: string
|
|
41
|
+
): boolean => {
|
|
42
|
+
try {
|
|
43
|
+
return nacl.sign.detached.verify(
|
|
44
|
+
new TextEncoder().encode(message),
|
|
45
|
+
Base64.toUint8Array(signatureBase64),
|
|
46
|
+
Base64.toUint8Array(publicKeyBase64)
|
|
47
|
+
);
|
|
48
|
+
} catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// keypair.ts
|
|
2
|
+
import nacl from "tweetnacl";
|
|
3
|
+
import { Base64 } from "js-base64";
|
|
4
|
+
|
|
5
|
+
export const generateKeyPairFromSeedV1 = (seedData: string) => {
|
|
6
|
+
const seed = new TextEncoder().encode(seedData);
|
|
7
|
+
const hashSeed = nacl.hash(seed);
|
|
8
|
+
const seed32 = hashSeed.slice(0, 32);
|
|
9
|
+
const keyPair = nacl.sign.keyPair.fromSeed(seed32);
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
publicKey: Base64.fromUint8Array(keyPair.publicKey, true),
|
|
13
|
+
secretKey: Base64.fromUint8Array(keyPair.secretKey, true),
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import nacl from "tweetnacl";
|
|
2
|
+
|
|
3
|
+
export const generateUserIdV1 = (
|
|
4
|
+
publicKey: string,
|
|
5
|
+
username: string,
|
|
6
|
+
language: string,
|
|
7
|
+
extra: string = ""
|
|
8
|
+
) => {
|
|
9
|
+
const text = publicKey + username + language + extra;
|
|
10
|
+
const encodedText = new TextEncoder().encode(text);
|
|
11
|
+
const hash = nacl.hash(encodedText);
|
|
12
|
+
|
|
13
|
+
// 方案1:使用Array.from和map
|
|
14
|
+
const hexString = Array.from(hash)
|
|
15
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
16
|
+
.join("");
|
|
17
|
+
|
|
18
|
+
// 方案2:更简洁的写法,用Uint8Array直接转
|
|
19
|
+
// const hexString = [...hash].map(x => x.toString(16).padStart(2,'0')).join('');
|
|
20
|
+
|
|
21
|
+
return hexString.slice(0, 10);
|
|
22
|
+
};
|
package/core/init.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BUILTIN_NOLO_AGENT_KEY } from "./builtinAgents";
|
|
2
|
+
|
|
3
|
+
export const nolotusId = "0e95801d90";
|
|
4
|
+
export const copilotDemoId = "b2e06f801f";
|
|
5
|
+
|
|
6
|
+
const ADMIN_IDS = new Set([nolotusId, copilotDemoId]);
|
|
7
|
+
|
|
8
|
+
export const isSystemAdmin = (userId?: string | null) =>
|
|
9
|
+
userId != null && ADMIN_IDS.has(userId);
|
|
10
|
+
|
|
11
|
+
export const AI_ADMIN_ROLE = "AI管理员";
|
|
12
|
+
|
|
13
|
+
const envAiAdminIds = () =>
|
|
14
|
+
new Set(
|
|
15
|
+
(process.env.AI_ADMIN_USER_IDS ?? "")
|
|
16
|
+
.split(",")
|
|
17
|
+
.map((item) => item.trim())
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const recordHasAiAdminRole = (record: unknown): boolean => {
|
|
22
|
+
if (!record || typeof record !== "object") return false;
|
|
23
|
+
const value = record as Record<string, unknown>;
|
|
24
|
+
const scalarFields = [value.role, value.globalRole, value.systemRole];
|
|
25
|
+
if (scalarFields.some((item) => item === AI_ADMIN_ROLE)) return true;
|
|
26
|
+
const listFields = [value.roles, value.globalRoles, value.systemRoles, value.permissions];
|
|
27
|
+
return listFields.some(
|
|
28
|
+
(item) => Array.isArray(item) && item.includes(AI_ADMIN_ROLE)
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const isAIAdmin = (
|
|
33
|
+
userId?: string | null,
|
|
34
|
+
...records: unknown[]
|
|
35
|
+
) =>
|
|
36
|
+
isSystemAdmin(userId) ||
|
|
37
|
+
(userId != null && envAiAdminIds().has(userId)) ||
|
|
38
|
+
records.some(recordHasAiAdminRole);
|
|
39
|
+
|
|
40
|
+
export const legacyNoloAgentId = "cybot-pub-01JYRSTM0MPPGQC9S25S3Y9J20";
|
|
41
|
+
export const noloAgentId = BUILTIN_NOLO_AGENT_KEY;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const DEFAULT_LOCAL_HOST = "127.0.0.1";
|
|
2
|
+
export const DEFAULT_LOCAL_API_PORT = "38123";
|
|
3
|
+
|
|
4
|
+
export const DEFAULT_LOCAL_API_ORIGIN = `http://${DEFAULT_LOCAL_HOST}:${DEFAULT_LOCAL_API_PORT}`;
|
|
5
|
+
|
|
6
|
+
export function normalizeOrigin(value: string): string {
|
|
7
|
+
return value.trim().replace(/\/+$/, "");
|
|
8
|
+
}
|
package/core/password.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import CryptoJS from "crypto-js";
|
|
2
|
+
import { SALT, AUTH_VERSION } from ".//config";
|
|
3
|
+
|
|
4
|
+
export const hashPasswordV1 = async (password: string): Promise<string> => {
|
|
5
|
+
const hash = CryptoJS.PBKDF2(password, SALT, {
|
|
6
|
+
keySize: 256 / AUTH_VERSION[1].keylen,
|
|
7
|
+
iterations: AUTH_VERSION[1].iterations,
|
|
8
|
+
hasher: CryptoJS.algo.SHA512,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
// 将 salt 和 hash 组合存储
|
|
12
|
+
return hash.toString(CryptoJS.enc.Base64);
|
|
13
|
+
};
|