nolo-cli 0.1.39 → 0.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +4 -4
  2. package/agent-runtime/dialogWritePlan.ts +39 -0
  3. package/agent-runtime/hostAdapter.ts +4 -0
  4. package/agent-runtime/hybridRecordStore.ts +5 -3
  5. package/agent-runtime/index.ts +15 -0
  6. package/agent-runtime/localLoop.ts +87 -7
  7. package/agent-runtime/localToolPolicy.ts +2 -13
  8. package/agent-runtime/localWorkspaceTools.ts +42 -110
  9. package/agent-runtime/runtimeToolPolicy.ts +2 -11
  10. package/agent-runtime/runtimeToolSurface.ts +198 -0
  11. package/agent-runtime/types.ts +1 -0
  12. package/agentAliases.ts +2 -1
  13. package/agentRunCommand.ts +10 -32
  14. package/agentRuntimeLocal.ts +1 -0
  15. package/ai/agent/_executeModel.ts +146 -0
  16. package/ai/agent/agentSlice.ts +556 -1
  17. package/ai/agent/appWorkingMemory.ts +126 -0
  18. package/ai/agent/buildEditingContext.ts +378 -0
  19. package/ai/agent/buildSystemPrompt.ts +585 -0
  20. package/ai/agent/canvasEditingContext.ts +49 -0
  21. package/ai/agent/cleanAgentMessages.ts +140 -0
  22. package/ai/agent/cliChatClient.ts +153 -0
  23. package/ai/agent/cliExecutor.ts +314 -40
  24. package/ai/agent/contextCompiler.ts +107 -0
  25. package/ai/agent/contextLayerContract.ts +44 -0
  26. package/ai/agent/createAgentSchema.ts +272 -0
  27. package/ai/agent/currentTimeContext.ts +65 -0
  28. package/ai/agent/executeToolCall.ts +58 -0
  29. package/ai/agent/fetchAgentContexts.ts +42 -0
  30. package/ai/agent/generatePrompt.ts +3 -0
  31. package/ai/agent/getFullChatContextKeys.ts +168 -0
  32. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  33. package/ai/agent/guidedCreation/types.ts +38 -0
  34. package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
  35. package/ai/agent/liveAudioModel.ts +2 -0
  36. package/ai/agent/pageBuilderHandoffRules.ts +75 -0
  37. package/ai/agent/persistMessageWithFixedId.ts +37 -0
  38. package/ai/agent/planSlice.ts +259 -0
  39. package/ai/agent/referenceUtils.ts +229 -0
  40. package/ai/agent/runAgentBackground.ts +310 -0
  41. package/ai/agent/runAgentClientLoop.ts +164 -0
  42. package/ai/agent/runtimeGuidance.ts +116 -0
  43. package/ai/agent/serverOrigin.ts +7 -0
  44. package/ai/agent/startParallelAgentStreams.ts +424 -0
  45. package/ai/agent/startupProtocol.ts +53 -0
  46. package/ai/agent/streamAgentChatTurn.ts +2001 -0
  47. package/ai/agent/streamAgentChatTurnUtils.ts +860 -0
  48. package/ai/agent/toolFailureGuard.ts +99 -0
  49. package/ai/agent/types.ts +73 -0
  50. package/ai/agent/utils/imageOutput.ts +37 -0
  51. package/ai/agent/utils/publicImageAgentMode.ts +26 -0
  52. package/ai/ai.locale.ts +1095 -0
  53. package/ai/chat/accumulateToolCallChunks.ts +126 -0
  54. package/ai/chat/fetchUtils.ts +143 -0
  55. package/ai/chat/inlineImageUrlsForCustomProvider.ts +117 -0
  56. package/ai/chat/parseApiError.ts +67 -0
  57. package/ai/chat/parseMultilineSSE.ts +95 -0
  58. package/ai/chat/sendOpenAICompletionsRequest.ts +897 -0
  59. package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
  60. package/ai/chat/serverProxyRetry.ts +102 -0
  61. package/ai/chat/shouldUseServerProxy.ts +18 -0
  62. package/ai/chat/streamRetry.ts +46 -0
  63. package/ai/chat/updateTotalUsage.ts +89 -0
  64. package/ai/context/buildReferenceContext.ts +437 -0
  65. package/ai/context/retention.ts +165 -0
  66. package/ai/context/tokenUtils.ts +78 -0
  67. package/ai/llm/agentCapabilities.ts +74 -0
  68. package/ai/llm/deepinfra.ts +79 -0
  69. package/ai/llm/fireworks.ts +68 -0
  70. package/ai/llm/generateRequestBody.ts +165 -0
  71. package/ai/llm/getModelContextWindow.ts +93 -0
  72. package/ai/llm/getPricing.ts +252 -0
  73. package/ai/llm/imagePricing.ts +66 -0
  74. package/ai/llm/isResponseAPIModel.ts +13 -0
  75. package/ai/llm/kimi.ts +23 -0
  76. package/ai/llm/mimo.ts +99 -0
  77. package/ai/llm/mistral.ts +21 -0
  78. package/ai/llm/models.ts +45 -0
  79. package/ai/llm/openrouterModels.ts +6 -0
  80. package/ai/llm/providers.ts +313 -0
  81. package/ai/llm/reasoningModels.ts +27 -0
  82. package/ai/llm/types.ts +82 -0
  83. package/ai/llm/usageRequestOptions.ts +59 -0
  84. package/ai/memory/queryShared.ts +161 -0
  85. package/ai/memory/recentRelationshipRecap.ts +247 -0
  86. package/ai/memory/remember.ts +167 -0
  87. package/ai/memory/store.ts +20 -0
  88. package/ai/memory/storeShared.ts +76 -0
  89. package/ai/memory/types.ts +46 -0
  90. package/ai/memory/understanding.ts +349 -0
  91. package/ai/memory/understandingGreeting.ts +264 -0
  92. package/ai/policy/personalizationDialog.ts +333 -0
  93. package/ai/policy/runtimePolicy.ts +454 -0
  94. package/ai/policy/selfUpdateFields.ts +48 -0
  95. package/ai/policy/types.ts +64 -0
  96. package/ai/skills/referenceRuntime.ts +274 -0
  97. package/ai/skills/skillDiagnostics.ts +251 -0
  98. package/ai/skills/skillDocBuilder.ts +139 -0
  99. package/ai/skills/skillSummaryMarker.ts +26 -0
  100. package/ai/token/calculatePrice.ts +576 -0
  101. package/ai/token/missingUsageEstimate.ts +42 -0
  102. package/ai/token/normalizeUsage.ts +124 -0
  103. package/ai/token/openaiImageGenerationUsage.ts +56 -0
  104. package/ai/token/prepareTokenUsageData.ts +93 -0
  105. package/ai/token/resolveBillingTarget.ts +52 -0
  106. package/ai/token/saveTokenRecord.ts +53 -0
  107. package/ai/token/types.ts +103 -0
  108. package/ai/tools/agent/agentTools.ts +235 -0
  109. package/ai/tools/agent/agentUpdateShared.ts +311 -0
  110. package/ai/tools/agent/callAgentTool.ts +139 -0
  111. package/ai/tools/agent/createAgentTool.ts +512 -0
  112. package/ai/tools/agent/createDialogTool.ts +69 -0
  113. package/ai/tools/agent/createSkillAgentTool.ts +62 -0
  114. package/ai/tools/agent/parallelBudget.ts +221 -0
  115. package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
  116. package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
  117. package/ai/tools/agent/runLlmTool.ts +96 -0
  118. package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
  119. package/ai/tools/agent/skillAgentArgs.ts +106 -0
  120. package/ai/tools/agent/startAgentDialogTool.ts +53 -0
  121. package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
  122. package/ai/tools/agent/updateAgentTool.ts +96 -0
  123. package/ai/tools/agent/updateSelfTool.ts +113 -0
  124. package/ai/tools/amazonProductScraperTool.ts +86 -0
  125. package/ai/tools/apifyActorClient.ts +45 -0
  126. package/ai/tools/appEditGuard.ts +372 -0
  127. package/ai/tools/appReadSnapshot.ts +153 -0
  128. package/ai/tools/appTools.ts +1549 -0
  129. package/ai/tools/applyEditTool.ts +259 -0
  130. package/ai/tools/applyLineEditsTool.ts +315 -0
  131. package/ai/tools/browserTools/click.ts +33 -0
  132. package/ai/tools/browserTools/closeSession.ts +29 -0
  133. package/ai/tools/browserTools/common.ts +27 -0
  134. package/ai/tools/browserTools/openSession.ts +48 -0
  135. package/ai/tools/browserTools/readContent.ts +38 -0
  136. package/ai/tools/browserTools/selectOption.ts +46 -0
  137. package/ai/tools/browserTools/typeText.ts +42 -0
  138. package/ai/tools/category/createCategoryTool.ts +66 -0
  139. package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
  140. package/ai/tools/category/updateContentCategoryTool.ts +75 -0
  141. package/ai/tools/cfBrowserTools.ts +319 -0
  142. package/ai/tools/cfSpeechToTextTool.ts +49 -0
  143. package/ai/tools/checkEnvTool.ts +102 -0
  144. package/ai/tools/cloudflareCrawlTool.ts +289 -0
  145. package/ai/tools/codeSearchTool.ts +123 -0
  146. package/ai/tools/codeTools.ts +101 -0
  147. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  148. package/ai/tools/createDocTool.ts +132 -0
  149. package/ai/tools/createSkillDocTool.ts +155 -0
  150. package/ai/tools/createWorkflowTool.ts +154 -0
  151. package/ai/tools/delayTool.ts +31 -0
  152. package/ai/tools/deleteSpacesTool.ts +325 -0
  153. package/ai/tools/deleteSpacesToolModel.ts +159 -0
  154. package/ai/tools/devReloadUtils.ts +29 -0
  155. package/ai/tools/dialogMessageSearch.ts +137 -0
  156. package/ai/tools/doctorSkillTool.ts +72 -0
  157. package/ai/tools/ecommerceScraperTool.ts +86 -0
  158. package/ai/tools/emailTools.ts +549 -0
  159. package/ai/tools/evalSkillTool.ts +92 -0
  160. package/ai/tools/exaSearchTool.ts +63 -0
  161. package/ai/tools/execShellTool.ts +266 -0
  162. package/ai/tools/executeSqlTool.ts +192 -0
  163. package/ai/tools/fetchWebpageSupport.ts +333 -0
  164. package/ai/tools/fetchWebpageTool.ts +97 -0
  165. package/ai/tools/geminiImagePreviewTool.ts +386 -0
  166. package/ai/tools/generateDocxTool.ts +215 -0
  167. package/ai/tools/googleSearchScraperTool.ts +106 -0
  168. package/ai/tools/importDataTool.ts +133 -0
  169. package/ai/tools/importSkillTool.ts +162 -0
  170. package/ai/tools/index.ts +2308 -0
  171. package/ai/tools/jdProductScraperTool.ts +821 -0
  172. package/ai/tools/listUserSpacesTool.ts +113 -0
  173. package/ai/tools/localFilesTool.ts +276 -0
  174. package/ai/tools/marxistsOfflineBook.ts +253 -0
  175. package/ai/tools/modelUsageTools.ts +206 -0
  176. package/ai/tools/noloWorkspaceReadTools.ts +467 -0
  177. package/ai/tools/olmOcrTool.ts +33 -0
  178. package/ai/tools/openaiImageTool.ts +267 -0
  179. package/ai/tools/prepareTools.ts +23 -0
  180. package/ai/tools/readDocTool.ts +88 -0
  181. package/ai/tools/readFileTool.ts +214 -0
  182. package/ai/tools/readTool.ts +194 -0
  183. package/ai/tools/readXPostTool.ts +229 -0
  184. package/ai/tools/readXhsProfileTool.ts +627 -0
  185. package/ai/tools/rememberMemoryTool.ts +84 -0
  186. package/ai/tools/remotionVideoTool.ts +151 -0
  187. package/ai/tools/searchDialogMessagesTool.ts +222 -0
  188. package/ai/tools/searchWorkspaceTool.ts +259 -0
  189. package/ai/tools/skillFollowup.ts +86 -0
  190. package/ai/tools/surfWeatherTool.ts +169 -0
  191. package/ai/tools/table/addTableRowTool.ts +217 -0
  192. package/ai/tools/table/createTableTool.ts +315 -0
  193. package/ai/tools/table/rowTools.ts +386 -0
  194. package/ai/tools/table/schemaTools.ts +244 -0
  195. package/ai/tools/table/shareTableTool.ts +148 -0
  196. package/ai/tools/table/toolShared.ts +129 -0
  197. package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
  198. package/ai/tools/toolApiClient.ts +279 -0
  199. package/ai/tools/toolResultError.ts +42 -0
  200. package/ai/tools/toolRunSlice.ts +303 -0
  201. package/ai/tools/toolSchemaCompatibility.ts +53 -0
  202. package/ai/tools/uiAskChoiceTool.ts +104 -0
  203. package/ai/tools/updateContentTitleTool.ts +84 -0
  204. package/ai/tools/updateDocTool.ts +105 -0
  205. package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
  206. package/ai/tools/wereadGatewayTool.ts +152 -0
  207. package/ai/tools/whisperTool.ts +76 -0
  208. package/ai/tools/writeFileTool.ts +213 -0
  209. package/ai/tools/youtubeScraperTool.ts +116 -0
  210. package/ai/tools/ziweiChartTool.ts +678 -0
  211. package/ai/types.ts +55 -0
  212. package/ai/workflow/workflowExecutor.ts +323 -0
  213. package/ai/workflow/workflowSlice.ts +73 -0
  214. package/ai/workflow/workflowTypes.ts +106 -0
  215. package/app/actions/syncAppRecord.ts +73 -0
  216. package/app/constants/animationSets.ts +21 -0
  217. package/app/constants/appEditor.ts +99 -0
  218. package/app/favorite/favoriteSlice.ts +690 -0
  219. package/app/favorite/type.ts +43 -0
  220. package/app/hooks/deleteDbKey.ts +233 -0
  221. package/app/i18n/client.ts +13 -0
  222. package/app/i18n/i18n.base.ts +14 -0
  223. package/app/i18n/i18n.config.ts +77 -0
  224. package/app/i18n/index.ts +15 -0
  225. package/app/i18n/mapLanguage.ts +11 -0
  226. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  227. package/app/i18n/translations/error.locale.ts +246 -0
  228. package/app/i18n/translations/interface.locale.ts +2174 -0
  229. package/app/i18n/translations/pricing.locale.ts +397 -0
  230. package/app/i18n/translations/privacy.locale.ts +168 -0
  231. package/app/i18n/translations/seo.locale.ts +129 -0
  232. package/app/i18n/translations/terms.locale.ts +124 -0
  233. package/app/i18n/types.ts +6 -0
  234. package/app/notifications/model.ts +77 -0
  235. package/app/notifications/notificationSlice.ts +141 -0
  236. package/app/reducer.ts +36 -0
  237. package/app/settings/dbActionThunks.ts +34 -0
  238. package/app/settings/defaultSpacePreference.ts +87 -0
  239. package/app/settings/settingSlice.tsx +1212 -0
  240. package/app/settings/settingsRecord.ts +8 -0
  241. package/app/stateViews/runtime.ts +90 -0
  242. package/app/store.ts +55 -0
  243. package/app/theme/colors.ts +280 -0
  244. package/app/theme/fontPreference.ts +77 -0
  245. package/app/theme/theme.config.ts +120 -0
  246. package/app/theme/themeModeBootstrap.ts +123 -0
  247. package/app/types/appSummary.ts +114 -0
  248. package/app/types.ts +358 -0
  249. package/app/utils/appKeys.ts +55 -0
  250. package/app/utils/async.ts +28 -0
  251. package/app/utils/desktopAgentRuntimeTurnClient.ts +73 -0
  252. package/app/utils/env.ts +17 -0
  253. package/app/utils/fileUtils.ts +229 -0
  254. package/app/utils/imageUtils.ts +274 -0
  255. package/app/utils/myContentItems.ts +289 -0
  256. package/app/utils/retryAfter.ts +36 -0
  257. package/app/utils/retryFetch.ts +61 -0
  258. package/app/utils/toast.ts +3 -0
  259. package/auth/action/signUpAction.ts +227 -0
  260. package/auth/adminPermissions.ts +18 -0
  261. package/auth/authSlice.ts +531 -0
  262. package/auth/client/loginRequest.ts +14 -0
  263. package/auth/resetAuthScopedClientState.ts +27 -0
  264. package/auth/routes.ts +178 -0
  265. package/auth/token.ts +63 -0
  266. package/auth/types.ts +40 -0
  267. package/chat/chat.locale.ts +813 -0
  268. package/chat/dialog/actions/addCybotAction.ts +52 -0
  269. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  270. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  271. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  272. package/chat/dialog/actions/createDialogAction.ts +379 -0
  273. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  274. package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
  275. package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
  276. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  277. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  278. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  279. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  280. package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
  281. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  282. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  283. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  284. package/chat/dialog/dialogAgents.ts +72 -0
  285. package/chat/dialog/dialogSlice.ts +872 -0
  286. package/chat/dialog/dialogTitle.ts +81 -0
  287. package/chat/dialog/dialogTokenStats.ts +12 -0
  288. package/chat/dialog/dialogUrl.ts +6 -0
  289. package/chat/dialog/goal.ts +108 -0
  290. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  291. package/chat/dialog/schedule.ts +17 -0
  292. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  293. package/chat/messages/fetchConvMsgs.ts +51 -0
  294. package/chat/messages/fileUrl.ts +13 -0
  295. package/chat/messages/messageAgent.ts +8 -0
  296. package/chat/messages/messageContent.ts +199 -0
  297. package/chat/messages/messageContract.ts +88 -0
  298. package/chat/messages/messageSlice.ts +1367 -0
  299. package/chat/messages/toolThunks.ts +625 -0
  300. package/cli/agentAliases.ts +2 -1
  301. package/cli/agentRunCommand.ts +10 -32
  302. package/cli/agentRuntimeLocal.ts +1 -0
  303. package/cli/client/agentRun.ts +67 -95
  304. package/cli/client/localRuntimeAdapter.ts +323 -54
  305. package/cli/commandRegistry.ts +2 -2
  306. package/cli/machineWsRunDispatch.ts +51 -6
  307. package/cli/offlineMarxistsAgentCommand.ts +6 -4
  308. package/client/agentConfigResolver.test.ts +2 -2
  309. package/client/agentRun.test.ts +175 -57
  310. package/client/agentRun.ts +67 -95
  311. package/client/localRuntimeAdapter.test.ts +682 -37
  312. package/client/localRuntimeAdapter.ts +323 -54
  313. package/client/localRuntimeDryRun.test.ts +23 -9
  314. package/client/localToolPolicy.test.ts +4 -4
  315. package/commandRegistry.ts +2 -2
  316. package/core/builtinAgents.ts +209 -0
  317. package/core/config.ts +15 -0
  318. package/core/crypto.ts +51 -0
  319. package/core/generateKeyPairFromSeedV1.ts +15 -0
  320. package/core/generateMainKey.ts +22 -0
  321. package/core/init.ts +41 -0
  322. package/core/localOrigins.ts +8 -0
  323. package/core/password.ts +13 -0
  324. package/core/prefix.ts +23 -0
  325. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  326. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  327. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  328. package/create/editor/transforms/markdownToSlate.ts +24 -0
  329. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  330. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  331. package/create/editor/transforms/slateToText.ts +33 -0
  332. package/create/editor/utils/slateUtils.ts +233 -0
  333. package/create/space/addSpaceAction.ts +193 -0
  334. package/create/space/category/categoryActions.ts +427 -0
  335. package/create/space/changeSpaceAction.ts +36 -0
  336. package/create/space/constants.ts +8 -0
  337. package/create/space/content/addContentAction.ts +116 -0
  338. package/create/space/content/contentThunks.ts +90 -0
  339. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  340. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  341. package/create/space/content/moveContentAction.ts +285 -0
  342. package/create/space/content/updateContentCategoryAction.ts +154 -0
  343. package/create/space/content/updateContentTitleAction.ts +151 -0
  344. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  345. package/create/space/contentKeyUtils.ts +117 -0
  346. package/create/space/deleteSpaceAction.ts +276 -0
  347. package/create/space/fetchSpaceAction.ts +70 -0
  348. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  349. package/create/space/loadDefaultSpaceAction.ts +57 -0
  350. package/create/space/member/addMemberAction.ts +79 -0
  351. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  352. package/create/space/member/memberThunks.ts +47 -0
  353. package/create/space/member/removeMemberAction.ts +67 -0
  354. package/create/space/resolvePreferredSpaceId.ts +113 -0
  355. package/create/space/sidebarVisibleTypes.ts +241 -0
  356. package/create/space/space.locale.ts +1087 -0
  357. package/create/space/spaceAccess.ts +182 -0
  358. package/create/space/spaceCollapsedState.ts +54 -0
  359. package/create/space/spaceKeys.ts +65 -0
  360. package/create/space/spaceSlice.ts +328 -0
  361. package/create/space/spaceThunks.ts +410 -0
  362. package/create/space/types.ts +27 -0
  363. package/create/space/updateSpaceAction.ts +107 -0
  364. package/create/space/utils/permissions.ts +47 -0
  365. package/create/types.ts +21 -0
  366. package/database/actions/agentReadResolution.ts +33 -0
  367. package/database/actions/common.ts +243 -0
  368. package/database/actions/deleteFile.ts +40 -0
  369. package/database/actions/fileContent.ts +125 -0
  370. package/database/actions/patch.ts +155 -0
  371. package/database/actions/read.ts +358 -0
  372. package/database/actions/readAndWait.ts +260 -0
  373. package/database/actions/readRequestManager.ts +120 -0
  374. package/database/actions/readResolution.ts +125 -0
  375. package/database/actions/remove.ts +94 -0
  376. package/database/actions/replication.ts +477 -0
  377. package/database/actions/upload.ts +186 -0
  378. package/database/actions/upsert.ts +56 -0
  379. package/database/actions/write.ts +146 -0
  380. package/database/authority/ownerKey.ts +80 -0
  381. package/database/authority/recordAuthority.ts +67 -0
  382. package/database/authority/userAuthorityRegistry.ts +54 -0
  383. package/database/client/fetchUserData.ts +61 -0
  384. package/database/dbActionThunks.ts +1 -0
  385. package/database/dbSlice.ts +149 -0
  386. package/database/fileRing.ts +51 -0
  387. package/database/fileStorage.ts +232 -0
  388. package/database/fileUrl.ts +34 -0
  389. package/database/keys.ts +767 -0
  390. package/database/queryPrefixes.ts +14 -0
  391. package/database/requests.ts +443 -0
  392. package/database/runtimeServerContext.ts +54 -0
  393. package/database/server/levelAuthorityStore.ts +20 -1
  394. package/database/tenantPlacement.ts +57 -0
  395. package/database/userPreferenceRegister.ts +131 -0
  396. package/database/utils/ulid.ts +1 -0
  397. package/integrations/anthropic/anthropicModels.ts +47 -0
  398. package/integrations/deepseek/models.ts +37 -0
  399. package/integrations/google/models.ts +341 -0
  400. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  401. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  402. package/integrations/openai/flexTier.ts +102 -0
  403. package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
  404. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  405. package/integrations/openai/models.ts +271 -0
  406. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  407. package/integrations/openai/responsesHelpers.ts +297 -0
  408. package/integrations/x-reader/types.ts +109 -0
  409. package/integrations/xai/models.ts +13 -0
  410. package/integrations/xhs-reader/analyze/profileAnalyzer.ts +205 -0
  411. package/integrations/xhs-reader/backends/playwrightProfileCollector.ts +624 -0
  412. package/integrations/xhs-reader/bridge/readXhsProfileWithBridge.ts +227 -0
  413. package/integrations/xhs-reader/client/xhsWebApiClient.ts +229 -0
  414. package/integrations/xhs-reader/normalize.ts +390 -0
  415. package/integrations/xhs-reader/orchestrator.ts +178 -0
  416. package/integrations/xhs-reader/redaction.ts +68 -0
  417. package/integrations/xhs-reader/types.ts +244 -0
  418. package/integrations/xhs-reader/url.ts +57 -0
  419. package/machineWsRunDispatch.ts +51 -6
  420. package/offlineMarxistsAgentCommand.ts +6 -4
  421. package/package.json +430 -3
  422. package/render/page/createPageAction.ts +183 -0
  423. package/render/page/docSlice.ts +468 -0
  424. package/render/page/types.ts +17 -0
  425. package/render/table/createTableAction.ts +270 -0
  426. package/render/table/deleteTableAction.ts +193 -0
  427. package/render/table/fetchAndCacheTableRows.ts +174 -0
  428. package/render/table/tableSlice.ts +1106 -0
  429. package/render/table/toolValueUtils.ts +363 -0
  430. package/render/table/types.ts +252 -0
  431. package/render/table/utils/tableSerialization.ts +50 -0
  432. package/server/handlers/agentRun/types.ts +104 -0
  433. package/share/action.ts +225 -0
  434. package/share/helpers.ts +302 -0
  435. package/share/keys.ts +243 -0
  436. package/share/publicSharePolicy.ts +27 -0
  437. package/share/shareSlice.ts +53 -0
  438. package/share/types.ts +100 -0
@@ -0,0 +1,81 @@
1
+ const GENERATED_DIALOG_TITLE_MAX_CHARS = 36;
2
+ const FALLBACK_DIALOG_TITLE_MAX_CHARS = 24;
3
+
4
+ const WRAPPING_QUOTES_RE = /^[`"'“”‘’「」『』《》]+|[`"'“”‘’「」『』《》]+$/gu;
5
+ const TRAILING_TITLE_PUNCTUATION_RE = /[。!?!?;;,,、::]+$/u;
6
+
7
+ const clip = (text: string, maxChars: number): string =>
8
+ text.length <= maxChars
9
+ ? text
10
+ : `${text.slice(0, maxChars - 1).trimEnd()}…`;
11
+
12
+ const toSingleLine = (value: string): string =>
13
+ value
14
+ .replace(/\r\n?/g, "\n")
15
+ .split("\n")
16
+ .map((line) => line.trim())
17
+ .find(Boolean) ?? "";
18
+
19
+ const stripTitleFormatting = (value: string): string =>
20
+ value
21
+ .replace(/^(?:[-*#>]+\s*|\d+\.\s+)/, "")
22
+ .replace(WRAPPING_QUOTES_RE, "")
23
+ .replace(TRAILING_TITLE_PUNCTUATION_RE, "")
24
+ .trim();
25
+
26
+ const pickLeadingClause = (value: string): string => {
27
+ const firstLine = toSingleLine(value);
28
+ if (!firstLine) return "";
29
+
30
+ const separatorIndexes = [firstLine.indexOf(":"), firstLine.indexOf(":")]
31
+ .filter((index) => index > 0)
32
+ .sort((left, right) => left - right);
33
+
34
+ for (const index of separatorIndexes) {
35
+ const clause = firstLine.slice(0, index).trim();
36
+ if (clause.length >= 4) return clause;
37
+ }
38
+
39
+ return firstLine;
40
+ };
41
+
42
+ export const normalizeDialogTitle = (
43
+ rawTitle: unknown,
44
+ maxChars = GENERATED_DIALOG_TITLE_MAX_CHARS
45
+ ): string => {
46
+ if (typeof rawTitle !== "string") return "";
47
+
48
+ const normalized = stripTitleFormatting(
49
+ toSingleLine(rawTitle).replace(/\s+/g, " ").trim()
50
+ );
51
+ if (!normalized) return "";
52
+
53
+ return clip(normalized, maxChars);
54
+ };
55
+
56
+ export const buildDialogFallbackTitleFromUserInput = (
57
+ userInput: unknown,
58
+ maxChars = FALLBACK_DIALOG_TITLE_MAX_CHARS
59
+ ): string => {
60
+ if (typeof userInput !== "string") return "";
61
+
62
+ const candidate = pickLeadingClause(userInput);
63
+ return normalizeDialogTitle(candidate || userInput, maxChars);
64
+ };
65
+
66
+ export const buildDialogFallbackTitleFromMessages = (
67
+ messages: Array<{ role?: unknown; content?: unknown }>
68
+ ): string => {
69
+ for (const message of messages) {
70
+ if (message?.role !== "user") continue;
71
+ const title = buildDialogFallbackTitleFromUserInput(message?.content);
72
+ if (title) return title;
73
+ }
74
+
75
+ return "";
76
+ };
77
+
78
+ export const resolveDialogTitle = (
79
+ generatedTitle: unknown,
80
+ fallbackTitle: string
81
+ ): string => normalizeDialogTitle(generatedTitle) || fallbackTitle.trim();
@@ -0,0 +1,12 @@
1
+ import type { DialogConfig } from "../../app/types";
2
+
3
+ import type { TokenStats } from "./dialogSlice";
4
+
5
+ export const mergeDialogTokenStats = (
6
+ dialogConfig: DialogConfig | null,
7
+ runtimeTokens: TokenStats
8
+ ): TokenStats => ({
9
+ inputTokens: (dialogConfig?.inputTokens ?? 0) + runtimeTokens.inputTokens,
10
+ outputTokens: (dialogConfig?.outputTokens ?? 0) + runtimeTokens.outputTokens,
11
+ totalCost: (dialogConfig?.totalCost ?? 0) + runtimeTokens.totalCost,
12
+ });
@@ -0,0 +1,6 @@
1
+ import { buildScopedPagePath } from "../../create/space/contentKeyUtils";
2
+
3
+ export const buildDialogUrl = (
4
+ dialogKey: string,
5
+ spaceId?: string | null
6
+ ): string => buildScopedPagePath(dialogKey, spaceId);
@@ -0,0 +1,108 @@
1
+ import type { DialogConfig, DialogGoalState } from "../../app/types";
2
+ import type { TokenStats } from "./dialogSlice";
3
+
4
+ export interface CreateDialogGoalInput {
5
+ objective: string;
6
+ tokenBudget?: number;
7
+ now?: number;
8
+ }
9
+
10
+ export interface DialogGoalReport {
11
+ goal: DialogGoalState | null;
12
+ usedTokens: number;
13
+ remainingTokens: number | null;
14
+ completionBudgetReport: string | null;
15
+ }
16
+
17
+ const normalizeObjective = (objective: string): string => {
18
+ const normalized = objective.trim();
19
+ if (!normalized) {
20
+ throw new Error("Dialog goal objective is required.");
21
+ }
22
+ return normalized;
23
+ };
24
+
25
+ const normalizeTokenBudget = (tokenBudget: unknown): number | undefined => {
26
+ if (typeof tokenBudget !== "number") return undefined;
27
+ if (!Number.isFinite(tokenBudget) || tokenBudget <= 0) return undefined;
28
+ return Math.floor(tokenBudget);
29
+ };
30
+
31
+ const getPersistedTokenUsage = (dialog?: DialogConfig | null): number =>
32
+ Math.max(0, dialog?.inputTokens ?? 0) + Math.max(0, dialog?.outputTokens ?? 0);
33
+
34
+ const getRuntimeTokenUsage = (runtimeTokens?: TokenStats | null): number =>
35
+ Math.max(0, runtimeTokens?.inputTokens ?? 0) +
36
+ Math.max(0, runtimeTokens?.outputTokens ?? 0);
37
+
38
+ export const buildDialogGoal = (
39
+ input: CreateDialogGoalInput
40
+ ): DialogGoalState => {
41
+ const tokenBudget = normalizeTokenBudget(input.tokenBudget);
42
+ return {
43
+ objective: normalizeObjective(input.objective),
44
+ status: "active",
45
+ ...(tokenBudget ? { tokenBudget } : {}),
46
+ createdAt: input.now ?? Date.now(),
47
+ };
48
+ };
49
+
50
+ export const createDialogGoal = (
51
+ dialog: DialogConfig,
52
+ input: CreateDialogGoalInput
53
+ ): DialogConfig => {
54
+ return {
55
+ ...dialog,
56
+ goal: buildDialogGoal(input),
57
+ };
58
+ };
59
+
60
+ export const completeDialogGoal = (
61
+ dialog: DialogConfig,
62
+ now = Date.now()
63
+ ): DialogConfig => {
64
+ if (!dialog.goal) return dialog;
65
+ return {
66
+ ...dialog,
67
+ goal: {
68
+ ...dialog.goal,
69
+ status: "complete",
70
+ completedAt: now,
71
+ },
72
+ };
73
+ };
74
+
75
+ export const getDialogGoalReport = (
76
+ dialog?: DialogConfig | null,
77
+ runtimeTokens?: TokenStats | null,
78
+ runtimeGoal?: DialogGoalState | null
79
+ ): DialogGoalReport => {
80
+ const goal = runtimeGoal ?? dialog?.goal ?? null;
81
+ const usedTokens = getPersistedTokenUsage(dialog) + getRuntimeTokenUsage(runtimeTokens);
82
+
83
+ if (!goal) {
84
+ return {
85
+ goal: null,
86
+ usedTokens,
87
+ remainingTokens: null,
88
+ completionBudgetReport: null,
89
+ };
90
+ }
91
+
92
+ if (typeof goal.tokenBudget !== "number") {
93
+ return {
94
+ goal,
95
+ usedTokens,
96
+ remainingTokens: null,
97
+ completionBudgetReport: `Goal is ${goal.status}. Used ${usedTokens} tokens. No token budget set.`,
98
+ };
99
+ }
100
+
101
+ const remainingTokens = Math.max(0, goal.tokenBudget - usedTokens);
102
+ return {
103
+ goal,
104
+ usedTokens,
105
+ remainingTokens,
106
+ completionBudgetReport: `Goal is ${goal.status}. Used ${usedTokens} / ${goal.tokenBudget} tokens, ${remainingTokens} remaining.`,
107
+ };
108
+ };
@@ -0,0 +1,286 @@
1
+ import type { Agent } from "../../app/types";
2
+ import type { AgentRuntimeOptions } from "../../ai/agent/types";
3
+ import { FIREWORKS_KIMI_LATEST_MODEL } from "../../ai/llm/kimi";
4
+ import { DataType } from "../../create/types";
5
+ import { createAgentKey } from "../../database/keys";
6
+ import { APP_BUILDER_PUBLIC_AGENT_KEY } from "../../app/constants/appEditor";
7
+
8
+ export type ObjectAssistantKind = "page" | "table" | "app" | "image" | "file";
9
+ export type BuiltinObjectAssistantKind = Exclude<ObjectAssistantKind, "app">;
10
+
11
+ export const OBJECT_ASSISTANT_SIDEBAR_PREFIX = "objectAssistant";
12
+
13
+ export const BUILTIN_OBJECT_ASSISTANT_IDS: Record<BuiltinObjectAssistantKind, string> = {
14
+ page: "builtin-doc-assistant-v1",
15
+ table: "builtin-table-assistant-v1",
16
+ image: "builtin-image-assistant-v1",
17
+ file: "builtin-file-assistant-v1",
18
+ };
19
+
20
+ type ObjectAssistantUiConfig = {
21
+ panelTitle: string;
22
+ activePanelTitle: string;
23
+ chatSubtitle: string;
24
+ loginMessage: string;
25
+ emptyMessage: string;
26
+ };
27
+
28
+ const OBJECT_ASSISTANT_UI: Record<ObjectAssistantKind, ObjectAssistantUiConfig> = {
29
+ app: {
30
+ panelTitle: "应用助手",
31
+ activePanelTitle: "应用助手",
32
+ chatSubtitle: "围绕当前应用继续迭代、预检与重新部署",
33
+ loginMessage: "登录后可在侧边栏使用助手继续修改当前应用",
34
+ emptyMessage: "还没有收藏 AI 助手,先去 AI 广场逛逛吧",
35
+ },
36
+ page: {
37
+ panelTitle: "文档助手",
38
+ activePanelTitle: "文档助手",
39
+ chatSubtitle: "帮你润色、改写、排版和扩展当前文档",
40
+ loginMessage: "登录后可在侧边栏使用文档助手",
41
+ emptyMessage: "文档助手暂时不可用,请稍后重试",
42
+ },
43
+ table: {
44
+ panelTitle: "表格助手",
45
+ activePanelTitle: "表格助手",
46
+ chatSubtitle: "帮你理解当前表、补数据、改数据和整理结构",
47
+ loginMessage: "登录后可在侧边栏使用表格助手",
48
+ emptyMessage: "表格助手暂时不可用,请稍后重试",
49
+ },
50
+ image: {
51
+ panelTitle: "图片助手",
52
+ activePanelTitle: "图片助手",
53
+ chatSubtitle: "先做图片分析与整理占位,后面可继续增强",
54
+ loginMessage: "登录后可在侧边栏使用图片助手",
55
+ emptyMessage: "图片助手暂时不可用,请稍后重试",
56
+ },
57
+ file: {
58
+ panelTitle: "文件助手",
59
+ activePanelTitle: "文件助手",
60
+ chatSubtitle: "先做文件理解与处理建议占位,后面可继续增强",
61
+ loginMessage: "登录后可在侧边栏使用文件助手",
62
+ emptyMessage: "文件助手暂时不可用,请稍后重试",
63
+ },
64
+ };
65
+
66
+ export const getObjectAssistantUiConfig = (kind: ObjectAssistantKind): ObjectAssistantUiConfig =>
67
+ OBJECT_ASSISTANT_UI[kind];
68
+
69
+ export const getPreferredObjectAssistantKey = (
70
+ kind: ObjectAssistantKind,
71
+ userId?: string | null,
72
+ ): string[] => {
73
+ if (kind === "app") return [APP_BUILDER_PUBLIC_AGENT_KEY];
74
+ if (!userId) return [];
75
+ return [createAgentKey.private(userId, BUILTIN_OBJECT_ASSISTANT_IDS[kind])];
76
+ };
77
+
78
+ export const buildObjectAssistantSidebarId = (
79
+ kind: ObjectAssistantKind,
80
+ contentKey?: string | null,
81
+ ) => `${OBJECT_ASSISTANT_SIDEBAR_PREFIX}:${kind}:${contentKey ?? "current"}`;
82
+
83
+ export const isObjectAssistantSidebarId = (id?: string | null) =>
84
+ typeof id === "string" && id.startsWith(`${OBJECT_ASSISTANT_SIDEBAR_PREFIX}:`);
85
+
86
+ export const resolveBuiltinObjectAssistantKindByKey = (
87
+ agentKey?: string | null,
88
+ userId?: string | null,
89
+ ): BuiltinObjectAssistantKind | null => {
90
+ if (!agentKey || !userId) return null;
91
+
92
+ const entries = Object.entries(BUILTIN_OBJECT_ASSISTANT_IDS) as Array<
93
+ [BuiltinObjectAssistantKind, string]
94
+ >;
95
+
96
+ for (const [kind, id] of entries) {
97
+ if (agentKey === createAgentKey.private(userId, id)) {
98
+ return kind;
99
+ }
100
+ }
101
+
102
+ return null;
103
+ };
104
+
105
+ export const buildBuiltinObjectAssistantAgent = (
106
+ kind: BuiltinObjectAssistantKind,
107
+ userId: string,
108
+ ): Agent & { dbKey: string } => {
109
+ const id = BUILTIN_OBJECT_ASSISTANT_IDS[kind];
110
+ const dbKey = createAgentKey.private(userId, id);
111
+ const now = Date.now();
112
+
113
+ const common = {
114
+ id,
115
+ dbKey,
116
+ type: DataType.AGENT,
117
+ userId,
118
+ isPublic: false,
119
+ provider: "fireworks",
120
+ model: FIREWORKS_KIMI_LATEST_MODEL,
121
+ apiSource: "platform" as const,
122
+ useServerProxy: true,
123
+ inputPrice: 0.95 * 8,
124
+ outputPrice: 4 * 8,
125
+ createdAt: now,
126
+ updatedAt: now,
127
+ dialogCount: 0,
128
+ messageCount: 0,
129
+ tokenCount: 0,
130
+ tags: ["builtin", "sidebar-assistant", kind],
131
+ };
132
+
133
+ switch (kind) {
134
+ case "page":
135
+ return {
136
+ ...common,
137
+ name: "文档助手",
138
+ introduction: "帮你润色、改写、续写、整理结构与排版的文档助手。",
139
+ greeting: {
140
+ text:
141
+ "你好,我是文档助手 ✍️\n\n你可以直接对我说:\n• 帮我润色这篇文章\n• 把结构整理得更清楚\n• 给这一段改成更口语/更专业\n• 帮我补一个开头或结尾",
142
+ menu: [
143
+ { id: "polish", label: "润色当前文档", userMessage: "帮我润色当前文档,让表达更顺" },
144
+ { id: "structure", label: "整理结构", userMessage: "帮我整理当前文档结构,看看标题和段落怎么更清楚" },
145
+ { id: "continue", label: "继续写", userMessage: "基于当前文档继续往下写" },
146
+ ],
147
+ },
148
+ tools: ["readDoc", "updateDoc"],
149
+ prompt:
150
+ "你是一个文档编辑助手。优先基于当前文档做增量修改,不要脱离现有内容空想重写。重点帮助用户润色、改写、续写、重组结构、生成标题和摘要。涉及修改时,优先读取当前文档真值,再进行定点编辑。",
151
+ };
152
+ case "table":
153
+ return {
154
+ ...common,
155
+ name: "表格助手",
156
+ introduction: "帮你理解表结构、补数据、改数据和整理字段的表格助手。",
157
+ greeting: {
158
+ text:
159
+ "你好,我是表格助手 📊\n\n你可以直接对我说:\n• 帮我看看这张表还缺什么字段\n• 给表里加一条记录\n• 把某一列统一改一下\n• 按这个条件帮我整理数据",
160
+ menu: [
161
+ { id: "inspect", label: "看看这张表", userMessage: "帮我看看当前这张表的结构和可改进点" },
162
+ { id: "add-row", label: "新增数据", userMessage: "我想往当前表里新增一条数据" },
163
+ { id: "fix-data", label: "批量改数据", userMessage: "我想修改当前表里的部分数据" },
164
+ ],
165
+ },
166
+ tools: [
167
+ "createTable",
168
+ "addTableRow",
169
+ "addTableRows",
170
+ "queryTableRows",
171
+ "updateTableRow",
172
+ "deleteTableRow",
173
+ ],
174
+ prompt:
175
+ "你是一个表格编辑助手。优先帮助用户理解当前表的字段、记录和结构,然后再做新增、查询、更新或删除。对用户说“这个表里的 xxx 怎么怎么改”时,默认理解为当前聚焦或最近提到的表;必要时先确认目标行/字段。",
176
+ };
177
+ case "image":
178
+ return {
179
+ ...common,
180
+ name: "图片助手",
181
+ introduction: "当前先作为图片分析与处理建议入口,后续可扩展为更完整的图片工作流助手。",
182
+ greeting:
183
+ "你好,我是图片助手 🖼️\n\n目前我可以先帮你分析图片内容、提炼重点、给出命名/整理建议。后续我们再把更深的图片编辑工作流接上。",
184
+ tools: [],
185
+ prompt:
186
+ "你是一个图片助手。当前阶段重点是围绕当前图片做理解、描述、整理建议和后续处理建议。不要假装已经具备复杂图片编辑能力;如果用户要更强操作,明确说明当前可做的是分析与组织。",
187
+ };
188
+ case "file":
189
+ return {
190
+ ...common,
191
+ name: "文件助手",
192
+ introduction: "当前先作为文件理解与处理建议入口,后续可扩展为更完整的文件工作流助手。",
193
+ greeting:
194
+ "你好,我是文件助手 📎\n\n目前我可以先帮你理解这个文件适合怎么处理、怎么提取信息、下一步应该做什么。后续我们再把更完整的文件处理流程接上。",
195
+ tools: [],
196
+ prompt:
197
+ "你是一个文件助手。当前阶段重点是围绕当前文件提供理解、整理、提取与后续处理建议。不要假装已经完成文件内容解析;必要时明确告诉用户当前更多是占位型工作流入口。",
198
+ };
199
+ }
200
+ };
201
+
202
+ export const buildBuiltinObjectAssistantAgentFromKey = (
203
+ agentKey?: string | null,
204
+ userId?: string | null,
205
+ ): (Agent & { dbKey: string }) | null => {
206
+ const kind = resolveBuiltinObjectAssistantKindByKey(agentKey, userId);
207
+ if (!kind || !userId) return null;
208
+ return buildBuiltinObjectAssistantAgent(kind, userId);
209
+ };
210
+
211
+ type RuntimeArgs = {
212
+ kind: ObjectAssistantKind;
213
+ contentKey?: string | null;
214
+ title?: string | null;
215
+ summary?: string | null;
216
+ metadata?: Record<string, unknown>;
217
+ };
218
+
219
+ export const buildObjectAssistantRuntimeOptions = (
220
+ args: RuntimeArgs,
221
+ ): AgentRuntimeOptions => {
222
+ const { kind, contentKey, title, summary, metadata = {} } = args;
223
+
224
+ if (kind === "app") {
225
+ return {
226
+ extraTools: ["appRead", "appPreflight", "appDeploy", "openAIGptImage"],
227
+ editingTarget: {
228
+ kind: "app",
229
+ key: contentKey ?? undefined,
230
+ title: title ?? undefined,
231
+ summary: summary ?? "当前应用可通过 AI 继续修改与重新部署,请围绕已有实现做增量迭代。",
232
+ metadata,
233
+ },
234
+ };
235
+ }
236
+
237
+ if (kind === "table") {
238
+ return {
239
+ extraTools: [
240
+ "addTableRow",
241
+ "addTableRows",
242
+ "queryTableRows",
243
+ "updateTableRow",
244
+ "deleteTableRow",
245
+ ],
246
+ editingTarget: {
247
+ kind: "table",
248
+ key: contentKey ?? undefined,
249
+ title: title ?? undefined,
250
+ summary:
251
+ summary ??
252
+ "当前对象是一张数据表。优先帮助用户理解字段、记录和结构,再做新增或修改。",
253
+ metadata,
254
+ },
255
+ };
256
+ }
257
+
258
+ if (kind === "page") {
259
+ return {
260
+ extraTools: ["readDoc", "updateDoc"],
261
+ editingTarget: {
262
+ kind: "page",
263
+ key: contentKey ?? undefined,
264
+ title: title ?? undefined,
265
+ summary:
266
+ summary ??
267
+ "当前对象是一篇文档。优先围绕现有内容做润色、改写、续写、重组和排版建议。",
268
+ metadata,
269
+ },
270
+ };
271
+ }
272
+
273
+ return {
274
+ editingTarget: {
275
+ kind,
276
+ key: contentKey ?? undefined,
277
+ title: title ?? undefined,
278
+ summary:
279
+ summary ??
280
+ (kind === "image"
281
+ ? "当前对象是一张图片,当前阶段优先做理解、描述和整理建议。"
282
+ : "当前对象是一个文件,当前阶段优先做理解、整理和处理建议。"),
283
+ metadata,
284
+ },
285
+ };
286
+ };
@@ -0,0 +1,17 @@
1
+ import { Cron } from "croner";
2
+
3
+ export function computeNextScheduledAt(
4
+ schedule: string | null | undefined,
5
+ now = Date.now(),
6
+ ): number | null {
7
+ const normalizedSchedule = typeof schedule === "string" ? schedule.trim() : "";
8
+ if (!normalizedSchedule) return null;
9
+
10
+ try {
11
+ const cron = new Cron(normalizedSchedule);
12
+ return cron.nextRuns(1, new Date(now))[0]?.getTime() ?? null;
13
+ } catch {
14
+ return null;
15
+ }
16
+ }
17
+
@@ -0,0 +1,119 @@
1
+ import { Message } from "./types";
2
+ import { fetchMessages as fetchLocalMessages } from "./fetchMessages";
3
+ import { fetchConvMsgs } from "./fetchConvMsgs";
4
+ import { swallowNonAbortError } from "../../app/utils/async";
5
+ import { createKey } from "../../database/keys";
6
+ import { DataType } from "../../create/types";
7
+ import { isTombstoneRecord, shouldReplaceWithNextRecord } from "../../database/tombstones";
8
+
9
+ type MessageRecord = Message & { deletedAt?: string };
10
+
11
+ interface FetchAndCacheOptions {
12
+ db: any; // Local LevelDB instance
13
+ dialogId: string;
14
+ dialogKey?: string;
15
+ limit?: number;
16
+ beforeKey?: string;
17
+ token?: string | null;
18
+ remoteServers?: string[];
19
+ signal?: AbortSignal;
20
+ }
21
+
22
+ export const fetchAndCacheMessages = async ({
23
+ db,
24
+ dialogId,
25
+ dialogKey,
26
+ limit = 50,
27
+ beforeKey,
28
+ token,
29
+ remoteServers = [],
30
+ signal,
31
+ }: FetchAndCacheOptions): Promise<Message[]> => {
32
+ // 1. 本地查询
33
+ const localPromise = fetchLocalMessages(db, dialogId, {
34
+ limit,
35
+ beforeKey,
36
+ throwOnError: false,
37
+ includeDeleted: true,
38
+ }).catch(() => [] as MessageRecord[]);
39
+
40
+ // 2. 远程查询
41
+ const remotePromise = (async () => {
42
+ if (!token || remoteServers.length === 0) return [] as MessageRecord[];
43
+
44
+ const results = await Promise.all(
45
+ remoteServers.map((server) =>
46
+ swallowNonAbortError(
47
+ fetchConvMsgs(
48
+ server,
49
+ token,
50
+ { dialogId, dialogKey, limit, beforeKey },
51
+ { signal }
52
+ ),
53
+ [] as MessageRecord[],
54
+ undefined
55
+ )
56
+ )
57
+ );
58
+ return results.flat() as MessageRecord[];
59
+ })();
60
+
61
+ const [localMsgs, remoteMsgs] = await Promise.all([
62
+ localPromise,
63
+ remotePromise,
64
+ ]);
65
+
66
+ const uniqueMap = new Map<string, MessageRecord>();
67
+
68
+ // 先放入本地消息
69
+ localMsgs.forEach((m) => uniqueMap.set(m.id, m));
70
+
71
+ const changedMessagesToCache = new Map<string, MessageRecord>();
72
+
73
+ // 4. 合并远程消息,并标记需要缓存的新消息
74
+ remoteMsgs.forEach((m) => {
75
+ if (!m || !m.id) return;
76
+
77
+ const existing = uniqueMap.get(m.id);
78
+ if (!existing || shouldReplaceWithNextRecord(m, existing)) {
79
+ uniqueMap.set(m.id, m);
80
+ changedMessagesToCache.set(m.id, m);
81
+ }
82
+ });
83
+
84
+ // 5. 将缺失的消息回写到本地 DB
85
+ if (changedMessagesToCache.size > 0) {
86
+ try {
87
+ const ops = Array.from(changedMessagesToCache.values()).map((msg) => {
88
+ let key = msg.dbKey || (msg as any)._key;
89
+
90
+ if (!key) {
91
+ key = createKey(DataType.DIALOG, dialogId, "msg", msg.id);
92
+ }
93
+
94
+ return {
95
+ type: "put",
96
+ key,
97
+ value: {
98
+ ...msg,
99
+ dbKey: key,
100
+ type: DataType.MSG,
101
+ },
102
+ };
103
+ });
104
+
105
+ await db.batch(ops);
106
+ } catch (_error) {
107
+ // Silently ignore cache write errors
108
+ }
109
+ }
110
+
111
+ // 6. 排序并返回
112
+ return Array.from(uniqueMap.values())
113
+ .filter((message) => !isTombstoneRecord(message))
114
+ .sort((a, b) => {
115
+ const tA = new Date((a as any).createdAt || 0).getTime();
116
+ const tB = new Date((b as any).createdAt || 0).getTime();
117
+ return tB - tA; // 降序 (Newest First)
118
+ });
119
+ };
@@ -0,0 +1,51 @@
1
+ const FETCH_TIMEOUT = 5000;
2
+
3
+ export const fetchConvMsgs = async (
4
+ server,
5
+ token,
6
+ { dialogId, dialogKey, limit, beforeKey },
7
+ options = {}
8
+ ) => {
9
+ const { signal: externalSignal } = options;
10
+
11
+ const controller = new AbortController();
12
+ const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
13
+ const onExternalAbort = () => controller.abort();
14
+ externalSignal?.addEventListener("abort", onExternalAbort);
15
+
16
+ try {
17
+ const response = await fetch(`${server}/rpc/getConvMsgs`, {
18
+ method: "POST",
19
+ headers: {
20
+ Authorization: `Bearer ${token}`,
21
+ "Content-Type": "application/json",
22
+ },
23
+ body: JSON.stringify({
24
+ dialogId,
25
+ ...(dialogKey && { dialogKey }),
26
+ limit,
27
+ ...(beforeKey && { beforeKey }),
28
+ }),
29
+ signal: controller.signal,
30
+ });
31
+ clearTimeout(timeoutId);
32
+ externalSignal?.removeEventListener("abort", onExternalAbort);
33
+
34
+ if (!response.ok) {
35
+ console.error(`fetchConvMsgs: Failed ${response.status} from ${server}`);
36
+ return [];
37
+ }
38
+
39
+ const data = await response.json();
40
+ return Array.isArray(data) ? data : [];
41
+ } catch (error) {
42
+ clearTimeout(timeoutId);
43
+ externalSignal?.removeEventListener("abort", onExternalAbort);
44
+ // Only re-throw when external signal was aborted (user navigated away)
45
+ if (externalSignal?.aborted) {
46
+ throw error;
47
+ }
48
+ console.error(`fetchConvMsgs: Error fetching from ${server}:`, error);
49
+ return [];
50
+ }
51
+ };
@@ -0,0 +1,13 @@
1
+ import {
2
+ buildDatabaseFileContentUrl,
3
+ isLocalDatabaseFileContentUrl,
4
+ } from "../../database/fileUrl";
5
+
6
+ export const buildMessageFileContentUrl = (
7
+ serverOrigin: string | undefined | null,
8
+ fileId: string | undefined | null
9
+ ): string | null => buildDatabaseFileContentUrl(serverOrigin, fileId);
10
+
11
+ export const isLocalFileContentUrl = (
12
+ url: string | null | undefined
13
+ ): boolean => isLocalDatabaseFileContentUrl(url);