nolo-cli 0.1.44 → 0.1.46
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 +258 -102
- package/index.js +73433 -0
- package/package.json +10 -633
- package/LICENSE +0 -21
- package/agent-runtime/agentConfigOptions.ts +0 -12
- package/agent-runtime/agentRecordConfig.ts +0 -101
- package/agent-runtime/agentRecordKeys.ts +0 -14
- package/agent-runtime/agentThread.ts +0 -222
- package/agent-runtime/agentThreadAdmission.ts +0 -74
- package/agent-runtime/dialogMessageRecord.ts +0 -16
- package/agent-runtime/dialogWritePlan.ts +0 -211
- package/agent-runtime/hostAdapter.ts +0 -81
- package/agent-runtime/hybridRecordStore.ts +0 -170
- package/agent-runtime/index.ts +0 -184
- package/agent-runtime/localDialogRead.ts +0 -23
- package/agent-runtime/localLoop.ts +0 -334
- package/agent-runtime/localToolPolicy.ts +0 -179
- package/agent-runtime/localWorkspaceTools.ts +0 -2310
- package/agent-runtime/noloWorkspaceTools.ts +0 -390
- package/agent-runtime/openAiCompatibleProvider.ts +0 -74
- package/agent-runtime/openAiCompatibleProviderConfig.ts +0 -27
- package/agent-runtime/platformChatProvider.ts +0 -229
- package/agent-runtime/providerResolution.ts +0 -302
- package/agent-runtime/runtimeDecision.ts +0 -70
- package/agent-runtime/runtimeFacts.ts +0 -40
- package/agent-runtime/runtimeToolPolicy.ts +0 -191
- package/agent-runtime/runtimeToolSurface.ts +0 -199
- package/agent-runtime/shellCommandPolicy.ts +0 -120
- package/agent-runtime/types.ts +0 -137
- package/agentAliases.ts +0 -110
- package/agentCommandSupport.ts +0 -81
- package/agentInternalCommandEntries.ts +0 -44
- package/agentListCommands.ts +0 -185
- package/agentListHelpers.ts +0 -242
- package/agentMachineCommands.ts +0 -403
- package/agentPullCommand.ts +0 -142
- package/agentRecordCommands.ts +0 -226
- package/agentRecordHelpers.ts +0 -571
- package/agentRunCommand.ts +0 -556
- package/agentRuntimeCommands.ts +0 -7
- package/agentRuntimeLocal.ts +0 -45
- package/ai/agent/_executeModel.ts +0 -146
- package/ai/agent/agentSlice.ts +0 -557
- package/ai/agent/appWorkingMemory.ts +0 -126
- package/ai/agent/buildEditingContext.ts +0 -378
- package/ai/agent/buildSystemPrompt.ts +0 -599
- package/ai/agent/canvasEditingContext.ts +0 -49
- package/ai/agent/cleanAgentMessages.ts +0 -140
- package/ai/agent/cliChatClient.ts +0 -153
- package/ai/agent/cliExecutor.ts +0 -1465
- package/ai/agent/cliPrompt.ts +0 -10
- package/ai/agent/contextCompiler.ts +0 -107
- package/ai/agent/contextLayerContract.ts +0 -44
- package/ai/agent/createAgentSchema.ts +0 -272
- package/ai/agent/currentTimeContext.ts +0 -65
- package/ai/agent/executeToolCall.ts +0 -58
- package/ai/agent/fetchAgentContexts.ts +0 -42
- package/ai/agent/generatePrompt.ts +0 -3
- package/ai/agent/getFullChatContextKeys.ts +0 -168
- package/ai/agent/guidedCreation/capabilities.ts +0 -84
- package/ai/agent/guidedCreation/types.ts +0 -38
- package/ai/agent/isLiveAudioOnlyAgent.ts +0 -26
- package/ai/agent/liveAudioModel.ts +0 -2
- package/ai/agent/machineRunPermissions.ts +0 -113
- package/ai/agent/pageBuilderHandoffRules.ts +0 -75
- package/ai/agent/persistMessageWithFixedId.ts +0 -37
- package/ai/agent/planSlice.ts +0 -259
- package/ai/agent/referenceUtils.ts +0 -229
- package/ai/agent/runAgentBackground.ts +0 -310
- package/ai/agent/runAgentClientLoop.ts +0 -164
- package/ai/agent/runtimeGuidance.ts +0 -116
- package/ai/agent/serverOrigin.ts +0 -7
- package/ai/agent/startParallelAgentStreams.ts +0 -424
- package/ai/agent/startupProtocol.ts +0 -53
- package/ai/agent/streamAgentChatTurn.ts +0 -2135
- package/ai/agent/streamAgentChatTurnUtils.ts +0 -923
- package/ai/agent/toolFailureGuard.ts +0 -99
- package/ai/agent/types.ts +0 -73
- package/ai/agent/utils/imageOutput.ts +0 -37
- package/ai/agent/utils/publicImageAgentMode.ts +0 -26
- package/ai/agent.ts +0 -2
- package/ai/ai.locale.ts +0 -1165
- package/ai/chat/accumulateToolCallChunks.ts +0 -126
- package/ai/chat/fetchUtils.ts +0 -143
- package/ai/chat/inlineImageUrlsForCustomProvider.ts +0 -122
- package/ai/chat/parseApiError.ts +0 -67
- package/ai/chat/parseMultilineSSE.ts +0 -95
- package/ai/chat/sendOpenAICompletionsRequest.ts +0 -921
- package/ai/chat/sendOpenAIResponseRequest.ts +0 -720
- package/ai/chat/serverProxyRetry.ts +0 -102
- package/ai/chat/shouldUseServerProxy.ts +0 -18
- package/ai/chat/streamRetry.ts +0 -46
- package/ai/chat/updateTotalUsage.ts +0 -89
- package/ai/context/buildReferenceContext.ts +0 -437
- package/ai/context/retention.ts +0 -165
- package/ai/context/tokenUtils.ts +0 -78
- package/ai/index.ts +0 -1
- package/ai/llm/agentCapabilities.ts +0 -74
- package/ai/llm/deepinfra.ts +0 -79
- package/ai/llm/fireworks.ts +0 -68
- package/ai/llm/generateRequestBody.ts +0 -165
- package/ai/llm/getModelContextWindow.ts +0 -93
- package/ai/llm/getPricing.ts +0 -252
- package/ai/llm/imagePricing.ts +0 -66
- package/ai/llm/isResponseAPIModel.ts +0 -13
- package/ai/llm/kimi.ts +0 -22
- package/ai/llm/mimo.ts +0 -99
- package/ai/llm/mistral.ts +0 -21
- package/ai/llm/models.ts +0 -45
- package/ai/llm/openrouterModels.ts +0 -31
- package/ai/llm/providers.ts +0 -313
- package/ai/llm/reasoningModels.ts +0 -27
- package/ai/llm/types.ts +0 -82
- package/ai/llm/usageRequestOptions.ts +0 -59
- package/ai/memory/policy.ts +0 -49
- package/ai/memory/queryShared.ts +0 -167
- package/ai/memory/recentRelationshipRecap.ts +0 -251
- package/ai/memory/remember.ts +0 -111
- package/ai/memory/scope.ts +0 -74
- package/ai/memory/store.ts +0 -20
- package/ai/memory/storeShared.ts +0 -76
- package/ai/memory/types.ts +0 -52
- package/ai/memory/understanding.ts +0 -341
- package/ai/memory/understandingGreeting.ts +0 -264
- package/ai/policy/personalizationDialog.ts +0 -333
- package/ai/policy/runtimePolicy.ts +0 -526
- package/ai/policy/selfUpdateFields.ts +0 -48
- package/ai/policy/types.ts +0 -64
- package/ai/skills/referenceRuntime.ts +0 -274
- package/ai/skills/skillDiagnostics.ts +0 -251
- package/ai/skills/skillDocBuilder.ts +0 -139
- package/ai/skills/skillDocProtocol.ts +0 -526
- package/ai/skills/skillSummaryMarker.ts +0 -26
- package/ai/token/calculatePrice.ts +0 -576
- package/ai/token/missingUsageEstimate.ts +0 -42
- package/ai/token/normalizeUsage.ts +0 -124
- package/ai/token/openaiImageGenerationUsage.ts +0 -56
- package/ai/token/prepareTokenUsageData.ts +0 -93
- package/ai/token/resolveBillingTarget.ts +0 -52
- package/ai/token/saveTokenRecord.ts +0 -53
- package/ai/token/types.ts +0 -103
- package/ai/tools/agent/agentTools.ts +0 -214
- package/ai/tools/agent/agentUpdateShared.ts +0 -311
- package/ai/tools/agent/callAgentTool.ts +0 -139
- package/ai/tools/agent/createAgentTool.ts +0 -512
- package/ai/tools/agent/createDialogTool.ts +0 -69
- package/ai/tools/agent/createSkillAgentTool.ts +0 -62
- package/ai/tools/agent/parallelBudget.ts +0 -221
- package/ai/tools/agent/prepareAgentDraftTool.ts +0 -159
- package/ai/tools/agent/presets/appBuilderPreset.ts +0 -154
- package/ai/tools/agent/runLlmTool.ts +0 -96
- package/ai/tools/agent/runStreamingAgentTool.ts +0 -73
- package/ai/tools/agent/skillAgentArgs.ts +0 -106
- package/ai/tools/agent/startAgentDialogTool.ts +0 -54
- package/ai/tools/agent/streamParallelAgentsTool.ts +0 -123
- package/ai/tools/agent/updateAgentTool.ts +0 -96
- package/ai/tools/agent/updateSelfTool.ts +0 -113
- package/ai/tools/amazonProductScraperTool.ts +0 -86
- package/ai/tools/apifyActorClient.ts +0 -45
- package/ai/tools/appEditGuard.ts +0 -372
- package/ai/tools/appReadSnapshot.ts +0 -153
- package/ai/tools/appTools.ts +0 -1549
- package/ai/tools/applyEditTool.ts +0 -259
- package/ai/tools/applyLineEditsTool.ts +0 -315
- package/ai/tools/browserTools/click.ts +0 -33
- package/ai/tools/browserTools/closeSession.ts +0 -29
- package/ai/tools/browserTools/common.ts +0 -27
- package/ai/tools/browserTools/openSession.ts +0 -48
- package/ai/tools/browserTools/readContent.ts +0 -38
- package/ai/tools/browserTools/selectOption.ts +0 -46
- package/ai/tools/browserTools/typeText.ts +0 -42
- package/ai/tools/category/createCategoryTool.ts +0 -66
- package/ai/tools/category/queryContentsByCategoryTool.ts +0 -69
- package/ai/tools/category/updateContentCategoryTool.ts +0 -75
- package/ai/tools/cfBrowserTools.ts +0 -319
- package/ai/tools/cfSpeechToTextTool.ts +0 -49
- package/ai/tools/checkEnvTool.ts +0 -102
- package/ai/tools/cloudflareCrawlTool.ts +0 -289
- package/ai/tools/codeSearchTool.ts +0 -123
- package/ai/tools/codeTools.ts +0 -101
- package/ai/tools/convertMarxistsBookTool.ts +0 -103
- package/ai/tools/createDocTool.ts +0 -132
- package/ai/tools/createSkillDocTool.ts +0 -155
- package/ai/tools/createWorkflowTool.ts +0 -154
- package/ai/tools/delayTool.ts +0 -31
- package/ai/tools/deleteSpacesTool.ts +0 -325
- package/ai/tools/deleteSpacesToolModel.ts +0 -159
- package/ai/tools/devReloadUtils.ts +0 -29
- package/ai/tools/dialogMessageSearch.ts +0 -137
- package/ai/tools/doctorSkillTool.ts +0 -72
- package/ai/tools/ecommerceScraperTool.ts +0 -86
- package/ai/tools/emailTools.ts +0 -549
- package/ai/tools/evalSkillTool.ts +0 -92
- package/ai/tools/exaSearchTool.ts +0 -63
- package/ai/tools/execShellTool.ts +0 -266
- package/ai/tools/executeSqlTool.ts +0 -192
- package/ai/tools/fetchWebpageSupport.ts +0 -333
- package/ai/tools/fetchWebpageTool.ts +0 -97
- package/ai/tools/geminiImagePreviewTool.ts +0 -386
- package/ai/tools/generateDocxTool.ts +0 -215
- package/ai/tools/googleSearchScraperTool.ts +0 -106
- package/ai/tools/importDataTool.ts +0 -133
- package/ai/tools/importSkillTool.ts +0 -162
- package/ai/tools/index.ts +0 -2290
- package/ai/tools/jdProductScraperTool.ts +0 -821
- package/ai/tools/listUserSpacesTool.ts +0 -113
- package/ai/tools/localFilesTool.ts +0 -276
- package/ai/tools/marxistsOfflineBook.ts +0 -253
- package/ai/tools/modelUsageTools.ts +0 -206
- package/ai/tools/noloWorkspaceReadTools.ts +0 -467
- package/ai/tools/olmOcrTool.ts +0 -33
- package/ai/tools/openaiImageTool.ts +0 -267
- package/ai/tools/prepareTools.ts +0 -193
- package/ai/tools/readDocTool.ts +0 -88
- package/ai/tools/readFileTool.ts +0 -214
- package/ai/tools/readTool.ts +0 -194
- package/ai/tools/readXPostTool.ts +0 -229
- package/ai/tools/readXhsProfileTool.ts +0 -638
- package/ai/tools/rememberMemoryTool.ts +0 -84
- package/ai/tools/remotionVideoTool.ts +0 -151
- package/ai/tools/searchDialogMessagesTool.ts +0 -222
- package/ai/tools/searchWorkspaceTool.ts +0 -259
- package/ai/tools/skillFollowup.ts +0 -86
- package/ai/tools/surfWeatherTool.ts +0 -169
- package/ai/tools/table/addTableRowTool.ts +0 -217
- package/ai/tools/table/createTableTool.ts +0 -326
- package/ai/tools/table/rowTools.ts +0 -386
- package/ai/tools/table/schemaTools.ts +0 -244
- package/ai/tools/table/shareTableTool.ts +0 -148
- package/ai/tools/table/toolShared.ts +0 -129
- package/ai/tools/taobaoTmallProductScraperTool.ts +0 -49
- package/ai/tools/toolApiClient.ts +0 -279
- package/ai/tools/toolNameAliases.ts +0 -70
- package/ai/tools/toolPacks.ts +0 -19
- package/ai/tools/toolResultError.ts +0 -42
- package/ai/tools/toolRunSlice.ts +0 -303
- package/ai/tools/toolSchemaCompatibility.ts +0 -53
- package/ai/tools/uiAskChoiceTool.ts +0 -104
- package/ai/tools/updateContentTitleTool.ts +0 -84
- package/ai/tools/updateDocTool.ts +0 -105
- package/ai/tools/updateUserPreferenceProfileTool.ts +0 -153
- package/ai/tools/wereadGatewayTool.ts +0 -152
- package/ai/tools/whisperTool.ts +0 -76
- package/ai/tools/writeFileTool.ts +0 -213
- package/ai/tools/youtubeScraperTool.ts +0 -116
- package/ai/tools/ziweiChartTool.ts +0 -678
- package/ai/types.ts +0 -58
- package/ai/workflow/workflowExecutor.ts +0 -323
- package/ai/workflow/workflowSlice.ts +0 -73
- package/ai/workflow/workflowTypes.ts +0 -106
- package/app/actions/syncAppRecord.ts +0 -73
- package/app/constants/animationSets.ts +0 -21
- package/app/constants/appEditor.ts +0 -99
- package/app/favorite/deletedFavoriteProjection.ts +0 -31
- package/app/favorite/favoriteSlice.ts +0 -690
- package/app/favorite/type.ts +0 -43
- package/app/hooks/deleteDbKey.ts +0 -254
- package/app/i18n/client.ts +0 -13
- package/app/i18n/i18n.base.ts +0 -14
- package/app/i18n/i18n.config.ts +0 -77
- package/app/i18n/index.ts +0 -15
- package/app/i18n/mapLanguage.ts +0 -11
- package/app/i18n/translations/appBuilder.locale.ts +0 -453
- package/app/i18n/translations/error.locale.ts +0 -246
- package/app/i18n/translations/interface.locale.ts +0 -2206
- package/app/i18n/translations/pricing.locale.ts +0 -397
- package/app/i18n/translations/privacy.locale.ts +0 -168
- package/app/i18n/translations/seo.locale.ts +0 -129
- package/app/i18n/translations/terms.locale.ts +0 -124
- package/app/i18n/types.ts +0 -6
- package/app/notifications/model.ts +0 -77
- package/app/notifications/notificationSlice.ts +0 -141
- package/app/reducer.ts +0 -36
- package/app/settings/dbActionThunks.ts +0 -34
- package/app/settings/defaultSpacePreference.ts +0 -87
- package/app/settings/settingSlice.tsx +0 -1212
- package/app/settings/settingsRecord.ts +0 -8
- package/app/stateViews/runtime.ts +0 -90
- package/app/store.ts +0 -55
- package/app/theme/colors.ts +0 -280
- package/app/theme/fontPreference.ts +0 -77
- package/app/theme/theme.config.ts +0 -120
- package/app/theme/themeModeBootstrap.ts +0 -123
- package/app/types/appSummary.ts +0 -118
- package/app/types.ts +0 -358
- package/app/utils/appKeys.ts +0 -55
- package/app/utils/async.ts +0 -28
- package/app/utils/desktopAgentRuntimeTurnClient.ts +0 -75
- package/app/utils/env.ts +0 -17
- package/app/utils/fileUtils.ts +0 -229
- package/app/utils/imageUtils.ts +0 -274
- package/app/utils/myContentItems.ts +0 -317
- package/app/utils/retryAfter.ts +0 -36
- package/app/utils/retryFetch.ts +0 -61
- package/app/utils/toast.ts +0 -3
- package/auth/action/signUpAction.ts +0 -227
- package/auth/adminPermissions.ts +0 -78
- package/auth/authSlice.ts +0 -531
- package/auth/client/loginRequest.ts +0 -14
- package/auth/resetAuthScopedClientState.ts +0 -27
- package/auth/routes.ts +0 -183
- package/auth/token.ts +0 -63
- package/auth/types.ts +0 -40
- package/authCommands.ts +0 -230
- package/chat/chat.locale.ts +0 -817
- package/chat/dialog/actions/addCybotAction.ts +0 -52
- package/chat/dialog/actions/addReferenceKeysAction.ts +0 -62
- package/chat/dialog/actions/builtinDialogLlm.ts +0 -35
- package/chat/dialog/actions/cleanupCliSession.ts +0 -40
- package/chat/dialog/actions/createDialogAction.ts +0 -379
- package/chat/dialog/actions/createScheduledTaskAction.ts +0 -78
- package/chat/dialog/actions/handleSendMessageAction.ts +0 -202
- package/chat/dialog/actions/handleSendMessageResolver.ts +0 -27
- package/chat/dialog/actions/removeCybotAction.ts +0 -6
- package/chat/dialog/actions/removeDialogAgentAction.ts +0 -44
- package/chat/dialog/actions/replacePrimaryCybotAction.ts +0 -6
- package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +0 -52
- package/chat/dialog/actions/updateDialogSummaryAction.ts +0 -430
- package/chat/dialog/actions/updateDialogTitleAction.ts +0 -151
- package/chat/dialog/actions/updateDialogTitlePolicy.ts +0 -30
- package/chat/dialog/actions/updateTokensAction.ts +0 -233
- package/chat/dialog/dialogAgents.ts +0 -72
- package/chat/dialog/dialogAttachmentCleanup.ts +0 -135
- package/chat/dialog/dialogSlice.ts +0 -985
- package/chat/dialog/dialogTitle.ts +0 -81
- package/chat/dialog/dialogTokenStats.ts +0 -12
- package/chat/dialog/dialogUrl.ts +0 -6
- package/chat/dialog/goal.ts +0 -108
- package/chat/dialog/objectAssistantRegistry.ts +0 -286
- package/chat/dialog/schedule.ts +0 -17
- package/chat/messages/activityCompletion.ts +0 -97
- package/chat/messages/fetchAndCacheMessages.ts +0 -119
- package/chat/messages/fetchConvMsgs.ts +0 -51
- package/chat/messages/fetchMessages.ts +0 -84
- package/chat/messages/fileUrl.ts +0 -13
- package/chat/messages/imagePayloadPersistence.ts +0 -22
- package/chat/messages/messageAgent.ts +0 -8
- package/chat/messages/messageContent.ts +0 -203
- package/chat/messages/messageContract.ts +0 -88
- package/chat/messages/messageSlice.ts +0 -1386
- package/chat/messages/toolThunks.ts +0 -646
- package/chat/messages/types.ts +0 -192
- package/chat/messages/web/toolDisplayName.ts +0 -686
- package/cli/agentAliases.ts +0 -110
- package/cli/agentCommandSupport.ts +0 -81
- package/cli/agentInternalCommandEntries.ts +0 -44
- package/cli/agentListCommands.ts +0 -185
- package/cli/agentListHelpers.ts +0 -242
- package/cli/agentMachineCommands.ts +0 -403
- package/cli/agentPullCommand.ts +0 -142
- package/cli/agentRecordCommands.ts +0 -226
- package/cli/agentRecordHelpers.ts +0 -571
- package/cli/agentRunCommand.ts +0 -556
- package/cli/agentRuntimeLocal.ts +0 -45
- package/cli/authCommands.ts +0 -230
- package/cli/cliCommandAdapters.ts +0 -28
- package/cli/cliCommandDispatch.ts +0 -66
- package/cli/cliCommandFactories.ts +0 -66
- package/cli/cliCommandTypes.ts +0 -49
- package/cli/cliEnvHelpers.ts +0 -116
- package/cli/cliSpaceHelpers.ts +0 -39
- package/cli/client/agentConfigResolver.ts +0 -1
- package/cli/client/agentRun.ts +0 -795
- package/cli/client/compactDialog.ts +0 -222
- package/cli/client/hybridRecordStore.ts +0 -52
- package/cli/client/localAgentRecords.ts +0 -7
- package/cli/client/localDialogRecords.ts +0 -30
- package/cli/client/localProviderResolver.ts +0 -1
- package/cli/client/localRuntimeAdapter.ts +0 -1104
- package/cli/client/localToolPolicy.ts +0 -8
- package/cli/client/profileConfig.ts +0 -101
- package/cli/client/streamingOutput.ts +0 -38
- package/cli/commandRegistry.ts +0 -98
- package/cli/connectorRunArtifact.ts +0 -120
- package/cli/connectorWebSocketTarget.ts +0 -112
- package/cli/defaultServer.ts +0 -1
- package/cli/dialogAttachmentCleanup.ts +0 -151
- package/cli/dialogCommands.ts +0 -1120
- package/cli/dialogInternalCommandEntries.ts +0 -17
- package/cli/docCreateCommands.ts +0 -345
- package/cli/docInternalCommandEntries.ts +0 -11
- package/cli/docPageHelpers.ts +0 -80
- package/cli/docSkillHelpers.ts +0 -67
- package/cli/docSpaceHelpers.ts +0 -46
- package/cli/globalRecordOperations.ts +0 -258
- package/cli/internalCommandEntries.ts +0 -18
- package/cli/localRuntimeAuthority.ts +0 -182
- package/cli/localRuntimeDb.ts +0 -26
- package/cli/machineCommands.ts +0 -307
- package/cli/machineDaemonCommands.ts +0 -185
- package/cli/machineHeartbeatCommands.ts +0 -30
- package/cli/machineStatusCommands.ts +0 -95
- package/cli/machineWatchCommands.ts +0 -41
- package/cli/machineWsPromptMaterialization.ts +0 -89
- package/cli/machineWsRunDispatch.ts +0 -695
- package/cli/machineWsSession.ts +0 -213
- package/cli/memoryCommands.ts +0 -253
- package/cli/memoryInternalCommandEntries.ts +0 -9
- package/cli/offlineMarxistsAgentCommand.ts +0 -316
- package/cli/qoderUsageProbe.ts +0 -252
- package/cli/runtimeDoctorCommands.ts +0 -174
- package/cli/runtimeModeArgs.ts +0 -33
- package/cli/scriptCommandEntries.ts +0 -66
- package/cli/secretScan.ts +0 -31
- package/cli/systemInternalCommandEntries.ts +0 -65
- package/cli/tableCommands.ts +0 -453
- package/cli/tui/readlineWorkspace.ts +0 -210
- package/cli/tui/session.ts +0 -554
- package/cli/updateCommands.ts +0 -134
- package/cli/workflowInternalCommandEntries.ts +0 -10
- package/cliCommandAdapters.ts +0 -28
- package/cliCommandDispatch.ts +0 -66
- package/cliCommandFactories.ts +0 -66
- package/cliCommandTypes.ts +0 -49
- package/cliEnvHelpers.ts +0 -116
- package/cliSpaceHelpers.ts +0 -39
- package/client/agentConfigResolver.test.ts +0 -69
- package/client/agentConfigResolver.ts +0 -1
- package/client/agentRun.test.ts +0 -1344
- package/client/agentRun.ts +0 -795
- package/client/compactDialog.test.ts +0 -238
- package/client/compactDialog.ts +0 -222
- package/client/hybridRecordStore.test.ts +0 -157
- package/client/hybridRecordStore.ts +0 -52
- package/client/localAgentRecords.test.ts +0 -27
- package/client/localAgentRecords.ts +0 -7
- package/client/localDialogRecords.test.ts +0 -124
- package/client/localDialogRecords.ts +0 -30
- package/client/localProviderResolver.test.ts +0 -102
- package/client/localProviderResolver.ts +0 -1
- package/client/localRuntimeAdapter.test.ts +0 -2804
- package/client/localRuntimeAdapter.ts +0 -1104
- package/client/localRuntimeDryRun.test.ts +0 -135
- package/client/localToolPolicy.test.ts +0 -48
- package/client/localToolPolicy.ts +0 -8
- package/client/profileConfig.test.ts +0 -106
- package/client/profileConfig.ts +0 -101
- package/client/streamingOutput.test.ts +0 -22
- package/client/streamingOutput.ts +0 -38
- package/commandRegistry.ts +0 -98
- package/connector-experimental/capabilities.ts +0 -75
- package/connector-experimental/codexBinary.ts +0 -41
- package/connector-experimental/heartbeatLoop.ts +0 -22
- package/connector-experimental/machineInfo.ts +0 -46
- package/connector-experimental/protocol.ts +0 -54
- package/connectorRunArtifact.ts +0 -120
- package/connectorWebSocketTarget.ts +0 -112
- package/core/builtinAgents.ts +0 -209
- package/core/config.ts +0 -15
- package/core/crypto.ts +0 -51
- package/core/generateKeyPairFromSeedV1.ts +0 -15
- package/core/generateMainKey.ts +0 -22
- package/core/init.ts +0 -41
- package/core/localOrigins.ts +0 -8
- package/core/password.ts +0 -13
- package/core/prefix.ts +0 -23
- package/create/editor/transforms/fromMarkdown/index.ts +0 -260
- package/create/editor/transforms/fromMarkdown/inline.ts +0 -285
- package/create/editor/transforms/fromMarkdown/table.ts +0 -130
- package/create/editor/transforms/markdownToSlate.ts +0 -24
- package/create/editor/transforms/slateToRenderMarkdown.ts +0 -218
- package/create/editor/transforms/slateToSimplifiedMarkdown.ts +0 -224
- package/create/editor/transforms/slateToText.ts +0 -33
- package/create/editor/utils/slateUtils.ts +0 -233
- package/create/space/addSpaceAction.ts +0 -193
- package/create/space/category/categoryActions.ts +0 -427
- package/create/space/changeSpaceAction.ts +0 -36
- package/create/space/constants.ts +0 -8
- package/create/space/content/addContentAction.ts +0 -116
- package/create/space/content/contentThunks.ts +0 -90
- package/create/space/content/deleteContentFromSpaceAction.ts +0 -187
- package/create/space/content/deleteMultipleContentAction.ts +0 -112
- package/create/space/content/moveContentAction.ts +0 -285
- package/create/space/content/updateContentCategoryAction.ts +0 -154
- package/create/space/content/updateContentTitleAction.ts +0 -151
- package/create/space/content/uploadAndAddFileToSpaceAction.ts +0 -98
- package/create/space/contentKeyUtils.ts +0 -117
- package/create/space/deleteSpaceAction.ts +0 -276
- package/create/space/fetchSpaceAction.ts +0 -70
- package/create/space/fetchSpaceSidebarStateAction.ts +0 -26
- package/create/space/loadDefaultSpaceAction.ts +0 -57
- package/create/space/member/addMemberAction.ts +0 -79
- package/create/space/member/fetchUserSpaceMembershipsAction.ts +0 -386
- package/create/space/member/memberThunks.ts +0 -47
- package/create/space/member/removeMemberAction.ts +0 -67
- package/create/space/resolvePreferredSpaceId.ts +0 -113
- package/create/space/sidebarVisibleTypes.ts +0 -260
- package/create/space/space.locale.ts +0 -1087
- package/create/space/spaceAccess.ts +0 -182
- package/create/space/spaceCollapsedState.ts +0 -54
- package/create/space/spaceKeys.ts +0 -65
- package/create/space/spaceSlice.ts +0 -328
- package/create/space/spaceThunks.ts +0 -410
- package/create/space/types.ts +0 -27
- package/create/space/updateSpaceAction.ts +0 -107
- package/create/space/utils/permissions.ts +0 -47
- package/create/types.ts +0 -21
- package/database/actions/agentReadResolution.ts +0 -33
- package/database/actions/common.ts +0 -243
- package/database/actions/deleteFile.ts +0 -40
- package/database/actions/fileContent.ts +0 -125
- package/database/actions/patch.ts +0 -155
- package/database/actions/read.ts +0 -358
- package/database/actions/readAndWait.ts +0 -260
- package/database/actions/readRequestManager.ts +0 -120
- package/database/actions/readResolution.ts +0 -125
- package/database/actions/remove.ts +0 -94
- package/database/actions/replication.ts +0 -477
- package/database/actions/upload.ts +0 -186
- package/database/actions/upsert.ts +0 -56
- package/database/actions/write.ts +0 -146
- package/database/authority/ownerKey.ts +0 -80
- package/database/authority/recordAuthority.ts +0 -67
- package/database/authority/userAuthorityRegistry.ts +0 -54
- package/database/client/fetchUserData.ts +0 -61
- package/database/config.ts +0 -40
- package/database/dbActionThunks.ts +0 -1
- package/database/dbSlice.ts +0 -149
- package/database/fileRing.ts +0 -51
- package/database/fileStorage.ts +0 -232
- package/database/fileUrl.ts +0 -34
- package/database/keys.ts +0 -767
- package/database/queryPrefixes.ts +0 -14
- package/database/requests.ts +0 -443
- package/database/runtimeServerContext.ts +0 -54
- package/database/server/authorityStoreTypes.ts +0 -31
- package/database/server/cliAuthorityBrokerClient.ts +0 -227
- package/database/server/cliAuthorityBrokerServer.ts +0 -283
- package/database/server/cliAuthorityBrokerTypes.ts +0 -43
- package/database/server/cliAuthorityStoreDriver.ts +0 -98
- package/database/server/db.ts +0 -99
- package/database/server/dbPath.ts +0 -20
- package/database/server/ensureDbOpen.ts +0 -12
- package/database/server/legacyServerDb.ts +0 -58
- package/database/server/levelAuthorityStore.ts +0 -114
- package/database/server/memoryAuthorityStore.ts +0 -133
- package/database/server/serverStoreFactory.ts +0 -118
- package/database/tenantPlacement.ts +0 -57
- package/database/tombstones.ts +0 -52
- package/database/userDataMerge.ts +0 -95
- package/database/userPreferenceRegister.ts +0 -131
- package/database/utils/ulid.ts +0 -1
- package/defaultServer.ts +0 -1
- package/dialogAttachmentCleanup.ts +0 -151
- package/dialogCommands.ts +0 -1120
- package/dialogInternalCommandEntries.ts +0 -17
- package/docCreateCommands.ts +0 -345
- package/docInternalCommandEntries.ts +0 -11
- package/docPageHelpers.ts +0 -80
- package/docSkillHelpers.ts +0 -67
- package/docSpaceHelpers.ts +0 -46
- package/globalRecordOperations.ts +0 -258
- package/index.ts +0 -78
- package/integrations/anthropic/anthropicModels.ts +0 -47
- package/integrations/deepseek/models.ts +0 -37
- package/integrations/google/models.ts +0 -341
- package/integrations/openai/chatCompletionStreamMode.ts +0 -10
- package/integrations/openai/filterAndCleanMessages.ts +0 -284
- package/integrations/openai/flexTier.ts +0 -102
- package/integrations/openai/generateOpenAIRequestBody.ts +0 -271
- package/integrations/openai/generateResponseRequestBody.ts +0 -77
- package/integrations/openai/models.ts +0 -271
- package/integrations/openai/providerBodyCompatibility.ts +0 -23
- package/integrations/openai/responsesHelpers.ts +0 -297
- package/integrations/x-reader/types.ts +0 -109
- package/integrations/xai/models.ts +0 -13
- package/integrations/xhs-reader/redaction.ts +0 -68
- package/integrations/xhs-reader/types.ts +0 -277
- package/integrations/xhs-reader/url.ts +0 -80
- package/internalCommandEntries.ts +0 -18
- package/localRuntimeAuthority.ts +0 -182
- package/localRuntimeDb.ts +0 -26
- package/machineCommands.ts +0 -307
- package/machineDaemonCommands.ts +0 -185
- package/machineHeartbeatCommands.ts +0 -30
- package/machineStatusCommands.ts +0 -95
- package/machineWatchCommands.ts +0 -41
- package/machineWsPromptMaterialization.ts +0 -89
- package/machineWsRunDispatch.ts +0 -695
- package/machineWsSession.ts +0 -213
- package/memoryCommands.ts +0 -253
- package/memoryInternalCommandEntries.ts +0 -9
- package/offlineMarxistsAgentCommand.ts +0 -316
- package/qoderUsageProbe.ts +0 -252
- package/render/contentIcon/types.ts +0 -167
- package/render/page/createPageAction.ts +0 -183
- package/render/page/docSlice.ts +0 -495
- package/render/page/types.ts +0 -19
- package/render/table/activityColumns.ts +0 -6
- package/render/table/createTableAction.ts +0 -274
- package/render/table/deleteTableAction.ts +0 -193
- package/render/table/fetchAndCacheTableRows.ts +0 -174
- package/render/table/tableSlice.ts +0 -1167
- package/render/table/toolValueUtils.ts +0 -363
- package/render/table/types.ts +0 -262
- package/render/table/utils/tableSerialization.ts +0 -50
- package/runtimeDoctorCommands.ts +0 -174
- package/runtimeModeArgs.ts +0 -33
- package/scriptCommandEntries.ts +0 -66
- package/secretScan.ts +0 -31
- package/server/handlers/agentRun/types.ts +0 -105
- package/share/action.ts +0 -225
- package/share/helpers.ts +0 -302
- package/share/keys.ts +0 -243
- package/share/publicSharePolicy.ts +0 -27
- package/share/shareSlice.ts +0 -53
- package/share/types.ts +0 -100
- package/systemInternalCommandEntries.ts +0 -65
- package/tableCommands.ts +0 -453
- package/tui/readlineWorkspace.ts +0 -210
- package/tui/session.ts +0 -554
- package/updateCommands.ts +0 -134
- package/workflowInternalCommandEntries.ts +0 -10
package/dialogCommands.ts
DELETED
|
@@ -1,1120 +0,0 @@
|
|
|
1
|
-
import type { AgentCommandDeps } from "./agentCommandSupport";
|
|
2
|
-
import { buildSpaceLookup, getSpaceContentKeys } from "./cliSpaceHelpers";
|
|
3
|
-
import {
|
|
4
|
-
parseUserIdFromAuthToken,
|
|
5
|
-
readOption,
|
|
6
|
-
resolveAuthToken,
|
|
7
|
-
resolveServerCandidates,
|
|
8
|
-
resolveServerUrl,
|
|
9
|
-
} from "./cliEnvHelpers";
|
|
10
|
-
import {
|
|
11
|
-
deleteDbRecordOnServers,
|
|
12
|
-
listUserRecordsFromServers,
|
|
13
|
-
readDbRecordFromServers,
|
|
14
|
-
readLiveDbRecordAfterTombstoneMerge,
|
|
15
|
-
} from "./globalRecordOperations";
|
|
16
|
-
import {
|
|
17
|
-
deleteDialogAttachmentCandidates,
|
|
18
|
-
planDialogAttachmentCleanup,
|
|
19
|
-
} from "./dialogAttachmentCleanup";
|
|
20
|
-
|
|
21
|
-
type ReadSource = "http" | "local-db-fallback";
|
|
22
|
-
|
|
23
|
-
type HttpAttempt = {
|
|
24
|
-
base: string;
|
|
25
|
-
ok: boolean;
|
|
26
|
-
status?: number;
|
|
27
|
-
message?: string;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
type ListedDialog = {
|
|
31
|
-
id: string;
|
|
32
|
-
dbKey: string;
|
|
33
|
-
title: string;
|
|
34
|
-
status: string | null;
|
|
35
|
-
updatedAt: string | number | null;
|
|
36
|
-
createdAt: string | number | null;
|
|
37
|
-
spaceId: string | null;
|
|
38
|
-
triggerType: string | null;
|
|
39
|
-
primaryAgentKey: string | null;
|
|
40
|
-
cybots: string[];
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const DIALOG_ID_RE = /^[0-9A-HJKMNP-TV-Z]{26}$/i;
|
|
44
|
-
const DIALOG_PATH_RE = /^\/(?:space\/([^/]+)\/)?dialog-(.+)-([0-9A-HJKMNP-TV-Z]{26})\/?$/i;
|
|
45
|
-
const VALUE_FLAGS = new Set([
|
|
46
|
-
"--limit",
|
|
47
|
-
"--server",
|
|
48
|
-
"--server-url",
|
|
49
|
-
"--space",
|
|
50
|
-
"--space-id",
|
|
51
|
-
"--token",
|
|
52
|
-
"--machine-key",
|
|
53
|
-
"--user",
|
|
54
|
-
]);
|
|
55
|
-
|
|
56
|
-
function hasFlag(args: string[], flag: string) {
|
|
57
|
-
return args.includes(flag);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function readFirstPositional(args: string[]) {
|
|
61
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
62
|
-
const value = args[index];
|
|
63
|
-
if (VALUE_FLAGS.has(value)) {
|
|
64
|
-
index += 1;
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
if (!value.startsWith("-")) return value;
|
|
68
|
-
}
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function readAllPositional(args: string[]) {
|
|
73
|
-
const positionals: string[] = [];
|
|
74
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
75
|
-
const value = args[index];
|
|
76
|
-
if (VALUE_FLAGS.has(value)) {
|
|
77
|
-
index += 1;
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
if (!value.startsWith("-")) {
|
|
81
|
-
positionals.push(value);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return positionals;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function readLimit(args: string[], fallback: number) {
|
|
88
|
-
const raw = readOption(args, "--limit");
|
|
89
|
-
const parsed = raw ? Number(raw) : fallback;
|
|
90
|
-
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function getDialogIdFromKey(dbKey: string) {
|
|
94
|
-
const index = dbKey.lastIndexOf("-");
|
|
95
|
-
return index >= 0 ? dbKey.slice(index + 1) : dbKey;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function resolveDialogInput(rawInput: string, userId: string) {
|
|
99
|
-
const raw = rawInput.trim();
|
|
100
|
-
if (raw.startsWith("http://") || raw.startsWith("https://")) {
|
|
101
|
-
const url = new URL(raw);
|
|
102
|
-
const match = url.pathname.match(DIALOG_PATH_RE);
|
|
103
|
-
if (!match) {
|
|
104
|
-
throw new Error(`Unsupported dialog URL path: ${url.pathname}`);
|
|
105
|
-
}
|
|
106
|
-
const [, spaceId, ownerId, dialogId] = match;
|
|
107
|
-
return {
|
|
108
|
-
dbKey: `dialog-${ownerId}-${dialogId}`,
|
|
109
|
-
dialogId,
|
|
110
|
-
ownerId,
|
|
111
|
-
spaceId: spaceId ? decodeURIComponent(spaceId) : null,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (raw.startsWith("dialog-")) {
|
|
116
|
-
const dialogId = getDialogIdFromKey(raw);
|
|
117
|
-
return {
|
|
118
|
-
dbKey: raw,
|
|
119
|
-
dialogId,
|
|
120
|
-
ownerId: raw.slice("dialog-".length, Math.max("dialog-".length, raw.length - dialogId.length - 1)),
|
|
121
|
-
spaceId: null,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (!DIALOG_ID_RE.test(raw)) {
|
|
126
|
-
throw new Error(`Unsupported dialog id: ${raw}`);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
dbKey: `dialog-${userId}-${raw}`,
|
|
131
|
-
dialogId: raw,
|
|
132
|
-
ownerId: userId,
|
|
133
|
-
spaceId: null,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function normalizeDialogRecord(record: any, fallbackDbKey?: string): ListedDialog | null {
|
|
138
|
-
const dbKey =
|
|
139
|
-
typeof record?.dbKey === "string" && record.dbKey.trim()
|
|
140
|
-
? record.dbKey.trim()
|
|
141
|
-
: fallbackDbKey ?? "";
|
|
142
|
-
const id =
|
|
143
|
-
typeof record?.id === "string" && record.id.trim()
|
|
144
|
-
? record.id.trim()
|
|
145
|
-
: dbKey
|
|
146
|
-
? getDialogIdFromKey(dbKey)
|
|
147
|
-
: "";
|
|
148
|
-
if (!dbKey || !id) return null;
|
|
149
|
-
|
|
150
|
-
return {
|
|
151
|
-
id,
|
|
152
|
-
dbKey,
|
|
153
|
-
title:
|
|
154
|
-
typeof record?.title === "string" && record.title.trim()
|
|
155
|
-
? record.title.trim()
|
|
156
|
-
: typeof record?.taskLabel === "string" && record.taskLabel.trim()
|
|
157
|
-
? record.taskLabel.trim()
|
|
158
|
-
: "(untitled)",
|
|
159
|
-
status: typeof record?.status === "string" ? record.status : null,
|
|
160
|
-
updatedAt:
|
|
161
|
-
typeof record?.updatedAt === "string" || typeof record?.updatedAt === "number"
|
|
162
|
-
? record.updatedAt
|
|
163
|
-
: typeof record?.updated_at === "string" || typeof record?.updated_at === "number"
|
|
164
|
-
? record.updated_at
|
|
165
|
-
: null,
|
|
166
|
-
createdAt:
|
|
167
|
-
typeof record?.createdAt === "string" || typeof record?.createdAt === "number"
|
|
168
|
-
? record.createdAt
|
|
169
|
-
: typeof record?.created === "string" || typeof record?.created === "number"
|
|
170
|
-
? record.created
|
|
171
|
-
: null,
|
|
172
|
-
spaceId: typeof record?.spaceId === "string" && record.spaceId.trim() ? record.spaceId : null,
|
|
173
|
-
triggerType: typeof record?.triggerType === "string" ? record.triggerType : null,
|
|
174
|
-
primaryAgentKey:
|
|
175
|
-
typeof record?.primaryAgentKey === "string" && record.primaryAgentKey.trim()
|
|
176
|
-
? record.primaryAgentKey
|
|
177
|
-
: null,
|
|
178
|
-
cybots: Array.isArray(record?.cybots)
|
|
179
|
-
? record.cybots.filter((agent: unknown): agent is string => typeof agent === "string")
|
|
180
|
-
: [],
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
function sortDialogs(dialogs: ListedDialog[]) {
|
|
185
|
-
return dialogs.sort((a, b) => {
|
|
186
|
-
const ta = a.updatedAt ?? a.createdAt ?? 0;
|
|
187
|
-
const tb = b.updatedAt ?? b.createdAt ?? 0;
|
|
188
|
-
const left = typeof ta === "number" ? ta : Date.parse(String(ta)) || 0;
|
|
189
|
-
const right = typeof tb === "number" ? tb : Date.parse(String(tb)) || 0;
|
|
190
|
-
return right - left;
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
function isScheduledDialog(record: ListedDialog) {
|
|
195
|
-
return record.triggerType === "scheduled_run";
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function printListUsage(output: { write(chunk: string): unknown }) {
|
|
199
|
-
output.write(`Usage:
|
|
200
|
-
nolo dialog list [--space <spaceId|spaceUrl>] [--limit 100] [--json] [--ids-only]
|
|
201
|
-
|
|
202
|
-
Options:
|
|
203
|
-
--space <space> List current user's dialogs attached to one space.
|
|
204
|
-
--limit <n> Maximum dialogs to return. Default: 100.
|
|
205
|
-
--include-scheduled Include scheduled automation run dialogs.
|
|
206
|
-
--json Print machine-readable JSON.
|
|
207
|
-
--ids-only Print only dialog ids.
|
|
208
|
-
--server <url> Override NOLO_SERVER/BASE_URL.
|
|
209
|
-
--token <jwt> Override AUTH_TOKEN.
|
|
210
|
-
|
|
211
|
-
Lists merge global server candidates and ignore newer tombstones.
|
|
212
|
-
`);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function printDeleteUsage(output: { write(chunk: string): unknown }) {
|
|
216
|
-
output.write(`Usage:
|
|
217
|
-
nolo dialog delete <dialogId|dialogKey|dialogUrl...> [--yes] [--include-attachments] [--include-referenced-attachments] [--json]
|
|
218
|
-
|
|
219
|
-
Options:
|
|
220
|
-
--yes Actually delete. Without this, the command is a dry-run.
|
|
221
|
-
--include-attachments Also delete files explicitly owned by this dialog/messages.
|
|
222
|
-
--include-referenced-attachments
|
|
223
|
-
Also delete same-account user-owned files referenced by this dialog.
|
|
224
|
-
--json Print machine-readable JSON.
|
|
225
|
-
--server <url> Prefer this server and include it in global deletion.
|
|
226
|
-
--token <jwt> Override AUTH_TOKEN.
|
|
227
|
-
|
|
228
|
-
Deletes are global across the selected/profile server plus known Nolo cluster peers.
|
|
229
|
-
Attachment cleanup is conservative by default. Use --include-referenced-attachments only
|
|
230
|
-
when you intentionally want to remove user-owned files referenced by the dialog too.
|
|
231
|
-
`);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function printReadUsage(output: { write(chunk: string): unknown }) {
|
|
235
|
-
output.write(`Usage:
|
|
236
|
-
nolo dialog read <dialogId|dialogKey|dialogUrl> [limit]
|
|
237
|
-
|
|
238
|
-
Options:
|
|
239
|
-
--server <url> Prefer this server when reading by raw dialog id.
|
|
240
|
-
--token <jwt> Override AUTH_TOKEN.
|
|
241
|
-
--user <userId> Override dialog owner for raw dialog ids.
|
|
242
|
-
|
|
243
|
-
Reads dialog metadata and messages as JSON.
|
|
244
|
-
`);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
function printStatusUsage(output: { write(chunk: string): unknown }) {
|
|
248
|
-
output.write(`Usage:
|
|
249
|
-
nolo dialog status <dialogId|dialogKey|dialogUrl>
|
|
250
|
-
|
|
251
|
-
Options:
|
|
252
|
-
--server <url> Prefer this server when reading by raw dialog id.
|
|
253
|
-
--token <jwt> Override AUTH_TOKEN.
|
|
254
|
-
--user <userId> Override dialog owner for raw dialog ids.
|
|
255
|
-
|
|
256
|
-
Prints compact dialog run status and next-step hints.
|
|
257
|
-
`);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
function isHelpArg(value?: string) {
|
|
261
|
-
return value === "-h" || value === "--help";
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
function readDialogLimitArg(args: string[], fallback: number) {
|
|
265
|
-
const explicit = readOption(args, "--limit");
|
|
266
|
-
const positional = args.find((value, index) =>
|
|
267
|
-
index > 0 && /^\d+$/.test(value) && args[index - 1] !== "--limit"
|
|
268
|
-
);
|
|
269
|
-
const raw = explicit ?? positional;
|
|
270
|
-
if (!raw) return fallback;
|
|
271
|
-
const parsed = Number(raw);
|
|
272
|
-
return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function readDialogOwnerId(args: string[], env: Record<string, string | undefined>, authToken: string) {
|
|
276
|
-
return readOption(args, "--user") ??
|
|
277
|
-
env.USER_ID ??
|
|
278
|
-
parseUserIdFromAuthToken(authToken) ??
|
|
279
|
-
"";
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
function resolveDialogReadTarget(args: string[], env: Record<string, string | undefined>, authToken: string) {
|
|
283
|
-
const rawInput = readFirstPositional(args);
|
|
284
|
-
if (!rawInput) return null;
|
|
285
|
-
const preferredServer = readOption(args, "--server") ?? readOption(args, "--server-url");
|
|
286
|
-
const ownerFallback = readDialogOwnerId(args, env, authToken);
|
|
287
|
-
|
|
288
|
-
const raw = rawInput.trim();
|
|
289
|
-
if (raw.startsWith("http://") || raw.startsWith("https://")) {
|
|
290
|
-
const url = new URL(raw);
|
|
291
|
-
const match = url.pathname.match(DIALOG_PATH_RE);
|
|
292
|
-
if (!match) throw new Error(`Unsupported dialog URL path: ${url.pathname}`);
|
|
293
|
-
const [, spaceId, ownerId, dialogId] = match;
|
|
294
|
-
const base = preferredServer ?? env.READ_DIALOG_BASE ?? url.origin;
|
|
295
|
-
return {
|
|
296
|
-
base,
|
|
297
|
-
dialogId,
|
|
298
|
-
dialogKey: `dialog-${ownerId}-${dialogId}`,
|
|
299
|
-
userId: ownerId,
|
|
300
|
-
spaceId: spaceId ? decodeURIComponent(spaceId) : undefined,
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
if (raw.startsWith("dialog-")) {
|
|
305
|
-
const dialogId = getDialogIdFromKey(raw);
|
|
306
|
-
const ownerId = raw.slice("dialog-".length, Math.max("dialog-".length, raw.length - dialogId.length - 1));
|
|
307
|
-
return {
|
|
308
|
-
base: preferredServer ?? env.READ_DIALOG_BASE ?? resolveServerUrl(args, env),
|
|
309
|
-
dialogId,
|
|
310
|
-
dialogKey: raw,
|
|
311
|
-
userId: ownerId || ownerFallback,
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (!DIALOG_ID_RE.test(raw)) {
|
|
316
|
-
throw new Error(`Unsupported dialog id: ${raw}`);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
if (!ownerFallback) {
|
|
320
|
-
throw new Error("raw dialog ids require an auth token userId or --user");
|
|
321
|
-
}
|
|
322
|
-
return {
|
|
323
|
-
base: preferredServer ?? env.READ_DIALOG_BASE ?? resolveServerUrl(args, env),
|
|
324
|
-
dialogId: raw,
|
|
325
|
-
dialogKey: `dialog-${ownerFallback}-${raw}`,
|
|
326
|
-
userId: ownerFallback,
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function toToolName(value: unknown) {
|
|
331
|
-
return typeof value === "string" ? value.trim() : "";
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
function countByName(values: string[]) {
|
|
335
|
-
return values.reduce<Record<string, number>>((acc, value) => {
|
|
336
|
-
acc[value] = (acc[value] ?? 0) + 1;
|
|
337
|
-
return acc;
|
|
338
|
-
}, {});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
function uniq(values: string[]) {
|
|
342
|
-
return [...new Set(values.filter(Boolean))];
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
function parseJsonObject(raw: unknown): Record<string, any> | null {
|
|
346
|
-
if (typeof raw !== "string" || !raw.trim()) return null;
|
|
347
|
-
try {
|
|
348
|
-
const parsed = JSON.parse(raw);
|
|
349
|
-
return parsed && typeof parsed === "object" ? parsed : null;
|
|
350
|
-
} catch {
|
|
351
|
-
return null;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
function deriveWrittenFiles(toolMessages: any[]) {
|
|
356
|
-
const writeToolNames = new Set(["applyEdit", "applyLineEdits", "writeFile", "createDoc", "updateDoc"]);
|
|
357
|
-
const files: string[] = [];
|
|
358
|
-
for (const message of toolMessages) {
|
|
359
|
-
const toolName = toToolName(message?.toolName ?? message?.name);
|
|
360
|
-
if (!writeToolNames.has(toolName)) continue;
|
|
361
|
-
const payload = message?.toolPayload ?? {};
|
|
362
|
-
const content = parseJsonObject(message?.content);
|
|
363
|
-
for (const candidate of [payload?.input?.filePath, payload?.response?.filePath, content?.filePath]) {
|
|
364
|
-
const normalized = typeof candidate === "string" ? candidate.trim() : "";
|
|
365
|
-
if (normalized) files.push(normalized);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return uniq(files);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
function deriveToolErrors(toolMessages: any[]) {
|
|
372
|
-
const errors: string[] = [];
|
|
373
|
-
for (const message of toolMessages) {
|
|
374
|
-
const toolName = toToolName(message?.toolName ?? message?.name);
|
|
375
|
-
const payload = message?.toolPayload ?? {};
|
|
376
|
-
const content = parseJsonObject(message?.content);
|
|
377
|
-
if (payload?.status === "failed" || content?.ok === false || content?.applied === false || content?.success === false) {
|
|
378
|
-
errors.push(toolName || "unknown-tool");
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
return uniq(errors);
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
function isLocalBaseUrl(base: string) {
|
|
385
|
-
try {
|
|
386
|
-
const url = new URL(base);
|
|
387
|
-
return url.hostname === "127.0.0.1" || url.hostname === "localhost";
|
|
388
|
-
} catch {
|
|
389
|
-
return false;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
async function readDialogOverHttp(args: {
|
|
394
|
-
base: string;
|
|
395
|
-
dialogKey: string;
|
|
396
|
-
dialogId: string;
|
|
397
|
-
limit: number;
|
|
398
|
-
authToken: string;
|
|
399
|
-
fetchImpl: typeof fetch;
|
|
400
|
-
}) {
|
|
401
|
-
const authHeaders = {
|
|
402
|
-
Authorization: `Bearer ${args.authToken}`,
|
|
403
|
-
"Content-Type": "application/json",
|
|
404
|
-
};
|
|
405
|
-
const readViaBridge = async () => {
|
|
406
|
-
const bridgeRes = await args.fetchImpl(`${args.base}/api/dialog-read`, {
|
|
407
|
-
method: "POST",
|
|
408
|
-
headers: authHeaders,
|
|
409
|
-
body: JSON.stringify({
|
|
410
|
-
dialogKey: args.dialogKey,
|
|
411
|
-
dialogId: args.dialogId,
|
|
412
|
-
limit: args.limit,
|
|
413
|
-
}),
|
|
414
|
-
});
|
|
415
|
-
if (!bridgeRes.ok) {
|
|
416
|
-
throw Object.assign(new Error(`dialog read bridge failed: HTTP ${bridgeRes.status}`), {
|
|
417
|
-
status: bridgeRes.status,
|
|
418
|
-
base: args.base,
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
const payload = await bridgeRes.json();
|
|
422
|
-
if (!payload?.ok) {
|
|
423
|
-
throw Object.assign(new Error(`dialog read bridge failed: ${payload?.error ?? "unknown error"}`), {
|
|
424
|
-
status: 500,
|
|
425
|
-
base: args.base,
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
return {
|
|
429
|
-
meta: payload.meta,
|
|
430
|
-
msgs: payload.msgs,
|
|
431
|
-
source: "http" as ReadSource,
|
|
432
|
-
};
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
const metaRes = await args.fetchImpl(
|
|
436
|
-
`${args.base}/api/v1/db/read/${encodeURIComponent(args.dialogKey)}`,
|
|
437
|
-
{ headers: { Authorization: `Bearer ${args.authToken}` } }
|
|
438
|
-
);
|
|
439
|
-
if (!metaRes.ok) {
|
|
440
|
-
if (metaRes.status === 401 || metaRes.status === 403) return readViaBridge();
|
|
441
|
-
throw Object.assign(new Error(`read dialog meta failed: HTTP ${metaRes.status}`), {
|
|
442
|
-
status: metaRes.status,
|
|
443
|
-
base: args.base,
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
const meta = await metaRes.json();
|
|
447
|
-
|
|
448
|
-
const msgsRes = await args.fetchImpl(`${args.base}/rpc/getConvMsgs`, {
|
|
449
|
-
method: "POST",
|
|
450
|
-
headers: authHeaders,
|
|
451
|
-
body: JSON.stringify({ dialogId: args.dialogId, limit: args.limit }),
|
|
452
|
-
});
|
|
453
|
-
if (!msgsRes.ok) {
|
|
454
|
-
if (msgsRes.status === 401 || msgsRes.status === 403) return readViaBridge();
|
|
455
|
-
throw Object.assign(new Error(`read dialog messages failed: HTTP ${msgsRes.status}`), {
|
|
456
|
-
status: msgsRes.status,
|
|
457
|
-
base: args.base,
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
return {
|
|
461
|
-
meta,
|
|
462
|
-
msgs: await msgsRes.json(),
|
|
463
|
-
source: "http" as ReadSource,
|
|
464
|
-
};
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
async function tryHttpDialogCandidates(args: {
|
|
468
|
-
bases: string[];
|
|
469
|
-
dialogKey: string;
|
|
470
|
-
dialogId: string;
|
|
471
|
-
limit: number;
|
|
472
|
-
authToken: string;
|
|
473
|
-
fetchImpl: typeof fetch;
|
|
474
|
-
}) {
|
|
475
|
-
const attempts: HttpAttempt[] = [];
|
|
476
|
-
for (const base of args.bases) {
|
|
477
|
-
try {
|
|
478
|
-
const result = await readDialogOverHttp({ ...args, base });
|
|
479
|
-
attempts.push({ base, ok: true });
|
|
480
|
-
return { ...result, resolvedBase: base, attempts };
|
|
481
|
-
} catch (error) {
|
|
482
|
-
attempts.push({
|
|
483
|
-
base,
|
|
484
|
-
ok: false,
|
|
485
|
-
status:
|
|
486
|
-
typeof error === "object" && error !== null && "status" in error
|
|
487
|
-
? Number((error as any).status)
|
|
488
|
-
: undefined,
|
|
489
|
-
message: error instanceof Error ? error.message : String(error),
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
throw Object.assign(new Error("All HTTP dialog reads failed"), { attempts });
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
async function readDialogFromLocalDb(dialogKey: string, dialogId: string, limit: number) {
|
|
497
|
-
const { readDialogFromLocalDb: readLocalDialog } = await import("./agent-runtime/localDialogRead");
|
|
498
|
-
const result = await readLocalDialog({ dialogKey, dialogId, limit });
|
|
499
|
-
return {
|
|
500
|
-
...result,
|
|
501
|
-
source: "local-db-fallback" as ReadSource,
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
async function readDialogSnapshot(args: {
|
|
506
|
-
authToken: string;
|
|
507
|
-
base: string;
|
|
508
|
-
dialogId: string;
|
|
509
|
-
dialogKey: string;
|
|
510
|
-
fetchImpl: typeof fetch;
|
|
511
|
-
limit: number;
|
|
512
|
-
}) {
|
|
513
|
-
const candidateBases = resolveServerCandidates({ NOLO_SERVER: args.base }, args.base);
|
|
514
|
-
let attempts: HttpAttempt[] = [];
|
|
515
|
-
try {
|
|
516
|
-
const result = await tryHttpDialogCandidates({
|
|
517
|
-
bases: candidateBases,
|
|
518
|
-
dialogKey: args.dialogKey,
|
|
519
|
-
dialogId: args.dialogId,
|
|
520
|
-
limit: args.limit,
|
|
521
|
-
authToken: args.authToken,
|
|
522
|
-
fetchImpl: args.fetchImpl,
|
|
523
|
-
});
|
|
524
|
-
return { ...result, candidateBases };
|
|
525
|
-
} catch (error) {
|
|
526
|
-
attempts =
|
|
527
|
-
typeof error === "object" && error !== null && "attempts" in error
|
|
528
|
-
? ((error as any).attempts as HttpAttempt[])
|
|
529
|
-
: attempts;
|
|
530
|
-
const statuses = attempts.map((attempt) => attempt.status).filter((status): status is number => typeof status === "number");
|
|
531
|
-
const all404 = attempts.length > 0 && statuses.length === attempts.length && statuses.every((status) => status === 404);
|
|
532
|
-
const localhostCandidate = candidateBases.find(isLocalBaseUrl);
|
|
533
|
-
if (!localhostCandidate || all404) {
|
|
534
|
-
throw Object.assign(new Error(
|
|
535
|
-
all404
|
|
536
|
-
? `dialog not found on tried servers: ${candidateBases.join(", ")}`
|
|
537
|
-
: `read dialog failed across candidates: ${attempts.map((attempt) => `${attempt.base} -> ${attempt.status ?? attempt.message}`).join("; ")}`
|
|
538
|
-
), { attempts });
|
|
539
|
-
}
|
|
540
|
-
const fallback = await readDialogFromLocalDb(args.dialogKey, args.dialogId, args.limit);
|
|
541
|
-
return {
|
|
542
|
-
...fallback,
|
|
543
|
-
resolvedBase: localhostCandidate,
|
|
544
|
-
attempts,
|
|
545
|
-
candidateBases,
|
|
546
|
-
};
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
function compact(value: unknown, max = 180) {
|
|
551
|
-
const text = typeof value === "string" ? value.trim() : "";
|
|
552
|
-
if (!text) return "";
|
|
553
|
-
return text.length > max ? `${text.slice(0, max - 3)}...` : text;
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
function renderCompactDialogStatus(snapshot: any) {
|
|
557
|
-
const checkpoint = snapshot.runtimeCheckpoint ?? {};
|
|
558
|
-
const checkpointStatus = typeof checkpoint.status === "string" ? checkpoint.status : null;
|
|
559
|
-
const status = snapshot.status ?? checkpointStatus ?? "unknown";
|
|
560
|
-
const state =
|
|
561
|
-
checkpointStatus === "done" || checkpointStatus === "completed" || status === "done" || status === "completed"
|
|
562
|
-
? "done"
|
|
563
|
-
: checkpointStatus === "failed" || checkpointStatus === "error" || status === "failed" || status === "error"
|
|
564
|
-
? "failed"
|
|
565
|
-
: status === "running" || status === "pending" || status === "queued"
|
|
566
|
-
? "active"
|
|
567
|
-
: "unknown";
|
|
568
|
-
const tools = Array.isArray(snapshot.toolsUsed)
|
|
569
|
-
? snapshot.toolsUsed.filter((tool: unknown): tool is string => typeof tool === "string" && tool.trim()).slice(0, 8)
|
|
570
|
-
: Array.isArray(checkpoint.lastToolNames)
|
|
571
|
-
? checkpoint.lastToolNames.filter((tool: unknown): tool is string => typeof tool === "string" && tool.trim()).slice(0, 8)
|
|
572
|
-
: [];
|
|
573
|
-
const files = Array.isArray(snapshot.writtenFiles) && snapshot.writtenFiles.length
|
|
574
|
-
? snapshot.writtenFiles.filter((file: unknown): file is string => typeof file === "string" && file.trim()).slice(0, 8)
|
|
575
|
-
: snapshot.artifacts && typeof snapshot.artifacts === "object" && Array.isArray(snapshot.artifacts.changedFiles ?? snapshot.artifacts.writtenFiles ?? snapshot.artifacts.files)
|
|
576
|
-
? (snapshot.artifacts.changedFiles ?? snapshot.artifacts.writtenFiles ?? snapshot.artifacts.files)
|
|
577
|
-
.filter((file: unknown): file is string => typeof file === "string" && file.trim())
|
|
578
|
-
.slice(0, 8)
|
|
579
|
-
: [];
|
|
580
|
-
const subjectRefs = Array.isArray(snapshot.subjectRefs)
|
|
581
|
-
? snapshot.subjectRefs
|
|
582
|
-
.map((ref: any) => {
|
|
583
|
-
const kind = typeof ref?.kind === "string" ? ref.kind.trim() : "";
|
|
584
|
-
const id = typeof ref?.id === "string" ? ref.id.trim() : "";
|
|
585
|
-
if (!kind || !id) return "";
|
|
586
|
-
const role = typeof ref?.role === "string" && ref.role.trim() ? `#${ref.role.trim()}` : "";
|
|
587
|
-
return `${kind}:${id}${role}`;
|
|
588
|
-
})
|
|
589
|
-
.filter(Boolean)
|
|
590
|
-
.slice(0, 8)
|
|
591
|
-
: [];
|
|
592
|
-
const toolErrors = Array.isArray(snapshot.toolErrors)
|
|
593
|
-
? snapshot.toolErrors.filter((tool: unknown): tool is string => typeof tool === "string" && tool.trim()).slice(0, 8)
|
|
594
|
-
: [];
|
|
595
|
-
const checkpointUpdatedAt = typeof checkpoint.updatedAt === "number" || typeof checkpoint.updatedAt === "string"
|
|
596
|
-
? Date.parse(String(checkpoint.updatedAt))
|
|
597
|
-
: NaN;
|
|
598
|
-
const activeHealth = state !== "active"
|
|
599
|
-
? ""
|
|
600
|
-
: !snapshot.runtimeCheckpoint
|
|
601
|
-
? "no-checkpoint"
|
|
602
|
-
: !Number.isFinite(checkpointUpdatedAt)
|
|
603
|
-
? "checkpoint-without-updatedAt"
|
|
604
|
-
: Date.now() - checkpointUpdatedAt > 5 * 60_000
|
|
605
|
-
? "stale-running"
|
|
606
|
-
: "running";
|
|
607
|
-
const errorMessage = compact(checkpoint.errorMessage ?? snapshot.errorMessage);
|
|
608
|
-
const lines = [
|
|
609
|
-
`dialog: ${snapshot.dialogId}`,
|
|
610
|
-
...(snapshot.base ? [`base: ${snapshot.base}`] : []),
|
|
611
|
-
...(snapshot.title ? [`title: ${snapshot.title}`] : []),
|
|
612
|
-
...(snapshot.parentDialogId ? [`parentDialogId: ${snapshot.parentDialogId}`] : []),
|
|
613
|
-
...(snapshot.rootDialogId ? [`rootDialogId: ${snapshot.rootDialogId}`] : []),
|
|
614
|
-
`status: ${status}`,
|
|
615
|
-
...(checkpointStatus ? [`checkpoint: ${checkpointStatus}`] : []),
|
|
616
|
-
`state: ${state}`,
|
|
617
|
-
...(activeHealth ? [`activeHealth: ${activeHealth}`] : []),
|
|
618
|
-
...(typeof snapshot.durationMs === "number" ? [`durationMs: ${snapshot.durationMs}`] : []),
|
|
619
|
-
...(snapshot.updatedAt ? [`updatedAt: ${snapshot.updatedAt}`] : []),
|
|
620
|
-
...(snapshot.finishedAt ? [`finishedAt: ${snapshot.finishedAt}`] : []),
|
|
621
|
-
...(compact(checkpoint.lastUserInput) ? [`lastUserInput: ${compact(checkpoint.lastUserInput)}`] : []),
|
|
622
|
-
...(compact(checkpoint.lastAssistantText) ? [`lastAssistantText: ${compact(checkpoint.lastAssistantText)}`] : []),
|
|
623
|
-
...(errorMessage ? [`error: ${errorMessage}`] : []),
|
|
624
|
-
...(tools.length ? [`tools: ${tools.join(", ")}`] : []),
|
|
625
|
-
...(files.length ? [`files: ${files.join(", ")}`] : []),
|
|
626
|
-
...(subjectRefs.length ? [`subjects: ${subjectRefs.join(", ")}`] : []),
|
|
627
|
-
...(toolErrors.length ? [`toolErrors: ${toolErrors.join(", ")}`] : []),
|
|
628
|
-
"",
|
|
629
|
-
"next:",
|
|
630
|
-
`- read full dialog: nolo dialog read ${snapshot.dialogId} 120`,
|
|
631
|
-
];
|
|
632
|
-
if (state === "active") lines.push(`- poll again: nolo dialog status ${snapshot.dialogId}`);
|
|
633
|
-
else if (state === "failed") lines.push(`- inspect failure and rerun/continue with: nolo agent run <agent> --continue ${snapshot.dialogId} --msg "..."`);
|
|
634
|
-
else if (state === "done") lines.push("- use artifacts/files above for review, handoff, or alpha integration.");
|
|
635
|
-
else lines.push("- inspect meta/messages before deciding whether to continue or rerun.");
|
|
636
|
-
return `${lines.join("\n")}\n`;
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
async function readSpaceDialogRecords(args: {
|
|
640
|
-
authToken: string;
|
|
641
|
-
fetchImpl: typeof fetch;
|
|
642
|
-
fallbackFetchImpl?: typeof fetch;
|
|
643
|
-
serverUrls: string[];
|
|
644
|
-
spaceInput: string;
|
|
645
|
-
userId: string;
|
|
646
|
-
}) {
|
|
647
|
-
const { spaceId, spaceKey } = buildSpaceLookup(args.spaceInput);
|
|
648
|
-
const spaceRead = await readLiveDbRecordAfterTombstoneMerge({
|
|
649
|
-
authToken: args.authToken,
|
|
650
|
-
dbKey: spaceKey,
|
|
651
|
-
fallbackFetchImpl: args.fallbackFetchImpl,
|
|
652
|
-
fetchImpl: args.fetchImpl,
|
|
653
|
-
label: "space record",
|
|
654
|
-
serverUrls: args.serverUrls,
|
|
655
|
-
});
|
|
656
|
-
const contentKeys = [...getSpaceContentKeys(spaceRead.record)]
|
|
657
|
-
.filter((key) => key.startsWith(`dialog-${args.userId}-`));
|
|
658
|
-
const contentKeySet = new Set(contentKeys);
|
|
659
|
-
const dialogResult = await listUserRecordsFromServers({
|
|
660
|
-
authToken: args.authToken,
|
|
661
|
-
fallbackFetchImpl: args.fallbackFetchImpl,
|
|
662
|
-
fetchImpl: args.fetchImpl,
|
|
663
|
-
label: "dialog query",
|
|
664
|
-
serverUrls: args.serverUrls,
|
|
665
|
-
type: "dialog",
|
|
666
|
-
userId: args.userId,
|
|
667
|
-
});
|
|
668
|
-
const records = dialogResult.records.filter((record) =>
|
|
669
|
-
typeof record?.dbKey === "string" && contentKeySet.has(record.dbKey)
|
|
670
|
-
);
|
|
671
|
-
const failures = [...spaceRead.failures, ...dialogResult.failures];
|
|
672
|
-
return { spaceId, records, failures };
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
export async function runDialogReadCommand(
|
|
676
|
-
args: string[],
|
|
677
|
-
deps: AgentCommandDeps = {}
|
|
678
|
-
) {
|
|
679
|
-
const env = deps.env ?? process.env;
|
|
680
|
-
const output = deps.output ?? process.stdout;
|
|
681
|
-
if (isHelpArg(args[0])) {
|
|
682
|
-
printReadUsage(output);
|
|
683
|
-
return 0;
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
const authToken = resolveAuthToken(args, env);
|
|
687
|
-
if (!authToken) {
|
|
688
|
-
output.write("[nolo] dialog read requires an auth token. Run `nolo login` or set AUTH_TOKEN.\n");
|
|
689
|
-
return 1;
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
let target: ReturnType<typeof resolveDialogReadTarget>;
|
|
693
|
-
try {
|
|
694
|
-
target = resolveDialogReadTarget(args, env, authToken);
|
|
695
|
-
} catch (error) {
|
|
696
|
-
output.write(`[nolo] dialog read failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
697
|
-
return 1;
|
|
698
|
-
}
|
|
699
|
-
if (!target) {
|
|
700
|
-
printReadUsage(output);
|
|
701
|
-
return 1;
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
try {
|
|
705
|
-
const limit = readDialogLimitArg(args, 50);
|
|
706
|
-
const read = await readDialogSnapshot({
|
|
707
|
-
authToken,
|
|
708
|
-
base: target.base,
|
|
709
|
-
dialogId: target.dialogId,
|
|
710
|
-
dialogKey: target.dialogKey,
|
|
711
|
-
fetchImpl: deps.fetchImpl ?? fetch,
|
|
712
|
-
limit,
|
|
713
|
-
});
|
|
714
|
-
const orderedMsgs = Array.isArray(read.msgs) ? [...read.msgs].reverse() : read.msgs;
|
|
715
|
-
const lastAssistantMessage = Array.isArray(orderedMsgs)
|
|
716
|
-
? [...orderedMsgs].reverse().find((message) => message?.role === "assistant" || message?.authorRole === "assistant")
|
|
717
|
-
: null;
|
|
718
|
-
const toolMessages = Array.isArray(orderedMsgs)
|
|
719
|
-
? orderedMsgs.filter((message) => message?.role === "tool" || message?.authorRole === "tool")
|
|
720
|
-
: [];
|
|
721
|
-
const toolNamesFromMessages = toolMessages
|
|
722
|
-
.map((message) => toToolName(message?.toolName ?? message?.name))
|
|
723
|
-
.filter(Boolean);
|
|
724
|
-
const toolsUsed = Array.isArray(read.meta?.toolsUsed) && read.meta.toolsUsed.length > 0
|
|
725
|
-
? read.meta.toolsUsed.map((tool: unknown) => toToolName(tool)).filter(Boolean)
|
|
726
|
-
: uniq(toolNamesFromMessages);
|
|
727
|
-
const writtenFiles = Array.isArray(read.meta?.writtenFiles) && read.meta.writtenFiles.length > 0
|
|
728
|
-
? uniq(read.meta.writtenFiles.map((value: unknown) => (typeof value === "string" ? value.trim() : "")).filter(Boolean))
|
|
729
|
-
: deriveWrittenFiles(toolMessages);
|
|
730
|
-
const toolErrors = Array.isArray(read.meta?.toolErrors) && read.meta.toolErrors.length > 0
|
|
731
|
-
? uniq(read.meta.toolErrors.map((value: unknown) => (typeof value === "string" ? value.trim() : "")).filter(Boolean))
|
|
732
|
-
: deriveToolErrors(toolMessages);
|
|
733
|
-
|
|
734
|
-
output.write(JSON.stringify({
|
|
735
|
-
source: read.source as ReadSource,
|
|
736
|
-
base: read.resolvedBase,
|
|
737
|
-
triedBases: read.candidateBases,
|
|
738
|
-
httpAttempts: read.attempts,
|
|
739
|
-
spaceId: target.spaceId,
|
|
740
|
-
dialogId: target.dialogId,
|
|
741
|
-
dialogKey: target.dialogKey,
|
|
742
|
-
userId: target.userId,
|
|
743
|
-
title: read.meta?.title ?? null,
|
|
744
|
-
cybots: Array.isArray(read.meta?.cybots) ? read.meta.cybots : [],
|
|
745
|
-
category: read.meta?.category ?? null,
|
|
746
|
-
inheritedFromDialogKey: read.meta?.inheritedFromDialogKey ?? null,
|
|
747
|
-
inheritedFromDialogTitle: read.meta?.inheritedFromDialogTitle ?? null,
|
|
748
|
-
parentDialogId: read.meta?.parentDialogId ?? null,
|
|
749
|
-
rootDialogId: read.meta?.rootDialogId ?? null,
|
|
750
|
-
status: read.meta?.status,
|
|
751
|
-
errorMessage: read.meta?.errorMessage ?? null,
|
|
752
|
-
runtimeCheckpoint: read.meta?.runtimeCheckpoint ?? null,
|
|
753
|
-
durationMs: read.meta?.durationMs,
|
|
754
|
-
finishedAt: read.meta?.finishedAt,
|
|
755
|
-
createdAt: read.meta?.createdAt,
|
|
756
|
-
updatedAt: read.meta?.updatedAt,
|
|
757
|
-
artifacts: read.meta?.artifacts ?? null,
|
|
758
|
-
writtenFiles,
|
|
759
|
-
toolsUsed,
|
|
760
|
-
toolErrors,
|
|
761
|
-
toolSummary: {
|
|
762
|
-
metaToolsCount: toolsUsed.length,
|
|
763
|
-
metaToolsUnique: [...new Set(toolsUsed)],
|
|
764
|
-
toolMessageCount: toolMessages.length,
|
|
765
|
-
toolNamesFromMessages: [...new Set(toolNamesFromMessages)],
|
|
766
|
-
toolMessageCountsByName: countByName(toolNamesFromMessages),
|
|
767
|
-
},
|
|
768
|
-
agentReply: read.meta?.agentReply ?? null,
|
|
769
|
-
messagesCount: Array.isArray(orderedMsgs) ? orderedMsgs.length : 0,
|
|
770
|
-
lastAssistantMessage,
|
|
771
|
-
messages: orderedMsgs,
|
|
772
|
-
}, null, 2));
|
|
773
|
-
output.write("\n");
|
|
774
|
-
return 0;
|
|
775
|
-
} catch (error) {
|
|
776
|
-
output.write(`[nolo] dialog read failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
777
|
-
return 1;
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
export async function runDialogStatusCommand(
|
|
782
|
-
args: string[],
|
|
783
|
-
deps: AgentCommandDeps = {}
|
|
784
|
-
) {
|
|
785
|
-
const env = deps.env ?? process.env;
|
|
786
|
-
const output = deps.output ?? process.stdout;
|
|
787
|
-
if (isHelpArg(args[0])) {
|
|
788
|
-
printStatusUsage(output);
|
|
789
|
-
return 0;
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
const authToken = resolveAuthToken(args, env);
|
|
793
|
-
if (!authToken) {
|
|
794
|
-
output.write("[nolo] dialog status requires an auth token. Run `nolo login` or set AUTH_TOKEN.\n");
|
|
795
|
-
return 1;
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
let target: ReturnType<typeof resolveDialogReadTarget>;
|
|
799
|
-
try {
|
|
800
|
-
target = resolveDialogReadTarget(args, env, authToken);
|
|
801
|
-
} catch (error) {
|
|
802
|
-
output.write(`[nolo] dialog status failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
803
|
-
return 1;
|
|
804
|
-
}
|
|
805
|
-
if (!target) {
|
|
806
|
-
printStatusUsage(output);
|
|
807
|
-
return 1;
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
try {
|
|
811
|
-
const read = await readDialogSnapshot({
|
|
812
|
-
authToken,
|
|
813
|
-
base: target.base,
|
|
814
|
-
dialogId: target.dialogId,
|
|
815
|
-
dialogKey: target.dialogKey,
|
|
816
|
-
fetchImpl: deps.fetchImpl ?? fetch,
|
|
817
|
-
limit: 1,
|
|
818
|
-
});
|
|
819
|
-
output.write(renderCompactDialogStatus({
|
|
820
|
-
...(read.meta ?? {}),
|
|
821
|
-
dialogId: target.dialogId,
|
|
822
|
-
dialogKey: target.dialogKey,
|
|
823
|
-
base: read.resolvedBase,
|
|
824
|
-
}));
|
|
825
|
-
return 0;
|
|
826
|
-
} catch (error) {
|
|
827
|
-
output.write(`[nolo] dialog status failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
828
|
-
return 1;
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
export async function runDialogListCommand(
|
|
833
|
-
args: string[],
|
|
834
|
-
deps: AgentCommandDeps = {}
|
|
835
|
-
) {
|
|
836
|
-
const env = deps.env ?? process.env;
|
|
837
|
-
const output = deps.output ?? process.stdout;
|
|
838
|
-
if (hasFlag(args, "--help") || hasFlag(args, "-h")) {
|
|
839
|
-
printListUsage(output);
|
|
840
|
-
return 0;
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
const authToken = resolveAuthToken(args, env);
|
|
844
|
-
if (!authToken) {
|
|
845
|
-
output.write("[nolo] dialog list requires an auth token. Run `nolo login` or set AUTH_TOKEN.\n");
|
|
846
|
-
return 1;
|
|
847
|
-
}
|
|
848
|
-
const userId = parseUserIdFromAuthToken(authToken);
|
|
849
|
-
if (!userId) {
|
|
850
|
-
output.write("[nolo] dialog list could not read userId from AUTH_TOKEN.\n");
|
|
851
|
-
return 1;
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
855
|
-
const fallbackFetchImpl = deps.fallbackFetchImpl;
|
|
856
|
-
const serverUrl = resolveServerUrl(args, env);
|
|
857
|
-
const serverUrls = resolveServerCandidates(args, env, serverUrl);
|
|
858
|
-
const limit = readLimit(args, 100);
|
|
859
|
-
const spaceInput = readOption(args, "--space") ?? readOption(args, "--space-id");
|
|
860
|
-
const includeScheduled = hasFlag(args, "--include-scheduled");
|
|
861
|
-
|
|
862
|
-
try {
|
|
863
|
-
let source: "user-data" | "space" = "user-data";
|
|
864
|
-
let resolvedSpaceId: string | null = null;
|
|
865
|
-
let queryFailures: Array<{ serverUrl: string; error: string }> = [];
|
|
866
|
-
let records: any[];
|
|
867
|
-
if (spaceInput) {
|
|
868
|
-
source = "space";
|
|
869
|
-
const result = await readSpaceDialogRecords({
|
|
870
|
-
authToken,
|
|
871
|
-
fallbackFetchImpl,
|
|
872
|
-
fetchImpl,
|
|
873
|
-
serverUrls,
|
|
874
|
-
spaceInput,
|
|
875
|
-
userId,
|
|
876
|
-
});
|
|
877
|
-
resolvedSpaceId = result.spaceId;
|
|
878
|
-
records = result.records;
|
|
879
|
-
queryFailures = result.failures;
|
|
880
|
-
} else {
|
|
881
|
-
const result = await listUserRecordsFromServers({
|
|
882
|
-
authToken,
|
|
883
|
-
fallbackFetchImpl,
|
|
884
|
-
fetchImpl,
|
|
885
|
-
label: "dialog query",
|
|
886
|
-
serverUrls,
|
|
887
|
-
type: "dialog",
|
|
888
|
-
userId,
|
|
889
|
-
});
|
|
890
|
-
records = result.records;
|
|
891
|
-
queryFailures = result.failures;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
const dialogs = sortDialogs(
|
|
895
|
-
records
|
|
896
|
-
.map((record) => normalizeDialogRecord(record))
|
|
897
|
-
.filter((dialog): dialog is ListedDialog => dialog != null)
|
|
898
|
-
.filter((dialog) => includeScheduled || !isScheduledDialog(dialog))
|
|
899
|
-
).slice(0, limit);
|
|
900
|
-
|
|
901
|
-
if (hasFlag(args, "--ids-only")) {
|
|
902
|
-
output.write(`${dialogs.map((dialog) => dialog.id).join("\n")}\n`);
|
|
903
|
-
return 0;
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
if (hasFlag(args, "--json")) {
|
|
907
|
-
output.write(JSON.stringify({
|
|
908
|
-
userId,
|
|
909
|
-
...(resolvedSpaceId ? { spaceId: resolvedSpaceId } : {}),
|
|
910
|
-
source,
|
|
911
|
-
targetServers: serverUrls,
|
|
912
|
-
...(queryFailures.length ? { serverFailures: queryFailures } : {}),
|
|
913
|
-
total: dialogs.length,
|
|
914
|
-
dialogs,
|
|
915
|
-
}, null, 2));
|
|
916
|
-
output.write("\n");
|
|
917
|
-
return 0;
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
output.write(`userId: ${userId}\n`);
|
|
921
|
-
if (resolvedSpaceId) output.write(`spaceId: ${resolvedSpaceId}\n`);
|
|
922
|
-
output.write(`source: ${source}\n`);
|
|
923
|
-
output.write(`targetServers: ${serverUrls.join(", ")}\n`);
|
|
924
|
-
if (queryFailures.length) {
|
|
925
|
-
output.write(`serverFailures: ${queryFailures.length}\n`);
|
|
926
|
-
}
|
|
927
|
-
output.write(`total dialogs: ${dialogs.length}\n`);
|
|
928
|
-
for (const dialog of dialogs) {
|
|
929
|
-
output.write(
|
|
930
|
-
`\n${dialog.title}\nid=${dialog.id}\nstatus=${dialog.status ?? "-"}\nupdatedAt=${dialog.updatedAt ?? "-"}\ndbKey=${dialog.dbKey}\n`
|
|
931
|
-
);
|
|
932
|
-
}
|
|
933
|
-
return 0;
|
|
934
|
-
} catch (error) {
|
|
935
|
-
output.write(
|
|
936
|
-
`[nolo] dialog list failed: ${
|
|
937
|
-
error instanceof Error ? error.message : String(error)
|
|
938
|
-
}\n`
|
|
939
|
-
);
|
|
940
|
-
return 1;
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
|
|
944
|
-
export async function runDialogDeleteCommand(
|
|
945
|
-
args: string[],
|
|
946
|
-
deps: AgentCommandDeps = {}
|
|
947
|
-
) {
|
|
948
|
-
const env = deps.env ?? process.env;
|
|
949
|
-
const output = deps.output ?? process.stdout;
|
|
950
|
-
if (hasFlag(args, "--help") || hasFlag(args, "-h")) {
|
|
951
|
-
printDeleteUsage(output);
|
|
952
|
-
return 0;
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
const rawDialogs = readAllPositional(args);
|
|
956
|
-
if (rawDialogs.length === 0) {
|
|
957
|
-
printDeleteUsage(output);
|
|
958
|
-
return 1;
|
|
959
|
-
}
|
|
960
|
-
|
|
961
|
-
const authToken = resolveAuthToken(args, env);
|
|
962
|
-
if (!authToken) {
|
|
963
|
-
output.write("[nolo] dialog delete requires an auth token. Run `nolo login` or set AUTH_TOKEN.\n");
|
|
964
|
-
return 1;
|
|
965
|
-
}
|
|
966
|
-
const userId = parseUserIdFromAuthToken(authToken);
|
|
967
|
-
if (!userId) {
|
|
968
|
-
output.write("[nolo] dialog delete could not read userId from AUTH_TOKEN.\n");
|
|
969
|
-
return 1;
|
|
970
|
-
}
|
|
971
|
-
|
|
972
|
-
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
973
|
-
const fallbackFetchImpl = deps.fallbackFetchImpl;
|
|
974
|
-
const serverUrl = resolveServerUrl(args, env);
|
|
975
|
-
const serverUrls = resolveServerCandidates(args, env, serverUrl);
|
|
976
|
-
const shouldDelete = hasFlag(args, "--yes");
|
|
977
|
-
const includeReferencedAttachments = hasFlag(args, "--include-referenced-attachments");
|
|
978
|
-
const includeAttachments = hasFlag(args, "--include-attachments") || includeReferencedAttachments;
|
|
979
|
-
|
|
980
|
-
let hasErrors = false;
|
|
981
|
-
const payloads: any[] = [];
|
|
982
|
-
|
|
983
|
-
for (const rawDialog of rawDialogs) {
|
|
984
|
-
try {
|
|
985
|
-
const resolved = resolveDialogInput(rawDialog, userId);
|
|
986
|
-
const readResult = await readDbRecordFromServers({
|
|
987
|
-
authToken,
|
|
988
|
-
dbKey: resolved.dbKey,
|
|
989
|
-
fallbackFetchImpl,
|
|
990
|
-
fetchImpl,
|
|
991
|
-
label: "dialog record",
|
|
992
|
-
serverUrls,
|
|
993
|
-
});
|
|
994
|
-
const dialog = normalizeDialogRecord(readResult.record, resolved.dbKey);
|
|
995
|
-
if (!dialog) {
|
|
996
|
-
throw new Error(`dialog record is unreadable: ${resolved.dbKey}`);
|
|
997
|
-
}
|
|
998
|
-
|
|
999
|
-
const attachmentPlan = includeAttachments
|
|
1000
|
-
? await planDialogAttachmentCleanup({
|
|
1001
|
-
authToken,
|
|
1002
|
-
dialogId: resolved.dialogId,
|
|
1003
|
-
ownerId: resolved.ownerId,
|
|
1004
|
-
includeUserOwnedReferenced: includeReferencedAttachments,
|
|
1005
|
-
fallbackFetchImpl,
|
|
1006
|
-
fetchImpl,
|
|
1007
|
-
serverUrl: readResult.serverUrl,
|
|
1008
|
-
serverUrls,
|
|
1009
|
-
})
|
|
1010
|
-
: null;
|
|
1011
|
-
|
|
1012
|
-
const attachmentDeleteResults =
|
|
1013
|
-
includeAttachments && shouldDelete && attachmentPlan
|
|
1014
|
-
? await deleteDialogAttachmentCandidates({
|
|
1015
|
-
authToken,
|
|
1016
|
-
candidates: attachmentPlan.deleteCandidates,
|
|
1017
|
-
fallbackFetchImpl,
|
|
1018
|
-
fetchImpl,
|
|
1019
|
-
serverUrls,
|
|
1020
|
-
})
|
|
1021
|
-
: [];
|
|
1022
|
-
|
|
1023
|
-
let deleteResults: Awaited<ReturnType<typeof deleteDbRecordOnServers>> = [];
|
|
1024
|
-
if (shouldDelete) {
|
|
1025
|
-
deleteResults = await deleteDbRecordOnServers({
|
|
1026
|
-
authToken,
|
|
1027
|
-
dbKey: resolved.dbKey,
|
|
1028
|
-
fallbackFetchImpl,
|
|
1029
|
-
fetchImpl,
|
|
1030
|
-
serverUrls,
|
|
1031
|
-
});
|
|
1032
|
-
}
|
|
1033
|
-
const failedDeletes = deleteResults.filter((result) => !result.ok);
|
|
1034
|
-
const failedAttachmentDeletes = attachmentDeleteResults.flatMap((result) =>
|
|
1035
|
-
result.deleteResults
|
|
1036
|
-
.filter((deleteResult) => !deleteResult.ok)
|
|
1037
|
-
.map((deleteResult) => ({
|
|
1038
|
-
fileId: result.fileId,
|
|
1039
|
-
fileDbKey: result.fileDbKey,
|
|
1040
|
-
...deleteResult,
|
|
1041
|
-
}))
|
|
1042
|
-
);
|
|
1043
|
-
|
|
1044
|
-
if (failedDeletes.length > 0 || failedAttachmentDeletes.length > 0) {
|
|
1045
|
-
hasErrors = true;
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
const payload = {
|
|
1049
|
-
dbKey: resolved.dbKey,
|
|
1050
|
-
dialogId: resolved.dialogId,
|
|
1051
|
-
title: dialog.title,
|
|
1052
|
-
readServerUrl: readResult.serverUrl,
|
|
1053
|
-
targetServers: serverUrls,
|
|
1054
|
-
dryRun: !shouldDelete,
|
|
1055
|
-
deleted: shouldDelete,
|
|
1056
|
-
includeAttachments,
|
|
1057
|
-
includeReferencedAttachments,
|
|
1058
|
-
...(attachmentPlan ? { attachmentPlan } : {}),
|
|
1059
|
-
...(readResult.failures.length ? { readFailures: readResult.failures } : {}),
|
|
1060
|
-
...(shouldDelete ? { deleteResults } : {}),
|
|
1061
|
-
...(attachmentDeleteResults.length ? { attachmentDeleteResults } : {}),
|
|
1062
|
-
};
|
|
1063
|
-
payloads.push(payload);
|
|
1064
|
-
|
|
1065
|
-
if (!hasFlag(args, "--json")) {
|
|
1066
|
-
output.write(`dialog: ${dialog.title}\n`);
|
|
1067
|
-
output.write(`dbKey: ${resolved.dbKey}\n`);
|
|
1068
|
-
output.write(`readServer: ${readResult.serverUrl}\n`);
|
|
1069
|
-
output.write(`targetServers: ${serverUrls.join(", ")}\n`);
|
|
1070
|
-
if (attachmentPlan) {
|
|
1071
|
-
output.write(
|
|
1072
|
-
`attachments: ${attachmentPlan.deleteCandidates.length} delete candidates, ${attachmentPlan.retainedCandidates.length} retained, ${attachmentPlan.bytesToDelete} bytes planned\n`
|
|
1073
|
-
);
|
|
1074
|
-
for (const candidate of attachmentPlan.retainedCandidates) {
|
|
1075
|
-
output.write(`retained attachment: ${candidate.fileId} (${candidate.reason})\n`);
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
output.write(
|
|
1079
|
-
shouldDelete
|
|
1080
|
-
? failedDeletes.length > 0
|
|
1081
|
-
? `Deleted dialog on ${deleteResults.length - failedDeletes.length}/${deleteResults.length} servers. Failed: ${failedDeletes.map((result) => `${result.serverUrl} (${result.error})`).join(", ")}\n`
|
|
1082
|
-
: "Deleted dialog on all target servers. Server-side delete cascades dialog messages.\n"
|
|
1083
|
-
: includeAttachments
|
|
1084
|
-
? "Dry-run only. Add --yes to delete this dialog, its messages, and delete-candidate attachments.\n"
|
|
1085
|
-
: "Dry-run only. Add --yes to delete this dialog and its messages.\n"
|
|
1086
|
-
);
|
|
1087
|
-
if (failedAttachmentDeletes.length > 0) {
|
|
1088
|
-
output.write(
|
|
1089
|
-
`Attachment delete failures: ${failedAttachmentDeletes.map((result) => `${result.fileDbKey}@${result.serverUrl} (${result.error})`).join(", ")}\n`
|
|
1090
|
-
);
|
|
1091
|
-
}
|
|
1092
|
-
if (rawDialogs.length > 1) {
|
|
1093
|
-
output.write("\n");
|
|
1094
|
-
}
|
|
1095
|
-
}
|
|
1096
|
-
} catch (error) {
|
|
1097
|
-
hasErrors = true;
|
|
1098
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
1099
|
-
if (hasFlag(args, "--json")) {
|
|
1100
|
-
payloads.push({
|
|
1101
|
-
rawDialog,
|
|
1102
|
-
error: errorMsg,
|
|
1103
|
-
});
|
|
1104
|
-
} else {
|
|
1105
|
-
output.write(`[nolo] dialog delete failed for ${rawDialog}: ${errorMsg}\n`);
|
|
1106
|
-
if (rawDialogs.length > 1) {
|
|
1107
|
-
output.write("\n");
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
}
|
|
1112
|
-
|
|
1113
|
-
if (hasFlag(args, "--json")) {
|
|
1114
|
-
const finalPayload = rawDialogs.length === 1 ? payloads[0] : payloads;
|
|
1115
|
-
output.write(JSON.stringify(finalPayload, null, 2));
|
|
1116
|
-
output.write("\n");
|
|
1117
|
-
}
|
|
1118
|
-
|
|
1119
|
-
return hasErrors ? 1 : 0;
|
|
1120
|
-
}
|