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
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
export const queryModelUsageFunctionSchema = {
|
|
2
|
+
name: "queryModelUsage",
|
|
3
|
+
description:
|
|
4
|
+
"查询模型/API 用量与费用。普通用户只能查自己的用量;系统管理员可以查指定用户或全站。费用默认返回 credits,也可附带 USD 换算。",
|
|
5
|
+
parameters: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
scope: {
|
|
9
|
+
type: "string",
|
|
10
|
+
enum: ["user", "all", "space"],
|
|
11
|
+
description:
|
|
12
|
+
"查询范围。user 为个人,all 为全站管理员查询,space 预留给空间范围。",
|
|
13
|
+
default: "user",
|
|
14
|
+
},
|
|
15
|
+
userId: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "管理员查询指定用户时使用;普通用户不允许指定他人。",
|
|
18
|
+
},
|
|
19
|
+
spaceId: {
|
|
20
|
+
type: "string",
|
|
21
|
+
description: "空间范围查询预留字段,当前版本会返回未实现。",
|
|
22
|
+
},
|
|
23
|
+
provider: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "可选 provider 过滤,例如 google、openai、anthropic。",
|
|
26
|
+
},
|
|
27
|
+
model: {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "可选模型过滤,例如 gemini-3.5-flash。",
|
|
30
|
+
},
|
|
31
|
+
serviceTier: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "可选计费档位过滤,例如 standard、flex。",
|
|
34
|
+
},
|
|
35
|
+
startDate: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "开始日期,YYYY-MM-DD。默认今天。",
|
|
38
|
+
},
|
|
39
|
+
endDate: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "结束日期,YYYY-MM-DD。默认等于 startDate。",
|
|
42
|
+
},
|
|
43
|
+
currency: {
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "展示货币/单位标签。默认 CREDITS;可填 USD、CNY 等。",
|
|
46
|
+
default: "CREDITS",
|
|
47
|
+
},
|
|
48
|
+
creditsPerUsd: {
|
|
49
|
+
type: "number",
|
|
50
|
+
description: "credits 与 USD 的换算比例,默认 8 credits = 1 USD。",
|
|
51
|
+
default: 8,
|
|
52
|
+
},
|
|
53
|
+
thresholdCredits: {
|
|
54
|
+
type: "number",
|
|
55
|
+
description:
|
|
56
|
+
"可选阈值,单位 credits;返回 threshold.exceeded 与 0-100 的 threshold.usedPercent。",
|
|
57
|
+
},
|
|
58
|
+
thresholdUsd: {
|
|
59
|
+
type: "number",
|
|
60
|
+
description:
|
|
61
|
+
"可选阈值,单位 USD;会按 creditsPerUsd 换算,并返回 0-100 的 threshold.usedPercent。",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const createScheduledTaskFunctionSchema = {
|
|
68
|
+
name: "createScheduledTask",
|
|
69
|
+
description:
|
|
70
|
+
"创建一个每日/周期性后台任务。适合让 agent 按 cron 定时检查用量、生成报告或执行提醒;可选择创建后立刻试运行一次。",
|
|
71
|
+
parameters: {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: {
|
|
74
|
+
title: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "任务标题。",
|
|
77
|
+
},
|
|
78
|
+
taskPrompt: {
|
|
79
|
+
type: "string",
|
|
80
|
+
description:
|
|
81
|
+
"定时任务每次执行时交给 agent 的完整任务描述,应包含检查条件和通知方式。",
|
|
82
|
+
},
|
|
83
|
+
schedule: {
|
|
84
|
+
type: "string",
|
|
85
|
+
description: "cron 表达式,例如每天 09:00 执行为 0 9 * * *。",
|
|
86
|
+
},
|
|
87
|
+
agentKey: {
|
|
88
|
+
type: "string",
|
|
89
|
+
description: "执行该任务的 agentKey。默认使用当前 agent。",
|
|
90
|
+
},
|
|
91
|
+
spaceId: {
|
|
92
|
+
type: "string",
|
|
93
|
+
description: "可选空间 ID;任务对话会归属到该空间。",
|
|
94
|
+
},
|
|
95
|
+
runOnceNow: {
|
|
96
|
+
type: "boolean",
|
|
97
|
+
description: "创建后是否立即执行一次,用来验证任务会产生什么结果。",
|
|
98
|
+
default: false,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
required: ["schedule", "taskPrompt"],
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const createDialogGoalFunctionSchema = {
|
|
106
|
+
name: "createDialogGoal",
|
|
107
|
+
description:
|
|
108
|
+
"为当前对话创建或替换一个轻量目标,可选设置 token 预算。目标会持久化到当前 dialog。",
|
|
109
|
+
parameters: {
|
|
110
|
+
type: "object",
|
|
111
|
+
properties: {
|
|
112
|
+
objective: {
|
|
113
|
+
type: "string",
|
|
114
|
+
description: "目标描述,应该是可完成的具体任务。",
|
|
115
|
+
},
|
|
116
|
+
tokenBudget: {
|
|
117
|
+
type: "number",
|
|
118
|
+
description: "可选 token 预算。用于报告 used / remaining,不会自动中断运行。",
|
|
119
|
+
},
|
|
120
|
+
dialogId: {
|
|
121
|
+
type: "string",
|
|
122
|
+
description: "可选 dialogId。默认使用当前运行中的对话。",
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
required: ["objective"],
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export const getDialogGoalFunctionSchema = {
|
|
130
|
+
name: "getDialogGoal",
|
|
131
|
+
description:
|
|
132
|
+
"读取当前或指定对话的 goal 状态,并返回 token 使用与剩余预算报告。",
|
|
133
|
+
parameters: {
|
|
134
|
+
type: "object",
|
|
135
|
+
properties: {
|
|
136
|
+
dialogId: {
|
|
137
|
+
type: "string",
|
|
138
|
+
description: "可选 dialogId。默认使用当前运行中的对话。",
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
export const completeDialogGoalFunctionSchema = {
|
|
145
|
+
name: "completeDialogGoal",
|
|
146
|
+
description:
|
|
147
|
+
"将当前或指定对话的 goal 标记为 complete,并持久化完成时间。",
|
|
148
|
+
parameters: {
|
|
149
|
+
type: "object",
|
|
150
|
+
properties: {
|
|
151
|
+
dialogId: {
|
|
152
|
+
type: "string",
|
|
153
|
+
description: "可选 dialogId。默认使用当前运行中的对话。",
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
export const notifyUserFunctionSchema = {
|
|
160
|
+
name: "notifyUser",
|
|
161
|
+
description:
|
|
162
|
+
"发送一条站内通知给当前用户。第一版只支持站内通知,后续可扩展邮件、桌面端、网页和移动端通知。",
|
|
163
|
+
parameters: {
|
|
164
|
+
type: "object",
|
|
165
|
+
properties: {
|
|
166
|
+
title: {
|
|
167
|
+
type: "string",
|
|
168
|
+
description: "通知标题。",
|
|
169
|
+
},
|
|
170
|
+
message: {
|
|
171
|
+
type: "string",
|
|
172
|
+
description: "通知正文。",
|
|
173
|
+
},
|
|
174
|
+
severity: {
|
|
175
|
+
type: "string",
|
|
176
|
+
enum: ["info", "warning", "critical"],
|
|
177
|
+
description: "通知级别。",
|
|
178
|
+
default: "info",
|
|
179
|
+
},
|
|
180
|
+
href: {
|
|
181
|
+
type: "string",
|
|
182
|
+
description: "可选跳转链接。",
|
|
183
|
+
},
|
|
184
|
+
targetUserId: {
|
|
185
|
+
type: "string",
|
|
186
|
+
description:
|
|
187
|
+
"可选目标用户 ID。默认通知当前用户;只有受信任的系统 agent 或管理员可以通知其他用户。",
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
required: ["title", "message"],
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const serverOnlyResult = (toolName: string) => ({
|
|
195
|
+
rawData: {
|
|
196
|
+
error: `${toolName} must run on the server-side agent runtime.`,
|
|
197
|
+
},
|
|
198
|
+
displayData: `${toolName} 需要在服务端 agent runtime 中执行。`,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
export const queryModelUsageFunc = async () => serverOnlyResult("queryModelUsage");
|
|
202
|
+
export const createScheduledTaskFunc = async () => serverOnlyResult("createScheduledTask");
|
|
203
|
+
export const createDialogGoalFunc = async () => serverOnlyResult("createDialogGoal");
|
|
204
|
+
export const getDialogGoalFunc = async () => serverOnlyResult("getDialogGoal");
|
|
205
|
+
export const completeDialogGoalFunc = async () => serverOnlyResult("completeDialogGoal");
|
|
206
|
+
export const notifyUserFunc = async () => serverOnlyResult("notifyUser");
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { selectRuntimeSnapshot } from "../../app/stateViews/runtime";
|
|
2
|
+
import { DataType } from "../../create/types";
|
|
3
|
+
import { createSpaceKey } from "../../create/space/spaceKeys";
|
|
4
|
+
import { redactAgentRecordForWorkspaceTool } from "../../agent-runtime/runtimeToolSurface";
|
|
5
|
+
import {
|
|
6
|
+
clampNoloPositiveInteger,
|
|
7
|
+
getNoloComparableUpdatedAt,
|
|
8
|
+
getNoloDialogIdFromKey,
|
|
9
|
+
NOLO_WORKSPACE_TOOL_NAMES,
|
|
10
|
+
normalizeNoloSpaceInput,
|
|
11
|
+
resolveNoloDialogInput,
|
|
12
|
+
} from "../../agent-runtime/noloWorkspaceTools";
|
|
13
|
+
|
|
14
|
+
type ToolResult = {
|
|
15
|
+
rawData: unknown;
|
|
16
|
+
displayData?: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const jsonPreview = (value: unknown, maxLength = 1800) => {
|
|
20
|
+
const text = JSON.stringify(value, null, 2);
|
|
21
|
+
return text.length <= maxLength ? text : `${text.slice(0, maxLength)}\n...(truncated)`;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const normalizeServer = (value: unknown) =>
|
|
25
|
+
typeof value === "string" && value.trim()
|
|
26
|
+
? value.trim().replace(/\/+$/, "")
|
|
27
|
+
: "";
|
|
28
|
+
|
|
29
|
+
const getRuntime = (thunkApi: any) => {
|
|
30
|
+
const state = thunkApi?.getState?.();
|
|
31
|
+
return state ? selectRuntimeSnapshot(state) : null;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const authHeaders = (token?: string) =>
|
|
35
|
+
token ? { Authorization: `Bearer ${token}` } : {};
|
|
36
|
+
|
|
37
|
+
async function readRemoteRecord(args: {
|
|
38
|
+
serverBase?: string;
|
|
39
|
+
token?: string;
|
|
40
|
+
dbKey: string;
|
|
41
|
+
includeDeleted?: boolean;
|
|
42
|
+
}) {
|
|
43
|
+
const serverBase = normalizeServer(args.serverBase);
|
|
44
|
+
if (!serverBase || !args.token) return null;
|
|
45
|
+
const query = args.includeDeleted ? "?includeDeleted=true" : "";
|
|
46
|
+
const response = await fetch(
|
|
47
|
+
`${serverBase}/api/v1/db/read/${encodeURIComponent(args.dbKey)}${query}`,
|
|
48
|
+
{ headers: authHeaders(args.token) }
|
|
49
|
+
);
|
|
50
|
+
if (!response.ok) return null;
|
|
51
|
+
const payload = await response.json().catch(() => null);
|
|
52
|
+
return payload?.data ?? payload;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function queryRemoteUserRecords(args: {
|
|
56
|
+
serverBase?: string;
|
|
57
|
+
token?: string;
|
|
58
|
+
userId?: string;
|
|
59
|
+
type: string | string[];
|
|
60
|
+
limit: number;
|
|
61
|
+
}) {
|
|
62
|
+
const serverBase = normalizeServer(args.serverBase);
|
|
63
|
+
if (!serverBase || !args.token || !args.userId) return [];
|
|
64
|
+
const response = await fetch(
|
|
65
|
+
`${serverBase}/api/v1/db/query/${encodeURIComponent(args.userId)}?limit=${args.limit}`,
|
|
66
|
+
{
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: {
|
|
69
|
+
"Content-Type": "application/json",
|
|
70
|
+
...authHeaders(args.token),
|
|
71
|
+
},
|
|
72
|
+
body: JSON.stringify({ type: args.type }),
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
if (!response.ok) return [];
|
|
76
|
+
const payload = await response.json().catch(() => null);
|
|
77
|
+
return Array.isArray(payload?.data?.data)
|
|
78
|
+
? payload.data.data
|
|
79
|
+
: Array.isArray(payload?.data)
|
|
80
|
+
? payload.data
|
|
81
|
+
: [];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function queryBestRecords(
|
|
85
|
+
thunkApi: any,
|
|
86
|
+
type: string | string[],
|
|
87
|
+
limit: number
|
|
88
|
+
) {
|
|
89
|
+
const runtime = getRuntime(thunkApi);
|
|
90
|
+
const remoteRecords = await queryRemoteUserRecords({
|
|
91
|
+
serverBase: runtime?.currentServer,
|
|
92
|
+
token: runtime?.currentToken,
|
|
93
|
+
userId: runtime?.currentUserId,
|
|
94
|
+
type,
|
|
95
|
+
limit,
|
|
96
|
+
}).catch(() => []);
|
|
97
|
+
return remoteRecords;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function readBestRecord(thunkApi: any, dbKey: string, includeDeleted = false) {
|
|
101
|
+
const runtime = getRuntime(thunkApi);
|
|
102
|
+
return readRemoteRecord({
|
|
103
|
+
serverBase: runtime?.currentServer,
|
|
104
|
+
token: runtime?.currentToken,
|
|
105
|
+
dbKey,
|
|
106
|
+
includeDeleted,
|
|
107
|
+
}).catch(() => null);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const listDialogsFunctionSchema = {
|
|
111
|
+
name: "listDialogs",
|
|
112
|
+
description: "List the current user's Nolo dialogs. Use before readDialog when the target dialog is unclear.",
|
|
113
|
+
parameters: {
|
|
114
|
+
type: "object",
|
|
115
|
+
properties: {
|
|
116
|
+
limit: { type: "integer", description: "Maximum dialogs to return. Default 100, max 500." },
|
|
117
|
+
space: { type: "string", description: "Optional space id or URL." },
|
|
118
|
+
includeScheduled: { type: "boolean", description: "Include scheduled/background run dialogs." },
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
} as const;
|
|
122
|
+
|
|
123
|
+
export async function listDialogsFunc(args: any, thunkApi: any): Promise<ToolResult> {
|
|
124
|
+
const limit = clampNoloPositiveInteger(args?.limit, 100, 500);
|
|
125
|
+
const includeScheduled = args?.includeScheduled === true;
|
|
126
|
+
const records = await queryBestRecords(thunkApi, DataType.DIALOG, limit * 3);
|
|
127
|
+
const dialogs = records
|
|
128
|
+
.filter((record: any) => includeScheduled || record?.triggerType !== "scheduled_run")
|
|
129
|
+
.sort((left: any, right: any) => getNoloComparableUpdatedAt(right) - getNoloComparableUpdatedAt(left))
|
|
130
|
+
.slice(0, limit)
|
|
131
|
+
.map((record: any) => ({
|
|
132
|
+
id: typeof record?.id === "string" ? record.id : getNoloDialogIdFromKey(String(record?.dbKey ?? "")),
|
|
133
|
+
dbKey: record?.dbKey ?? null,
|
|
134
|
+
title: record?.title ?? record?.taskLabel ?? "(untitled)",
|
|
135
|
+
status: record?.status ?? null,
|
|
136
|
+
updatedAt: record?.updatedAt ?? record?.updated_at ?? null,
|
|
137
|
+
createdAt: record?.createdAt ?? record?.created ?? null,
|
|
138
|
+
spaceId: record?.spaceId ?? null,
|
|
139
|
+
triggerType: record?.triggerType ?? null,
|
|
140
|
+
primaryAgentKey: record?.primaryAgentKey ?? null,
|
|
141
|
+
}));
|
|
142
|
+
return {
|
|
143
|
+
rawData: { success: true, total: dialogs.length, dialogs },
|
|
144
|
+
displayData: jsonPreview({ total: dialogs.length, dialogs }),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export const readDialogFunctionSchema = {
|
|
149
|
+
name: "readDialog",
|
|
150
|
+
description: "Read one persisted Nolo dialog, including metadata and recent messages.",
|
|
151
|
+
parameters: {
|
|
152
|
+
type: "object",
|
|
153
|
+
properties: {
|
|
154
|
+
dialog: { type: "string", description: "Dialog id, dialog dbKey, or dialog URL." },
|
|
155
|
+
limit: { type: "integer", description: "Message limit. Default 120, max 1000." },
|
|
156
|
+
},
|
|
157
|
+
required: ["dialog"],
|
|
158
|
+
},
|
|
159
|
+
} as const;
|
|
160
|
+
|
|
161
|
+
export async function readDialogFunc(args: any, thunkApi: any): Promise<ToolResult> {
|
|
162
|
+
const runtime = getRuntime(thunkApi);
|
|
163
|
+
const userId = runtime?.currentUserId;
|
|
164
|
+
if (!userId) throw new Error("readDialog requires a signed-in user.");
|
|
165
|
+
const rawDialog = typeof args?.dialog === "string"
|
|
166
|
+
? args.dialog.trim()
|
|
167
|
+
: typeof args?.dialogId === "string"
|
|
168
|
+
? args.dialogId.trim()
|
|
169
|
+
: typeof args?.id === "string"
|
|
170
|
+
? args.id.trim()
|
|
171
|
+
: "";
|
|
172
|
+
if (!rawDialog) throw new Error("readDialog requires dialog.");
|
|
173
|
+
const resolved = resolveNoloDialogInput(rawDialog, userId);
|
|
174
|
+
const limit = clampNoloPositiveInteger(args?.limit, 120, 1000);
|
|
175
|
+
const meta = await readBestRecord(thunkApi, resolved.dbKey, true);
|
|
176
|
+
|
|
177
|
+
let messages: any[] = [];
|
|
178
|
+
const serverBase = normalizeServer(runtime?.currentServer);
|
|
179
|
+
if (serverBase && runtime?.currentToken) {
|
|
180
|
+
const response = await fetch(`${serverBase}/rpc/getConvMsgs`, {
|
|
181
|
+
method: "POST",
|
|
182
|
+
headers: {
|
|
183
|
+
"Content-Type": "application/json",
|
|
184
|
+
...authHeaders(runtime.currentToken),
|
|
185
|
+
},
|
|
186
|
+
body: JSON.stringify({ dialogId: resolved.dialogId, limit }),
|
|
187
|
+
}).catch(() => null);
|
|
188
|
+
if (response?.ok) {
|
|
189
|
+
const payload = await response.json().catch(() => []);
|
|
190
|
+
messages = Array.isArray(payload) ? payload : [];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return {
|
|
195
|
+
rawData: {
|
|
196
|
+
success: true,
|
|
197
|
+
dialogKey: resolved.dbKey,
|
|
198
|
+
dialogId: resolved.dialogId,
|
|
199
|
+
meta,
|
|
200
|
+
messages,
|
|
201
|
+
},
|
|
202
|
+
displayData: jsonPreview({
|
|
203
|
+
dialogKey: resolved.dbKey,
|
|
204
|
+
title: meta?.title,
|
|
205
|
+
messageCount: messages.length,
|
|
206
|
+
messages,
|
|
207
|
+
}),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export const listAgentsFunctionSchema = {
|
|
212
|
+
name: "listAgents",
|
|
213
|
+
description: "List the current user's Nolo agents.",
|
|
214
|
+
parameters: {
|
|
215
|
+
type: "object",
|
|
216
|
+
properties: {
|
|
217
|
+
limit: { type: "integer", description: "Maximum agents to return. Default 100, max 500." },
|
|
218
|
+
publicOnly: { type: "boolean", description: "Only show public agents." },
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
} as const;
|
|
222
|
+
|
|
223
|
+
export async function listAgentsFunc(args: any, thunkApi: any): Promise<ToolResult> {
|
|
224
|
+
const limit = clampNoloPositiveInteger(args?.limit, 100, 500);
|
|
225
|
+
const records = await queryBestRecords(thunkApi, DataType.AGENT, limit);
|
|
226
|
+
const agents = records
|
|
227
|
+
.sort((left: any, right: any) => getNoloComparableUpdatedAt(right) - getNoloComparableUpdatedAt(left))
|
|
228
|
+
.map((record: any) => ({
|
|
229
|
+
id: record?.id ?? null,
|
|
230
|
+
privateKey: record?.dbKey ?? null,
|
|
231
|
+
publicKey: typeof record?.id === "string" ? `agent-pub-${record.id}` : null,
|
|
232
|
+
name: record?.name ?? "(unnamed)",
|
|
233
|
+
model: record?.model ?? null,
|
|
234
|
+
provider: record?.provider ?? record?.apiSource ?? null,
|
|
235
|
+
isPublic: record?.isPublic === true,
|
|
236
|
+
updatedAt: record?.updatedAt ?? record?.createdAt ?? null,
|
|
237
|
+
tools: Array.isArray(record?.tools) ? record.tools : [],
|
|
238
|
+
}))
|
|
239
|
+
.filter((agent: any) => args?.publicOnly !== true || agent.isPublic);
|
|
240
|
+
return {
|
|
241
|
+
rawData: { success: true, total: agents.length, agents },
|
|
242
|
+
displayData: jsonPreview({ total: agents.length, agents }),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export const readAgentFunctionSchema = {
|
|
247
|
+
name: "readAgent",
|
|
248
|
+
description: "Read one Nolo agent config.",
|
|
249
|
+
parameters: {
|
|
250
|
+
type: "object",
|
|
251
|
+
properties: {
|
|
252
|
+
agent: { type: "string", description: "Agent key, id, alias, or URL." },
|
|
253
|
+
},
|
|
254
|
+
required: ["agent"],
|
|
255
|
+
},
|
|
256
|
+
} as const;
|
|
257
|
+
|
|
258
|
+
export async function readAgentFunc(args: any, thunkApi: any): Promise<ToolResult> {
|
|
259
|
+
const runtime = getRuntime(thunkApi);
|
|
260
|
+
const userId = runtime?.currentUserId;
|
|
261
|
+
if (!userId) throw new Error("readAgent requires a signed-in user.");
|
|
262
|
+
const rawAgent = typeof args?.agent === "string"
|
|
263
|
+
? args.agent.trim()
|
|
264
|
+
: typeof args?.agentKey === "string"
|
|
265
|
+
? args.agentKey.trim()
|
|
266
|
+
: typeof args?.id === "string"
|
|
267
|
+
? args.id.trim()
|
|
268
|
+
: "";
|
|
269
|
+
if (!rawAgent) throw new Error("readAgent requires agent.");
|
|
270
|
+
const raw = rawAgent.startsWith("http://") || rawAgent.startsWith("https://")
|
|
271
|
+
? new URL(rawAgent).pathname.split("/").filter(Boolean).at(-1) ?? rawAgent
|
|
272
|
+
: rawAgent;
|
|
273
|
+
const candidates = raw.startsWith("agent-")
|
|
274
|
+
? [raw]
|
|
275
|
+
: [`agent-${userId}-${raw}`, `agent-pub-${raw}`];
|
|
276
|
+
for (const candidate of candidates) {
|
|
277
|
+
const record = await readBestRecord(thunkApi, candidate, true);
|
|
278
|
+
if (record) {
|
|
279
|
+
return {
|
|
280
|
+
rawData: {
|
|
281
|
+
success: true,
|
|
282
|
+
agentKey: candidate,
|
|
283
|
+
record: redactAgentRecordForWorkspaceTool(record),
|
|
284
|
+
},
|
|
285
|
+
displayData: jsonPreview({
|
|
286
|
+
agentKey: candidate,
|
|
287
|
+
record: redactAgentRecordForWorkspaceTool(record),
|
|
288
|
+
}),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
throw new Error(`readAgent not found: ${rawAgent}`);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export const listSpacesFunctionSchema = {
|
|
296
|
+
name: "listSpaces",
|
|
297
|
+
description: "List joined Nolo spaces.",
|
|
298
|
+
parameters: {
|
|
299
|
+
type: "object",
|
|
300
|
+
properties: {},
|
|
301
|
+
},
|
|
302
|
+
} as const;
|
|
303
|
+
|
|
304
|
+
export async function listSpacesFunc(_args: any, thunkApi: any): Promise<ToolResult> {
|
|
305
|
+
const runtime = getRuntime(thunkApi);
|
|
306
|
+
const serverBase = normalizeServer(runtime?.currentServer);
|
|
307
|
+
if (serverBase && runtime?.currentToken && runtime?.currentUserId) {
|
|
308
|
+
const response = await fetch(`${serverBase}/rpc/getUserSpaceMemberships`, {
|
|
309
|
+
method: "POST",
|
|
310
|
+
headers: {
|
|
311
|
+
"Content-Type": "application/json",
|
|
312
|
+
...authHeaders(runtime.currentToken),
|
|
313
|
+
},
|
|
314
|
+
body: JSON.stringify({ userId: runtime.currentUserId }),
|
|
315
|
+
}).catch(() => null);
|
|
316
|
+
if (response?.ok) {
|
|
317
|
+
const memberships = await response.json().catch(() => []);
|
|
318
|
+
if (Array.isArray(memberships)) {
|
|
319
|
+
const spaces = memberships.map((membership: any) => ({
|
|
320
|
+
spaceId: membership?.spaceId ?? null,
|
|
321
|
+
spaceKey: membership?.spaceId ? createSpaceKey.space(String(membership.spaceId)) : null,
|
|
322
|
+
name: membership?.spaceName ?? membership?.name ?? membership?.spaceId ?? null,
|
|
323
|
+
role: membership?.role ?? null,
|
|
324
|
+
ownerId: membership?.ownerId ?? null,
|
|
325
|
+
visibility: membership?.visibility ?? null,
|
|
326
|
+
}));
|
|
327
|
+
return {
|
|
328
|
+
rawData: { success: true, total: spaces.length, spaces },
|
|
329
|
+
displayData: jsonPreview({ total: spaces.length, spaces }),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
throw new Error("listSpaces requires a signed-in user and reachable Nolo server.");
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export const readSpaceFunctionSchema = {
|
|
338
|
+
name: "readSpace",
|
|
339
|
+
description: "Read one Nolo space and optionally list its contents.",
|
|
340
|
+
parameters: {
|
|
341
|
+
type: "object",
|
|
342
|
+
properties: {
|
|
343
|
+
space: { type: "string", description: "Space id or URL." },
|
|
344
|
+
contentKey: { type: "string", description: "Optional content key inside the space." },
|
|
345
|
+
brief: { type: "boolean", description: "Return brief content entries." },
|
|
346
|
+
},
|
|
347
|
+
required: ["space"],
|
|
348
|
+
},
|
|
349
|
+
} as const;
|
|
350
|
+
|
|
351
|
+
export async function readSpaceFunc(args: any, thunkApi: any): Promise<ToolResult> {
|
|
352
|
+
const rawSpace = typeof args?.space === "string"
|
|
353
|
+
? args.space.trim()
|
|
354
|
+
: typeof args?.spaceId === "string"
|
|
355
|
+
? args.spaceId.trim()
|
|
356
|
+
: typeof args?.id === "string"
|
|
357
|
+
? args.id.trim()
|
|
358
|
+
: "";
|
|
359
|
+
if (!rawSpace) throw new Error("readSpace requires space.");
|
|
360
|
+
const spaceId = normalizeNoloSpaceInput(rawSpace);
|
|
361
|
+
const spaceKey = createSpaceKey.space(spaceId);
|
|
362
|
+
const space = await readBestRecord(thunkApi, spaceKey, true);
|
|
363
|
+
if (!space) throw new Error(`readSpace not found: ${rawSpace}`);
|
|
364
|
+
const contentKeyFilter = typeof args?.contentKey === "string" ? args.contentKey.trim() : "";
|
|
365
|
+
const allContents = Object.entries(space?.contents ?? {})
|
|
366
|
+
.filter(([, value]) => value && typeof value === "object")
|
|
367
|
+
.map(([entryKey, value]) => ({ entryKey, ...(value as Record<string, any>) }));
|
|
368
|
+
const contents = contentKeyFilter
|
|
369
|
+
? allContents.filter((item: any) => {
|
|
370
|
+
const contentKey = typeof item.contentKey === "string" && item.contentKey.trim()
|
|
371
|
+
? item.contentKey.trim()
|
|
372
|
+
: item.entryKey;
|
|
373
|
+
return item.entryKey === contentKeyFilter || contentKey === contentKeyFilter;
|
|
374
|
+
})
|
|
375
|
+
: allContents;
|
|
376
|
+
const result = {
|
|
377
|
+
success: true,
|
|
378
|
+
spaceId,
|
|
379
|
+
spaceKey,
|
|
380
|
+
name: space?.name ?? null,
|
|
381
|
+
description: space?.description ?? null,
|
|
382
|
+
ownerId: space?.ownerId ?? null,
|
|
383
|
+
visibility: space?.visibility ?? null,
|
|
384
|
+
contentCount: allContents.length,
|
|
385
|
+
contents: args?.brief === true
|
|
386
|
+
? contents.map((item: any) => ({
|
|
387
|
+
entryKey: item.entryKey,
|
|
388
|
+
contentKey: item.contentKey ?? item.entryKey,
|
|
389
|
+
type: item.type ?? null,
|
|
390
|
+
title: item.title ?? null,
|
|
391
|
+
categoryId: item.categoryId ?? null,
|
|
392
|
+
}))
|
|
393
|
+
: contents,
|
|
394
|
+
...(contentKeyFilter ? { contentKeyFilter, matchedCount: contents.length } : {}),
|
|
395
|
+
};
|
|
396
|
+
return {
|
|
397
|
+
rawData: result,
|
|
398
|
+
displayData: jsonPreview(result),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
export const readSkillDocFunctionSchema = {
|
|
403
|
+
name: "readSkillDoc",
|
|
404
|
+
description: "Read one Nolo skill doc/page by page dbKey.",
|
|
405
|
+
parameters: {
|
|
406
|
+
type: "object",
|
|
407
|
+
properties: {
|
|
408
|
+
id: { type: "string", description: "Skill doc page dbKey, for example page-xxx." },
|
|
409
|
+
doc: { type: "string", description: "Alias for id." },
|
|
410
|
+
},
|
|
411
|
+
required: ["id"],
|
|
412
|
+
},
|
|
413
|
+
} as const;
|
|
414
|
+
|
|
415
|
+
export async function readSkillDocFunc(args: any, thunkApi: any): Promise<ToolResult> {
|
|
416
|
+
const { buildReadDocResult } = await import("./readDocTool");
|
|
417
|
+
const id = args?.id ?? args?.doc ?? args?.docKey ?? args?.pageKey;
|
|
418
|
+
if (typeof id !== "string" || !id.trim()) {
|
|
419
|
+
throw new Error("readSkillDoc requires id or doc.");
|
|
420
|
+
}
|
|
421
|
+
const page = await readBestRecord(thunkApi, id.trim(), true);
|
|
422
|
+
if (!page) throw new Error(`readSkillDoc not found: ${id}`);
|
|
423
|
+
const result = buildReadDocResult(page);
|
|
424
|
+
return { rawData: result.rawData, displayData: result.displayData };
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export const cliWhoamiFunctionSchema = {
|
|
428
|
+
name: "cliWhoami",
|
|
429
|
+
description: "Show the current Nolo runtime identity. In Web/RN this reports browser runtime identity.",
|
|
430
|
+
parameters: { type: "object", properties: {} },
|
|
431
|
+
} as const;
|
|
432
|
+
|
|
433
|
+
export async function cliWhoamiFunc(_args: any, thunkApi: any): Promise<ToolResult> {
|
|
434
|
+
const runtime = getRuntime(thunkApi);
|
|
435
|
+
const result = {
|
|
436
|
+
success: true,
|
|
437
|
+
runtime: "browser",
|
|
438
|
+
serverBase: runtime?.currentServer ?? null,
|
|
439
|
+
userId: runtime?.currentUserId ?? null,
|
|
440
|
+
authenticated: !!runtime?.currentToken,
|
|
441
|
+
};
|
|
442
|
+
return { rawData: result, displayData: jsonPreview(result) };
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
export const cliDoctorFunctionSchema = {
|
|
446
|
+
name: "cliDoctor",
|
|
447
|
+
description: "Show Nolo runtime diagnostics. In Web/RN this reports browser tool diagnostics.",
|
|
448
|
+
parameters: { type: "object", properties: {} },
|
|
449
|
+
} as const;
|
|
450
|
+
|
|
451
|
+
export async function cliDoctorFunc(_args: any, thunkApi: any): Promise<ToolResult> {
|
|
452
|
+
const runtime = getRuntime(thunkApi);
|
|
453
|
+
const result = {
|
|
454
|
+
success: true,
|
|
455
|
+
runtime: "browser",
|
|
456
|
+
serverBase: runtime?.currentServer ?? null,
|
|
457
|
+
authenticated: !!runtime?.currentToken,
|
|
458
|
+
userId: runtime?.currentUserId ?? null,
|
|
459
|
+
diagnosticScope: "nolo_workspace_subset",
|
|
460
|
+
message:
|
|
461
|
+
"workspaceTools is a subset for Nolo workspace inspection, not necessarily the complete current run tool surface.",
|
|
462
|
+
noloWorkspaceToolSubset: [...NOLO_WORKSPACE_TOOL_NAMES],
|
|
463
|
+
workspaceTools: [...NOLO_WORKSPACE_TOOL_NAMES],
|
|
464
|
+
workspaceToolsAreSubset: true,
|
|
465
|
+
};
|
|
466
|
+
return { rawData: result, displayData: jsonPreview(result) };
|
|
467
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { callToolApi } from "./toolApiClient";
|
|
2
|
+
|
|
3
|
+
export const olmOcrSchema = {
|
|
4
|
+
name: "olm_ocr",
|
|
5
|
+
description: "使用 allenai/olmOCR-2-7B-1025 模型进行光学字符识别 (OCR)。适合文档、论文等结构化文本的高质量识别。",
|
|
6
|
+
parameters: {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
imageUrl: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "要进行 OCR 的图片 URL、base64 编码的图片数据,或者内部文件 ID (如 'file-...')。",
|
|
12
|
+
},
|
|
13
|
+
prompt: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "可选的提示词,用于指导模型如何提取信息(例如:'提取所有表格数据' 或 '识别图片中的所有文字')。默认为 '识别图片中的所有文字'。",
|
|
16
|
+
default: "识别图片中的所有文字"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
required: ["imageUrl"],
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const olmOcrFunc = async (input: any, thunkApi: any): Promise<any> => {
|
|
24
|
+
const { imageUrl, prompt = "识别图片中的所有文字" } = input;
|
|
25
|
+
|
|
26
|
+
const data = await callToolApi(thunkApi, "/api/olm-ocr", { imageUrl, prompt }, { withAuth: true });
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
summary: "OCR processing completed",
|
|
30
|
+
text: data.choices?.[0]?.message?.content || "No text detected",
|
|
31
|
+
rawData: data
|
|
32
|
+
};
|
|
33
|
+
};
|