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.
Files changed (482) hide show
  1. package/README.md +27 -12
  2. package/agent-runtime/agentThread.ts +222 -0
  3. package/agent-runtime/agentThreadAdmission.ts +74 -0
  4. package/agent-runtime/dialogWritePlan.ts +42 -0
  5. package/agent-runtime/hostAdapter.ts +1 -0
  6. package/agent-runtime/hybridRecordStore.ts +5 -3
  7. package/agent-runtime/index.ts +43 -0
  8. package/agent-runtime/localLoop.ts +31 -2
  9. package/agent-runtime/localToolPolicy.ts +1 -0
  10. package/agent-runtime/localWorkspaceTools.ts +1258 -78
  11. package/agent-runtime/noloWorkspaceTools.ts +20 -1
  12. package/agent-runtime/runtimeToolPolicy.ts +1 -5
  13. package/agent-runtime/runtimeToolSurface.ts +1 -0
  14. package/agentAliases.ts +29 -9
  15. package/agentInternalCommandEntries.ts +11 -3
  16. package/agentMachineCommands.ts +1 -0
  17. package/agentRecordCommands.ts +2 -2
  18. package/agentRecordHelpers.ts +59 -6
  19. package/agentRunCommand.ts +84 -19
  20. package/ai/agent/_executeModel.ts +146 -0
  21. package/ai/agent/agentSlice.ts +556 -1
  22. package/ai/agent/appWorkingMemory.ts +126 -0
  23. package/ai/agent/buildEditingContext.ts +378 -0
  24. package/ai/agent/buildSystemPrompt.ts +599 -0
  25. package/ai/agent/canvasEditingContext.ts +49 -0
  26. package/ai/agent/cleanAgentMessages.ts +140 -0
  27. package/ai/agent/cliChatClient.ts +153 -0
  28. package/ai/agent/cliExecutor.ts +264 -46
  29. package/ai/agent/contextCompiler.ts +107 -0
  30. package/ai/agent/contextLayerContract.ts +44 -0
  31. package/ai/agent/createAgentSchema.ts +272 -0
  32. package/ai/agent/currentTimeContext.ts +65 -0
  33. package/ai/agent/executeToolCall.ts +58 -0
  34. package/ai/agent/fetchAgentContexts.ts +42 -0
  35. package/ai/agent/generatePrompt.ts +3 -0
  36. package/ai/agent/getFullChatContextKeys.ts +168 -0
  37. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  38. package/ai/agent/guidedCreation/types.ts +38 -0
  39. package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
  40. package/ai/agent/liveAudioModel.ts +2 -0
  41. package/ai/agent/pageBuilderHandoffRules.ts +75 -0
  42. package/ai/agent/persistMessageWithFixedId.ts +37 -0
  43. package/ai/agent/planSlice.ts +259 -0
  44. package/ai/agent/referenceUtils.ts +229 -0
  45. package/ai/agent/runAgentBackground.ts +310 -0
  46. package/ai/agent/runAgentClientLoop.ts +164 -0
  47. package/ai/agent/runtimeGuidance.ts +116 -0
  48. package/ai/agent/serverOrigin.ts +7 -0
  49. package/ai/agent/startParallelAgentStreams.ts +424 -0
  50. package/ai/agent/startupProtocol.ts +53 -0
  51. package/ai/agent/streamAgentChatTurn.ts +2135 -0
  52. package/ai/agent/streamAgentChatTurnUtils.ts +923 -0
  53. package/ai/agent/toolFailureGuard.ts +99 -0
  54. package/ai/agent/types.ts +73 -0
  55. package/ai/agent/utils/imageOutput.ts +37 -0
  56. package/ai/agent/utils/publicImageAgentMode.ts +26 -0
  57. package/ai/ai.locale.ts +1165 -0
  58. package/ai/chat/accumulateToolCallChunks.ts +126 -0
  59. package/ai/chat/fetchUtils.ts +143 -0
  60. package/ai/chat/inlineImageUrlsForCustomProvider.ts +122 -0
  61. package/ai/chat/parseApiError.ts +67 -0
  62. package/ai/chat/parseMultilineSSE.ts +95 -0
  63. package/ai/chat/sendOpenAICompletionsRequest.ts +921 -0
  64. package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
  65. package/ai/chat/serverProxyRetry.ts +102 -0
  66. package/ai/chat/shouldUseServerProxy.ts +18 -0
  67. package/ai/chat/streamRetry.ts +46 -0
  68. package/ai/chat/updateTotalUsage.ts +89 -0
  69. package/ai/context/buildReferenceContext.ts +437 -0
  70. package/ai/context/retention.ts +165 -0
  71. package/ai/context/tokenUtils.ts +78 -0
  72. package/ai/llm/agentCapabilities.ts +74 -0
  73. package/ai/llm/deepinfra.ts +79 -0
  74. package/ai/llm/fireworks.ts +68 -0
  75. package/ai/llm/generateRequestBody.ts +165 -0
  76. package/ai/llm/getModelContextWindow.ts +93 -0
  77. package/ai/llm/getPricing.ts +252 -0
  78. package/ai/llm/imagePricing.ts +66 -0
  79. package/ai/llm/isResponseAPIModel.ts +13 -0
  80. package/ai/llm/kimi.ts +22 -0
  81. package/ai/llm/mimo.ts +99 -0
  82. package/ai/llm/mistral.ts +21 -0
  83. package/ai/llm/models.ts +45 -0
  84. package/ai/llm/openrouterModels.ts +31 -0
  85. package/ai/llm/providers.ts +313 -0
  86. package/ai/llm/reasoningModels.ts +27 -0
  87. package/ai/llm/types.ts +82 -0
  88. package/ai/llm/usageRequestOptions.ts +59 -0
  89. package/ai/memory/policy.ts +49 -0
  90. package/ai/memory/queryShared.ts +167 -0
  91. package/ai/memory/recentRelationshipRecap.ts +251 -0
  92. package/ai/memory/remember.ts +111 -0
  93. package/ai/memory/scope.ts +74 -0
  94. package/ai/memory/store.ts +20 -0
  95. package/ai/memory/storeShared.ts +76 -0
  96. package/ai/memory/types.ts +52 -0
  97. package/ai/memory/understanding.ts +341 -0
  98. package/ai/memory/understandingGreeting.ts +264 -0
  99. package/ai/policy/personalizationDialog.ts +333 -0
  100. package/ai/policy/runtimePolicy.ts +526 -0
  101. package/ai/policy/selfUpdateFields.ts +48 -0
  102. package/ai/policy/types.ts +64 -0
  103. package/ai/skills/referenceRuntime.ts +274 -0
  104. package/ai/skills/skillDiagnostics.ts +251 -0
  105. package/ai/skills/skillDocBuilder.ts +139 -0
  106. package/ai/skills/skillSummaryMarker.ts +26 -0
  107. package/ai/token/calculatePrice.ts +576 -0
  108. package/ai/token/missingUsageEstimate.ts +42 -0
  109. package/ai/token/normalizeUsage.ts +124 -0
  110. package/ai/token/openaiImageGenerationUsage.ts +56 -0
  111. package/ai/token/prepareTokenUsageData.ts +93 -0
  112. package/ai/token/resolveBillingTarget.ts +52 -0
  113. package/ai/token/saveTokenRecord.ts +53 -0
  114. package/ai/token/types.ts +103 -0
  115. package/ai/tools/agent/agentTools.ts +214 -0
  116. package/ai/tools/agent/agentUpdateShared.ts +311 -0
  117. package/ai/tools/agent/callAgentTool.ts +139 -0
  118. package/ai/tools/agent/createAgentTool.ts +512 -0
  119. package/ai/tools/agent/createDialogTool.ts +69 -0
  120. package/ai/tools/agent/createSkillAgentTool.ts +62 -0
  121. package/ai/tools/agent/parallelBudget.ts +221 -0
  122. package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
  123. package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
  124. package/ai/tools/agent/runLlmTool.ts +96 -0
  125. package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
  126. package/ai/tools/agent/skillAgentArgs.ts +106 -0
  127. package/ai/tools/agent/startAgentDialogTool.ts +54 -0
  128. package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
  129. package/ai/tools/agent/updateAgentTool.ts +96 -0
  130. package/ai/tools/agent/updateSelfTool.ts +113 -0
  131. package/ai/tools/amazonProductScraperTool.ts +86 -0
  132. package/ai/tools/apifyActorClient.ts +45 -0
  133. package/ai/tools/appEditGuard.ts +372 -0
  134. package/ai/tools/appReadSnapshot.ts +153 -0
  135. package/ai/tools/appTools.ts +1549 -0
  136. package/ai/tools/applyEditTool.ts +259 -0
  137. package/ai/tools/applyLineEditsTool.ts +315 -0
  138. package/ai/tools/browserTools/click.ts +33 -0
  139. package/ai/tools/browserTools/closeSession.ts +29 -0
  140. package/ai/tools/browserTools/common.ts +27 -0
  141. package/ai/tools/browserTools/openSession.ts +48 -0
  142. package/ai/tools/browserTools/readContent.ts +38 -0
  143. package/ai/tools/browserTools/selectOption.ts +46 -0
  144. package/ai/tools/browserTools/typeText.ts +42 -0
  145. package/ai/tools/category/createCategoryTool.ts +66 -0
  146. package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
  147. package/ai/tools/category/updateContentCategoryTool.ts +75 -0
  148. package/ai/tools/cfBrowserTools.ts +319 -0
  149. package/ai/tools/cfSpeechToTextTool.ts +49 -0
  150. package/ai/tools/checkEnvTool.ts +102 -0
  151. package/ai/tools/cloudflareCrawlTool.ts +289 -0
  152. package/ai/tools/codeSearchTool.ts +123 -0
  153. package/ai/tools/codeTools.ts +101 -0
  154. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  155. package/ai/tools/createDocTool.ts +132 -0
  156. package/ai/tools/createSkillDocTool.ts +155 -0
  157. package/ai/tools/createWorkflowTool.ts +154 -0
  158. package/ai/tools/delayTool.ts +31 -0
  159. package/ai/tools/deleteSpacesTool.ts +325 -0
  160. package/ai/tools/deleteSpacesToolModel.ts +159 -0
  161. package/ai/tools/devReloadUtils.ts +29 -0
  162. package/ai/tools/dialogMessageSearch.ts +137 -0
  163. package/ai/tools/doctorSkillTool.ts +72 -0
  164. package/ai/tools/ecommerceScraperTool.ts +86 -0
  165. package/ai/tools/emailTools.ts +549 -0
  166. package/ai/tools/evalSkillTool.ts +92 -0
  167. package/ai/tools/exaSearchTool.ts +63 -0
  168. package/ai/tools/execShellTool.ts +266 -0
  169. package/ai/tools/executeSqlTool.ts +192 -0
  170. package/ai/tools/fetchWebpageSupport.ts +333 -0
  171. package/ai/tools/fetchWebpageTool.ts +97 -0
  172. package/ai/tools/geminiImagePreviewTool.ts +386 -0
  173. package/ai/tools/generateDocxTool.ts +215 -0
  174. package/ai/tools/googleSearchScraperTool.ts +106 -0
  175. package/ai/tools/importDataTool.ts +133 -0
  176. package/ai/tools/importSkillTool.ts +162 -0
  177. package/ai/tools/index.ts +2290 -0
  178. package/ai/tools/jdProductScraperTool.ts +821 -0
  179. package/ai/tools/listUserSpacesTool.ts +113 -0
  180. package/ai/tools/localFilesTool.ts +276 -0
  181. package/ai/tools/marxistsOfflineBook.ts +253 -0
  182. package/ai/tools/modelUsageTools.ts +206 -0
  183. package/ai/tools/noloWorkspaceReadTools.ts +467 -0
  184. package/ai/tools/olmOcrTool.ts +33 -0
  185. package/ai/tools/openaiImageTool.ts +267 -0
  186. package/ai/tools/prepareTools.ts +193 -0
  187. package/ai/tools/readDocTool.ts +88 -0
  188. package/ai/tools/readFileTool.ts +214 -0
  189. package/ai/tools/readTool.ts +194 -0
  190. package/ai/tools/readXPostTool.ts +229 -0
  191. package/ai/tools/readXhsProfileTool.ts +638 -0
  192. package/ai/tools/rememberMemoryTool.ts +84 -0
  193. package/ai/tools/remotionVideoTool.ts +151 -0
  194. package/ai/tools/searchDialogMessagesTool.ts +222 -0
  195. package/ai/tools/searchWorkspaceTool.ts +259 -0
  196. package/ai/tools/skillFollowup.ts +86 -0
  197. package/ai/tools/surfWeatherTool.ts +169 -0
  198. package/ai/tools/table/addTableRowTool.ts +217 -0
  199. package/ai/tools/table/createTableTool.ts +326 -0
  200. package/ai/tools/table/rowTools.ts +386 -0
  201. package/ai/tools/table/schemaTools.ts +244 -0
  202. package/ai/tools/table/shareTableTool.ts +148 -0
  203. package/ai/tools/table/toolShared.ts +129 -0
  204. package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
  205. package/ai/tools/toolApiClient.ts +279 -0
  206. package/ai/tools/toolPacks.ts +19 -0
  207. package/ai/tools/toolResultError.ts +42 -0
  208. package/ai/tools/toolRunSlice.ts +303 -0
  209. package/ai/tools/toolSchemaCompatibility.ts +53 -0
  210. package/ai/tools/uiAskChoiceTool.ts +104 -0
  211. package/ai/tools/updateContentTitleTool.ts +84 -0
  212. package/ai/tools/updateDocTool.ts +105 -0
  213. package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
  214. package/ai/tools/wereadGatewayTool.ts +152 -0
  215. package/ai/tools/whisperTool.ts +76 -0
  216. package/ai/tools/writeFileTool.ts +213 -0
  217. package/ai/tools/youtubeScraperTool.ts +116 -0
  218. package/ai/tools/ziweiChartTool.ts +678 -0
  219. package/ai/types.ts +58 -0
  220. package/ai/workflow/workflowExecutor.ts +323 -0
  221. package/ai/workflow/workflowSlice.ts +73 -0
  222. package/ai/workflow/workflowTypes.ts +106 -0
  223. package/app/actions/syncAppRecord.ts +73 -0
  224. package/app/constants/animationSets.ts +21 -0
  225. package/app/constants/appEditor.ts +99 -0
  226. package/app/favorite/deletedFavoriteProjection.ts +31 -0
  227. package/app/favorite/favoriteSlice.ts +690 -0
  228. package/app/favorite/type.ts +43 -0
  229. package/app/hooks/deleteDbKey.ts +254 -0
  230. package/app/i18n/client.ts +13 -0
  231. package/app/i18n/i18n.base.ts +14 -0
  232. package/app/i18n/i18n.config.ts +77 -0
  233. package/app/i18n/index.ts +15 -0
  234. package/app/i18n/mapLanguage.ts +11 -0
  235. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  236. package/app/i18n/translations/error.locale.ts +246 -0
  237. package/app/i18n/translations/interface.locale.ts +2206 -0
  238. package/app/i18n/translations/pricing.locale.ts +397 -0
  239. package/app/i18n/translations/privacy.locale.ts +168 -0
  240. package/app/i18n/translations/seo.locale.ts +129 -0
  241. package/app/i18n/translations/terms.locale.ts +124 -0
  242. package/app/i18n/types.ts +6 -0
  243. package/app/notifications/model.ts +77 -0
  244. package/app/notifications/notificationSlice.ts +141 -0
  245. package/app/reducer.ts +36 -0
  246. package/app/settings/dbActionThunks.ts +34 -0
  247. package/app/settings/defaultSpacePreference.ts +87 -0
  248. package/app/settings/settingSlice.tsx +1212 -0
  249. package/app/settings/settingsRecord.ts +8 -0
  250. package/app/stateViews/runtime.ts +90 -0
  251. package/app/store.ts +55 -0
  252. package/app/theme/colors.ts +280 -0
  253. package/app/theme/fontPreference.ts +77 -0
  254. package/app/theme/theme.config.ts +120 -0
  255. package/app/theme/themeModeBootstrap.ts +123 -0
  256. package/app/types/appSummary.ts +118 -0
  257. package/app/types.ts +358 -0
  258. package/app/utils/appKeys.ts +55 -0
  259. package/app/utils/async.ts +28 -0
  260. package/app/utils/desktopAgentRuntimeTurnClient.ts +75 -0
  261. package/app/utils/env.ts +17 -0
  262. package/app/utils/fileUtils.ts +229 -0
  263. package/app/utils/imageUtils.ts +274 -0
  264. package/app/utils/myContentItems.ts +289 -0
  265. package/app/utils/retryAfter.ts +36 -0
  266. package/app/utils/retryFetch.ts +61 -0
  267. package/app/utils/toast.ts +3 -0
  268. package/auth/action/signUpAction.ts +227 -0
  269. package/auth/adminPermissions.ts +78 -0
  270. package/auth/authSlice.ts +531 -0
  271. package/auth/client/loginRequest.ts +14 -0
  272. package/auth/resetAuthScopedClientState.ts +27 -0
  273. package/auth/routes.ts +183 -0
  274. package/auth/token.ts +63 -0
  275. package/auth/types.ts +40 -0
  276. package/chat/chat.locale.ts +817 -0
  277. package/chat/dialog/actions/addCybotAction.ts +52 -0
  278. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  279. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  280. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  281. package/chat/dialog/actions/createDialogAction.ts +379 -0
  282. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  283. package/chat/dialog/actions/handleSendMessageAction.ts +202 -0
  284. package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
  285. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  286. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  287. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  288. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  289. package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
  290. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  291. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  292. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  293. package/chat/dialog/dialogAgents.ts +72 -0
  294. package/chat/dialog/dialogAttachmentCleanup.ts +135 -0
  295. package/chat/dialog/dialogSlice.ts +985 -0
  296. package/chat/dialog/dialogTitle.ts +81 -0
  297. package/chat/dialog/dialogTokenStats.ts +12 -0
  298. package/chat/dialog/dialogUrl.ts +6 -0
  299. package/chat/dialog/goal.ts +108 -0
  300. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  301. package/chat/dialog/schedule.ts +17 -0
  302. package/chat/messages/activityCompletion.ts +97 -0
  303. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  304. package/chat/messages/fetchConvMsgs.ts +51 -0
  305. package/chat/messages/fileUrl.ts +13 -0
  306. package/chat/messages/imagePayloadPersistence.ts +22 -0
  307. package/chat/messages/messageAgent.ts +8 -0
  308. package/chat/messages/messageContent.ts +203 -0
  309. package/chat/messages/messageContract.ts +88 -0
  310. package/chat/messages/messageSlice.ts +1386 -0
  311. package/chat/messages/toolThunks.ts +646 -0
  312. package/chat/messages/types.ts +8 -1
  313. package/chat/messages/web/toolDisplayName.ts +686 -0
  314. package/cli/agentAliases.ts +29 -9
  315. package/cli/agentInternalCommandEntries.ts +11 -3
  316. package/cli/agentMachineCommands.ts +1 -0
  317. package/cli/agentRecordCommands.ts +2 -2
  318. package/cli/agentRecordHelpers.ts +59 -6
  319. package/cli/agentRunCommand.ts +84 -19
  320. package/cli/client/agentRun.ts +92 -261
  321. package/cli/client/localRuntimeAdapter.ts +292 -50
  322. package/cli/commandRegistry.ts +7 -4
  323. package/cli/dialogAttachmentCleanup.ts +151 -0
  324. package/cli/dialogCommands.ts +163 -61
  325. package/cli/dialogInternalCommandEntries.ts +1 -1
  326. package/cli/docCreateCommands.ts +345 -0
  327. package/cli/docInternalCommandEntries.ts +11 -0
  328. package/cli/docPageHelpers.ts +80 -0
  329. package/cli/docSkillHelpers.ts +67 -0
  330. package/cli/docSpaceHelpers.ts +46 -0
  331. package/cli/internalCommandEntries.ts +4 -0
  332. package/cli/machineCommands.ts +18 -34
  333. package/cli/memoryCommands.ts +253 -0
  334. package/cli/memoryInternalCommandEntries.ts +9 -0
  335. package/cli/qoderUsageProbe.ts +252 -0
  336. package/cli/scriptCommandEntries.ts +0 -3
  337. package/cli/secretScan.ts +31 -0
  338. package/cli/tableCommands.ts +248 -13
  339. package/cli/workflowInternalCommandEntries.ts +2 -3
  340. package/client/agentRun.test.ts +119 -83
  341. package/client/agentRun.ts +92 -261
  342. package/client/localRuntimeAdapter.test.ts +894 -32
  343. package/client/localRuntimeAdapter.ts +292 -50
  344. package/commandRegistry.ts +7 -4
  345. package/connector-experimental/capabilities.ts +10 -9
  346. package/core/builtinAgents.ts +209 -0
  347. package/core/config.ts +15 -0
  348. package/core/crypto.ts +51 -0
  349. package/core/generateKeyPairFromSeedV1.ts +15 -0
  350. package/core/generateMainKey.ts +22 -0
  351. package/core/init.ts +41 -0
  352. package/core/localOrigins.ts +8 -0
  353. package/core/password.ts +13 -0
  354. package/core/prefix.ts +23 -0
  355. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  356. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  357. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  358. package/create/editor/transforms/markdownToSlate.ts +24 -0
  359. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  360. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  361. package/create/editor/transforms/slateToText.ts +33 -0
  362. package/create/editor/utils/slateUtils.ts +233 -0
  363. package/create/space/addSpaceAction.ts +193 -0
  364. package/create/space/category/categoryActions.ts +427 -0
  365. package/create/space/changeSpaceAction.ts +36 -0
  366. package/create/space/constants.ts +8 -0
  367. package/create/space/content/addContentAction.ts +116 -0
  368. package/create/space/content/contentThunks.ts +90 -0
  369. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  370. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  371. package/create/space/content/moveContentAction.ts +285 -0
  372. package/create/space/content/updateContentCategoryAction.ts +154 -0
  373. package/create/space/content/updateContentTitleAction.ts +151 -0
  374. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  375. package/create/space/contentKeyUtils.ts +117 -0
  376. package/create/space/deleteSpaceAction.ts +276 -0
  377. package/create/space/fetchSpaceAction.ts +70 -0
  378. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  379. package/create/space/loadDefaultSpaceAction.ts +57 -0
  380. package/create/space/member/addMemberAction.ts +79 -0
  381. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  382. package/create/space/member/memberThunks.ts +47 -0
  383. package/create/space/member/removeMemberAction.ts +67 -0
  384. package/create/space/resolvePreferredSpaceId.ts +113 -0
  385. package/create/space/sidebarVisibleTypes.ts +260 -0
  386. package/create/space/space.locale.ts +1087 -0
  387. package/create/space/spaceAccess.ts +182 -0
  388. package/create/space/spaceCollapsedState.ts +54 -0
  389. package/create/space/spaceKeys.ts +65 -0
  390. package/create/space/spaceSlice.ts +328 -0
  391. package/create/space/spaceThunks.ts +410 -0
  392. package/create/space/types.ts +27 -0
  393. package/create/space/updateSpaceAction.ts +107 -0
  394. package/create/space/utils/permissions.ts +47 -0
  395. package/create/types.ts +21 -0
  396. package/database/actions/agentReadResolution.ts +33 -0
  397. package/database/actions/common.ts +243 -0
  398. package/database/actions/deleteFile.ts +40 -0
  399. package/database/actions/fileContent.ts +125 -0
  400. package/database/actions/patch.ts +155 -0
  401. package/database/actions/read.ts +358 -0
  402. package/database/actions/readAndWait.ts +260 -0
  403. package/database/actions/readRequestManager.ts +120 -0
  404. package/database/actions/readResolution.ts +125 -0
  405. package/database/actions/remove.ts +94 -0
  406. package/database/actions/replication.ts +477 -0
  407. package/database/actions/upload.ts +186 -0
  408. package/database/actions/upsert.ts +56 -0
  409. package/database/actions/write.ts +146 -0
  410. package/database/authority/ownerKey.ts +80 -0
  411. package/database/authority/recordAuthority.ts +67 -0
  412. package/database/authority/userAuthorityRegistry.ts +54 -0
  413. package/database/client/fetchUserData.ts +61 -0
  414. package/database/dbActionThunks.ts +1 -0
  415. package/database/dbSlice.ts +149 -0
  416. package/database/fileRing.ts +51 -0
  417. package/database/fileStorage.ts +232 -0
  418. package/database/fileUrl.ts +34 -0
  419. package/database/keys.ts +767 -0
  420. package/database/queryPrefixes.ts +14 -0
  421. package/database/requests.ts +443 -0
  422. package/database/runtimeServerContext.ts +54 -0
  423. package/database/tenantPlacement.ts +57 -0
  424. package/database/userPreferenceRegister.ts +131 -0
  425. package/database/utils/ulid.ts +1 -0
  426. package/dialogAttachmentCleanup.ts +151 -0
  427. package/dialogCommands.ts +163 -61
  428. package/dialogInternalCommandEntries.ts +1 -1
  429. package/docCreateCommands.ts +345 -0
  430. package/docInternalCommandEntries.ts +11 -0
  431. package/docPageHelpers.ts +80 -0
  432. package/docSkillHelpers.ts +67 -0
  433. package/docSpaceHelpers.ts +46 -0
  434. package/integrations/anthropic/anthropicModels.ts +47 -0
  435. package/integrations/deepseek/models.ts +37 -0
  436. package/integrations/google/models.ts +341 -0
  437. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  438. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  439. package/integrations/openai/flexTier.ts +102 -0
  440. package/integrations/openai/generateOpenAIRequestBody.ts +271 -0
  441. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  442. package/integrations/openai/models.ts +271 -0
  443. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  444. package/integrations/openai/responsesHelpers.ts +297 -0
  445. package/integrations/x-reader/types.ts +109 -0
  446. package/integrations/xai/models.ts +13 -0
  447. package/integrations/xhs-reader/redaction.ts +68 -0
  448. package/integrations/xhs-reader/types.ts +277 -0
  449. package/integrations/xhs-reader/url.ts +80 -0
  450. package/internalCommandEntries.ts +4 -0
  451. package/machineCommands.ts +18 -34
  452. package/memoryCommands.ts +253 -0
  453. package/memoryInternalCommandEntries.ts +9 -0
  454. package/package.json +454 -9
  455. package/qoderUsageProbe.ts +252 -0
  456. package/render/contentIcon/types.ts +167 -0
  457. package/render/page/createPageAction.ts +183 -0
  458. package/render/page/docSlice.ts +495 -0
  459. package/render/page/types.ts +19 -0
  460. package/render/table/createTableAction.ts +274 -0
  461. package/render/table/deleteTableAction.ts +193 -0
  462. package/render/table/fetchAndCacheTableRows.ts +174 -0
  463. package/render/table/tableSlice.ts +1167 -0
  464. package/render/table/toolValueUtils.ts +363 -0
  465. package/render/table/types.ts +262 -0
  466. package/render/table/utils/tableSerialization.ts +50 -0
  467. package/scriptCommandEntries.ts +0 -3
  468. package/secretScan.ts +31 -0
  469. package/server/handlers/agentRun/types.ts +105 -0
  470. package/share/action.ts +225 -0
  471. package/share/helpers.ts +302 -0
  472. package/share/keys.ts +243 -0
  473. package/share/publicSharePolicy.ts +27 -0
  474. package/share/shareSlice.ts +53 -0
  475. package/share/types.ts +100 -0
  476. package/tableCommands.ts +248 -13
  477. package/workflowInternalCommandEntries.ts +2 -3
  478. package/ai/tools/agent/taskRunTool.ts +0 -112
  479. package/cli/client/taskRunPrompt.ts +0 -27
  480. package/cli/taskRunCommand.ts +0 -265
  481. package/client/taskRunPrompt.ts +0 -27
  482. package/taskRunCommand.ts +0 -265
@@ -0,0 +1,151 @@
1
+ import { deleteDbRecordOnServers, readDbRecordFromServers, type GlobalDeleteResult } from "./globalRecordOperations";
2
+ import {
3
+ buildDialogAttachmentPlan,
4
+ extractFileContentIds,
5
+ type DialogAttachmentCandidate,
6
+ type DialogAttachmentPlan,
7
+ } from "../chat/dialog/dialogAttachmentCleanup";
8
+
9
+ export { buildDialogAttachmentPlan, extractFileContentIds };
10
+
11
+ export type DialogAttachmentDeleteResult = {
12
+ fileId: string;
13
+ fileDbKey: string;
14
+ deleteResults: GlobalDeleteResult[];
15
+ };
16
+
17
+ function asText(value: unknown) {
18
+ return typeof value === "string" && value.trim() ? value.trim() : null;
19
+ }
20
+
21
+ async function readDialogMessages(args: {
22
+ authToken: string;
23
+ dialogId: string;
24
+ fetchImpl: typeof fetch;
25
+ serverUrl: string;
26
+ }) {
27
+ const response = await args.fetchImpl(`${args.serverUrl}/rpc/getConvMsgs`, {
28
+ method: "POST",
29
+ headers: {
30
+ Authorization: `Bearer ${args.authToken}`,
31
+ "Content-Type": "application/json",
32
+ },
33
+ body: JSON.stringify({ dialogId: args.dialogId, limit: 10000 }),
34
+ });
35
+ if (!response.ok) {
36
+ throw new Error(`read dialog messages failed on ${args.serverUrl}: HTTP ${response.status}`);
37
+ }
38
+ const payload = await response.json();
39
+ return Array.isArray(payload) ? payload : [];
40
+ }
41
+
42
+ export async function planDialogAttachmentCleanup(args: {
43
+ authToken: string;
44
+ dialogId: string;
45
+ ownerId?: string | null;
46
+ includeUserOwnedReferenced?: boolean;
47
+ fallbackFetchImpl?: typeof fetch;
48
+ fetchImpl: typeof fetch;
49
+ serverUrl: string;
50
+ serverUrls: string[];
51
+ }): Promise<DialogAttachmentPlan> {
52
+ const messages = await readDialogMessages({
53
+ authToken: args.authToken,
54
+ dialogId: args.dialogId,
55
+ fetchImpl: args.fetchImpl,
56
+ serverUrl: args.serverUrl,
57
+ });
58
+ const fileIds = [...new Set(messages.flatMap((message) => extractFileContentIds(message)))];
59
+ const metadataByFileId: Record<string, any> = {};
60
+ const metadataReadFailures: Array<{ fileId: string; error: string }> = [];
61
+
62
+ for (const fileId of fileIds) {
63
+ try {
64
+ const result = await readDbRecordFromServers({
65
+ authToken: args.authToken,
66
+ dbKey: `file-id-${fileId}`,
67
+ fallbackFetchImpl: args.fallbackFetchImpl,
68
+ fetchImpl: args.fetchImpl,
69
+ serverUrls: args.serverUrls,
70
+ label: `file metadata index ${fileId}`,
71
+ });
72
+ const mainKey = asText(result.record?.mainKey);
73
+ if (!mainKey) throw new Error(`file-id index missing mainKey`);
74
+ const metadata = await readDbRecordFromServers({
75
+ authToken: args.authToken,
76
+ dbKey: mainKey,
77
+ fallbackFetchImpl: args.fallbackFetchImpl,
78
+ fetchImpl: args.fetchImpl,
79
+ serverUrls: args.serverUrls,
80
+ label: `file metadata ${fileId}`,
81
+ });
82
+ metadataByFileId[fileId] = {
83
+ ...metadata.record,
84
+ dbKey: asText(metadata.record?.dbKey) ?? mainKey,
85
+ };
86
+ } catch (error) {
87
+ const fallbackKey =
88
+ args.ownerId && !fileId.startsWith("file-")
89
+ ? `file-${args.ownerId}-${fileId}`
90
+ : null;
91
+ if (fallbackKey) {
92
+ try {
93
+ const metadata = await readDbRecordFromServers({
94
+ authToken: args.authToken,
95
+ dbKey: fallbackKey,
96
+ fallbackFetchImpl: args.fallbackFetchImpl,
97
+ fetchImpl: args.fetchImpl,
98
+ serverUrls: args.serverUrls,
99
+ label: `file metadata ${fileId}`,
100
+ });
101
+ metadataByFileId[fileId] = {
102
+ ...metadata.record,
103
+ dbKey: asText(metadata.record?.dbKey) ?? fallbackKey,
104
+ };
105
+ continue;
106
+ } catch {
107
+ // Keep the original index error; it explains why the preferred path failed.
108
+ }
109
+ }
110
+ metadataReadFailures.push({
111
+ fileId,
112
+ error: error instanceof Error ? error.message : String(error),
113
+ });
114
+ }
115
+ }
116
+
117
+ return buildDialogAttachmentPlan({
118
+ dialogId: args.dialogId,
119
+ ownerId: args.ownerId,
120
+ includeUserOwnedReferenced: args.includeUserOwnedReferenced,
121
+ messages,
122
+ metadataByFileId,
123
+ metadataReadFailures,
124
+ });
125
+ }
126
+
127
+ export async function deleteDialogAttachmentCandidates(args: {
128
+ authToken: string;
129
+ candidates: DialogAttachmentCandidate[];
130
+ fallbackFetchImpl?: typeof fetch;
131
+ fetchImpl: typeof fetch;
132
+ serverUrls: string[];
133
+ }): Promise<DialogAttachmentDeleteResult[]> {
134
+ const results: DialogAttachmentDeleteResult[] = [];
135
+ for (const candidate of args.candidates) {
136
+ if (candidate.status !== "delete" || !candidate.fileDbKey) continue;
137
+ const deleteResults = await deleteDbRecordOnServers({
138
+ authToken: args.authToken,
139
+ dbKey: candidate.fileDbKey,
140
+ fallbackFetchImpl: args.fallbackFetchImpl,
141
+ fetchImpl: args.fetchImpl,
142
+ serverUrls: args.serverUrls,
143
+ });
144
+ results.push({
145
+ fileId: candidate.fileId,
146
+ fileDbKey: candidate.fileDbKey,
147
+ deleteResults,
148
+ });
149
+ }
150
+ return results;
151
+ }
@@ -13,6 +13,10 @@ import {
13
13
  readDbRecordFromServers,
14
14
  readLiveDbRecordAfterTombstoneMerge,
15
15
  } from "./globalRecordOperations";
16
+ import {
17
+ deleteDialogAttachmentCandidates,
18
+ planDialogAttachmentCleanup,
19
+ } from "./dialogAttachmentCleanup";
16
20
 
17
21
  type ReadSource = "http" | "local-db-fallback";
18
22
 
@@ -45,6 +49,7 @@ const VALUE_FLAGS = new Set([
45
49
  "--space",
46
50
  "--space-id",
47
51
  "--token",
52
+ "--machine-key",
48
53
  "--user",
49
54
  ]);
50
55
 
@@ -64,6 +69,21 @@ function readFirstPositional(args: string[]) {
64
69
  return undefined;
65
70
  }
66
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
+
67
87
  function readLimit(args: string[], fallback: number) {
68
88
  const raw = readOption(args, "--limit");
69
89
  const parsed = raw ? Number(raw) : fallback;
@@ -194,15 +214,20 @@ Lists merge global server candidates and ignore newer tombstones.
194
214
 
195
215
  function printDeleteUsage(output: { write(chunk: string): unknown }) {
196
216
  output.write(`Usage:
197
- nolo dialog delete <dialogId|dialogKey|dialogUrl> [--yes] [--json]
217
+ nolo dialog delete <dialogId|dialogKey|dialogUrl...> [--yes] [--include-attachments] [--include-referenced-attachments] [--json]
198
218
 
199
219
  Options:
200
- --yes Actually delete. Without this, the command is a dry-run.
201
- --json Print machine-readable JSON.
202
- --server <url> Prefer this server and include it in global deletion.
203
- --token <jwt> Override AUTH_TOKEN.
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.
204
227
 
205
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.
206
231
  `);
207
232
  }
208
233
 
@@ -927,8 +952,8 @@ export async function runDialogDeleteCommand(
927
952
  return 0;
928
953
  }
929
954
 
930
- const rawDialog = readFirstPositional(args);
931
- if (!rawDialog) {
955
+ const rawDialogs = readAllPositional(args);
956
+ if (rawDialogs.length === 0) {
932
957
  printDeleteUsage(output);
933
958
  return 1;
934
959
  }
@@ -948,71 +973,148 @@ export async function runDialogDeleteCommand(
948
973
  const fallbackFetchImpl = deps.fallbackFetchImpl;
949
974
  const serverUrl = resolveServerUrl(args, env);
950
975
  const serverUrls = resolveServerCandidates(args, env, serverUrl);
951
- const resolved = resolveDialogInput(rawDialog, userId);
952
976
  const shouldDelete = hasFlag(args, "--yes");
977
+ const includeReferencedAttachments = hasFlag(args, "--include-referenced-attachments");
978
+ const includeAttachments = hasFlag(args, "--include-attachments") || includeReferencedAttachments;
953
979
 
954
- try {
955
- const readResult = await readDbRecordFromServers({
956
- authToken,
957
- dbKey: resolved.dbKey,
958
- fallbackFetchImpl,
959
- fetchImpl,
960
- label: "dialog record",
961
- serverUrls,
962
- });
963
- const dialog = normalizeDialogRecord(readResult.record, resolved.dbKey);
964
- if (!dialog) {
965
- throw new Error(`dialog record is unreadable: ${resolved.dbKey}`);
966
- }
980
+ let hasErrors = false;
981
+ const payloads: any[] = [];
967
982
 
968
- let deleteResults: Awaited<ReturnType<typeof deleteDbRecordOnServers>> = [];
969
- if (shouldDelete) {
970
- deleteResults = await deleteDbRecordOnServers({
983
+ for (const rawDialog of rawDialogs) {
984
+ try {
985
+ const resolved = resolveDialogInput(rawDialog, userId);
986
+ const readResult = await readDbRecordFromServers({
971
987
  authToken,
972
988
  dbKey: resolved.dbKey,
973
989
  fallbackFetchImpl,
974
990
  fetchImpl,
991
+ label: "dialog record",
975
992
  serverUrls,
976
993
  });
977
- }
978
- const failedDeletes = deleteResults.filter((result) => !result.ok);
979
-
980
- const payload = {
981
- dbKey: resolved.dbKey,
982
- dialogId: resolved.dialogId,
983
- title: dialog.title,
984
- readServerUrl: readResult.serverUrl,
985
- targetServers: serverUrls,
986
- dryRun: !shouldDelete,
987
- deleted: shouldDelete,
988
- ...(readResult.failures.length ? { readFailures: readResult.failures } : {}),
989
- ...(shouldDelete ? { deleteResults } : {}),
990
- };
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
+ );
991
1043
 
992
- if (hasFlag(args, "--json")) {
993
- output.write(JSON.stringify(payload, null, 2));
994
- output.write("\n");
995
- return failedDeletes.length > 0 ? 1 : 0;
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
+ }
996
1110
  }
1111
+ }
997
1112
 
998
- output.write(`dialog: ${dialog.title}\n`);
999
- output.write(`dbKey: ${resolved.dbKey}\n`);
1000
- output.write(`readServer: ${readResult.serverUrl}\n`);
1001
- output.write(`targetServers: ${serverUrls.join(", ")}\n`);
1002
- output.write(
1003
- shouldDelete
1004
- ? failedDeletes.length > 0
1005
- ? `Deleted dialog on ${deleteResults.length - failedDeletes.length}/${deleteResults.length} servers. Failed: ${failedDeletes.map((result) => `${result.serverUrl} (${result.error})`).join(", ")}\n`
1006
- : "Deleted dialog on all target servers. Server-side delete cascades dialog messages.\n"
1007
- : "Dry-run only. Add --yes to delete this dialog and its messages.\n"
1008
- );
1009
- return failedDeletes.length > 0 ? 1 : 0;
1010
- } catch (error) {
1011
- output.write(
1012
- `[nolo] dialog delete failed: ${
1013
- error instanceof Error ? error.message : String(error)
1014
- }\n`
1015
- );
1016
- return 1;
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");
1017
1117
  }
1118
+
1119
+ return hasErrors ? 1 : 0;
1018
1120
  }
@@ -10,7 +10,7 @@ import {
10
10
  export function getDialogInternalCommandEntries(): CommandEntry[] {
11
11
  return [
12
12
  createEnvCommand(["dialog", "list"], "List dialogs", runDialogListCommand),
13
- createEnvCommand(["dialog", "delete"], "Delete a dialog", runDialogDeleteCommand),
13
+ createEnvCommand(["dialog", "delete"], "Delete one or more dialogs", runDialogDeleteCommand),
14
14
  createEnvCommand(["dialog", "read"], "Read a dialog", runDialogReadCommand),
15
15
  createEnvCommand(["dialog", "status"], "Read compact dialog status", runDialogStatusCommand),
16
16
  ];