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,345 @@
|
|
|
1
|
+
import { NOLO_CLUSTER_SERVERS } from "../database/config";
|
|
2
|
+
import { DEFAULT_LOCAL_API_ORIGIN } from "../core/localOrigins";
|
|
3
|
+
import { buildSkillSummaryMarker } from "../ai/skills/skillSummaryMarker";
|
|
4
|
+
import { writeAgentRecord } from "./agentRecordHelpers";
|
|
5
|
+
import {
|
|
6
|
+
parseUserIdFromAuthToken,
|
|
7
|
+
readOption,
|
|
8
|
+
resolveAuthToken,
|
|
9
|
+
resolveServerUrl,
|
|
10
|
+
} from "./cliEnvHelpers";
|
|
11
|
+
import {
|
|
12
|
+
buildPageKey,
|
|
13
|
+
buildPageRecord,
|
|
14
|
+
createPageId,
|
|
15
|
+
readBodyArg,
|
|
16
|
+
} from "./docPageHelpers";
|
|
17
|
+
import {
|
|
18
|
+
buildSkillDocId,
|
|
19
|
+
buildSkillPageKey,
|
|
20
|
+
buildSkillPageRecord,
|
|
21
|
+
parseJsonArg,
|
|
22
|
+
} from "./docSkillHelpers";
|
|
23
|
+
import { ensurePageAttachedToSpace } from "./docSpaceHelpers";
|
|
24
|
+
import { findPotentialSecrets, formatSecretFindings } from "./secretScan";
|
|
25
|
+
|
|
26
|
+
type DocKind = "page" | "skill";
|
|
27
|
+
|
|
28
|
+
type DocCreateDeps = {
|
|
29
|
+
env: NodeJS.ProcessEnv;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const VALUE_FLAGS = new Set([
|
|
33
|
+
"--title",
|
|
34
|
+
"--description",
|
|
35
|
+
"--body",
|
|
36
|
+
"--body-file",
|
|
37
|
+
"--id",
|
|
38
|
+
"--space",
|
|
39
|
+
"--sync",
|
|
40
|
+
"--server",
|
|
41
|
+
"--server-url",
|
|
42
|
+
"--token",
|
|
43
|
+
"--tools",
|
|
44
|
+
"--required-skills",
|
|
45
|
+
"--recommended-skills",
|
|
46
|
+
"--preferred-agents",
|
|
47
|
+
"--trigger-mode",
|
|
48
|
+
"--budget-tier",
|
|
49
|
+
"--prompt-patch",
|
|
50
|
+
"--kind",
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
function hasHelpArg(args: string[]) {
|
|
54
|
+
return args.includes("--help") || args.includes("-h");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function hasFlag(args: string[], flag: string) {
|
|
58
|
+
return args.includes(flag);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function printDocCreateUsage(output: { write(chunk: string): unknown }) {
|
|
62
|
+
output.write(`Usage:
|
|
63
|
+
nolo doc create --title <title> [--body ... | --body-file path] [--id ...] [--space ...]
|
|
64
|
+
|
|
65
|
+
Options:
|
|
66
|
+
--description <text> Optional page description stored in meta.
|
|
67
|
+
--sync local,main,us Choose write targets. Values may also be full URLs.
|
|
68
|
+
--local-only Write only to the local server target.
|
|
69
|
+
--no-local Exclude local targets when --sync includes them.
|
|
70
|
+
--dry-run Build and validate without writing.
|
|
71
|
+
--json Print machine-readable JSON.
|
|
72
|
+
--allow-secrets Allow bodies that look like credentials.
|
|
73
|
+
--server <url> Default write target when --sync is omitted.
|
|
74
|
+
--token <jwt> Auth token. Required for writes.
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function printSkillDocCreateUsage(output: { write(chunk: string): unknown }) {
|
|
79
|
+
output.write(`Usage:
|
|
80
|
+
nolo skill-doc create --title <title> --description <text> [--body ... | --body-file path]
|
|
81
|
+
nolo skill create-doc --title <title> --description <text> [--body ... | --body-file path]
|
|
82
|
+
|
|
83
|
+
Options:
|
|
84
|
+
--tools '["readDoc"]' Tool names this skill expects.
|
|
85
|
+
--required-skills '["skill-a"]' Required skill references.
|
|
86
|
+
--recommended-skills '["skill-b"]' Recommended skill references.
|
|
87
|
+
--preferred-agents '["agent-key"]' Preferred agent keys.
|
|
88
|
+
--trigger-mode explicit|required|recommended
|
|
89
|
+
--budget-tier low|medium|high
|
|
90
|
+
--prompt-patch <text>
|
|
91
|
+
--page | --kind page Create a normal page instead of a skill-backed page.
|
|
92
|
+
--sync local,main,us Choose write targets. Values may also be full URLs.
|
|
93
|
+
--dry-run Build and validate without writing.
|
|
94
|
+
--json Print machine-readable JSON.
|
|
95
|
+
--token <jwt> Auth token. Required for writes.
|
|
96
|
+
`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function normalizeBaseUrl(base: string) {
|
|
100
|
+
return base.trim().replace(/\/+$/, "");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function localBaseFromEnv(env: NodeJS.ProcessEnv) {
|
|
104
|
+
return normalizeBaseUrl(env.SCRIPT_LOCAL_BASE_URL || DEFAULT_LOCAL_API_ORIGIN);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function targetToBase(target: string, env: NodeJS.ProcessEnv) {
|
|
108
|
+
const normalized = target.trim().toLowerCase();
|
|
109
|
+
if (normalized === "local") return localBaseFromEnv(env);
|
|
110
|
+
if (normalized === "main") return normalizeBaseUrl(NOLO_CLUSTER_SERVERS[0]);
|
|
111
|
+
if (normalized === "us") return normalizeBaseUrl(NOLO_CLUSTER_SERVERS[1]);
|
|
112
|
+
return normalizeBaseUrl(target);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function parseSyncTargets(raw: string | undefined, env: NodeJS.ProcessEnv) {
|
|
116
|
+
if (!raw) return undefined;
|
|
117
|
+
return raw
|
|
118
|
+
.split(",")
|
|
119
|
+
.map((value) => value.trim())
|
|
120
|
+
.filter(Boolean)
|
|
121
|
+
.filter((value) => value !== "none")
|
|
122
|
+
.map((value) => targetToBase(value, env));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function isLocalBaseUrl(baseUrl: string) {
|
|
126
|
+
try {
|
|
127
|
+
const hostname = new URL(baseUrl).hostname;
|
|
128
|
+
return hostname === "localhost" || hostname === "127.0.0.1";
|
|
129
|
+
} catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function resolveWriteTargets(args: string[], env: NodeJS.ProcessEnv) {
|
|
135
|
+
const explicitSync = parseSyncTargets(readOption(args, "--sync"), env);
|
|
136
|
+
const targets = hasFlag(args, "--local-only")
|
|
137
|
+
? [localBaseFromEnv(env)]
|
|
138
|
+
: explicitSync ?? [resolveServerUrl(args, env)];
|
|
139
|
+
const filtered = hasFlag(args, "--no-local")
|
|
140
|
+
? targets.filter((target) => !isLocalBaseUrl(target))
|
|
141
|
+
: targets;
|
|
142
|
+
return Array.from(new Set(filtered.map(normalizeBaseUrl)));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function readTitle(args: string[]) {
|
|
146
|
+
return readOption(args, "--title") ?? args.find((value, index) => {
|
|
147
|
+
if (index === 0) return false;
|
|
148
|
+
if (VALUE_FLAGS.has(args[index - 1])) return false;
|
|
149
|
+
return !value.startsWith("-");
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function resolveDocKind(args: string[], fallback: DocKind): DocKind {
|
|
154
|
+
if (hasFlag(args, "--page") || readOption(args, "--kind") === "page") return "page";
|
|
155
|
+
return fallback;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function requireTokenUser(args: string[], env: NodeJS.ProcessEnv, dryRun: boolean) {
|
|
159
|
+
const authToken = resolveAuthToken(args, env);
|
|
160
|
+
const userId = parseUserIdFromAuthToken(authToken) || env.USER_ID || "";
|
|
161
|
+
if (!authToken && !dryRun) {
|
|
162
|
+
throw new Error("doc create requires an auth token. Pass --token or set AUTH_TOKEN.");
|
|
163
|
+
}
|
|
164
|
+
if (!userId && !dryRun) {
|
|
165
|
+
throw new Error("auth token does not contain userId. Pass a user-scoped token.");
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
authToken,
|
|
169
|
+
userId: userId || "dry-run",
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function writePageRecord(args: {
|
|
174
|
+
authToken: string;
|
|
175
|
+
dbKey: string;
|
|
176
|
+
record: Record<string, any>;
|
|
177
|
+
serverUrl: string;
|
|
178
|
+
spaceId: string | null;
|
|
179
|
+
title: string;
|
|
180
|
+
userId: string;
|
|
181
|
+
skillSummary?: Record<string, any> | null;
|
|
182
|
+
}) {
|
|
183
|
+
await writeAgentRecord({
|
|
184
|
+
agentKey: args.dbKey,
|
|
185
|
+
authToken: args.authToken,
|
|
186
|
+
fetchImpl: fetch,
|
|
187
|
+
serverUrl: args.serverUrl,
|
|
188
|
+
userId: args.userId,
|
|
189
|
+
record: args.record,
|
|
190
|
+
});
|
|
191
|
+
if (args.spaceId) {
|
|
192
|
+
await ensurePageAttachedToSpace({
|
|
193
|
+
baseUrl: args.serverUrl,
|
|
194
|
+
userId: args.userId,
|
|
195
|
+
authToken: args.authToken,
|
|
196
|
+
spaceId: args.spaceId,
|
|
197
|
+
contentKey: args.dbKey,
|
|
198
|
+
title: args.title,
|
|
199
|
+
skillSummary: args.skillSummary,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async function runCreateCommand(
|
|
205
|
+
args: string[],
|
|
206
|
+
deps: DocCreateDeps,
|
|
207
|
+
options: { defaultKind: DocKind; usage: (output: { write(chunk: string): unknown }) => void }
|
|
208
|
+
) {
|
|
209
|
+
if (hasHelpArg(args)) {
|
|
210
|
+
options.usage(process.stdout);
|
|
211
|
+
return 0;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const title = readTitle(args);
|
|
215
|
+
const description = readOption(args, "--description") ?? "";
|
|
216
|
+
const docKind = resolveDocKind(args, options.defaultKind);
|
|
217
|
+
const shouldDryRun = hasFlag(args, "--dry-run");
|
|
218
|
+
const shouldOutputJson = hasFlag(args, "--json");
|
|
219
|
+
const allowSecrets = hasFlag(args, "--allow-secrets");
|
|
220
|
+
const spaceId = readOption(args, "--space") ?? null;
|
|
221
|
+
|
|
222
|
+
if (!title || (docKind === "skill" && !description)) {
|
|
223
|
+
options.usage(process.stderr);
|
|
224
|
+
return 1;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const body = readBodyArg(args, "");
|
|
228
|
+
const secretFindings = findPotentialSecrets(body);
|
|
229
|
+
if (secretFindings.length && !allowSecrets) {
|
|
230
|
+
throw new Error(
|
|
231
|
+
[
|
|
232
|
+
"Document body appears to contain credentials or secrets. Pass --allow-secrets to write it anyway.",
|
|
233
|
+
formatSecretFindings(secretFindings),
|
|
234
|
+
].join("\n")
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const { authToken, userId } = requireTokenUser(args, deps.env, shouldDryRun);
|
|
239
|
+
const targets = resolveWriteTargets(args, deps.env);
|
|
240
|
+
if (!targets.length) {
|
|
241
|
+
throw new Error("No write targets resolved. Check --sync / --local-only / --no-local.");
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const explicitId = readOption(args, "--id");
|
|
245
|
+
const docId = explicitId ?? (docKind === "skill" ? buildSkillDocId(title) : createPageId());
|
|
246
|
+
const dbKey = docKind === "skill" ? buildSkillPageKey(userId, docId) : buildPageKey(userId, docId);
|
|
247
|
+
const record =
|
|
248
|
+
docKind === "skill"
|
|
249
|
+
? buildSkillPageRecord({
|
|
250
|
+
dbKey,
|
|
251
|
+
skillId: docId,
|
|
252
|
+
title,
|
|
253
|
+
spaceId,
|
|
254
|
+
body,
|
|
255
|
+
skillConfig: {
|
|
256
|
+
version: "0.1",
|
|
257
|
+
kind: "skill",
|
|
258
|
+
id: docId,
|
|
259
|
+
name: title,
|
|
260
|
+
description,
|
|
261
|
+
...(parseJsonArg<string[]>(readOption(args, "--tools"), []).length
|
|
262
|
+
? { toolNames: parseJsonArg<string[]>(readOption(args, "--tools"), []) }
|
|
263
|
+
: {}),
|
|
264
|
+
...(parseJsonArg<string[]>(readOption(args, "--required-skills"), []).length
|
|
265
|
+
? { requiredSkills: parseJsonArg<string[]>(readOption(args, "--required-skills"), []) }
|
|
266
|
+
: {}),
|
|
267
|
+
...(parseJsonArg<string[]>(readOption(args, "--recommended-skills"), []).length
|
|
268
|
+
? { recommendedSkills: parseJsonArg<string[]>(readOption(args, "--recommended-skills"), []) }
|
|
269
|
+
: {}),
|
|
270
|
+
...(parseJsonArg<string[]>(readOption(args, "--preferred-agents"), []).length
|
|
271
|
+
? { preferredAgents: parseJsonArg<string[]>(readOption(args, "--preferred-agents"), []) }
|
|
272
|
+
: {}),
|
|
273
|
+
...(readOption(args, "--trigger-mode")
|
|
274
|
+
? { triggerMode: readOption(args, "--trigger-mode") as "explicit" | "required" | "recommended" }
|
|
275
|
+
: {}),
|
|
276
|
+
...(readOption(args, "--budget-tier")
|
|
277
|
+
? { budgetTier: readOption(args, "--budget-tier") as "low" | "medium" | "high" }
|
|
278
|
+
: {}),
|
|
279
|
+
...(readOption(args, "--prompt-patch") ? { promptPatch: readOption(args, "--prompt-patch") } : {}),
|
|
280
|
+
},
|
|
281
|
+
})
|
|
282
|
+
: buildPageRecord({
|
|
283
|
+
dbKey,
|
|
284
|
+
pageId: docId,
|
|
285
|
+
title,
|
|
286
|
+
spaceId,
|
|
287
|
+
content: body,
|
|
288
|
+
meta: description ? { description } : undefined,
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
const skillSummary = docKind === "skill" ? buildSkillSummaryMarker(record.meta) : undefined;
|
|
292
|
+
const summary = {
|
|
293
|
+
dryRun: shouldDryRun,
|
|
294
|
+
kind: docKind,
|
|
295
|
+
title,
|
|
296
|
+
dbKey,
|
|
297
|
+
id: docId,
|
|
298
|
+
userId,
|
|
299
|
+
spaceId,
|
|
300
|
+
syncTargets: targets,
|
|
301
|
+
writtenTargets: [] as string[],
|
|
302
|
+
secretFindingCount: secretFindings.length,
|
|
303
|
+
secretFindings,
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
if (!shouldDryRun) {
|
|
307
|
+
for (const serverUrl of targets) {
|
|
308
|
+
await writePageRecord({
|
|
309
|
+
authToken,
|
|
310
|
+
dbKey,
|
|
311
|
+
record,
|
|
312
|
+
serverUrl,
|
|
313
|
+
spaceId,
|
|
314
|
+
title,
|
|
315
|
+
userId,
|
|
316
|
+
skillSummary,
|
|
317
|
+
});
|
|
318
|
+
summary.writtenTargets.push(serverUrl);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (shouldOutputJson) {
|
|
323
|
+
process.stdout.write(`${JSON.stringify(summary, null, 2)}\n`);
|
|
324
|
+
} else if (shouldDryRun) {
|
|
325
|
+
process.stdout.write(`dry-run ok: ${dbKey}\n`);
|
|
326
|
+
} else {
|
|
327
|
+
process.stdout.write(`created ${docKind}: ${dbKey}\n`);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return 0;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export async function runDocCreateCommand(args: string[], deps: DocCreateDeps) {
|
|
334
|
+
return runCreateCommand(args, deps, {
|
|
335
|
+
defaultKind: "page",
|
|
336
|
+
usage: printDocCreateUsage,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export async function runSkillDocCreateCommand(args: string[], deps: DocCreateDeps) {
|
|
341
|
+
return runCreateCommand(args, deps, {
|
|
342
|
+
defaultKind: "skill",
|
|
343
|
+
usage: printSkillDocCreateUsage,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CommandEntry } from "./cliCommandTypes";
|
|
2
|
+
import { createEnvCommand } from "./cliCommandFactories";
|
|
3
|
+
import { runDocCreateCommand, runSkillDocCreateCommand } from "./docCreateCommands";
|
|
4
|
+
|
|
5
|
+
export function getDocInternalCommandEntries(): CommandEntry[] {
|
|
6
|
+
return [
|
|
7
|
+
createEnvCommand(["doc", "create"], "Create a normal doc", runDocCreateCommand),
|
|
8
|
+
createEnvCommand(["skill-doc", "create"], "Create a skill-backed doc", runSkillDocCreateCommand),
|
|
9
|
+
createEnvCommand(["skill", "create-doc"], "Create a skill-backed doc", runSkillDocCreateCommand),
|
|
10
|
+
];
|
|
11
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { ulid } from "ulid";
|
|
3
|
+
|
|
4
|
+
function getCliArg(args: string[], flag: string): string | undefined {
|
|
5
|
+
const idx = args.indexOf(flag);
|
|
6
|
+
return idx !== -1 ? args[idx + 1] : undefined;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function readBodyArg(args: string[], fallback = "") {
|
|
10
|
+
const bodyFile = getCliArg(args, "--body-file");
|
|
11
|
+
if (bodyFile !== undefined) {
|
|
12
|
+
return readFileSync(bodyFile, "utf8");
|
|
13
|
+
}
|
|
14
|
+
return getCliArg(args, "--body") ?? fallback;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function textToSlate(text: string) {
|
|
18
|
+
return text.split("\n").map((line) => ({
|
|
19
|
+
type: "paragraph",
|
|
20
|
+
children: [{ text: line }],
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function createPageId() {
|
|
25
|
+
return ulid();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function buildPageKey(userId: string, pageId: string) {
|
|
29
|
+
return `page-${userId}-${pageId}`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function buildPageRecord(args: {
|
|
33
|
+
dbKey: string;
|
|
34
|
+
pageId: string;
|
|
35
|
+
title: string;
|
|
36
|
+
spaceId: string | null;
|
|
37
|
+
content: string;
|
|
38
|
+
existing?: Record<string, any> | null;
|
|
39
|
+
meta?: Record<string, any> | null;
|
|
40
|
+
slateData?: Record<string, any>[] | null;
|
|
41
|
+
}) {
|
|
42
|
+
const { dbKey, pageId, title, spaceId, content, existing, meta, slateData } = args;
|
|
43
|
+
const now = Date.now();
|
|
44
|
+
const createdAt = typeof existing?.createdAt === "number" ? existing.createdAt : now;
|
|
45
|
+
const created =
|
|
46
|
+
typeof existing?.created === "string" ? existing.created : new Date(createdAt).toISOString();
|
|
47
|
+
|
|
48
|
+
const nextRecord: Record<string, any> = {
|
|
49
|
+
...(existing ?? {}),
|
|
50
|
+
id: existing?.id ?? pageId,
|
|
51
|
+
dbKey,
|
|
52
|
+
type: "page",
|
|
53
|
+
title,
|
|
54
|
+
spaceId,
|
|
55
|
+
content,
|
|
56
|
+
updatedAt: now,
|
|
57
|
+
createdAt,
|
|
58
|
+
created,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
if (meta !== undefined) {
|
|
62
|
+
if (meta === null) {
|
|
63
|
+
delete nextRecord.meta;
|
|
64
|
+
} else {
|
|
65
|
+
nextRecord.meta = meta;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (slateData !== undefined) {
|
|
70
|
+
if (slateData === null) {
|
|
71
|
+
delete nextRecord.slateData;
|
|
72
|
+
} else {
|
|
73
|
+
nextRecord.slateData = slateData;
|
|
74
|
+
}
|
|
75
|
+
} else if (!existing?.slateData) {
|
|
76
|
+
nextRecord.slateData = textToSlate(content);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return nextRecord;
|
|
80
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildSkillDocMarkdown,
|
|
3
|
+
type SkillDocConfig,
|
|
4
|
+
} from "../ai/skills/skillDocProtocol";
|
|
5
|
+
import { buildPageKey, buildPageRecord } from "./docPageHelpers";
|
|
6
|
+
|
|
7
|
+
function normalizeSkillSeed(input: string) {
|
|
8
|
+
return input
|
|
9
|
+
.trim()
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-")
|
|
12
|
+
.replace(/^-+|-+$/g, "");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function deterministicId(prefix: string, seed: string): string {
|
|
16
|
+
let h = 0x811c9dc5;
|
|
17
|
+
for (let i = 0; i < seed.length; i++) {
|
|
18
|
+
h ^= seed.charCodeAt(i);
|
|
19
|
+
h = (h * 0x01000193) >>> 0;
|
|
20
|
+
}
|
|
21
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
22
|
+
return (prefix + suffix).slice(0, 26);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function buildSkillDocId(input: string) {
|
|
26
|
+
return deterministicId("01SK", normalizeSkillSeed(input) || input);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function buildSkillPageKey(userId: string, skillId: string) {
|
|
30
|
+
return buildPageKey(userId, skillId);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function buildSkillPageRecord(args: {
|
|
34
|
+
dbKey: string;
|
|
35
|
+
skillId: string;
|
|
36
|
+
title: string;
|
|
37
|
+
spaceId: string | null;
|
|
38
|
+
body: string;
|
|
39
|
+
skillConfig: SkillDocConfig;
|
|
40
|
+
existing?: Record<string, any> | null;
|
|
41
|
+
}) {
|
|
42
|
+
const { dbKey, skillId, title, spaceId, body, skillConfig, existing } = args;
|
|
43
|
+
return {
|
|
44
|
+
...buildPageRecord({
|
|
45
|
+
dbKey,
|
|
46
|
+
pageId: skillId,
|
|
47
|
+
title,
|
|
48
|
+
spaceId,
|
|
49
|
+
content: buildSkillDocMarkdown({
|
|
50
|
+
body,
|
|
51
|
+
skillConfig,
|
|
52
|
+
}),
|
|
53
|
+
existing,
|
|
54
|
+
meta: {
|
|
55
|
+
...(existing?.meta ?? {}),
|
|
56
|
+
kind: "skill",
|
|
57
|
+
skillConfig,
|
|
58
|
+
},
|
|
59
|
+
slateData: null,
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function parseJsonArg<T>(raw: string | undefined, fallback: T): T {
|
|
65
|
+
if (raw === undefined) return fallback;
|
|
66
|
+
return JSON.parse(raw) as T;
|
|
67
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createSpaceKey } from "../create/space/spaceKeys";
|
|
2
|
+
import { readDbRecord, writeAgentRecord } from "./agentRecordHelpers";
|
|
3
|
+
|
|
4
|
+
export async function ensurePageAttachedToSpace(params: {
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
authToken: string;
|
|
8
|
+
spaceId: string;
|
|
9
|
+
contentKey: string;
|
|
10
|
+
title: string;
|
|
11
|
+
skillSummary?: Record<string, any> | null;
|
|
12
|
+
}) {
|
|
13
|
+
const { baseUrl, userId, authToken, spaceId, contentKey, title, skillSummary } = params;
|
|
14
|
+
const spaceKey = createSpaceKey.space(spaceId);
|
|
15
|
+
const spaceRecord = await readDbRecord({
|
|
16
|
+
dbKey: spaceKey,
|
|
17
|
+
authToken,
|
|
18
|
+
fetchImpl: fetch,
|
|
19
|
+
serverUrl: baseUrl,
|
|
20
|
+
});
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
|
|
23
|
+
await writeAgentRecord({
|
|
24
|
+
agentKey: spaceKey,
|
|
25
|
+
authToken,
|
|
26
|
+
fetchImpl: fetch,
|
|
27
|
+
serverUrl: baseUrl,
|
|
28
|
+
userId,
|
|
29
|
+
record: {
|
|
30
|
+
...spaceRecord,
|
|
31
|
+
contents: {
|
|
32
|
+
...(spaceRecord.contents ?? {}),
|
|
33
|
+
[contentKey]: {
|
|
34
|
+
...(spaceRecord.contents?.[contentKey] ?? {}),
|
|
35
|
+
title,
|
|
36
|
+
type: "page",
|
|
37
|
+
contentKey,
|
|
38
|
+
...(skillSummary !== undefined ? { skillSummary } : {}),
|
|
39
|
+
updatedAt: now,
|
|
40
|
+
createdAt: spaceRecord.contents?.[contentKey]?.createdAt ?? now,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
updatedAt: now,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getAgentInternalCommandEntries } from "./agentInternalCommandEntries";
|
|
2
2
|
import { getDialogInternalCommandEntries } from "./dialogInternalCommandEntries";
|
|
3
|
+
import { getDocInternalCommandEntries } from "./docInternalCommandEntries";
|
|
3
4
|
import type { CommandEntry } from "./cliCommandTypes";
|
|
5
|
+
import { getMemoryInternalCommandEntries } from "./memoryInternalCommandEntries";
|
|
4
6
|
import { getSystemInternalCommandEntries } from "./systemInternalCommandEntries";
|
|
5
7
|
import { getWorkflowInternalCommandEntries } from "./workflowInternalCommandEntries";
|
|
6
8
|
|
|
@@ -8,6 +10,8 @@ export function getInternalCommandEntries(renderHelpText: () => string): Command
|
|
|
8
10
|
return [
|
|
9
11
|
...getAgentInternalCommandEntries(),
|
|
10
12
|
...getDialogInternalCommandEntries(),
|
|
13
|
+
...getDocInternalCommandEntries(),
|
|
14
|
+
...getMemoryInternalCommandEntries(),
|
|
11
15
|
...getWorkflowInternalCommandEntries(),
|
|
12
16
|
...getSystemInternalCommandEntries(renderHelpText),
|
|
13
17
|
];
|
package/cli/machineCommands.ts
CHANGED
|
@@ -132,50 +132,34 @@ function detectLaunchableMachineInfo() {
|
|
|
132
132
|
return detectMachineInfo({ probeLaunchable: true });
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
function
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if (haystack.includes("project-manager") || haystack.includes("项目经理")) return "pm";
|
|
145
|
-
return "codex";
|
|
135
|
+
function findTaskRowSubjectRef(runtimeContext: any) {
|
|
136
|
+
const subjectRefs = Array.isArray(runtimeContext?.subjectRefs) ? runtimeContext.subjectRefs : [];
|
|
137
|
+
for (const ref of subjectRefs) {
|
|
138
|
+
if (!ref || typeof ref !== "object" || Array.isArray(ref)) continue;
|
|
139
|
+
if (ref.kind !== "table-row") continue;
|
|
140
|
+
const id = typeof ref.id === "string" ? ref.id.trim() : "";
|
|
141
|
+
if (id) return id;
|
|
142
|
+
}
|
|
143
|
+
return "";
|
|
146
144
|
}
|
|
147
145
|
|
|
148
|
-
function
|
|
146
|
+
function buildTaskEvidencePrompt(args: {
|
|
149
147
|
agentKey: string;
|
|
150
148
|
agentConfig: any;
|
|
151
149
|
runtimeContext: any;
|
|
152
150
|
}) {
|
|
153
|
-
const
|
|
154
|
-
const rowDbKey = typeof taskRun?.rowDbKey === "string" ? taskRun.rowDbKey.trim() : "";
|
|
151
|
+
const rowDbKey = findTaskRowSubjectRef(args.runtimeContext);
|
|
155
152
|
if (!rowDbKey) return "";
|
|
156
|
-
const workItemId = typeof taskRun?.workItemId === "string" ? taskRun.workItemId.trim() : "";
|
|
157
|
-
const role = inferTaskRunRole(args.agentKey, args.agentConfig);
|
|
158
153
|
return [
|
|
159
|
-
"--- Nolo task
|
|
154
|
+
"--- Nolo task evidence context ---",
|
|
160
155
|
"This CLI runtime does not receive server-side function tools directly.",
|
|
161
|
-
"Use the
|
|
156
|
+
"Use the task row subjectRef and linked dialog/activity evidence as the durable task context.",
|
|
162
157
|
"Run commands from the repository root. The runner already provides server URL and auth in the environment.",
|
|
163
158
|
"Release boundary: after review passes, AI/reviewer/Codex may advance alpha for verification. Do not merge, push, or release main/release unless the human owner explicitly authorizes it in the current task context.",
|
|
164
|
-
"
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
? [
|
|
169
|
-
`Claim work item: bun packages/cli/index.ts task-run claim-work-item --row-dbkey ${JSON.stringify(rowDbKey)} --work-item-id ${JSON.stringify(workItemId)} --agent-key ${JSON.stringify(args.agentKey)} --role ${role}`,
|
|
170
|
-
`Set blocker: bun packages/cli/index.ts task-run set-blocker --row-dbkey ${JSON.stringify(rowDbKey)} --work-item-id ${JSON.stringify(workItemId)} --layer tool --code <CODE> --message <MESSAGE>`,
|
|
171
|
-
`Clear resolved blocker: bun packages/cli/index.ts task-run clear-blocker --row-dbkey ${JSON.stringify(rowDbKey)} --work-item-id ${JSON.stringify(workItemId)} --blocker-id <BLOCKER_ID>`,
|
|
172
|
-
`Submit outcome: bun packages/cli/index.ts task-run submit-outcome --row-dbkey ${JSON.stringify(rowDbKey)} --work-item-id ${JSON.stringify(workItemId)} --summary <SUMMARY>`,
|
|
173
|
-
`Request review: bun packages/cli/index.ts task-run request-review --row-dbkey ${JSON.stringify(rowDbKey)} --work-item-id ${JSON.stringify(workItemId)} --reviewer-agent-key <AGENT_KEY> --message <MESSAGE>`,
|
|
174
|
-
`Record review: bun packages/cli/index.ts task-run record-review --row-dbkey ${JSON.stringify(rowDbKey)} --work-item-id ${JSON.stringify(workItemId)} --review-status <passed|needs_changes|blocked> --reviewer-agent-key ${JSON.stringify(args.agentKey)} --findings <FINDINGS>`,
|
|
175
|
-
`Close work item: bun packages/cli/index.ts task-run close-work-item --row-dbkey ${JSON.stringify(rowDbKey)} --work-item-id ${JSON.stringify(workItemId)} --summary <SUMMARY>`,
|
|
176
|
-
]
|
|
177
|
-
: []),
|
|
178
|
-
"If a bridge command fails, report the exact command and error.",
|
|
159
|
+
"Handoff context: inspect activityRefs/latestActivityRef, dialog checkpoints, artifacts, commits, and test evidence. Use dialog read/search for exact evidence; do not infer completion from handoff text alone.",
|
|
160
|
+
`Read task row: bun packages/cli/index.ts table query --table meta-0e95801d90-NOLOTASKBOARD --row ${JSON.stringify(rowDbKey)} --include-activity --output json`,
|
|
161
|
+
"Then read linked activity dialog ids with: bun packages/cli/index.ts dialog read <dialogId>",
|
|
162
|
+
"Report progress, blockers, worktree, branch, commit/diff, tests, and unverified items in the dialog.",
|
|
179
163
|
].join("\n");
|
|
180
164
|
}
|
|
181
165
|
|
|
@@ -186,7 +170,7 @@ function buildConnectorCliPrompt(agentConfig: any, userInput: string, bridgeArgs
|
|
|
186
170
|
const policy = permissionPolicy ?? resolveMachineRunPermissionPolicy(agentConfig);
|
|
187
171
|
return [
|
|
188
172
|
typeof agentConfig?.prompt === "string" ? agentConfig.prompt.trim() : "",
|
|
189
|
-
bridgeArgs ?
|
|
173
|
+
bridgeArgs ? buildTaskEvidencePrompt({
|
|
190
174
|
agentKey: bridgeArgs.agentKey,
|
|
191
175
|
agentConfig,
|
|
192
176
|
runtimeContext: bridgeArgs.runtimeContext,
|