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,313 @@
1
+ // ai/llm/providers.ts
2
+ import { anthropicModels } from "../../integrations/anthropic/anthropicModels";
3
+ import { deepSeekModels } from "../../integrations/deepseek/models";
4
+ import { googleModels } from "../../integrations/google/models";
5
+ import { openAIModels } from "../../integrations/openai/models";
6
+ import { openrouterModels } from "../llm/openrouterModels";
7
+ import { deepinfraModels } from "../llm/deepinfra";
8
+ // import { xaiModels } from "../../integrations/xai/models";
9
+ import './fireworks'
10
+ import type { Model } from "./types";
11
+ import type { Agent } from "../../app/types";
12
+ import { fireworksModels } from "./fireworks";
13
+ import { mistralModels } from "./mistral";
14
+ import { mimoModels } from "./mimo";
15
+ import type { ModelPrice } from "./types";
16
+ import { FIREWORKS_KIMI_LATEST_MODEL } from "./kimi";
17
+ export { supportedReasoningModels } from "./reasoningModels";
18
+
19
+ /* ──────────────────────────────────────────
20
+ * 所有模型(仅用于功能过滤)
21
+ * ────────────────────────────────────────── */
22
+
23
+ /* ──────────────────────────────────────────
24
+ * Provider → 模型列表
25
+ * ────────────────────────────────────────── */
26
+ const MODEL_MAP = {
27
+ // anthropic: anthropicModels,
28
+ deepseek: deepSeekModels,
29
+ google: googleModels,
30
+ openai: openAIModels,
31
+ deepinfra: deepinfraModels,
32
+ openrouter: openrouterModels,
33
+ fireworks: fireworksModels,
34
+ mistral: mistralModels,
35
+ mimo: mimoModels,
36
+ } as const;
37
+
38
+ const MODEL_LOOKUP_MAP = {
39
+ anthropic: anthropicModels,
40
+ ...MODEL_MAP,
41
+ } as const;
42
+
43
+ type LookupProvider = keyof typeof MODEL_LOOKUP_MAP;
44
+
45
+ type ModelLookupCandidate = Model & {
46
+ id?: string;
47
+ pricing?: ModelPrice;
48
+ supportVision?: boolean;
49
+ supportTool?: boolean;
50
+ supportReasoning?: boolean;
51
+ maxTokens?: number;
52
+ };
53
+
54
+ const ANTHROPIC_MODEL_ALIASES: Record<string, string> = {
55
+ "claude-sonnet-4.6": "claude-3-7-sonnet-latest",
56
+ "claude-sonnet-4.5": "claude-3-5-sonnet-latest",
57
+ };
58
+
59
+ const normalizeLookupProvider = (provider?: string | null): LookupProvider | null => {
60
+ if (!provider) return null;
61
+ const normalized = provider.toLowerCase();
62
+ if (normalized in MODEL_LOOKUP_MAP) {
63
+ return normalized as LookupProvider;
64
+ }
65
+ return null;
66
+ };
67
+
68
+ const normalizeLookupModelName = (
69
+ provider: LookupProvider,
70
+ name: string
71
+ ): string => {
72
+ if (provider === "anthropic") {
73
+ return ANTHROPIC_MODEL_ALIASES[name] ?? name;
74
+ }
75
+ return name;
76
+ };
77
+
78
+ const toModel = (candidate: ModelLookupCandidate): Model => ({
79
+ name:
80
+ typeof candidate.id === "string" && candidate.id.trim()
81
+ ? candidate.id
82
+ : candidate.name,
83
+ displayName:
84
+ candidate.displayName ??
85
+ (typeof candidate.id === "string" && candidate.id !== candidate.name
86
+ ? candidate.name
87
+ : undefined),
88
+ hasVision:
89
+ typeof candidate.hasVision === "boolean"
90
+ ? candidate.hasVision
91
+ : !!candidate.supportVision,
92
+ contextWindow: candidate.contextWindow,
93
+ price: candidate.price ?? candidate.pricing ?? { input: 0, output: 0 },
94
+ pricingStrategy: candidate.pricingStrategy,
95
+ serviceTierPriceMultipliers: candidate.serviceTierPriceMultipliers,
96
+ maxOutputTokens: candidate.maxOutputTokens ?? candidate.maxTokens,
97
+ jsonOutput: candidate.jsonOutput,
98
+ fnCall:
99
+ typeof candidate.fnCall === "boolean"
100
+ ? candidate.fnCall
101
+ : candidate.supportTool,
102
+ provider: candidate.provider,
103
+ description: candidate.description,
104
+ hasAudio: candidate.hasAudio,
105
+ maxImageResolution: candidate.maxImageResolution,
106
+ canFineTune: candidate.canFineTune,
107
+ hasImageOutput: candidate.hasImageOutput,
108
+ supportsImageOutput: candidate.supportsImageOutput,
109
+ supportsTool:
110
+ typeof candidate.supportsTool === "boolean"
111
+ ? candidate.supportsTool
112
+ : candidate.supportTool,
113
+ supportsImageConfig: candidate.supportsImageConfig,
114
+ requiresImageModalities: candidate.requiresImageModalities,
115
+ defaultModalities: candidate.defaultModalities,
116
+ supportedAspectRatios: candidate.supportedAspectRatios,
117
+ supportedImageSizes: candidate.supportedImageSizes,
118
+ pricePerImage: candidate.pricePerImage,
119
+ imagePricingNote: candidate.imagePricingNote,
120
+ imageTokenPricePerMillion: candidate.imageTokenPricePerMillion,
121
+ imageOutputTokenEstimateBySize: candidate.imageOutputTokenEstimateBySize,
122
+ imageGenerationWaitTimeSeconds: candidate.imageGenerationWaitTimeSeconds,
123
+ imageGenerationProfiles: candidate.imageGenerationProfiles,
124
+ supportsReasoningEffort:
125
+ typeof candidate.supportsReasoningEffort === "boolean"
126
+ ? candidate.supportsReasoningEffort
127
+ : candidate.supportReasoning,
128
+ endpointKey: candidate.endpointKey,
129
+ });
130
+
131
+ const findCandidateInProvider = (
132
+ provider: LookupProvider,
133
+ name: string
134
+ ): Model | null => {
135
+ const normalizedName = normalizeLookupModelName(provider, name);
136
+ const list = MODEL_LOOKUP_MAP[provider] as readonly ModelLookupCandidate[];
137
+ const candidate = list.find(
138
+ (item) =>
139
+ item.name === normalizedName ||
140
+ item.displayName === normalizedName ||
141
+ item.id === normalizedName
142
+ );
143
+ return candidate ? toModel(candidate) : null;
144
+ };
145
+
146
+ const findOpenRouterUpstreamModel = (name: string): Model | null => {
147
+ const slash = name.indexOf("/");
148
+ if (slash <= 0) return null;
149
+ const upstreamProvider = normalizeLookupProvider(name.slice(0, slash));
150
+ if (!upstreamProvider) return null;
151
+ const upstreamModelName = name.slice(slash + 1);
152
+ return findCandidateInProvider(upstreamProvider, upstreamModelName);
153
+ };
154
+
155
+ export function findModelConfig(provider: string, name: string): Model | null {
156
+ const normalizedProvider = normalizeLookupProvider(provider);
157
+ if (!normalizedProvider) return null;
158
+
159
+ const direct = findCandidateInProvider(normalizedProvider, name);
160
+ if (direct) return direct;
161
+
162
+ if (normalizedProvider === "openrouter") {
163
+ return findOpenRouterUpstreamModel(name);
164
+ }
165
+
166
+ return null;
167
+ }
168
+
169
+ /* 自动推断 Provider 字面量类型 */
170
+ export const availableProviderOptions = Object.keys(MODEL_MAP) as Array<
171
+ keyof typeof MODEL_MAP
172
+ >;
173
+ export type Provider = (typeof availableProviderOptions)[number];
174
+
175
+ /* ──────────────────────────────────────────
176
+ * Provider → 命名端点
177
+ * 统一用 endpointKey 提高可读性
178
+ * ────────────────────────────────────────── */
179
+ type ProviderEndpointMap = Record<string, string>; // endpointKey → URL
180
+
181
+ const API_ENDPOINTS: Record<string, ProviderEndpointMap> = {
182
+ openai: {
183
+ completions: "https://api.openai.com/v1/chat/completions",
184
+ responses: "https://api.openai.com/v1/responses",
185
+ },
186
+ xai: {
187
+ default: "https://api.x.ai/v1/chat/completions",
188
+ },
189
+ deepseek: {
190
+ default: "https://api.deepseek.com/chat/completions",
191
+ },
192
+ deepinfra: {
193
+ default: "https://api.deepinfra.com/v1/openai/chat/completions",
194
+ },
195
+ mistral: {
196
+ default: "https://api.mistral.ai/v1/chat/completions",
197
+ },
198
+ google: {
199
+ default:
200
+ "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
201
+ },
202
+ openrouter: {
203
+ default: "https://openrouter.ai/api/v1/chat/completions",
204
+ },
205
+ fireworks: {
206
+ default: "https://api.fireworks.ai/inference/v1/chat/completions"
207
+ },
208
+ mimo: {
209
+ default: "https://token-plan-cn.xiaomimimo.com/v1/chat/completions",
210
+ }
211
+ } as const;
212
+
213
+ /* ──────────────────────────────────────────
214
+ * 工具函数
215
+ * ────────────────────────────────────────── */
216
+
217
+ /** 根据 provider & name 获取模型配置 */
218
+ export function getModelConfig(provider: Provider | "anthropic", name: string): Model {
219
+ const model = findModelConfig(provider, name);
220
+ if (!model) {
221
+ throw new Error(`Model ${name} not found for provider ${provider}`);
222
+ }
223
+ return model;
224
+ }
225
+
226
+ /** 获取某 provider 全量模型 */
227
+ export function getModelsByProvider(provider: Provider): Model[] {
228
+ return MODEL_MAP[provider] ?? [];
229
+ }
230
+
231
+ /** 通过模型名反查 provider(跨所有 provider 搜索) */
232
+ export function getProviderByModelName(modelName: string): Provider | undefined {
233
+ for (const [provider, models] of Object.entries(MODEL_MAP)) {
234
+ if (models.some((m) => m.name === modelName)) {
235
+ return provider as Provider;
236
+ }
237
+ }
238
+ return undefined;
239
+ }
240
+
241
+ /** 默认模型配置(provider + model 成对出现,避免分散硬编码) */
242
+ export const DEFAULT_MODEL = {
243
+ provider: "fireworks" as Provider,
244
+ name: FIREWORKS_KIMI_LATEST_MODEL,
245
+ } as const;
246
+
247
+ /** 统一获取 ChatCompletion / Responses 等端点 */
248
+ export function getApiEndpoint(agent: Agent): string {
249
+ const { provider, customProviderUrl, endpointKey, model } = agent;
250
+ const effectiveProvider = provider;
251
+ const effectiveModel = model;
252
+
253
+ // CLI agents don't use HTTP API endpoints - should never reach here
254
+ if ((agent as any).apiSource === "cli") {
255
+ throw new Error(
256
+ "Routing error: CLI agent should not call getApiEndpoint. Check streamAgentChatTurn."
257
+ );
258
+ }
259
+
260
+ /* 手动覆盖:有自定义 URL 时直接用,但对只填了 base URL 的情况做兜底补全 */
261
+ if (customProviderUrl) {
262
+ const url = customProviderUrl.trim().replace(/\/$/, ""); // 去掉末尾斜杠
263
+ // 如果 URL 末尾是 /v1 /v2 /v1beta /v3 等版本路径(典型 base URL),
264
+ // 说明用户可能漏填了 /chat/completions,自动补全
265
+ if (/\/v\d+(beta\d*)?$/.test(url)) {
266
+ return `${url}/chat/completions`;
267
+ }
268
+ return url;
269
+ }
270
+
271
+ /* custom provider / apiSource=custom 但未给 URL 的兜底
272
+ * 注意:apiSource="custom" 的 agent 不需要 provider 字段,
273
+ * 使用 customProviderUrl + 自己的 apiKey,上面已经 return 了。
274
+ * 只有 customProviderUrl 为空时才会走到这里报错。
275
+ */
276
+ if (
277
+ !effectiveProvider ||
278
+ effectiveProvider.toLowerCase() === "custom" ||
279
+ (agent as any).apiSource === "custom"
280
+ ) {
281
+ if (agent.useServerProxy) {
282
+ return "";
283
+ }
284
+ throw new Error(
285
+ "Custom provider URL is required when apiSource is 'custom'."
286
+ );
287
+ }
288
+
289
+ /* Provider 端点表 */
290
+ const endpoints = API_ENDPOINTS[effectiveProvider];
291
+ if (!endpoints) throw new Error(`Unsupported provider: ${provider}`);
292
+
293
+ /* 1. Agent 显式 endpointKey 优先 */
294
+ let key = endpointKey;
295
+
296
+ /* 2. 未指定时,读取模型默认 endpointKey */
297
+ if (!key && effectiveModel) {
298
+ try {
299
+ key = getModelConfig(effectiveProvider as Provider, effectiveModel).endpointKey;
300
+ } catch {
301
+ /* ignore */
302
+ }
303
+ }
304
+
305
+ /* 3. 取 URL 顺序:指定 key → default → 第一个 */
306
+ if (key && endpoints[key]) return endpoints[key];
307
+ if (endpoints.default) return endpoints.default;
308
+
309
+ const first = Object.values(endpoints)[0];
310
+ if (first) return first;
311
+
312
+ throw new Error(`No endpoint found for provider ${provider}`);
313
+ }
@@ -0,0 +1,27 @@
1
+ const REASONING_MODEL_NAMES = new Set([
2
+ "deepseek-v4-flash",
3
+ "deepseek-v4-pro",
4
+ "gemini-2.5-pro",
5
+ "gemini-3.5-flash",
6
+ "gemini-3-flash-preview",
7
+ "gemini-3-pro-preview",
8
+ "gemini-3.1-pro-preview",
9
+ "gpt-5.5",
10
+ "gpt-5.5-flex",
11
+ "gpt-5.5-pro",
12
+ "gpt-5.5-pro-flex",
13
+ "gpt-5.4",
14
+ "gpt-5.4-flex",
15
+ "gpt-5.4-mini",
16
+ "gpt-5.4-nano",
17
+ "gpt-5.4-pro",
18
+ "gpt-5.4-pro-flex",
19
+ "gpt-5",
20
+ "gpt-5-mini",
21
+ "o3-pro",
22
+ ]);
23
+
24
+ export const isModelSupportReasoningEffort = (model: string): boolean =>
25
+ REASONING_MODEL_NAMES.has(model);
26
+
27
+ export const supportedReasoningModels = Array.from(REASONING_MODEL_NAMES);
@@ -0,0 +1,82 @@
1
+ // ai/llm/types.ts
2
+
3
+ export interface ModelPrice {
4
+ input: number;
5
+ output: number;
6
+ cachingWrite?: number;
7
+ cachingRead?: number;
8
+ inputCacheHit?: number; // 为DeepSeek模型保留
9
+ }
10
+
11
+ // 新增:定价阶梯定义
12
+ export interface PricingTier {
13
+ minContext: number; // 触发此价格的最小 Token 数 (例如 200001)
14
+ price: ModelPrice; // 此阶梯对应的完整价格表
15
+ }
16
+
17
+ // 新增:定价策略定义
18
+ export interface PricingStrategy {
19
+ type: "tiered_context"; // 目前支持基于上下文长度的阶梯定价
20
+ tiers: PricingTier[];
21
+ }
22
+
23
+ export interface ServiceTierPriceMultiplier {
24
+ inputOutput: number;
25
+ cache?: number;
26
+ }
27
+
28
+ export interface ImageGenerationWaitTimeSeconds {
29
+ min: number;
30
+ max: number;
31
+ }
32
+
33
+ export interface ImageGenerationProfile {
34
+ key: "speed" | "quality";
35
+ label: string;
36
+ imageModel: string;
37
+ description?: string;
38
+ waitTimeSeconds?: ImageGenerationWaitTimeSeconds;
39
+ }
40
+
41
+ export interface Model {
42
+ name: string;
43
+ displayName?: string; // 可选的 displayName 字段
44
+ hasVision: boolean;
45
+ contextWindow?: any; // 建议改为 number,但保持你原有的 any 兼容
46
+ price: ModelPrice; // 基础/默认价格
47
+
48
+ // 新增字段:支持高级定价策略
49
+ pricingStrategy?: PricingStrategy;
50
+ serviceTierPriceMultipliers?: Partial<
51
+ Record<"batch" | "flex" | "priority", ServiceTierPriceMultiplier>
52
+ >;
53
+
54
+ maxOutputTokens?: any; // 最大输出令牌数,建议改为 number
55
+ jsonOutput?: boolean; // 是否支持 JSON 结构化输出
56
+ fnCall?: boolean; // 是否支持函数调用
57
+ provider?: string; // 供应商
58
+ description?: string; // 描述
59
+ hasAudio?: boolean; // 是否支持音频输入
60
+ maxImageResolution?: string; // 最大图像分辨率
61
+ canFineTune?: boolean; // 是否可以微调
62
+
63
+ hasImageOutput?: boolean; // 是否支持图片输出
64
+ supportsImageOutput?: boolean; // 兼容旧字段名
65
+ supportsTool?: boolean; // 是否支持工具调用
66
+
67
+ // ✅ 新增:图像生成相关能力
68
+ supportsImageConfig?: boolean; // 是否支持 image_config(aspect_ratio / image_size)
69
+ requiresImageModalities?: boolean; // 是否需要显式设置 modalities 才能出图
70
+ defaultModalities?: Array<"text" | "image">; // 模型推荐的默认输出模态组合
71
+ supportedAspectRatios?: string[];
72
+ supportedImageSizes?: string[];
73
+ pricePerImage?: number;
74
+ imagePricingNote?: string;
75
+ imageTokenPricePerMillion?: number;
76
+ imageOutputTokenEstimateBySize?: Partial<Record<"1K" | "2K" | "4K", number>>;
77
+ imageGenerationWaitTimeSeconds?: ImageGenerationWaitTimeSeconds;
78
+ imageGenerationProfiles?: ImageGenerationProfile[];
79
+
80
+ supportsReasoningEffort?: boolean; // 是否支持推理功能
81
+ endpointKey?: string;
82
+ }
@@ -0,0 +1,59 @@
1
+ export interface UsageRequestOptions {
2
+ stream_options?: {
3
+ include_usage: true;
4
+ };
5
+ usage?: {
6
+ include: true;
7
+ };
8
+ }
9
+
10
+ export type UsageRequestApi = "chat-completions" | "responses";
11
+
12
+ const STREAM_USAGE_PROVIDERS = new Set([
13
+ "google",
14
+ "openrouter",
15
+ "xai",
16
+ "openai",
17
+ "fireworks",
18
+ "mistral",
19
+ ]);
20
+
21
+ const EXTRA_USAGE_FIELD_PROVIDERS = new Set(["openrouter"]);
22
+
23
+ const normalizeProviderName = (providerName?: string | null) =>
24
+ typeof providerName === "string" ? providerName.trim().toLowerCase() : "";
25
+
26
+ export const getUsageRequestOptions = (
27
+ providerName?: string | null,
28
+ options?: { api?: UsageRequestApi }
29
+ ): UsageRequestOptions => {
30
+ const normalizedProvider = normalizeProviderName(providerName);
31
+ const api = options?.api ?? "chat-completions";
32
+
33
+ if (api === "responses") {
34
+ return EXTRA_USAGE_FIELD_PROVIDERS.has(normalizedProvider)
35
+ ? {
36
+ usage: {
37
+ include: true as const,
38
+ },
39
+ }
40
+ : {};
41
+ }
42
+
43
+ return {
44
+ ...(STREAM_USAGE_PROVIDERS.has(normalizedProvider)
45
+ ? {
46
+ stream_options: {
47
+ include_usage: true as const,
48
+ },
49
+ }
50
+ : {}),
51
+ ...(EXTRA_USAGE_FIELD_PROVIDERS.has(normalizedProvider)
52
+ ? {
53
+ usage: {
54
+ include: true as const,
55
+ },
56
+ }
57
+ : {}),
58
+ };
59
+ };
@@ -0,0 +1,161 @@
1
+ import {
2
+ createMemoryKey,
3
+ memoryOwnerRange,
4
+ memorySubjectKindRange,
5
+ } from "../../database/keys";
6
+ import type {
7
+ MemoryItem,
8
+ MemoryKind,
9
+ MemoryOwnerRef,
10
+ MemorySubjectRef,
11
+ } from "./types";
12
+
13
+ export const chooseMemoryOwners = (input: {
14
+ userId?: string | null;
15
+ spaceId?: string | null;
16
+ }): MemoryOwnerRef[] => {
17
+ const owners: MemoryOwnerRef[] = [];
18
+ if (input.userId) {
19
+ owners.push({ ownerType: "user", ownerId: input.userId });
20
+ }
21
+ if (input.spaceId) {
22
+ owners.push({ ownerType: "space", ownerId: input.spaceId });
23
+ }
24
+ return owners;
25
+ };
26
+
27
+ export const loadOwnerItemsFromDb = async (
28
+ db: any,
29
+ owner: MemoryOwnerRef,
30
+ limit: number
31
+ ): Promise<MemoryItem[]> => {
32
+ const range = memoryOwnerRange(owner.ownerType, owner.ownerId);
33
+ const refs: Array<{ memoryId?: string }> = [];
34
+ for await (const [, value] of db.iterator({
35
+ gte: range.start,
36
+ lte: range.end,
37
+ reverse: true,
38
+ })) {
39
+ refs.push(value ?? {});
40
+ if (refs.length >= limit) break;
41
+ }
42
+
43
+ const items = await Promise.all(
44
+ refs.map((ref) =>
45
+ typeof ref?.memoryId === "string"
46
+ ? db
47
+ .get(createMemoryKey(owner.ownerType, owner.ownerId, ref.memoryId))
48
+ .catch(() => null)
49
+ : Promise.resolve(null)
50
+ )
51
+ );
52
+ return items.filter((item): item is MemoryItem => !!item);
53
+ };
54
+
55
+ export const loadSubjectKindItemsFromDb = async (
56
+ db: any,
57
+ subject: MemorySubjectRef,
58
+ kind: MemoryKind,
59
+ limit: number
60
+ ): Promise<MemoryItem[]> => {
61
+ const range = memorySubjectKindRange(subject.subjectType, subject.subjectId, kind);
62
+ const refs: Array<{ memoryKey?: string }> = [];
63
+ for await (const [, value] of db.iterator({
64
+ gte: range.start,
65
+ lte: range.end,
66
+ reverse: true,
67
+ })) {
68
+ refs.push(value ?? {});
69
+ if (refs.length >= limit) break;
70
+ }
71
+
72
+ const items = await Promise.all(
73
+ refs.map((ref) =>
74
+ typeof ref?.memoryKey === "string"
75
+ ? db.get(ref.memoryKey).catch(() => null)
76
+ : Promise.resolve(null)
77
+ )
78
+ );
79
+ return items.filter((item): item is MemoryItem => !!item);
80
+ };
81
+
82
+ export const loadMemoryCandidatesFromDb = async (
83
+ db: any,
84
+ input: {
85
+ owners: MemoryOwnerRef[];
86
+ subjects: MemorySubjectRef[];
87
+ kinds?: MemoryKind[];
88
+ ownerLimit?: number;
89
+ }
90
+ ): Promise<MemoryItem[]> => {
91
+ const kinds = input.kinds ?? ["episodic", "semantic", "procedural"];
92
+ const ownerLimit = input.ownerLimit ?? 12;
93
+ const ownerKeySet = new Set(
94
+ input.owners
95
+ .filter((owner) => owner.ownerId)
96
+ .map((owner) => `${owner.ownerType}:${owner.ownerId}`)
97
+ );
98
+ const subjects = input.subjects.filter(
99
+ (subject): subject is MemorySubjectRef => !!subject.subjectId
100
+ );
101
+
102
+ const subjectResults =
103
+ subjects.length > 0
104
+ ? await Promise.all(
105
+ subjects.flatMap((subject) =>
106
+ kinds.map((kind) =>
107
+ loadSubjectKindItemsFromDb(db, subject, kind, ownerLimit)
108
+ )
109
+ )
110
+ )
111
+ : [];
112
+ const subjectHitCount = subjectResults.reduce((sum, items) => sum + items.length, 0);
113
+ const usingOwnerFallback = subjects.length === 0 || subjectHitCount === 0;
114
+ const results = usingOwnerFallback
115
+ ? await Promise.all(
116
+ input.owners.map((owner) => loadOwnerItemsFromDb(db, owner, ownerLimit))
117
+ )
118
+ : subjectResults;
119
+
120
+ const kindSet = new Set(kinds);
121
+ const seen = new Set<string>();
122
+ const merged: MemoryItem[] = [];
123
+ for (const items of results) {
124
+ for (const item of items) {
125
+ if (seen.has(item.id)) continue;
126
+ if (!kindSet.has(item.kind)) continue;
127
+ if (
128
+ ownerKeySet.size > 0 &&
129
+ !ownerKeySet.has(`${item.ownerType}:${item.ownerId}`)
130
+ ) {
131
+ continue;
132
+ }
133
+ if (
134
+ !usingOwnerFallback &&
135
+ subjects.length > 0 &&
136
+ !subjects.some(
137
+ (subject) =>
138
+ subject.subjectType === item.subjectType &&
139
+ subject.subjectId === item.subjectId
140
+ )
141
+ ) {
142
+ continue;
143
+ }
144
+ seen.add(item.id);
145
+ merged.push(item);
146
+ }
147
+ }
148
+
149
+ return merged;
150
+ };
151
+
152
+ export const buildDefaultSubjects = (input: {
153
+ userId?: string | null;
154
+ spaceId?: string | null;
155
+ agentKey: string;
156
+ }): MemorySubjectRef[] =>
157
+ [
158
+ { subjectType: "agent", subjectId: input.agentKey },
159
+ input.userId ? { subjectType: "user", subjectId: input.userId } : null,
160
+ input.spaceId ? { subjectType: "space", subjectId: input.spaceId } : null,
161
+ ].filter((value): value is MemorySubjectRef => !!value);