nolo-cli 0.1.40 → 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 (412) hide show
  1. package/agent-runtime/hybridRecordStore.ts +5 -3
  2. package/ai/agent/_executeModel.ts +146 -0
  3. package/ai/agent/agentSlice.ts +556 -1
  4. package/ai/agent/appWorkingMemory.ts +126 -0
  5. package/ai/agent/buildEditingContext.ts +378 -0
  6. package/ai/agent/buildSystemPrompt.ts +585 -0
  7. package/ai/agent/canvasEditingContext.ts +49 -0
  8. package/ai/agent/cleanAgentMessages.ts +140 -0
  9. package/ai/agent/cliChatClient.ts +153 -0
  10. package/ai/agent/cliExecutor.ts +65 -6
  11. package/ai/agent/contextCompiler.ts +107 -0
  12. package/ai/agent/contextLayerContract.ts +44 -0
  13. package/ai/agent/createAgentSchema.ts +272 -0
  14. package/ai/agent/currentTimeContext.ts +65 -0
  15. package/ai/agent/executeToolCall.ts +58 -0
  16. package/ai/agent/fetchAgentContexts.ts +42 -0
  17. package/ai/agent/generatePrompt.ts +3 -0
  18. package/ai/agent/getFullChatContextKeys.ts +168 -0
  19. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  20. package/ai/agent/guidedCreation/types.ts +38 -0
  21. package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
  22. package/ai/agent/liveAudioModel.ts +2 -0
  23. package/ai/agent/pageBuilderHandoffRules.ts +75 -0
  24. package/ai/agent/persistMessageWithFixedId.ts +37 -0
  25. package/ai/agent/planSlice.ts +259 -0
  26. package/ai/agent/referenceUtils.ts +229 -0
  27. package/ai/agent/runAgentBackground.ts +310 -0
  28. package/ai/agent/runAgentClientLoop.ts +164 -0
  29. package/ai/agent/runtimeGuidance.ts +116 -0
  30. package/ai/agent/serverOrigin.ts +7 -0
  31. package/ai/agent/startParallelAgentStreams.ts +424 -0
  32. package/ai/agent/startupProtocol.ts +53 -0
  33. package/ai/agent/streamAgentChatTurn.ts +2001 -0
  34. package/ai/agent/streamAgentChatTurnUtils.ts +860 -0
  35. package/ai/agent/toolFailureGuard.ts +99 -0
  36. package/ai/agent/types.ts +73 -0
  37. package/ai/agent/utils/imageOutput.ts +37 -0
  38. package/ai/agent/utils/publicImageAgentMode.ts +26 -0
  39. package/ai/ai.locale.ts +1095 -0
  40. package/ai/chat/accumulateToolCallChunks.ts +126 -0
  41. package/ai/chat/fetchUtils.ts +143 -0
  42. package/ai/chat/inlineImageUrlsForCustomProvider.ts +117 -0
  43. package/ai/chat/parseApiError.ts +67 -0
  44. package/ai/chat/parseMultilineSSE.ts +95 -0
  45. package/ai/chat/sendOpenAICompletionsRequest.ts +897 -0
  46. package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
  47. package/ai/chat/serverProxyRetry.ts +102 -0
  48. package/ai/chat/shouldUseServerProxy.ts +18 -0
  49. package/ai/chat/streamRetry.ts +46 -0
  50. package/ai/chat/updateTotalUsage.ts +89 -0
  51. package/ai/context/buildReferenceContext.ts +437 -0
  52. package/ai/context/retention.ts +165 -0
  53. package/ai/context/tokenUtils.ts +78 -0
  54. package/ai/llm/agentCapabilities.ts +74 -0
  55. package/ai/llm/deepinfra.ts +79 -0
  56. package/ai/llm/fireworks.ts +68 -0
  57. package/ai/llm/generateRequestBody.ts +165 -0
  58. package/ai/llm/getModelContextWindow.ts +93 -0
  59. package/ai/llm/getPricing.ts +252 -0
  60. package/ai/llm/imagePricing.ts +66 -0
  61. package/ai/llm/isResponseAPIModel.ts +13 -0
  62. package/ai/llm/kimi.ts +23 -0
  63. package/ai/llm/mimo.ts +99 -0
  64. package/ai/llm/mistral.ts +21 -0
  65. package/ai/llm/models.ts +45 -0
  66. package/ai/llm/openrouterModels.ts +6 -0
  67. package/ai/llm/providers.ts +313 -0
  68. package/ai/llm/reasoningModels.ts +27 -0
  69. package/ai/llm/types.ts +82 -0
  70. package/ai/llm/usageRequestOptions.ts +59 -0
  71. package/ai/memory/queryShared.ts +161 -0
  72. package/ai/memory/recentRelationshipRecap.ts +247 -0
  73. package/ai/memory/remember.ts +167 -0
  74. package/ai/memory/store.ts +20 -0
  75. package/ai/memory/storeShared.ts +76 -0
  76. package/ai/memory/types.ts +46 -0
  77. package/ai/memory/understanding.ts +349 -0
  78. package/ai/memory/understandingGreeting.ts +264 -0
  79. package/ai/policy/personalizationDialog.ts +333 -0
  80. package/ai/policy/runtimePolicy.ts +454 -0
  81. package/ai/policy/selfUpdateFields.ts +48 -0
  82. package/ai/policy/types.ts +64 -0
  83. package/ai/skills/referenceRuntime.ts +274 -0
  84. package/ai/skills/skillDiagnostics.ts +251 -0
  85. package/ai/skills/skillDocBuilder.ts +139 -0
  86. package/ai/skills/skillSummaryMarker.ts +26 -0
  87. package/ai/token/calculatePrice.ts +576 -0
  88. package/ai/token/missingUsageEstimate.ts +42 -0
  89. package/ai/token/normalizeUsage.ts +124 -0
  90. package/ai/token/openaiImageGenerationUsage.ts +56 -0
  91. package/ai/token/prepareTokenUsageData.ts +93 -0
  92. package/ai/token/resolveBillingTarget.ts +52 -0
  93. package/ai/token/saveTokenRecord.ts +53 -0
  94. package/ai/token/types.ts +103 -0
  95. package/ai/tools/agent/agentTools.ts +235 -0
  96. package/ai/tools/agent/agentUpdateShared.ts +311 -0
  97. package/ai/tools/agent/callAgentTool.ts +139 -0
  98. package/ai/tools/agent/createAgentTool.ts +512 -0
  99. package/ai/tools/agent/createDialogTool.ts +69 -0
  100. package/ai/tools/agent/createSkillAgentTool.ts +62 -0
  101. package/ai/tools/agent/parallelBudget.ts +221 -0
  102. package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
  103. package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
  104. package/ai/tools/agent/runLlmTool.ts +96 -0
  105. package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
  106. package/ai/tools/agent/skillAgentArgs.ts +106 -0
  107. package/ai/tools/agent/startAgentDialogTool.ts +53 -0
  108. package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
  109. package/ai/tools/agent/updateAgentTool.ts +96 -0
  110. package/ai/tools/agent/updateSelfTool.ts +113 -0
  111. package/ai/tools/amazonProductScraperTool.ts +86 -0
  112. package/ai/tools/apifyActorClient.ts +45 -0
  113. package/ai/tools/appEditGuard.ts +372 -0
  114. package/ai/tools/appReadSnapshot.ts +153 -0
  115. package/ai/tools/appTools.ts +1549 -0
  116. package/ai/tools/applyEditTool.ts +259 -0
  117. package/ai/tools/applyLineEditsTool.ts +315 -0
  118. package/ai/tools/browserTools/click.ts +33 -0
  119. package/ai/tools/browserTools/closeSession.ts +29 -0
  120. package/ai/tools/browserTools/common.ts +27 -0
  121. package/ai/tools/browserTools/openSession.ts +48 -0
  122. package/ai/tools/browserTools/readContent.ts +38 -0
  123. package/ai/tools/browserTools/selectOption.ts +46 -0
  124. package/ai/tools/browserTools/typeText.ts +42 -0
  125. package/ai/tools/category/createCategoryTool.ts +66 -0
  126. package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
  127. package/ai/tools/category/updateContentCategoryTool.ts +75 -0
  128. package/ai/tools/cfBrowserTools.ts +319 -0
  129. package/ai/tools/cfSpeechToTextTool.ts +49 -0
  130. package/ai/tools/checkEnvTool.ts +102 -0
  131. package/ai/tools/cloudflareCrawlTool.ts +289 -0
  132. package/ai/tools/codeSearchTool.ts +123 -0
  133. package/ai/tools/codeTools.ts +101 -0
  134. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  135. package/ai/tools/createDocTool.ts +132 -0
  136. package/ai/tools/createSkillDocTool.ts +155 -0
  137. package/ai/tools/createWorkflowTool.ts +154 -0
  138. package/ai/tools/delayTool.ts +31 -0
  139. package/ai/tools/deleteSpacesTool.ts +325 -0
  140. package/ai/tools/deleteSpacesToolModel.ts +159 -0
  141. package/ai/tools/devReloadUtils.ts +29 -0
  142. package/ai/tools/dialogMessageSearch.ts +137 -0
  143. package/ai/tools/doctorSkillTool.ts +72 -0
  144. package/ai/tools/ecommerceScraperTool.ts +86 -0
  145. package/ai/tools/emailTools.ts +549 -0
  146. package/ai/tools/evalSkillTool.ts +92 -0
  147. package/ai/tools/exaSearchTool.ts +63 -0
  148. package/ai/tools/execShellTool.ts +266 -0
  149. package/ai/tools/executeSqlTool.ts +192 -0
  150. package/ai/tools/fetchWebpageSupport.ts +333 -0
  151. package/ai/tools/fetchWebpageTool.ts +97 -0
  152. package/ai/tools/geminiImagePreviewTool.ts +386 -0
  153. package/ai/tools/generateDocxTool.ts +215 -0
  154. package/ai/tools/googleSearchScraperTool.ts +106 -0
  155. package/ai/tools/importDataTool.ts +133 -0
  156. package/ai/tools/importSkillTool.ts +162 -0
  157. package/ai/tools/index.ts +2308 -0
  158. package/ai/tools/jdProductScraperTool.ts +821 -0
  159. package/ai/tools/listUserSpacesTool.ts +113 -0
  160. package/ai/tools/localFilesTool.ts +276 -0
  161. package/ai/tools/marxistsOfflineBook.ts +253 -0
  162. package/ai/tools/modelUsageTools.ts +206 -0
  163. package/ai/tools/noloWorkspaceReadTools.ts +467 -0
  164. package/ai/tools/olmOcrTool.ts +33 -0
  165. package/ai/tools/openaiImageTool.ts +267 -0
  166. package/ai/tools/prepareTools.ts +23 -0
  167. package/ai/tools/readDocTool.ts +88 -0
  168. package/ai/tools/readFileTool.ts +214 -0
  169. package/ai/tools/readTool.ts +194 -0
  170. package/ai/tools/readXPostTool.ts +229 -0
  171. package/ai/tools/readXhsProfileTool.ts +627 -0
  172. package/ai/tools/rememberMemoryTool.ts +84 -0
  173. package/ai/tools/remotionVideoTool.ts +151 -0
  174. package/ai/tools/searchDialogMessagesTool.ts +222 -0
  175. package/ai/tools/searchWorkspaceTool.ts +259 -0
  176. package/ai/tools/skillFollowup.ts +86 -0
  177. package/ai/tools/surfWeatherTool.ts +169 -0
  178. package/ai/tools/table/addTableRowTool.ts +217 -0
  179. package/ai/tools/table/createTableTool.ts +315 -0
  180. package/ai/tools/table/rowTools.ts +386 -0
  181. package/ai/tools/table/schemaTools.ts +244 -0
  182. package/ai/tools/table/shareTableTool.ts +148 -0
  183. package/ai/tools/table/toolShared.ts +129 -0
  184. package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
  185. package/ai/tools/toolApiClient.ts +279 -0
  186. package/ai/tools/toolResultError.ts +42 -0
  187. package/ai/tools/toolRunSlice.ts +303 -0
  188. package/ai/tools/toolSchemaCompatibility.ts +53 -0
  189. package/ai/tools/uiAskChoiceTool.ts +104 -0
  190. package/ai/tools/updateContentTitleTool.ts +84 -0
  191. package/ai/tools/updateDocTool.ts +105 -0
  192. package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
  193. package/ai/tools/wereadGatewayTool.ts +152 -0
  194. package/ai/tools/whisperTool.ts +76 -0
  195. package/ai/tools/writeFileTool.ts +213 -0
  196. package/ai/tools/youtubeScraperTool.ts +116 -0
  197. package/ai/tools/ziweiChartTool.ts +678 -0
  198. package/ai/types.ts +55 -0
  199. package/ai/workflow/workflowExecutor.ts +323 -0
  200. package/ai/workflow/workflowSlice.ts +73 -0
  201. package/ai/workflow/workflowTypes.ts +106 -0
  202. package/app/actions/syncAppRecord.ts +73 -0
  203. package/app/constants/animationSets.ts +21 -0
  204. package/app/constants/appEditor.ts +99 -0
  205. package/app/favorite/favoriteSlice.ts +690 -0
  206. package/app/favorite/type.ts +43 -0
  207. package/app/hooks/deleteDbKey.ts +233 -0
  208. package/app/i18n/client.ts +13 -0
  209. package/app/i18n/i18n.base.ts +14 -0
  210. package/app/i18n/i18n.config.ts +77 -0
  211. package/app/i18n/index.ts +15 -0
  212. package/app/i18n/mapLanguage.ts +11 -0
  213. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  214. package/app/i18n/translations/error.locale.ts +246 -0
  215. package/app/i18n/translations/interface.locale.ts +2174 -0
  216. package/app/i18n/translations/pricing.locale.ts +397 -0
  217. package/app/i18n/translations/privacy.locale.ts +168 -0
  218. package/app/i18n/translations/seo.locale.ts +129 -0
  219. package/app/i18n/translations/terms.locale.ts +124 -0
  220. package/app/i18n/types.ts +6 -0
  221. package/app/notifications/model.ts +77 -0
  222. package/app/notifications/notificationSlice.ts +141 -0
  223. package/app/reducer.ts +36 -0
  224. package/app/settings/dbActionThunks.ts +34 -0
  225. package/app/settings/defaultSpacePreference.ts +87 -0
  226. package/app/settings/settingSlice.tsx +1212 -0
  227. package/app/settings/settingsRecord.ts +8 -0
  228. package/app/stateViews/runtime.ts +90 -0
  229. package/app/store.ts +55 -0
  230. package/app/theme/colors.ts +280 -0
  231. package/app/theme/fontPreference.ts +77 -0
  232. package/app/theme/theme.config.ts +120 -0
  233. package/app/theme/themeModeBootstrap.ts +123 -0
  234. package/app/types/appSummary.ts +114 -0
  235. package/app/types.ts +358 -0
  236. package/app/utils/appKeys.ts +55 -0
  237. package/app/utils/async.ts +28 -0
  238. package/app/utils/desktopAgentRuntimeTurnClient.ts +73 -0
  239. package/app/utils/env.ts +17 -0
  240. package/app/utils/fileUtils.ts +229 -0
  241. package/app/utils/imageUtils.ts +274 -0
  242. package/app/utils/myContentItems.ts +289 -0
  243. package/app/utils/retryAfter.ts +36 -0
  244. package/app/utils/retryFetch.ts +61 -0
  245. package/app/utils/toast.ts +3 -0
  246. package/auth/action/signUpAction.ts +227 -0
  247. package/auth/adminPermissions.ts +18 -0
  248. package/auth/authSlice.ts +531 -0
  249. package/auth/client/loginRequest.ts +14 -0
  250. package/auth/resetAuthScopedClientState.ts +27 -0
  251. package/auth/routes.ts +178 -0
  252. package/auth/token.ts +63 -0
  253. package/auth/types.ts +40 -0
  254. package/chat/chat.locale.ts +813 -0
  255. package/chat/dialog/actions/addCybotAction.ts +52 -0
  256. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  257. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  258. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  259. package/chat/dialog/actions/createDialogAction.ts +379 -0
  260. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  261. package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
  262. package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
  263. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  264. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  265. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  266. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  267. package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
  268. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  269. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  270. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  271. package/chat/dialog/dialogAgents.ts +72 -0
  272. package/chat/dialog/dialogSlice.ts +872 -0
  273. package/chat/dialog/dialogTitle.ts +81 -0
  274. package/chat/dialog/dialogTokenStats.ts +12 -0
  275. package/chat/dialog/dialogUrl.ts +6 -0
  276. package/chat/dialog/goal.ts +108 -0
  277. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  278. package/chat/dialog/schedule.ts +17 -0
  279. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  280. package/chat/messages/fetchConvMsgs.ts +51 -0
  281. package/chat/messages/fileUrl.ts +13 -0
  282. package/chat/messages/messageAgent.ts +8 -0
  283. package/chat/messages/messageContent.ts +199 -0
  284. package/chat/messages/messageContract.ts +88 -0
  285. package/chat/messages/messageSlice.ts +1367 -0
  286. package/chat/messages/toolThunks.ts +625 -0
  287. package/cli/client/agentRun.ts +27 -8
  288. package/cli/client/localRuntimeAdapter.ts +144 -28
  289. package/client/agentRun.test.ts +52 -0
  290. package/client/agentRun.ts +27 -8
  291. package/client/localRuntimeAdapter.test.ts +437 -6
  292. package/client/localRuntimeAdapter.ts +144 -28
  293. package/core/builtinAgents.ts +209 -0
  294. package/core/config.ts +15 -0
  295. package/core/crypto.ts +51 -0
  296. package/core/generateKeyPairFromSeedV1.ts +15 -0
  297. package/core/generateMainKey.ts +22 -0
  298. package/core/init.ts +41 -0
  299. package/core/localOrigins.ts +8 -0
  300. package/core/password.ts +13 -0
  301. package/core/prefix.ts +23 -0
  302. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  303. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  304. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  305. package/create/editor/transforms/markdownToSlate.ts +24 -0
  306. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  307. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  308. package/create/editor/transforms/slateToText.ts +33 -0
  309. package/create/editor/utils/slateUtils.ts +233 -0
  310. package/create/space/addSpaceAction.ts +193 -0
  311. package/create/space/category/categoryActions.ts +427 -0
  312. package/create/space/changeSpaceAction.ts +36 -0
  313. package/create/space/constants.ts +8 -0
  314. package/create/space/content/addContentAction.ts +116 -0
  315. package/create/space/content/contentThunks.ts +90 -0
  316. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  317. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  318. package/create/space/content/moveContentAction.ts +285 -0
  319. package/create/space/content/updateContentCategoryAction.ts +154 -0
  320. package/create/space/content/updateContentTitleAction.ts +151 -0
  321. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  322. package/create/space/contentKeyUtils.ts +117 -0
  323. package/create/space/deleteSpaceAction.ts +276 -0
  324. package/create/space/fetchSpaceAction.ts +70 -0
  325. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  326. package/create/space/loadDefaultSpaceAction.ts +57 -0
  327. package/create/space/member/addMemberAction.ts +79 -0
  328. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  329. package/create/space/member/memberThunks.ts +47 -0
  330. package/create/space/member/removeMemberAction.ts +67 -0
  331. package/create/space/resolvePreferredSpaceId.ts +113 -0
  332. package/create/space/sidebarVisibleTypes.ts +241 -0
  333. package/create/space/space.locale.ts +1087 -0
  334. package/create/space/spaceAccess.ts +182 -0
  335. package/create/space/spaceCollapsedState.ts +54 -0
  336. package/create/space/spaceKeys.ts +65 -0
  337. package/create/space/spaceSlice.ts +328 -0
  338. package/create/space/spaceThunks.ts +410 -0
  339. package/create/space/types.ts +27 -0
  340. package/create/space/updateSpaceAction.ts +107 -0
  341. package/create/space/utils/permissions.ts +47 -0
  342. package/create/types.ts +21 -0
  343. package/database/actions/agentReadResolution.ts +33 -0
  344. package/database/actions/common.ts +243 -0
  345. package/database/actions/deleteFile.ts +40 -0
  346. package/database/actions/fileContent.ts +125 -0
  347. package/database/actions/patch.ts +155 -0
  348. package/database/actions/read.ts +358 -0
  349. package/database/actions/readAndWait.ts +260 -0
  350. package/database/actions/readRequestManager.ts +120 -0
  351. package/database/actions/readResolution.ts +125 -0
  352. package/database/actions/remove.ts +94 -0
  353. package/database/actions/replication.ts +477 -0
  354. package/database/actions/upload.ts +186 -0
  355. package/database/actions/upsert.ts +56 -0
  356. package/database/actions/write.ts +146 -0
  357. package/database/authority/ownerKey.ts +80 -0
  358. package/database/authority/recordAuthority.ts +67 -0
  359. package/database/authority/userAuthorityRegistry.ts +54 -0
  360. package/database/client/fetchUserData.ts +61 -0
  361. package/database/dbActionThunks.ts +1 -0
  362. package/database/dbSlice.ts +149 -0
  363. package/database/fileRing.ts +51 -0
  364. package/database/fileStorage.ts +232 -0
  365. package/database/fileUrl.ts +34 -0
  366. package/database/keys.ts +767 -0
  367. package/database/queryPrefixes.ts +14 -0
  368. package/database/requests.ts +443 -0
  369. package/database/runtimeServerContext.ts +54 -0
  370. package/database/tenantPlacement.ts +57 -0
  371. package/database/userPreferenceRegister.ts +131 -0
  372. package/database/utils/ulid.ts +1 -0
  373. package/integrations/anthropic/anthropicModels.ts +47 -0
  374. package/integrations/deepseek/models.ts +37 -0
  375. package/integrations/google/models.ts +341 -0
  376. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  377. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  378. package/integrations/openai/flexTier.ts +102 -0
  379. package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
  380. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  381. package/integrations/openai/models.ts +271 -0
  382. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  383. package/integrations/openai/responsesHelpers.ts +297 -0
  384. package/integrations/x-reader/types.ts +109 -0
  385. package/integrations/xai/models.ts +13 -0
  386. package/integrations/xhs-reader/analyze/profileAnalyzer.ts +205 -0
  387. package/integrations/xhs-reader/backends/playwrightProfileCollector.ts +624 -0
  388. package/integrations/xhs-reader/bridge/readXhsProfileWithBridge.ts +227 -0
  389. package/integrations/xhs-reader/client/xhsWebApiClient.ts +229 -0
  390. package/integrations/xhs-reader/normalize.ts +390 -0
  391. package/integrations/xhs-reader/orchestrator.ts +178 -0
  392. package/integrations/xhs-reader/redaction.ts +68 -0
  393. package/integrations/xhs-reader/types.ts +244 -0
  394. package/integrations/xhs-reader/url.ts +57 -0
  395. package/package.json +430 -4
  396. package/render/page/createPageAction.ts +183 -0
  397. package/render/page/docSlice.ts +468 -0
  398. package/render/page/types.ts +17 -0
  399. package/render/table/createTableAction.ts +270 -0
  400. package/render/table/deleteTableAction.ts +193 -0
  401. package/render/table/fetchAndCacheTableRows.ts +174 -0
  402. package/render/table/tableSlice.ts +1106 -0
  403. package/render/table/toolValueUtils.ts +363 -0
  404. package/render/table/types.ts +252 -0
  405. package/render/table/utils/tableSerialization.ts +50 -0
  406. package/server/handlers/agentRun/types.ts +104 -0
  407. package/share/action.ts +225 -0
  408. package/share/helpers.ts +302 -0
  409. package/share/keys.ts +243 -0
  410. package/share/publicSharePolicy.ts +27 -0
  411. package/share/shareSlice.ts +53 -0
  412. package/share/types.ts +100 -0
@@ -42,6 +42,8 @@ import {
42
42
  type HybridRecordStore,
43
43
  } from "./hybridRecordStore";
44
44
  import { executeLocalToolWithPolicy } from "./localToolPolicy";
45
+ import { inferCaptureIntent } from "../ai/policy/runtimePolicy";
46
+ import { prepareTools } from "../ai/tools/prepareTools";
45
47
  import { taskRunFunctionSchema } from "../ai/tools/agent/taskRunTool";
46
48
  import {
47
49
  MIMO_MONTH_AGENT_KEY,
@@ -56,6 +58,11 @@ import {
56
58
  } from "../agent-runtime/noloWorkspaceTools";
57
59
  import { executeCli as defaultExecuteCli, type CliExecuteResult, type CliImageInput } from "../ai/agent/cliExecutor";
58
60
  import { buildCliPrompt } from "../ai/agent/cliPrompt";
61
+ import {
62
+ readXhsProfileFunc,
63
+ readXhsProfileFunctionSchema,
64
+ } from "../ai/tools/readXhsProfileTool";
65
+ import { resolveDefaultXhsProfileDir } from "../integrations/xhs-reader/bridge/readXhsProfileWithBridge";
59
66
 
60
67
  type EnvLike = Record<string, string | undefined>;
61
68
  type FetchInput = Parameters<typeof fetch>[0];
@@ -78,6 +85,14 @@ export const BUILTIN_NOLO_AGENT_ID = NOLO_DEFAULT_AGENT_ID;
78
85
  export const BUILTIN_NOLO_AGENT_KEY = NOLO_DEFAULT_AGENT_KEY;
79
86
  const CLI_DIR = dirname(fileURLToPath(import.meta.url));
80
87
  const CLI_ENTRYPOINT = join(CLI_DIR, "..", "index.ts");
88
+ const LOCAL_SERVER_TABLE_TOOL_NAMES = [
89
+ "createTable",
90
+ "addTableRow",
91
+ "addTableRows",
92
+ "updateTableRow",
93
+ "updateTableRows",
94
+ ] as const;
95
+ const LOCAL_SERVER_TABLE_TOOL_NAME_SET = new Set<string>(LOCAL_SERVER_TABLE_TOOL_NAMES);
81
96
 
82
97
  export type CliLocalRuntimeDb = CliKvDb;
83
98
 
@@ -91,6 +106,7 @@ export type CliLocalRuntimeAdapterDeps = {
91
106
  cwd?: string;
92
107
  output?: { write(chunk: string): unknown };
93
108
  localToolExecutors?: Record<string, (call: any) => Promise<{ content: string; metadata?: Record<string, unknown> }>>;
109
+ readXhsProfile?: typeof readXhsProfileFunc;
94
110
  executeCli?: LocalCliExecutor;
95
111
  sleep?: (ms: number) => Promise<void>;
96
112
  loopbackRequest?: (input: FetchInput, init?: FetchInit) => Promise<Response>;
@@ -235,12 +251,14 @@ function buildRequestTimeoutSignal(timeoutMs?: number) {
235
251
  if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
236
252
  return undefined;
237
253
  }
238
- if (typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function") {
239
- return AbortSignal.timeout(timeoutMs);
240
- }
241
254
  const controller = new AbortController();
242
- setTimeout(() => controller.abort(new Error(`request timed out after ${timeoutMs}ms`)), timeoutMs);
243
- return controller.signal;
255
+ const timeout = setTimeout(() => {
256
+ controller.abort(new Error(`request timed out after ${timeoutMs}ms`));
257
+ }, timeoutMs);
258
+ return {
259
+ signal: controller.signal,
260
+ clear: () => clearTimeout(timeout),
261
+ };
244
262
  }
245
263
 
246
264
  function summarizeEndpoint(value: unknown) {
@@ -383,12 +401,17 @@ function buildLocalPolicyToolNames(args: { toolNames?: string[]; env: EnvLike })
383
401
  exposeShellTools: true,
384
402
  }),
385
403
  ...((args.toolNames ?? []).includes("taskRun") ? ["taskRun"] : []),
404
+ ...((args.toolNames ?? []).includes("read_xhs_profile") ? ["read_xhs_profile"] : []),
405
+ ...(args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
386
406
  ...filterNoloWorkspaceToolNames(args.toolNames),
387
407
  ];
388
408
  }
389
409
 
390
410
  function buildServerPlatformOpenAiTools(args: { toolNames?: string[] }) {
391
411
  const toolNames = new Set(args.toolNames ?? []);
412
+ const tableTools = prepareTools(
413
+ (args.toolNames ?? []).filter((name) => LOCAL_SERVER_TABLE_TOOL_NAME_SET.has(name)),
414
+ );
392
415
  return [
393
416
  ...(toolNames.has("taskRun")
394
417
  ? [{
@@ -396,6 +419,13 @@ function buildServerPlatformOpenAiTools(args: { toolNames?: string[] }) {
396
419
  function: taskRunFunctionSchema,
397
420
  }]
398
421
  : []),
422
+ ...(toolNames.has("read_xhs_profile")
423
+ ? [{
424
+ type: "function",
425
+ function: readXhsProfileFunctionSchema,
426
+ }]
427
+ : []),
428
+ ...tableTools,
399
429
  ];
400
430
  }
401
431
 
@@ -467,29 +497,72 @@ function buildServerPlatformToolExecutors(args: {
467
497
  env: EnvLike;
468
498
  fetchImpl: typeof fetch;
469
499
  }) {
500
+ const postServer = async (path: string, body: object) => {
501
+ const serverUrl = resolveRuntimeServerUrl(args.env);
502
+ const authToken = resolveRuntimeAuthToken(args.env);
503
+ if (!serverUrl) throw new Error("server platform tools require NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
504
+ if (!authToken) throw new Error("server platform tools require AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
505
+ const response = await args.fetchImpl(`${serverUrl}${path}`, {
506
+ method: "POST",
507
+ headers: {
508
+ "Content-Type": "application/json",
509
+ Authorization: `Bearer ${authToken}`,
510
+ },
511
+ body: JSON.stringify(body),
512
+ });
513
+ const text = await response.text().catch(() => "");
514
+ if (!response.ok) {
515
+ throw new Error(`server platform tool bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
516
+ }
517
+ return text;
518
+ };
519
+ const guardExplicitTableCapture = (call: any) => {
520
+ if (inferCaptureIntent(String(call.userInput ?? "")) === "strong") return null;
521
+ return JSON.stringify({
522
+ error: "knowledge_capture_requires_confirmation",
523
+ message:
524
+ "当前本地运行不允许自动写入表格。只有当用户在当前请求里明确要求保存、建表、写入 table 或做成数据集时,才能继续;否则请先询问用户。",
525
+ policy: {
526
+ capability: "knowledge_capture",
527
+ target: "table",
528
+ mode: "explicit-only-local",
529
+ },
530
+ });
531
+ };
532
+ const tableExecutors = Object.fromEntries(
533
+ LOCAL_SERVER_TABLE_TOOL_NAMES.map((toolName) => [
534
+ toolName,
535
+ async (call: any) => {
536
+ const blocked = guardExplicitTableCapture(call);
537
+ if (blocked) {
538
+ return {
539
+ content: blocked,
540
+ metadata: { serverPlatformTool: true, tableWriteBlocked: true },
541
+ };
542
+ }
543
+ const parsed = parseNoloWorkspaceToolArguments(call.arguments);
544
+ const path =
545
+ toolName === "createTable" ? "/api/table/create"
546
+ : toolName === "addTableRow" ? "/api/table/add-row"
547
+ : toolName === "addTableRows" ? "/api/table/add-rows"
548
+ : toolName === "updateTableRow" ? "/api/table/update-row"
549
+ : "/api/table/update-rows";
550
+ const content = await postServer(path, parsed);
551
+ return {
552
+ content,
553
+ metadata: { serverPlatformTool: true, tableWrite: true },
554
+ };
555
+ },
556
+ ]),
557
+ );
470
558
  return {
471
559
  taskRun: async (call: any) => {
472
- const serverUrl = resolveRuntimeServerUrl(args.env);
473
- const authToken = resolveRuntimeAuthToken(args.env);
474
- if (!serverUrl) throw new Error("taskRun requires NOLO_SERVER_URL, NOLO_SERVER, or BASE_URL.");
475
- if (!authToken) throw new Error("taskRun requires AUTH_TOKEN or NOLO_MACHINE_API_KEY.");
476
- const response = await args.fetchImpl(`${serverUrl}/api/task-run`, {
477
- method: "POST",
478
- headers: {
479
- "Content-Type": "application/json",
480
- Authorization: `Bearer ${authToken}`,
481
- },
482
- body: JSON.stringify(parseNoloWorkspaceToolArguments(call.arguments)),
483
- });
484
- const text = await response.text().catch(() => "");
485
- if (!response.ok) {
486
- throw new Error(`taskRun bridge failed: HTTP ${response.status} ${text.slice(0, 500)}`);
487
- }
488
560
  return {
489
- content: text,
561
+ content: await postServer("/api/task-run", parseNoloWorkspaceToolArguments(call.arguments)),
490
562
  metadata: { serverPlatformTool: true },
491
563
  };
492
564
  },
565
+ ...tableExecutors,
493
566
  };
494
567
  }
495
568
 
@@ -498,9 +571,34 @@ function buildLocalToolExecutors(args: {
498
571
  env: EnvLike;
499
572
  fetchImpl: typeof fetch;
500
573
  localToolExecutors?: CliLocalRuntimeAdapterDeps["localToolExecutors"];
574
+ readXhsProfile?: CliLocalRuntimeAdapterDeps["readXhsProfile"];
501
575
  commandTimeoutMs?: number;
502
576
  commandOutputLimit?: number;
503
577
  }) {
578
+ const resolveCliDefaultXhsArgs = (parsedArgs: any) => {
579
+ if (
580
+ parsedArgs?.profileDir ||
581
+ parsedArgs?.profile_dir ||
582
+ args.env.NOLO_XHS_READER_PROFILE_DIR
583
+ ) {
584
+ return parsedArgs;
585
+ }
586
+ return {
587
+ ...parsedArgs,
588
+ profileDir: resolveDefaultXhsProfileDir({
589
+ env: {
590
+ ...process.env,
591
+ ...args.env,
592
+ NOLO_DESKTOP: "1",
593
+ NOLO_DESKTOP_CHANNEL:
594
+ args.env.NOLO_DESKTOP_CHANNEL?.trim() ||
595
+ args.env.NOLO_XHS_READER_DESKTOP_CHANNEL?.trim() ||
596
+ "stable",
597
+ },
598
+ }),
599
+ };
600
+ };
601
+
504
602
  return {
505
603
  ...createLocalWorkspaceToolExecutors({
506
604
  workspaceRoot: args.workspaceRoot,
@@ -514,6 +612,22 @@ function buildLocalToolExecutors(args: {
514
612
  ...buildCliWorkspaceToolExecutors({
515
613
  env: args.env,
516
614
  }),
615
+ read_xhs_profile: async (call: any) => {
616
+ const parsedArgs = (() => {
617
+ try { return JSON.parse(call.arguments || "{}"); } catch { return {}; }
618
+ })();
619
+ const result = await (args.readXhsProfile ?? readXhsProfileFunc)(
620
+ resolveCliDefaultXhsArgs(parsedArgs),
621
+ undefined,
622
+ );
623
+ return {
624
+ content: JSON.stringify(result.rawData),
625
+ metadata: {
626
+ xhsLocalBridge: true,
627
+ displayData: result.displayData,
628
+ },
629
+ };
630
+ },
517
631
  ...(args.localToolExecutors ?? {}),
518
632
  };
519
633
  }
@@ -599,6 +713,7 @@ export function createCliLocalRuntimeAdapter(
599
713
  env: deps.env,
600
714
  fetchImpl,
601
715
  localToolExecutors: deps.localToolExecutors,
716
+ readXhsProfile: deps.readXhsProfile,
602
717
  ...runtimeToolExecutionLimits,
603
718
  });
604
719
 
@@ -629,6 +744,7 @@ export function createCliLocalRuntimeAdapter(
629
744
  env: deps.env,
630
745
  fetchImpl,
631
746
  localToolExecutors: deps.localToolExecutors,
747
+ readXhsProfile: deps.readXhsProfile,
632
748
  ...runtimeToolExecutionLimits,
633
749
  });
634
750
  return agentConfig;
@@ -725,7 +841,7 @@ export function createCliLocalRuntimeAdapter(
725
841
  messages,
726
842
  tools,
727
843
  });
728
- const signal = buildRequestTimeoutSignal(options?.timeoutMs);
844
+ const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
729
845
  logLocalRuntimeDiagnostic("provider.request.start", {
730
846
  agentKey: agentConfig.key,
731
847
  transport: "platform-proxy",
@@ -740,11 +856,11 @@ export function createCliLocalRuntimeAdapter(
740
856
  });
741
857
  const res = await fetchWithTransientRetry(fetchImpl, request.url, {
742
858
  ...request.init,
743
- ...(signal ? { signal } : {}),
859
+ ...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
744
860
  }, {
745
861
  sleep: deps.sleep,
746
862
  loopbackRequest,
747
- });
863
+ }).finally(() => timeoutSignal?.clear());
748
864
  const raw = await res.text().catch(() => "");
749
865
  logLocalRuntimeDiagnostic("provider.request.result", {
750
866
  agentKey: agentConfig.key,
@@ -798,7 +914,7 @@ export function createCliLocalRuntimeAdapter(
798
914
  messages,
799
915
  tools,
800
916
  });
801
- const signal = buildRequestTimeoutSignal(options?.timeoutMs);
917
+ const timeoutSignal = buildRequestTimeoutSignal(options?.timeoutMs);
802
918
  logLocalRuntimeDiagnostic("provider.request.start", {
803
919
  agentKey: agentConfig.key,
804
920
  transport: "direct-openai-compatible",
@@ -812,11 +928,11 @@ export function createCliLocalRuntimeAdapter(
812
928
  });
813
929
  const res = await fetchWithTransientRetry(fetchImpl, request.url, {
814
930
  ...request.init,
815
- ...(signal ? { signal } : {}),
931
+ ...(timeoutSignal ? { signal: timeoutSignal.signal } : {}),
816
932
  }, {
817
933
  sleep: deps.sleep,
818
934
  loopbackRequest,
819
- });
935
+ }).finally(() => timeoutSignal?.clear());
820
936
  const raw = await res.text().catch(() => "");
821
937
  logLocalRuntimeDiagnostic("provider.request.result", {
822
938
  agentKey: agentConfig.key,
@@ -0,0 +1,209 @@
1
+ import { APP_BUILDER_PRESET } from "../ai/tools/agent/presets/appBuilderPreset";
2
+ import { FIREWORKS_KIMI_LATEST_MODEL } from "../ai/llm/kimi";
3
+
4
+ export const BUILTIN_NOLO_AGENT_KEY = "agent-pub-01NOLOAPPBLD000000019KCKT0";
5
+ export const BUILTIN_APP_BUILDER_AGENT_KEY =
6
+ "agent-pub-01APPBUILDER00000001YAII3I";
7
+ export const BUILTIN_ECOMMERCE_AGENT_KEY =
8
+ "agent-pub-01ECOMMERCEAG00000001PYQ2J";
9
+ export const BUILTIN_AGENT_CREATOR_AGENT_KEY =
10
+ "agent-pub-01NOLOAGENTCRT000000000001";
11
+ export const BUILTIN_NOLO_AGENT_ID = "01NOLOAPPBLD000000019KCKT0";
12
+ export const BUILTIN_APP_BUILDER_AGENT_ID = "01APPBUILDER00000001YAII3I";
13
+ export const BUILTIN_ECOMMERCE_AGENT_ID = "01ECOMMERCEAG00000001PYQ2J";
14
+ export const BUILTIN_AGENT_CREATOR_AGENT_ID = "01NOLOAGENTCRT000000000001";
15
+
16
+ const BUILTIN_PUBLIC_RUNTIME_SERVER_BASE = "https://nolo.chat";
17
+
18
+ const buildBuiltinBaseAgent = (overrides: Record<string, unknown>) => {
19
+ const timestamp = Date.now();
20
+ return {
21
+ type: "agent",
22
+ isPublic: true,
23
+ userId: "builtin",
24
+ createdAt: timestamp,
25
+ updatedAt: timestamp,
26
+ references: [],
27
+ ...overrides,
28
+ };
29
+ };
30
+
31
+ const BUILTIN_NOLO_PROMPT = [
32
+ "你是 nolo,负责帮助刚进入产品的用户理解现在能做什么,并把他们带到合适的下一步。",
33
+ "优先直接回答、解释入口、帮用户开始对话、创建 AI、创建文档,或把任务交给更合适的 agent。",
34
+ "用户只是泛泛提问时,先收敛问题,不要立刻切换到重型流程。",
35
+ `当用户明确要创建、定制或发布 AI / Agent / 智能体时,调用 runStreamingAgent 转交给 AI 创建助手,agentKey 是 ${BUILTIN_AGENT_CREATOR_AGENT_KEY}。`,
36
+ "不要自己调用 prepareAgentDraft 或 createAgent;AI 创建助手负责草稿预览、用户确认和最终创建。",
37
+ "不要调用 deleteSpaces 这类高风险能力。",
38
+ ].join("\n");
39
+
40
+ export const BUILTIN_AGENT_CREATOR_PROMPT = [
41
+ "你是 Nolo 的 AI 创建助手,只负责通过对话帮助用户创建或调整一个新的 Agent。",
42
+ "先理解用户想让这个 AI 服务谁、完成什么任务、使用什么语气、需要哪些能力、是否需要知识引用,以及是否适合公开。",
43
+ "当信息足够形成初版配置时,先调用 prepareAgentDraft,生成可预览草稿;信息不足时每次只问一个关键问题。",
44
+ "prepareAgentDraft 只生成草稿,不代表已经创建真实 Agent。",
45
+ "草稿展示后,等待用户明确确认,例如“确认创建”“就按这个创建”“创建这个 AI”。",
46
+ "只有得到明确确认后,才调用 createAgent 创建真实 Agent。",
47
+ "用户只是讨论、补充、修改或说“先看看”时,不要调用 createAgent。",
48
+ "默认模型使用 provider=fireworks, model=accounts/fireworks/models/kimi-latest;除非用户明确要求且平台已知支持,不要选择 Claude/Anthropic 等当前 runtime 不支持的 provider。",
49
+ "公开状态保持保守:你可以建议公开,但只有用户明确要求公开发布时,createAgent 的 isPublic 才能为 true。",
50
+ "如果用户想手动微调模型、工具、知识引用或发布状态,可以引导用户进入 /create/agent 高级编辑页。",
51
+ ].join("\n");
52
+
53
+ export const buildBuiltinNoloRecord = () =>
54
+ buildBuiltinBaseAgent({
55
+ dbKey: BUILTIN_NOLO_AGENT_KEY,
56
+ id: BUILTIN_NOLO_AGENT_ID,
57
+ name: "nolo",
58
+ introduction:
59
+ "专门用来引导用户理解 Nolo 能做什么,并把问题带到正确入口或更合适的 Agent。",
60
+ greeting:
61
+ "你好,我是 nolo。你可以直接说你想做什么,我会帮你开始、解释入口,或把任务交给更合适的能力。",
62
+ provider: "fireworks",
63
+ model: FIREWORKS_KIMI_LATEST_MODEL,
64
+ useServerProxy: true,
65
+ apiSource: "platform",
66
+ runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
67
+ inputPrice: 0.95 * 8,
68
+ outputPrice: 4 * 8,
69
+ hasVision: true,
70
+ tags: ["nolo", "引导", "分发"],
71
+ tools: ["fetchWebpage", "runStreamingAgent"],
72
+ prompt: BUILTIN_NOLO_PROMPT,
73
+ });
74
+
75
+ export const buildBuiltinAppBuilderRecord = () =>
76
+ buildBuiltinBaseAgent({
77
+ ...APP_BUILDER_PRESET,
78
+ dbKey: BUILTIN_APP_BUILDER_AGENT_KEY,
79
+ id: BUILTIN_APP_BUILDER_AGENT_ID,
80
+ runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
81
+ tags: ["应用构建", "App Builder", "无代码"],
82
+ });
83
+
84
+ export const buildBuiltinEcommerceAgentRecord = () =>
85
+ buildBuiltinBaseAgent({
86
+ dbKey: BUILTIN_ECOMMERCE_AGENT_KEY,
87
+ id: BUILTIN_ECOMMERCE_AGENT_ID,
88
+ name: "电商商品参数助手",
89
+ introduction:
90
+ "专门获取淘宝、天猫、京东等电商商品真实参数、SKU、价格、库存和店铺信息,并做结构化对比。",
91
+ greeting: "发给我淘宝、天猫或京东商品链接,我会尽量获取真实商品参数。",
92
+ provider: "fireworks",
93
+ model: FIREWORKS_KIMI_LATEST_MODEL,
94
+ useServerProxy: true,
95
+ apiSource: "platform",
96
+ runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
97
+ inputPrice: 0.95 * 8,
98
+ outputPrice: 4 * 8,
99
+ hasVision: false,
100
+ tags: ["电商", "商品参数", "数据抓取"],
101
+ tools: ["taobaoTmallProductScraper", "jdProductScraper"],
102
+ prompt: [
103
+ "你是电商商品参数助手,只负责获取和整理电商商品真实数据。",
104
+ "当用户给淘宝/天猫链接或商品 ID 时,先提取数字 itemId,再调用 taobaoTmallProductScraper。",
105
+ "当用户给京东链接或 SKU 时,先提取数字 skuId,再调用 jdProductScraper。",
106
+ "输出要结构化:商品标题、品牌、型号、店铺、价格、SKU/规格、库存、尺寸重量、质保、数据来源和缺失项。",
107
+ "用户问参数或详情时,必须展开工具返回的详细参数,不要只摘要基础字段。",
108
+ "只输出用户请求的数据结果;不要输出寒暄、确认、过渡句或结尾追问。",
109
+ "如果用户给多个商品,逐个调用对应工具后再做对比表。",
110
+ "如果工具返回缺失字段,如实说明缺失;不要编造参数,也不要要求用户手抄页面。",
111
+ ].join("\n"),
112
+ });
113
+
114
+ export const buildBuiltinAgentCreatorRecord = () =>
115
+ buildBuiltinBaseAgent({
116
+ dbKey: BUILTIN_AGENT_CREATOR_AGENT_KEY,
117
+ id: BUILTIN_AGENT_CREATOR_AGENT_ID,
118
+ name: "AI 创建助手",
119
+ introduction:
120
+ "通过对话帮你整理专属 AI 的用途、能力、Prompt、知识引用和发布建议,并在确认后创建。",
121
+ greeting:
122
+ "告诉我你想创建一个什么样的 AI:它要帮谁、完成什么、需要哪些能力或资料?",
123
+ provider: "fireworks",
124
+ model: "accounts/fireworks/models/kimi-latest",
125
+ useServerProxy: true,
126
+ apiSource: "platform",
127
+ runtimeServerBase: BUILTIN_PUBLIC_RUNTIME_SERVER_BASE,
128
+ inputPrice: 0.95 * 8,
129
+ outputPrice: 4 * 8,
130
+ hasVision: false,
131
+ tags: ["AI 创建", "Agent 创建", "配置助手"],
132
+ tools: ["prepareAgentDraft", "createAgent"],
133
+ prompt: BUILTIN_AGENT_CREATOR_PROMPT,
134
+ });
135
+
136
+ export const normalizeBuiltinPublicAgentRecord = <T extends Record<string, any>>(
137
+ agent: T,
138
+ ): T => {
139
+ if (!agent || typeof agent !== "object") return agent;
140
+ const key = typeof agent.dbKey === "string" ? agent.dbKey : "";
141
+ const id = typeof agent.id === "string" ? agent.id : "";
142
+ const isBuiltinCreator =
143
+ key === BUILTIN_AGENT_CREATOR_AGENT_KEY || id === BUILTIN_AGENT_CREATOR_AGENT_ID;
144
+
145
+ if (!isBuiltinCreator) return agent;
146
+
147
+ const builtin = buildBuiltinAgentCreatorRecord();
148
+ return {
149
+ ...agent,
150
+ name: builtin.name,
151
+ introduction: builtin.introduction,
152
+ greeting: builtin.greeting,
153
+ provider: builtin.provider,
154
+ model: builtin.model,
155
+ useServerProxy: builtin.useServerProxy,
156
+ apiSource: builtin.apiSource,
157
+ runtimeServerBase: builtin.runtimeServerBase,
158
+ inputPrice: builtin.inputPrice,
159
+ outputPrice: builtin.outputPrice,
160
+ hasVision: builtin.hasVision,
161
+ references: builtin.references,
162
+ tags: builtin.tags,
163
+ tools: builtin.tools,
164
+ prompt: builtin.prompt,
165
+ };
166
+ };
167
+
168
+ export const BUILTIN_PLATFORM_AGENT_KEYS = [
169
+ BUILTIN_NOLO_AGENT_KEY,
170
+ BUILTIN_APP_BUILDER_AGENT_KEY,
171
+ BUILTIN_ECOMMERCE_AGENT_KEY,
172
+ BUILTIN_AGENT_CREATOR_AGENT_KEY,
173
+ ] as const;
174
+
175
+ const BUILTIN_PLATFORM_AGENT_KEY_SET = new Set<string>(BUILTIN_PLATFORM_AGENT_KEYS);
176
+
177
+ export const isBuiltinPlatformAgentRecord = (agent: {
178
+ dbKey?: string | null;
179
+ id?: string | null;
180
+ }): boolean => {
181
+ const dbKey = typeof agent?.dbKey === "string" ? agent.dbKey : "";
182
+ if (dbKey && BUILTIN_PLATFORM_AGENT_KEY_SET.has(dbKey)) return true;
183
+
184
+ const id = typeof agent?.id === "string" ? agent.id : "";
185
+ if (!id) return false;
186
+
187
+ return BUILTIN_PLATFORM_AGENT_KEYS.some((key) => key.endsWith(id));
188
+ };
189
+
190
+ export const shouldHideBuiltinAgentFromPublicPlaza = (agent: {
191
+ dbKey?: string | null;
192
+ id?: string | null;
193
+ }): boolean => isBuiltinPlatformAgentRecord(agent);
194
+
195
+ export const buildBuiltinPlatformAgentRecord = (dbKey: string) => {
196
+ if (dbKey === BUILTIN_NOLO_AGENT_KEY) {
197
+ return buildBuiltinNoloRecord();
198
+ }
199
+ if (dbKey === BUILTIN_APP_BUILDER_AGENT_KEY) {
200
+ return buildBuiltinAppBuilderRecord();
201
+ }
202
+ if (dbKey === BUILTIN_ECOMMERCE_AGENT_KEY) {
203
+ return buildBuiltinEcommerceAgentRecord();
204
+ }
205
+ if (dbKey === BUILTIN_AGENT_CREATOR_AGENT_KEY) {
206
+ return buildBuiltinAgentCreatorRecord();
207
+ }
208
+ return null;
209
+ };
package/core/config.ts ADDED
@@ -0,0 +1,15 @@
1
+ const providerName = "nolotus";
2
+
3
+ const slogonforYou =
4
+ "The goodness or badness of this world concerns every individual.";
5
+
6
+ // be cart CryptoJS.PBKDF2 keySize: 256 / AUTH_VERSION[1].keylen,
7
+ // even keylen same ,maybe error rn with web version
8
+ export const AUTH_VERSION = {
9
+ "1": {
10
+ iterations: 10000,
11
+ salt: providerName + slogonforYou,
12
+ keylen: 32,
13
+ },
14
+ };
15
+ export const SALT = AUTH_VERSION[1].salt;
package/core/crypto.ts ADDED
@@ -0,0 +1,51 @@
1
+ import nacl from "tweetnacl";
2
+ import { Base64 } from "js-base64";
3
+
4
+ export const signMessage = (
5
+ message: string,
6
+ secretKeyBase64: string
7
+ ): string => {
8
+ const messageUint8 = new TextEncoder().encode(message);
9
+ const signedMessage = nacl.sign(
10
+ messageUint8,
11
+ Base64.toUint8Array(secretKeyBase64)
12
+ );
13
+ return Base64.fromUint8Array(signedMessage);
14
+ };
15
+
16
+ export const verifySignedMessage = (
17
+ signedMessageBase64: string,
18
+ publicKeyBase64: string
19
+ ): string => {
20
+ const message = nacl.sign.open(
21
+ Base64.toUint8Array(signedMessageBase64),
22
+ Base64.toUint8Array(publicKeyBase64)
23
+ );
24
+
25
+ if (!message) throw new Error("Decoding failed");
26
+ return new TextDecoder().decode(message);
27
+ };
28
+
29
+ export const detachedSign = (message: string, secretKeyBase64: string) => {
30
+ const signature = nacl.sign.detached(
31
+ new TextEncoder().encode(message),
32
+ Base64.toUint8Array(secretKeyBase64)
33
+ );
34
+ return Base64.fromUint8Array(signature, true);
35
+ };
36
+
37
+ export const verifyDetachedSignature = (
38
+ message: string,
39
+ signatureBase64: string,
40
+ publicKeyBase64: string
41
+ ): boolean => {
42
+ try {
43
+ return nacl.sign.detached.verify(
44
+ new TextEncoder().encode(message),
45
+ Base64.toUint8Array(signatureBase64),
46
+ Base64.toUint8Array(publicKeyBase64)
47
+ );
48
+ } catch {
49
+ return false;
50
+ }
51
+ };
@@ -0,0 +1,15 @@
1
+ // keypair.ts
2
+ import nacl from "tweetnacl";
3
+ import { Base64 } from "js-base64";
4
+
5
+ export const generateKeyPairFromSeedV1 = (seedData: string) => {
6
+ const seed = new TextEncoder().encode(seedData);
7
+ const hashSeed = nacl.hash(seed);
8
+ const seed32 = hashSeed.slice(0, 32);
9
+ const keyPair = nacl.sign.keyPair.fromSeed(seed32);
10
+
11
+ return {
12
+ publicKey: Base64.fromUint8Array(keyPair.publicKey, true),
13
+ secretKey: Base64.fromUint8Array(keyPair.secretKey, true),
14
+ };
15
+ };
@@ -0,0 +1,22 @@
1
+ import nacl from "tweetnacl";
2
+
3
+ export const generateUserIdV1 = (
4
+ publicKey: string,
5
+ username: string,
6
+ language: string,
7
+ extra: string = ""
8
+ ) => {
9
+ const text = publicKey + username + language + extra;
10
+ const encodedText = new TextEncoder().encode(text);
11
+ const hash = nacl.hash(encodedText);
12
+
13
+ // 方案1:使用Array.from和map
14
+ const hexString = Array.from(hash)
15
+ .map((b) => b.toString(16).padStart(2, "0"))
16
+ .join("");
17
+
18
+ // 方案2:更简洁的写法,用Uint8Array直接转
19
+ // const hexString = [...hash].map(x => x.toString(16).padStart(2,'0')).join('');
20
+
21
+ return hexString.slice(0, 10);
22
+ };
package/core/init.ts ADDED
@@ -0,0 +1,41 @@
1
+ import { BUILTIN_NOLO_AGENT_KEY } from "./builtinAgents";
2
+
3
+ export const nolotusId = "0e95801d90";
4
+ export const copilotDemoId = "b2e06f801f";
5
+
6
+ const ADMIN_IDS = new Set([nolotusId, copilotDemoId]);
7
+
8
+ export const isSystemAdmin = (userId?: string | null) =>
9
+ userId != null && ADMIN_IDS.has(userId);
10
+
11
+ export const AI_ADMIN_ROLE = "AI管理员";
12
+
13
+ const envAiAdminIds = () =>
14
+ new Set(
15
+ (process.env.AI_ADMIN_USER_IDS ?? "")
16
+ .split(",")
17
+ .map((item) => item.trim())
18
+ .filter(Boolean)
19
+ );
20
+
21
+ const recordHasAiAdminRole = (record: unknown): boolean => {
22
+ if (!record || typeof record !== "object") return false;
23
+ const value = record as Record<string, unknown>;
24
+ const scalarFields = [value.role, value.globalRole, value.systemRole];
25
+ if (scalarFields.some((item) => item === AI_ADMIN_ROLE)) return true;
26
+ const listFields = [value.roles, value.globalRoles, value.systemRoles, value.permissions];
27
+ return listFields.some(
28
+ (item) => Array.isArray(item) && item.includes(AI_ADMIN_ROLE)
29
+ );
30
+ };
31
+
32
+ export const isAIAdmin = (
33
+ userId?: string | null,
34
+ ...records: unknown[]
35
+ ) =>
36
+ isSystemAdmin(userId) ||
37
+ (userId != null && envAiAdminIds().has(userId)) ||
38
+ records.some(recordHasAiAdminRole);
39
+
40
+ export const legacyNoloAgentId = "cybot-pub-01JYRSTM0MPPGQC9S25S3Y9J20";
41
+ export const noloAgentId = BUILTIN_NOLO_AGENT_KEY;
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_LOCAL_HOST = "127.0.0.1";
2
+ export const DEFAULT_LOCAL_API_PORT = "38123";
3
+
4
+ export const DEFAULT_LOCAL_API_ORIGIN = `http://${DEFAULT_LOCAL_HOST}:${DEFAULT_LOCAL_API_PORT}`;
5
+
6
+ export function normalizeOrigin(value: string): string {
7
+ return value.trim().replace(/\/+$/, "");
8
+ }
@@ -0,0 +1,13 @@
1
+ import CryptoJS from "crypto-js";
2
+ import { SALT, AUTH_VERSION } from ".//config";
3
+
4
+ export const hashPasswordV1 = async (password: string): Promise<string> => {
5
+ const hash = CryptoJS.PBKDF2(password, SALT, {
6
+ keySize: 256 / AUTH_VERSION[1].keylen,
7
+ iterations: AUTH_VERSION[1].iterations,
8
+ hasher: CryptoJS.algo.SHA512,
9
+ });
10
+
11
+ // 将 salt 和 hash 组合存储
12
+ return hash.toString(CryptoJS.enc.Base64);
13
+ };