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
@@ -69,8 +69,8 @@ export function renderHelpText() {
69
69
  " nolo space read 01KKY77TT0DA9NY7TNW3R7255N --content-key page-user-id --brief",
70
70
  " nolo space delete --name-prefix rn_owner_verify_0504 --yes",
71
71
  " nolo table query --table 01ABCXYZ",
72
- ' nolo table query --table meta-b2e06f801f-NOLOTASKBOARD --columns \'["title","status","owner","priority","codeStatus"]\' --no-base-fields --output items',
73
- ' nolo table update-row --table meta-b2e06f801f-NOLOTASKBOARD --row 01ROWID --changes \'{"status":"已完成"}\'',
72
+ ' nolo table query --table meta-0e95801d90-NOLOTASKBOARD --columns \'["title","status","owner","priority","codeStatus"]\' --no-base-fields --output items',
73
+ ' nolo table update-row --table meta-0e95801d90-NOLOTASKBOARD --row 01ROWID --changes \'{"status":"已完成"}\'',
74
74
  " nolo task-run read-context --row-dbkey row-user-table-row",
75
75
  " nolo llama status",
76
76
  ];
@@ -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
+ };
package/core/prefix.ts ADDED
@@ -0,0 +1,23 @@
1
+ const extractKeyPart = (key: string, index: number): string => {
2
+ const parts = key.split("-");
3
+ if (index < 2) {
4
+ return parts[index];
5
+ }
6
+ return parts.slice(index).join("-");
7
+ };
8
+
9
+ export const extractUserId = (key: string): string => {
10
+ const parts = key.split("-");
11
+
12
+ if (parts.length === 2) {
13
+ return parts[0];
14
+ }
15
+
16
+ if (parts[0] === "user" && parts[1] === "pref" && parts.length >= 3) {
17
+ return parts[2];
18
+ }
19
+
20
+ return extractKeyPart(key, 1);
21
+ };
22
+
23
+ export const extractCustomId = (key: string): string => extractKeyPart(key, 2);
@@ -0,0 +1,260 @@
1
+ // create/editor/transforms/fromMarkdown.ts
2
+
3
+ import { processInlineNodes } from "./inline";
4
+ import { transformTable } from "./table";
5
+
6
+ interface SlateNode {
7
+ type: string;
8
+ children: Array<any>;
9
+ text?: string;
10
+ bold?: boolean;
11
+ italic?: boolean;
12
+ ordered?: boolean;
13
+ url?: string;
14
+ language?: string | null;
15
+ alt?: string;
16
+ title?: string;
17
+ header?: boolean;
18
+ checked?: boolean;
19
+ html?: string;
20
+ start?: number;
21
+ value?: number;
22
+ columns?: any[];
23
+ // 从 Markdown meta 里解析出来的 preview 标记
24
+ // 使用字符串是为了兼容 element.preview === "true" 的判断
25
+ preview?: string;
26
+ }
27
+
28
+ /**
29
+ * 创建一个空段落节点
30
+ */
31
+ function createEmptyParagraph(): SlateNode {
32
+ return {
33
+ type: "paragraph",
34
+ children: [{ text: "" }],
35
+ };
36
+ }
37
+
38
+ /**
39
+ * 安全获取 children 数组
40
+ */
41
+ function getChildren(node: any): any[] {
42
+ if (!node || typeof node !== "object") return [];
43
+ if (!Array.isArray(node.children)) return [];
44
+ return node.children;
45
+ }
46
+
47
+ /**
48
+ * 从 mdast 的 code 节点中解析 preview meta
49
+ * 支持:
50
+ * ```tsx preview
51
+ * ```tsx preview=true
52
+ */
53
+ function getPreviewFlagFromMeta(node: any): "true" | undefined {
54
+ const meta = typeof node?.meta === "string" ? node.meta.trim() : "";
55
+ if (!meta) return undefined;
56
+
57
+ const tokens = meta.split(/\s+/);
58
+
59
+ const hasPreview = tokens.some((tok) => {
60
+ if (tok === "preview") return true;
61
+ if (tok.startsWith("preview=")) {
62
+ const [, value] = tok.split("=");
63
+ return value === "true";
64
+ }
65
+ return false;
66
+ });
67
+
68
+ return hasPreview ? "true" : undefined;
69
+ }
70
+
71
+ /**
72
+ * 将一个 list 节点转换为 Slate list 节点
73
+ */
74
+ function convertList(node: any): SlateNode {
75
+ const start = typeof node.start === "number" ? node.start : 1;
76
+ const items = getChildren(node);
77
+
78
+ return {
79
+ type: "list",
80
+ ordered: !!node.ordered,
81
+ start,
82
+ children: items.map((item: any, index: number) =>
83
+ convertListItem(item, start + index)
84
+ ),
85
+ };
86
+ }
87
+
88
+ /**
89
+ * 将 listItem 节点转换为 Slate list-item 节点
90
+ */
91
+ function convertListItem(item: any, value: number): SlateNode {
92
+ const children = convertListItemChildren(item);
93
+
94
+ const listItemNode: SlateNode = {
95
+ type: "list-item",
96
+ value,
97
+ children: children.length ? children : [createEmptyParagraph()],
98
+ };
99
+
100
+ if (item && (item.checked === true || item.checked === false)) {
101
+ listItemNode.checked = item.checked;
102
+ }
103
+
104
+ return listItemNode;
105
+ }
106
+
107
+ /**
108
+ * 将 listItem 里的子节点统一转换
109
+ * 支持:
110
+ * - 段落
111
+ * - 嵌套列表
112
+ * - 引用
113
+ * - 代码块
114
+ * - 表格
115
+ * - 分割线
116
+ * - HTML
117
+ * - 标题等
118
+ */
119
+ function convertListItemChildren(item: any): SlateNode[] {
120
+ const children = getChildren(item);
121
+ if (!children.length) return [createEmptyParagraph()];
122
+
123
+ return convertBlockChildren(children);
124
+ }
125
+
126
+ /**
127
+ * 转换一组「块级」节点(用于 root / blockquote / listItem 等容器)
128
+ */
129
+ function convertBlockChildren(nodes: any[]): SlateNode[] {
130
+ const result: SlateNode[] = [];
131
+
132
+ for (const node of nodes || []) {
133
+ const converted = convertBlockNode(node);
134
+ if (!converted) continue;
135
+
136
+ if (Array.isArray(converted)) {
137
+ result.push(...converted);
138
+ } else {
139
+ result.push(converted);
140
+ }
141
+ }
142
+
143
+ return result;
144
+ }
145
+
146
+ /**
147
+ * 将单个 mdast「块级」节点转换为 Slate 节点
148
+ * 这里处理所有可以作为块的类型:paragraph / heading / list / blockquote / code / table / html / thematicBreak ...
149
+ */
150
+ function convertBlockNode(node: any): SlateNode | SlateNode[] | null {
151
+ if (!node || typeof node !== "object") return null;
152
+
153
+ switch (node.type) {
154
+ // 段落
155
+ case "paragraph":
156
+ return {
157
+ type: "paragraph",
158
+ children: node.children?.length
159
+ ? processInlineNodes(node.children)
160
+ : [{ text: "" }],
161
+ };
162
+
163
+ // 标题
164
+ case "heading": {
165
+ const depth = (node as any).depth || 1;
166
+ const headings = ["one", "two", "three", "four", "five", "six"];
167
+ const suffix = headings[depth - 1] || "one";
168
+ return {
169
+ type: `heading-${suffix}`,
170
+ children: node.children?.length
171
+ ? processInlineNodes(node.children)
172
+ : [{ text: "" }],
173
+ };
174
+ }
175
+
176
+ // 代码块(支持 preview meta)
177
+ case "code":
178
+ return {
179
+ type: "code-block",
180
+ language: node.lang || "text",
181
+ preview: getPreviewFlagFromMeta(node),
182
+ children: (node.value || "").split("\n").map((line: string) => ({
183
+ type: "code-line",
184
+ children: [{ text: line }],
185
+ })),
186
+ };
187
+
188
+ // 列表
189
+ case "list":
190
+ return convertList(node);
191
+
192
+ // 引用块(blockquote)
193
+ case "blockquote": {
194
+ const children = convertBlockChildren(getChildren(node));
195
+ return {
196
+ type: "quote",
197
+ children: children.length ? children : [createEmptyParagraph()],
198
+ };
199
+ }
200
+
201
+ // 表格
202
+ case "table": {
203
+ const tableNode = transformTable(node);
204
+ return tableNode || null;
205
+ }
206
+
207
+ // 分割线
208
+ case "thematicBreak":
209
+ return { type: "thematic-break", children: [{ text: "" }] };
210
+
211
+ // 原始 HTML(块级)
212
+ case "html": {
213
+ // 原来的实现只处理 position.start.column === 1 的块级 html
214
+ // 这里保持同样逻辑,避免行为改变太大
215
+ const isBlockHtml = !node.position || node.position.start?.column === 1;
216
+
217
+ if (!isBlockHtml) return null;
218
+
219
+ return {
220
+ type: "html-block",
221
+ html: node.value || "",
222
+ children: [{ text: "" }],
223
+ };
224
+ }
225
+
226
+ // root:取 children 继续处理
227
+ case "root":
228
+ return convertBlockChildren(getChildren(node));
229
+
230
+ default:
231
+ return null;
232
+ }
233
+ }
234
+
235
+ /**
236
+ * 顶层入口:MDAST -> Slate 数组
237
+ */
238
+ export function mdastToSlate(mdastTree: any): SlateNode[] {
239
+ if (!mdastTree) {
240
+ return [createEmptyParagraph()];
241
+ }
242
+
243
+ let rootChildren: any[] = [];
244
+
245
+ if (mdastTree.type === "root") {
246
+ rootChildren = getChildren(mdastTree);
247
+ } else if (Array.isArray(mdastTree.children)) {
248
+ // 非 root 但有 children 的场景也兼容一下
249
+ rootChildren = mdastTree.children;
250
+ } else {
251
+ // 单节点也走统一转换
252
+ const single = convertBlockNode(mdastTree);
253
+ if (!single) return [createEmptyParagraph()];
254
+ return Array.isArray(single) ? single : [single];
255
+ }
256
+
257
+ const slateNodes = convertBlockChildren(rootChildren);
258
+
259
+ return slateNodes.length ? slateNodes : [createEmptyParagraph()];
260
+ }