nolo-cli 0.1.39 → 0.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +4 -4
  2. package/agent-runtime/dialogWritePlan.ts +39 -0
  3. package/agent-runtime/hostAdapter.ts +4 -0
  4. package/agent-runtime/hybridRecordStore.ts +5 -3
  5. package/agent-runtime/index.ts +15 -0
  6. package/agent-runtime/localLoop.ts +87 -7
  7. package/agent-runtime/localToolPolicy.ts +2 -13
  8. package/agent-runtime/localWorkspaceTools.ts +42 -110
  9. package/agent-runtime/runtimeToolPolicy.ts +2 -11
  10. package/agent-runtime/runtimeToolSurface.ts +198 -0
  11. package/agent-runtime/types.ts +1 -0
  12. package/agentAliases.ts +2 -1
  13. package/agentRunCommand.ts +10 -32
  14. package/agentRuntimeLocal.ts +1 -0
  15. package/ai/agent/_executeModel.ts +146 -0
  16. package/ai/agent/agentSlice.ts +556 -1
  17. package/ai/agent/appWorkingMemory.ts +126 -0
  18. package/ai/agent/buildEditingContext.ts +378 -0
  19. package/ai/agent/buildSystemPrompt.ts +585 -0
  20. package/ai/agent/canvasEditingContext.ts +49 -0
  21. package/ai/agent/cleanAgentMessages.ts +140 -0
  22. package/ai/agent/cliChatClient.ts +153 -0
  23. package/ai/agent/cliExecutor.ts +314 -40
  24. package/ai/agent/contextCompiler.ts +107 -0
  25. package/ai/agent/contextLayerContract.ts +44 -0
  26. package/ai/agent/createAgentSchema.ts +272 -0
  27. package/ai/agent/currentTimeContext.ts +65 -0
  28. package/ai/agent/executeToolCall.ts +58 -0
  29. package/ai/agent/fetchAgentContexts.ts +42 -0
  30. package/ai/agent/generatePrompt.ts +3 -0
  31. package/ai/agent/getFullChatContextKeys.ts +168 -0
  32. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  33. package/ai/agent/guidedCreation/types.ts +38 -0
  34. package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
  35. package/ai/agent/liveAudioModel.ts +2 -0
  36. package/ai/agent/pageBuilderHandoffRules.ts +75 -0
  37. package/ai/agent/persistMessageWithFixedId.ts +37 -0
  38. package/ai/agent/planSlice.ts +259 -0
  39. package/ai/agent/referenceUtils.ts +229 -0
  40. package/ai/agent/runAgentBackground.ts +310 -0
  41. package/ai/agent/runAgentClientLoop.ts +164 -0
  42. package/ai/agent/runtimeGuidance.ts +116 -0
  43. package/ai/agent/serverOrigin.ts +7 -0
  44. package/ai/agent/startParallelAgentStreams.ts +424 -0
  45. package/ai/agent/startupProtocol.ts +53 -0
  46. package/ai/agent/streamAgentChatTurn.ts +2001 -0
  47. package/ai/agent/streamAgentChatTurnUtils.ts +860 -0
  48. package/ai/agent/toolFailureGuard.ts +99 -0
  49. package/ai/agent/types.ts +73 -0
  50. package/ai/agent/utils/imageOutput.ts +37 -0
  51. package/ai/agent/utils/publicImageAgentMode.ts +26 -0
  52. package/ai/ai.locale.ts +1095 -0
  53. package/ai/chat/accumulateToolCallChunks.ts +126 -0
  54. package/ai/chat/fetchUtils.ts +143 -0
  55. package/ai/chat/inlineImageUrlsForCustomProvider.ts +117 -0
  56. package/ai/chat/parseApiError.ts +67 -0
  57. package/ai/chat/parseMultilineSSE.ts +95 -0
  58. package/ai/chat/sendOpenAICompletionsRequest.ts +897 -0
  59. package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
  60. package/ai/chat/serverProxyRetry.ts +102 -0
  61. package/ai/chat/shouldUseServerProxy.ts +18 -0
  62. package/ai/chat/streamRetry.ts +46 -0
  63. package/ai/chat/updateTotalUsage.ts +89 -0
  64. package/ai/context/buildReferenceContext.ts +437 -0
  65. package/ai/context/retention.ts +165 -0
  66. package/ai/context/tokenUtils.ts +78 -0
  67. package/ai/llm/agentCapabilities.ts +74 -0
  68. package/ai/llm/deepinfra.ts +79 -0
  69. package/ai/llm/fireworks.ts +68 -0
  70. package/ai/llm/generateRequestBody.ts +165 -0
  71. package/ai/llm/getModelContextWindow.ts +93 -0
  72. package/ai/llm/getPricing.ts +252 -0
  73. package/ai/llm/imagePricing.ts +66 -0
  74. package/ai/llm/isResponseAPIModel.ts +13 -0
  75. package/ai/llm/kimi.ts +23 -0
  76. package/ai/llm/mimo.ts +99 -0
  77. package/ai/llm/mistral.ts +21 -0
  78. package/ai/llm/models.ts +45 -0
  79. package/ai/llm/openrouterModels.ts +6 -0
  80. package/ai/llm/providers.ts +313 -0
  81. package/ai/llm/reasoningModels.ts +27 -0
  82. package/ai/llm/types.ts +82 -0
  83. package/ai/llm/usageRequestOptions.ts +59 -0
  84. package/ai/memory/queryShared.ts +161 -0
  85. package/ai/memory/recentRelationshipRecap.ts +247 -0
  86. package/ai/memory/remember.ts +167 -0
  87. package/ai/memory/store.ts +20 -0
  88. package/ai/memory/storeShared.ts +76 -0
  89. package/ai/memory/types.ts +46 -0
  90. package/ai/memory/understanding.ts +349 -0
  91. package/ai/memory/understandingGreeting.ts +264 -0
  92. package/ai/policy/personalizationDialog.ts +333 -0
  93. package/ai/policy/runtimePolicy.ts +454 -0
  94. package/ai/policy/selfUpdateFields.ts +48 -0
  95. package/ai/policy/types.ts +64 -0
  96. package/ai/skills/referenceRuntime.ts +274 -0
  97. package/ai/skills/skillDiagnostics.ts +251 -0
  98. package/ai/skills/skillDocBuilder.ts +139 -0
  99. package/ai/skills/skillSummaryMarker.ts +26 -0
  100. package/ai/token/calculatePrice.ts +576 -0
  101. package/ai/token/missingUsageEstimate.ts +42 -0
  102. package/ai/token/normalizeUsage.ts +124 -0
  103. package/ai/token/openaiImageGenerationUsage.ts +56 -0
  104. package/ai/token/prepareTokenUsageData.ts +93 -0
  105. package/ai/token/resolveBillingTarget.ts +52 -0
  106. package/ai/token/saveTokenRecord.ts +53 -0
  107. package/ai/token/types.ts +103 -0
  108. package/ai/tools/agent/agentTools.ts +235 -0
  109. package/ai/tools/agent/agentUpdateShared.ts +311 -0
  110. package/ai/tools/agent/callAgentTool.ts +139 -0
  111. package/ai/tools/agent/createAgentTool.ts +512 -0
  112. package/ai/tools/agent/createDialogTool.ts +69 -0
  113. package/ai/tools/agent/createSkillAgentTool.ts +62 -0
  114. package/ai/tools/agent/parallelBudget.ts +221 -0
  115. package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
  116. package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
  117. package/ai/tools/agent/runLlmTool.ts +96 -0
  118. package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
  119. package/ai/tools/agent/skillAgentArgs.ts +106 -0
  120. package/ai/tools/agent/startAgentDialogTool.ts +53 -0
  121. package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
  122. package/ai/tools/agent/updateAgentTool.ts +96 -0
  123. package/ai/tools/agent/updateSelfTool.ts +113 -0
  124. package/ai/tools/amazonProductScraperTool.ts +86 -0
  125. package/ai/tools/apifyActorClient.ts +45 -0
  126. package/ai/tools/appEditGuard.ts +372 -0
  127. package/ai/tools/appReadSnapshot.ts +153 -0
  128. package/ai/tools/appTools.ts +1549 -0
  129. package/ai/tools/applyEditTool.ts +259 -0
  130. package/ai/tools/applyLineEditsTool.ts +315 -0
  131. package/ai/tools/browserTools/click.ts +33 -0
  132. package/ai/tools/browserTools/closeSession.ts +29 -0
  133. package/ai/tools/browserTools/common.ts +27 -0
  134. package/ai/tools/browserTools/openSession.ts +48 -0
  135. package/ai/tools/browserTools/readContent.ts +38 -0
  136. package/ai/tools/browserTools/selectOption.ts +46 -0
  137. package/ai/tools/browserTools/typeText.ts +42 -0
  138. package/ai/tools/category/createCategoryTool.ts +66 -0
  139. package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
  140. package/ai/tools/category/updateContentCategoryTool.ts +75 -0
  141. package/ai/tools/cfBrowserTools.ts +319 -0
  142. package/ai/tools/cfSpeechToTextTool.ts +49 -0
  143. package/ai/tools/checkEnvTool.ts +102 -0
  144. package/ai/tools/cloudflareCrawlTool.ts +289 -0
  145. package/ai/tools/codeSearchTool.ts +123 -0
  146. package/ai/tools/codeTools.ts +101 -0
  147. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  148. package/ai/tools/createDocTool.ts +132 -0
  149. package/ai/tools/createSkillDocTool.ts +155 -0
  150. package/ai/tools/createWorkflowTool.ts +154 -0
  151. package/ai/tools/delayTool.ts +31 -0
  152. package/ai/tools/deleteSpacesTool.ts +325 -0
  153. package/ai/tools/deleteSpacesToolModel.ts +159 -0
  154. package/ai/tools/devReloadUtils.ts +29 -0
  155. package/ai/tools/dialogMessageSearch.ts +137 -0
  156. package/ai/tools/doctorSkillTool.ts +72 -0
  157. package/ai/tools/ecommerceScraperTool.ts +86 -0
  158. package/ai/tools/emailTools.ts +549 -0
  159. package/ai/tools/evalSkillTool.ts +92 -0
  160. package/ai/tools/exaSearchTool.ts +63 -0
  161. package/ai/tools/execShellTool.ts +266 -0
  162. package/ai/tools/executeSqlTool.ts +192 -0
  163. package/ai/tools/fetchWebpageSupport.ts +333 -0
  164. package/ai/tools/fetchWebpageTool.ts +97 -0
  165. package/ai/tools/geminiImagePreviewTool.ts +386 -0
  166. package/ai/tools/generateDocxTool.ts +215 -0
  167. package/ai/tools/googleSearchScraperTool.ts +106 -0
  168. package/ai/tools/importDataTool.ts +133 -0
  169. package/ai/tools/importSkillTool.ts +162 -0
  170. package/ai/tools/index.ts +2308 -0
  171. package/ai/tools/jdProductScraperTool.ts +821 -0
  172. package/ai/tools/listUserSpacesTool.ts +113 -0
  173. package/ai/tools/localFilesTool.ts +276 -0
  174. package/ai/tools/marxistsOfflineBook.ts +253 -0
  175. package/ai/tools/modelUsageTools.ts +206 -0
  176. package/ai/tools/noloWorkspaceReadTools.ts +467 -0
  177. package/ai/tools/olmOcrTool.ts +33 -0
  178. package/ai/tools/openaiImageTool.ts +267 -0
  179. package/ai/tools/prepareTools.ts +23 -0
  180. package/ai/tools/readDocTool.ts +88 -0
  181. package/ai/tools/readFileTool.ts +214 -0
  182. package/ai/tools/readTool.ts +194 -0
  183. package/ai/tools/readXPostTool.ts +229 -0
  184. package/ai/tools/readXhsProfileTool.ts +627 -0
  185. package/ai/tools/rememberMemoryTool.ts +84 -0
  186. package/ai/tools/remotionVideoTool.ts +151 -0
  187. package/ai/tools/searchDialogMessagesTool.ts +222 -0
  188. package/ai/tools/searchWorkspaceTool.ts +259 -0
  189. package/ai/tools/skillFollowup.ts +86 -0
  190. package/ai/tools/surfWeatherTool.ts +169 -0
  191. package/ai/tools/table/addTableRowTool.ts +217 -0
  192. package/ai/tools/table/createTableTool.ts +315 -0
  193. package/ai/tools/table/rowTools.ts +386 -0
  194. package/ai/tools/table/schemaTools.ts +244 -0
  195. package/ai/tools/table/shareTableTool.ts +148 -0
  196. package/ai/tools/table/toolShared.ts +129 -0
  197. package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
  198. package/ai/tools/toolApiClient.ts +279 -0
  199. package/ai/tools/toolResultError.ts +42 -0
  200. package/ai/tools/toolRunSlice.ts +303 -0
  201. package/ai/tools/toolSchemaCompatibility.ts +53 -0
  202. package/ai/tools/uiAskChoiceTool.ts +104 -0
  203. package/ai/tools/updateContentTitleTool.ts +84 -0
  204. package/ai/tools/updateDocTool.ts +105 -0
  205. package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
  206. package/ai/tools/wereadGatewayTool.ts +152 -0
  207. package/ai/tools/whisperTool.ts +76 -0
  208. package/ai/tools/writeFileTool.ts +213 -0
  209. package/ai/tools/youtubeScraperTool.ts +116 -0
  210. package/ai/tools/ziweiChartTool.ts +678 -0
  211. package/ai/types.ts +55 -0
  212. package/ai/workflow/workflowExecutor.ts +323 -0
  213. package/ai/workflow/workflowSlice.ts +73 -0
  214. package/ai/workflow/workflowTypes.ts +106 -0
  215. package/app/actions/syncAppRecord.ts +73 -0
  216. package/app/constants/animationSets.ts +21 -0
  217. package/app/constants/appEditor.ts +99 -0
  218. package/app/favorite/favoriteSlice.ts +690 -0
  219. package/app/favorite/type.ts +43 -0
  220. package/app/hooks/deleteDbKey.ts +233 -0
  221. package/app/i18n/client.ts +13 -0
  222. package/app/i18n/i18n.base.ts +14 -0
  223. package/app/i18n/i18n.config.ts +77 -0
  224. package/app/i18n/index.ts +15 -0
  225. package/app/i18n/mapLanguage.ts +11 -0
  226. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  227. package/app/i18n/translations/error.locale.ts +246 -0
  228. package/app/i18n/translations/interface.locale.ts +2174 -0
  229. package/app/i18n/translations/pricing.locale.ts +397 -0
  230. package/app/i18n/translations/privacy.locale.ts +168 -0
  231. package/app/i18n/translations/seo.locale.ts +129 -0
  232. package/app/i18n/translations/terms.locale.ts +124 -0
  233. package/app/i18n/types.ts +6 -0
  234. package/app/notifications/model.ts +77 -0
  235. package/app/notifications/notificationSlice.ts +141 -0
  236. package/app/reducer.ts +36 -0
  237. package/app/settings/dbActionThunks.ts +34 -0
  238. package/app/settings/defaultSpacePreference.ts +87 -0
  239. package/app/settings/settingSlice.tsx +1212 -0
  240. package/app/settings/settingsRecord.ts +8 -0
  241. package/app/stateViews/runtime.ts +90 -0
  242. package/app/store.ts +55 -0
  243. package/app/theme/colors.ts +280 -0
  244. package/app/theme/fontPreference.ts +77 -0
  245. package/app/theme/theme.config.ts +120 -0
  246. package/app/theme/themeModeBootstrap.ts +123 -0
  247. package/app/types/appSummary.ts +114 -0
  248. package/app/types.ts +358 -0
  249. package/app/utils/appKeys.ts +55 -0
  250. package/app/utils/async.ts +28 -0
  251. package/app/utils/desktopAgentRuntimeTurnClient.ts +73 -0
  252. package/app/utils/env.ts +17 -0
  253. package/app/utils/fileUtils.ts +229 -0
  254. package/app/utils/imageUtils.ts +274 -0
  255. package/app/utils/myContentItems.ts +289 -0
  256. package/app/utils/retryAfter.ts +36 -0
  257. package/app/utils/retryFetch.ts +61 -0
  258. package/app/utils/toast.ts +3 -0
  259. package/auth/action/signUpAction.ts +227 -0
  260. package/auth/adminPermissions.ts +18 -0
  261. package/auth/authSlice.ts +531 -0
  262. package/auth/client/loginRequest.ts +14 -0
  263. package/auth/resetAuthScopedClientState.ts +27 -0
  264. package/auth/routes.ts +178 -0
  265. package/auth/token.ts +63 -0
  266. package/auth/types.ts +40 -0
  267. package/chat/chat.locale.ts +813 -0
  268. package/chat/dialog/actions/addCybotAction.ts +52 -0
  269. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  270. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  271. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  272. package/chat/dialog/actions/createDialogAction.ts +379 -0
  273. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  274. package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
  275. package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
  276. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  277. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  278. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  279. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  280. package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
  281. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  282. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  283. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  284. package/chat/dialog/dialogAgents.ts +72 -0
  285. package/chat/dialog/dialogSlice.ts +872 -0
  286. package/chat/dialog/dialogTitle.ts +81 -0
  287. package/chat/dialog/dialogTokenStats.ts +12 -0
  288. package/chat/dialog/dialogUrl.ts +6 -0
  289. package/chat/dialog/goal.ts +108 -0
  290. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  291. package/chat/dialog/schedule.ts +17 -0
  292. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  293. package/chat/messages/fetchConvMsgs.ts +51 -0
  294. package/chat/messages/fileUrl.ts +13 -0
  295. package/chat/messages/messageAgent.ts +8 -0
  296. package/chat/messages/messageContent.ts +199 -0
  297. package/chat/messages/messageContract.ts +88 -0
  298. package/chat/messages/messageSlice.ts +1367 -0
  299. package/chat/messages/toolThunks.ts +625 -0
  300. package/cli/agentAliases.ts +2 -1
  301. package/cli/agentRunCommand.ts +10 -32
  302. package/cli/agentRuntimeLocal.ts +1 -0
  303. package/cli/client/agentRun.ts +67 -95
  304. package/cli/client/localRuntimeAdapter.ts +323 -54
  305. package/cli/commandRegistry.ts +2 -2
  306. package/cli/machineWsRunDispatch.ts +51 -6
  307. package/cli/offlineMarxistsAgentCommand.ts +6 -4
  308. package/client/agentConfigResolver.test.ts +2 -2
  309. package/client/agentRun.test.ts +175 -57
  310. package/client/agentRun.ts +67 -95
  311. package/client/localRuntimeAdapter.test.ts +682 -37
  312. package/client/localRuntimeAdapter.ts +323 -54
  313. package/client/localRuntimeDryRun.test.ts +23 -9
  314. package/client/localToolPolicy.test.ts +4 -4
  315. package/commandRegistry.ts +2 -2
  316. package/core/builtinAgents.ts +209 -0
  317. package/core/config.ts +15 -0
  318. package/core/crypto.ts +51 -0
  319. package/core/generateKeyPairFromSeedV1.ts +15 -0
  320. package/core/generateMainKey.ts +22 -0
  321. package/core/init.ts +41 -0
  322. package/core/localOrigins.ts +8 -0
  323. package/core/password.ts +13 -0
  324. package/core/prefix.ts +23 -0
  325. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  326. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  327. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  328. package/create/editor/transforms/markdownToSlate.ts +24 -0
  329. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  330. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  331. package/create/editor/transforms/slateToText.ts +33 -0
  332. package/create/editor/utils/slateUtils.ts +233 -0
  333. package/create/space/addSpaceAction.ts +193 -0
  334. package/create/space/category/categoryActions.ts +427 -0
  335. package/create/space/changeSpaceAction.ts +36 -0
  336. package/create/space/constants.ts +8 -0
  337. package/create/space/content/addContentAction.ts +116 -0
  338. package/create/space/content/contentThunks.ts +90 -0
  339. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  340. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  341. package/create/space/content/moveContentAction.ts +285 -0
  342. package/create/space/content/updateContentCategoryAction.ts +154 -0
  343. package/create/space/content/updateContentTitleAction.ts +151 -0
  344. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  345. package/create/space/contentKeyUtils.ts +117 -0
  346. package/create/space/deleteSpaceAction.ts +276 -0
  347. package/create/space/fetchSpaceAction.ts +70 -0
  348. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  349. package/create/space/loadDefaultSpaceAction.ts +57 -0
  350. package/create/space/member/addMemberAction.ts +79 -0
  351. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  352. package/create/space/member/memberThunks.ts +47 -0
  353. package/create/space/member/removeMemberAction.ts +67 -0
  354. package/create/space/resolvePreferredSpaceId.ts +113 -0
  355. package/create/space/sidebarVisibleTypes.ts +241 -0
  356. package/create/space/space.locale.ts +1087 -0
  357. package/create/space/spaceAccess.ts +182 -0
  358. package/create/space/spaceCollapsedState.ts +54 -0
  359. package/create/space/spaceKeys.ts +65 -0
  360. package/create/space/spaceSlice.ts +328 -0
  361. package/create/space/spaceThunks.ts +410 -0
  362. package/create/space/types.ts +27 -0
  363. package/create/space/updateSpaceAction.ts +107 -0
  364. package/create/space/utils/permissions.ts +47 -0
  365. package/create/types.ts +21 -0
  366. package/database/actions/agentReadResolution.ts +33 -0
  367. package/database/actions/common.ts +243 -0
  368. package/database/actions/deleteFile.ts +40 -0
  369. package/database/actions/fileContent.ts +125 -0
  370. package/database/actions/patch.ts +155 -0
  371. package/database/actions/read.ts +358 -0
  372. package/database/actions/readAndWait.ts +260 -0
  373. package/database/actions/readRequestManager.ts +120 -0
  374. package/database/actions/readResolution.ts +125 -0
  375. package/database/actions/remove.ts +94 -0
  376. package/database/actions/replication.ts +477 -0
  377. package/database/actions/upload.ts +186 -0
  378. package/database/actions/upsert.ts +56 -0
  379. package/database/actions/write.ts +146 -0
  380. package/database/authority/ownerKey.ts +80 -0
  381. package/database/authority/recordAuthority.ts +67 -0
  382. package/database/authority/userAuthorityRegistry.ts +54 -0
  383. package/database/client/fetchUserData.ts +61 -0
  384. package/database/dbActionThunks.ts +1 -0
  385. package/database/dbSlice.ts +149 -0
  386. package/database/fileRing.ts +51 -0
  387. package/database/fileStorage.ts +232 -0
  388. package/database/fileUrl.ts +34 -0
  389. package/database/keys.ts +767 -0
  390. package/database/queryPrefixes.ts +14 -0
  391. package/database/requests.ts +443 -0
  392. package/database/runtimeServerContext.ts +54 -0
  393. package/database/server/levelAuthorityStore.ts +20 -1
  394. package/database/tenantPlacement.ts +57 -0
  395. package/database/userPreferenceRegister.ts +131 -0
  396. package/database/utils/ulid.ts +1 -0
  397. package/integrations/anthropic/anthropicModels.ts +47 -0
  398. package/integrations/deepseek/models.ts +37 -0
  399. package/integrations/google/models.ts +341 -0
  400. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  401. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  402. package/integrations/openai/flexTier.ts +102 -0
  403. package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
  404. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  405. package/integrations/openai/models.ts +271 -0
  406. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  407. package/integrations/openai/responsesHelpers.ts +297 -0
  408. package/integrations/x-reader/types.ts +109 -0
  409. package/integrations/xai/models.ts +13 -0
  410. package/integrations/xhs-reader/analyze/profileAnalyzer.ts +205 -0
  411. package/integrations/xhs-reader/backends/playwrightProfileCollector.ts +624 -0
  412. package/integrations/xhs-reader/bridge/readXhsProfileWithBridge.ts +227 -0
  413. package/integrations/xhs-reader/client/xhsWebApiClient.ts +229 -0
  414. package/integrations/xhs-reader/normalize.ts +390 -0
  415. package/integrations/xhs-reader/orchestrator.ts +178 -0
  416. package/integrations/xhs-reader/redaction.ts +68 -0
  417. package/integrations/xhs-reader/types.ts +244 -0
  418. package/integrations/xhs-reader/url.ts +57 -0
  419. package/machineWsRunDispatch.ts +51 -6
  420. package/offlineMarxistsAgentCommand.ts +6 -4
  421. package/package.json +430 -3
  422. package/render/page/createPageAction.ts +183 -0
  423. package/render/page/docSlice.ts +468 -0
  424. package/render/page/types.ts +17 -0
  425. package/render/table/createTableAction.ts +270 -0
  426. package/render/table/deleteTableAction.ts +193 -0
  427. package/render/table/fetchAndCacheTableRows.ts +174 -0
  428. package/render/table/tableSlice.ts +1106 -0
  429. package/render/table/toolValueUtils.ts +363 -0
  430. package/render/table/types.ts +252 -0
  431. package/render/table/utils/tableSerialization.ts +50 -0
  432. package/server/handlers/agentRun/types.ts +104 -0
  433. package/share/action.ts +225 -0
  434. package/share/helpers.ts +302 -0
  435. package/share/keys.ts +243 -0
  436. package/share/publicSharePolicy.ts +27 -0
  437. package/share/shareSlice.ts +53 -0
  438. package/share/types.ts +100 -0
@@ -0,0 +1,244 @@
1
+ import { patchRecord, loadTableMetaOrThrow, ensureRowsLoaded, resolveTableIdentity } from "./toolShared";
2
+ import type { RootState } from "../../../app/store";
3
+ import type { TableColumn } from "../../../render/table/types";
4
+ import { ulid } from "../../../database/utils/ulid";
5
+
6
+ const requireTableIdentity = (args: { tenantId?: string; tableId?: string }, thunkApi: any) => {
7
+ const state = thunkApi.getState() as RootState;
8
+ const { tenantId, tableId } = resolveTableIdentity(args, state);
9
+ if (!tenantId || !tableId) {
10
+ throw new Error("需要显式提供 tenantId 和 tableId,或在已打开的表页面中调用。");
11
+ }
12
+ return { tenantId, tableId };
13
+ };
14
+
15
+ const ensureColumnName = (name: unknown): string => {
16
+ if (typeof name !== "string" || !name.trim()) {
17
+ throw new Error("列名不能为空。");
18
+ }
19
+ return name.trim();
20
+ };
21
+
22
+ const normalizeOptions = (options: unknown): string[] | undefined => {
23
+ if (!Array.isArray(options)) return undefined;
24
+ const normalized = options
25
+ .map((value) => (typeof value === "string" ? value.trim() : ""))
26
+ .filter(Boolean);
27
+ return normalized.length > 0 ? normalized : undefined;
28
+ };
29
+
30
+ export const addTableColumnFunctionSchema = {
31
+ name: "addTableColumn",
32
+ description: "向指定表中新增一列。",
33
+ parameters: {
34
+ type: "object",
35
+ properties: {
36
+ tenantId: { type: "string" },
37
+ tableId: { type: "string" },
38
+ name: { type: "string" },
39
+ label: { type: "string" },
40
+ type: {
41
+ type: "string",
42
+ enum: ["text", "number", "boolean", "date", "datetime", "select", "multi_select"],
43
+ },
44
+ description: { type: "string" },
45
+ required: { type: "boolean" },
46
+ options: { type: "array", items: { type: "string" } },
47
+ },
48
+ required: ["name"],
49
+ },
50
+ };
51
+
52
+ export async function addTableColumnFunc(args: any, thunkApi: any) {
53
+ const { tenantId, tableId } = requireTableIdentity(args, thunkApi);
54
+ const tableMeta = await loadTableMetaOrThrow(thunkApi, tenantId, tableId);
55
+ const name = ensureColumnName(args?.name);
56
+ if (tableMeta.columns.some((column) => column.name === name)) {
57
+ throw new Error(`字段 ${name} 已存在。`);
58
+ }
59
+
60
+ const column: TableColumn = {
61
+ id: ulid(),
62
+ name,
63
+ label: typeof args?.label === "string" && args.label.trim() ? args.label.trim() : name,
64
+ type: typeof args?.type === "string" ? args.type : "text",
65
+ description: typeof args?.description === "string" && args.description.trim() ? args.description.trim() : undefined,
66
+ required: typeof args?.required === "boolean" ? args.required : undefined,
67
+ options: normalizeOptions(args?.options),
68
+ };
69
+
70
+ const updatedAt = new Date().toISOString();
71
+ const updated = await patchRecord(thunkApi, tableMeta.dbKey, {
72
+ columns: [...tableMeta.columns, column],
73
+ updatedAt,
74
+ });
75
+
76
+ return {
77
+ rawData: updated,
78
+ displayData: `已向表「${tableMeta.displayName || tableId}」新增字段 ${name}。`,
79
+ };
80
+ }
81
+
82
+ export const deleteTableColumnFunctionSchema = {
83
+ name: "deleteTableColumn",
84
+ description: "删除指定表中的某一列,并同步从已有行中移除该字段。",
85
+ parameters: {
86
+ type: "object",
87
+ properties: {
88
+ tenantId: { type: "string" },
89
+ tableId: { type: "string" },
90
+ columnName: { type: "string" },
91
+ },
92
+ required: ["columnName"],
93
+ },
94
+ };
95
+
96
+ export async function deleteTableColumnFunc(args: any, thunkApi: any) {
97
+ const { tenantId, tableId } = requireTableIdentity(args, thunkApi);
98
+ const tableMeta = await loadTableMetaOrThrow(thunkApi, tenantId, tableId);
99
+ const columnName = ensureColumnName(args?.columnName);
100
+ if (!tableMeta.columns.some((column) => column.name === columnName)) {
101
+ throw new Error(`字段 ${columnName} 不存在。`);
102
+ }
103
+
104
+ const rows = await ensureRowsLoaded(thunkApi, tenantId, tableId);
105
+ const updatedAt = new Date().toISOString();
106
+ for (const row of rows) {
107
+ if (Object.prototype.hasOwnProperty.call(row, columnName)) {
108
+ await patchRecord(thunkApi, row.dbKey, {
109
+ [columnName]: null,
110
+ updatedAt,
111
+ });
112
+ }
113
+ }
114
+
115
+ const updated = await patchRecord(thunkApi, tableMeta.dbKey, {
116
+ columns: tableMeta.columns.filter((column) => column.name !== columnName),
117
+ updatedAt,
118
+ });
119
+
120
+ return {
121
+ rawData: updated,
122
+ displayData: `已从表「${tableMeta.displayName || tableId}」删除字段 ${columnName}。`,
123
+ };
124
+ }
125
+
126
+ export const renameTableColumnFunctionSchema = {
127
+ name: "renameTableColumn",
128
+ description: "修改表字段的 machine name,并同步迁移所有已有行的数据 key。",
129
+ parameters: {
130
+ type: "object",
131
+ properties: {
132
+ tenantId: { type: "string" },
133
+ tableId: { type: "string" },
134
+ oldName: { type: "string" },
135
+ newName: { type: "string" },
136
+ },
137
+ required: ["oldName", "newName"],
138
+ },
139
+ };
140
+
141
+ export async function renameTableColumnFunc(args: any, thunkApi: any) {
142
+ const { tenantId, tableId } = requireTableIdentity(args, thunkApi);
143
+ const tableMeta = await loadTableMetaOrThrow(thunkApi, tenantId, tableId);
144
+ const oldName = ensureColumnName(args?.oldName);
145
+ const newName = ensureColumnName(args?.newName);
146
+
147
+ if (!tableMeta.columns.some((column) => column.name === oldName)) {
148
+ throw new Error(`字段 ${oldName} 不存在。`);
149
+ }
150
+ if (tableMeta.columns.some((column) => column.name === newName)) {
151
+ throw new Error(`字段 ${newName} 已存在。`);
152
+ }
153
+
154
+ const rows = await ensureRowsLoaded(thunkApi, tenantId, tableId);
155
+ const updatedAt = new Date().toISOString();
156
+ for (const row of rows) {
157
+ if (Object.prototype.hasOwnProperty.call(row, oldName)) {
158
+ await patchRecord(thunkApi, row.dbKey, {
159
+ [newName]: row[oldName],
160
+ [oldName]: null,
161
+ updatedAt,
162
+ });
163
+ }
164
+ }
165
+
166
+ const updated = await patchRecord(thunkApi, tableMeta.dbKey, {
167
+ columns: tableMeta.columns.map((column) =>
168
+ column.name === oldName ? { ...column, name: newName } : column
169
+ ),
170
+ updatedAt,
171
+ });
172
+
173
+ return {
174
+ rawData: updated,
175
+ displayData: `已将表「${tableMeta.displayName || tableId}」中的字段 ${oldName} 重命名为 ${newName}。`,
176
+ };
177
+ }
178
+
179
+ export const renameTableColumnLabelFunctionSchema = {
180
+ name: "renameTableColumnLabel",
181
+ description: "修改表字段的显示名,不改变行数据里的 key。",
182
+ parameters: {
183
+ type: "object",
184
+ properties: {
185
+ tenantId: { type: "string" },
186
+ tableId: { type: "string" },
187
+ columnName: { type: "string" },
188
+ newLabel: { type: "string" },
189
+ },
190
+ required: ["columnName", "newLabel"],
191
+ },
192
+ };
193
+
194
+ export async function renameTableColumnLabelFunc(args: any, thunkApi: any) {
195
+ const { tenantId, tableId } = requireTableIdentity(args, thunkApi);
196
+ const tableMeta = await loadTableMetaOrThrow(thunkApi, tenantId, tableId);
197
+ const columnName = ensureColumnName(args?.columnName);
198
+ const newLabel = ensureColumnName(args?.newLabel);
199
+
200
+ if (!tableMeta.columns.some((column) => column.name === columnName)) {
201
+ throw new Error(`字段 ${columnName} 不存在。`);
202
+ }
203
+
204
+ const updated = await patchRecord(thunkApi, tableMeta.dbKey, {
205
+ columns: tableMeta.columns.map((column) =>
206
+ column.name === columnName ? { ...column, label: newLabel } : column
207
+ ),
208
+ updatedAt: new Date().toISOString(),
209
+ });
210
+
211
+ return {
212
+ rawData: updated,
213
+ displayData: `已将字段 ${columnName} 的显示名更新为 ${newLabel}。`,
214
+ };
215
+ }
216
+
217
+ export const renameTableFunctionSchema = {
218
+ name: "renameTable",
219
+ description: "更新表的显示名称。",
220
+ parameters: {
221
+ type: "object",
222
+ properties: {
223
+ tenantId: { type: "string" },
224
+ tableId: { type: "string" },
225
+ newName: { type: "string" },
226
+ },
227
+ required: ["newName"],
228
+ },
229
+ };
230
+
231
+ export async function renameTableFunc(args: any, thunkApi: any) {
232
+ const { tenantId, tableId } = requireTableIdentity(args, thunkApi);
233
+ const tableMeta = await loadTableMetaOrThrow(thunkApi, tenantId, tableId);
234
+ const newName = ensureColumnName(args?.newName);
235
+ const updated = await patchRecord(thunkApi, tableMeta.dbKey, {
236
+ displayName: newName,
237
+ updatedAt: new Date().toISOString(),
238
+ });
239
+
240
+ return {
241
+ rawData: updated,
242
+ displayData: `已将表名更新为「${newName}」。`,
243
+ };
244
+ }
@@ -0,0 +1,148 @@
1
+ import { DataType } from "../../../create/types";
2
+ import { readAndWait } from "../../../database/dbSlice";
3
+ import { shareResourceAction } from "../../../share/action";
4
+ import { hasExplicitPublicShareRequest } from "../../../share/publicSharePolicy";
5
+ import { selectAllMsgs, selectCurrentDialogId } from "../../../chat/messages/messageSlice";
6
+
7
+ type ShareTableArgs = {
8
+ dbKey?: string;
9
+ tenantId?: string;
10
+ tableId?: string;
11
+ title?: string;
12
+ description?: string;
13
+ visibility?: "private" | "community";
14
+ };
15
+
16
+ type ShareTableResult = {
17
+ rawData: {
18
+ token: string;
19
+ key: string;
20
+ url: string;
21
+ };
22
+ displayData: string;
23
+ };
24
+
25
+ export const shareTableFunctionSchema = {
26
+ name: "shareTable",
27
+ description:
28
+ "把一张表发布为分享链接。默认用于社区分享;只有当用户明确要求公开/社区分享时才应调用。",
29
+ parameters: {
30
+ type: "object",
31
+ properties: {
32
+ dbKey: {
33
+ type: "string",
34
+ description: "表 meta 记录的 dbKey,例如 meta-user123-table123。",
35
+ },
36
+ tenantId: {
37
+ type: "string",
38
+ description: "表所属租户 ID。dbKey 缺失时必填。",
39
+ },
40
+ tableId: {
41
+ type: "string",
42
+ description: "表 ID。dbKey 缺失时必填。",
43
+ },
44
+ title: {
45
+ type: "string",
46
+ description: "分享标题;不传则回退为表 ID。",
47
+ },
48
+ description: {
49
+ type: "string",
50
+ description: "可选:分享描述。",
51
+ },
52
+ visibility: {
53
+ type: "string",
54
+ enum: ["private", "community"],
55
+ description: "默认 community。",
56
+ },
57
+ },
58
+ },
59
+ };
60
+
61
+ const resolveTableDbKey = (args: ShareTableArgs): string => {
62
+ if (typeof args.dbKey === "string" && args.dbKey.trim()) {
63
+ return args.dbKey.trim();
64
+ }
65
+ if (
66
+ typeof args.tenantId === "string" &&
67
+ args.tenantId.trim() &&
68
+ typeof args.tableId === "string" &&
69
+ args.tableId.trim()
70
+ ) {
71
+ return `meta-${args.tenantId.trim()}-${args.tableId.trim()}`;
72
+ }
73
+ throw new Error("shareTable 需要提供 dbKey,或同时提供 tenantId 和 tableId。");
74
+ };
75
+
76
+ const asNonEmptyString = (value: unknown): string =>
77
+ typeof value === "string" && value.trim() ? value.trim() : "";
78
+
79
+ const readSharedTableMeta = async (
80
+ thunkApi: any,
81
+ tableDbKey: string
82
+ ): Promise<Record<string, unknown> | null> => {
83
+ if (typeof thunkApi?.dispatch !== "function") return null;
84
+ const result = await thunkApi.dispatch(readAndWait(tableDbKey));
85
+ if (!readAndWait.fulfilled.match(result) || !result.payload || typeof result.payload !== "object") {
86
+ return null;
87
+ }
88
+ return result.payload as Record<string, unknown>;
89
+ };
90
+
91
+ export async function shareTableFunc(
92
+ args: ShareTableArgs,
93
+ thunkApi: any
94
+ ): Promise<ShareTableResult> {
95
+ const state = thunkApi?.getState?.();
96
+ const dialogId = state ? selectCurrentDialogId(state) : undefined;
97
+ const latestUserInput = state
98
+ ? selectAllMsgs(state, dialogId)
99
+ .slice()
100
+ .reverse()
101
+ .find((message) => message?.role === "user" && typeof message?.content === "string")
102
+ ?.content
103
+ : undefined;
104
+ if (!hasExplicitPublicShareRequest(latestUserInput)) {
105
+ throw new Error("当前策略不允许在用户未明确要求公开/社区分享时自动发布表。");
106
+ }
107
+
108
+ const tableDbKey = resolveTableDbKey(args);
109
+ const tableMeta =
110
+ !asNonEmptyString(args.tenantId) || !asNonEmptyString(args.tableId) || !asNonEmptyString(args.title)
111
+ ? await readSharedTableMeta(thunkApi, tableDbKey)
112
+ : null;
113
+ const tenantId = asNonEmptyString(args.tenantId) || asNonEmptyString(tableMeta?.tenantId);
114
+ const tableId = asNonEmptyString(args.tableId) || asNonEmptyString(tableMeta?.tableId);
115
+ const title =
116
+ asNonEmptyString(args.title) ||
117
+ asNonEmptyString(tableMeta?.displayName) ||
118
+ asNonEmptyString(tableMeta?.title) ||
119
+ tableId ||
120
+ tableDbKey;
121
+
122
+ const result = await shareResourceAction(
123
+ {
124
+ type: DataType.TABLE,
125
+ data: {
126
+ dbKey: tableDbKey,
127
+ ...(tenantId ? { tenantId } : {}),
128
+ ...(tableId ? { tableId } : {}),
129
+ displayName: title,
130
+ },
131
+ title,
132
+ description:
133
+ typeof args.description === "string" && args.description.trim()
134
+ ? args.description.trim()
135
+ : undefined,
136
+ visibility: args.visibility ?? "community",
137
+ },
138
+ thunkApi
139
+ );
140
+
141
+ return {
142
+ rawData: {
143
+ ...result,
144
+ url: `/share/${result.token}`,
145
+ },
146
+ displayData: `表已分享:/share/${result.token}`,
147
+ };
148
+ }
@@ -0,0 +1,129 @@
1
+ import type { RootState } from "../../../app/store";
2
+ import { readAndWait, patch, write } from "../../../database/dbSlice";
3
+ import { metaKey, rowKey } from "../../../database/keys";
4
+ import { DataType } from "../../../create/types";
5
+ import { loadTableRows } from "../../../render/table/tableSlice";
6
+ import type { TableMeta } from "../../../render/table/types";
7
+
8
+ export const resolveTableIdentity = (
9
+ args: { tenantId?: string; tableId?: string },
10
+ state: RootState
11
+ ) => {
12
+ const currentTable = state.table.currentTable;
13
+ const tenantId = args.tenantId ?? currentTable?.tenantId;
14
+ const tableId = args.tableId ?? currentTable?.tableId;
15
+ return { tenantId, tableId, currentTable };
16
+ };
17
+
18
+ export async function loadTableMetaOrThrow(
19
+ thunkApi: any,
20
+ tenantId: string,
21
+ tableId: string
22
+ ): Promise<TableMeta> {
23
+ const result = await thunkApi.dispatch(readAndWait(metaKey(tenantId, tableId)));
24
+ if (!readAndWait.fulfilled.match(result) || !result.payload) {
25
+ const message =
26
+ (result.payload as any)?.message ||
27
+ result.error?.message ||
28
+ `找不到表 ${tableId} 的定义。`;
29
+ throw new Error(message);
30
+ }
31
+ return result.payload as TableMeta;
32
+ }
33
+
34
+ export async function ensureRowsLoaded(
35
+ thunkApi: any,
36
+ tenantId: string,
37
+ tableId: string
38
+ ): Promise<any[]> {
39
+ const result = await thunkApi.dispatch(loadTableRows({ tenantId, tableId }));
40
+ if (!loadTableRows.fulfilled.match(result)) {
41
+ const message =
42
+ (result.payload as any) ||
43
+ result.error?.message ||
44
+ "加载表行失败";
45
+ throw new Error(message);
46
+ }
47
+
48
+ const state = thunkApi.getState() as RootState;
49
+ return state.table.rows.filter(
50
+ (row: any) => row?.tenantId === tenantId && row?.tableId === tableId && !row?.deletedAt
51
+ );
52
+ }
53
+
54
+ export async function resolveRowOrThrow(
55
+ thunkApi: any,
56
+ args: { tenantId: string; tableId: string; rowId?: string; dbKey?: string }
57
+ ) {
58
+ const { tenantId, tableId, rowId, dbKey } = args;
59
+
60
+ if (!rowId && !dbKey) {
61
+ throw new Error("需要提供 rowId 或 dbKey 才能定位表行。");
62
+ }
63
+
64
+ const finalDbKey = dbKey || rowKey.single(tenantId, tableId, String(rowId));
65
+ const readResult = await thunkApi.dispatch(readAndWait(finalDbKey));
66
+ if (readAndWait.fulfilled.match(readResult) && readResult.payload && !readResult.payload.deletedAt) {
67
+ return readResult.payload;
68
+ }
69
+
70
+ const rows = await ensureRowsLoaded(thunkApi, tenantId, tableId);
71
+ const found = rows.find((row) => row?.dbKey === finalDbKey || row?.rowId === rowId);
72
+ if (!found) {
73
+ throw new Error(`找不到要操作的行:${rowId || finalDbKey}`);
74
+ }
75
+ return found;
76
+ }
77
+
78
+ export async function writeRow(thunkApi: any, row: any) {
79
+ const result = await thunkApi.dispatch(
80
+ write({
81
+ data: row,
82
+ customKey: row.dbKey,
83
+ })
84
+ );
85
+ if (!write.fulfilled.match(result)) {
86
+ const message =
87
+ (result.payload as any)?.message ||
88
+ result.error?.message ||
89
+ "写入表行失败";
90
+ throw new Error(message);
91
+ }
92
+ return result.payload;
93
+ }
94
+
95
+ export async function patchRecord(thunkApi: any, dbKey: string, changes: Record<string, any>) {
96
+ const result = await thunkApi.dispatch(
97
+ patch({
98
+ dbKey,
99
+ changes,
100
+ })
101
+ );
102
+ if (!patch.fulfilled.match(result)) {
103
+ const message =
104
+ (result.payload as any)?.message ||
105
+ result.error?.message ||
106
+ `更新记录失败:${dbKey}`;
107
+ throw new Error(message);
108
+ }
109
+ return result.payload;
110
+ }
111
+
112
+ export function buildNewRow(
113
+ tenantId: string,
114
+ tableId: string,
115
+ values: Record<string, any>
116
+ ) {
117
+ const { dbKey, rowId } = rowKey.create(tenantId, tableId);
118
+ const now = new Date().toISOString();
119
+ return {
120
+ dbKey,
121
+ tenantId,
122
+ tableId,
123
+ rowId,
124
+ createdAt: now,
125
+ updatedAt: now,
126
+ type: DataType.TABLE_ROW as const,
127
+ ...values,
128
+ };
129
+ }
@@ -0,0 +1,49 @@
1
+ import { callApifyActor } from "./apifyActorClient";
2
+
3
+ export const taobaoTmallProductScraperFunctionSchema = {
4
+ name: "taobaoTmallProductScraper",
5
+ description:
6
+ "使用 Apify Taobao/Tmall Product Scraper 获取淘宝/天猫商品真实详情,返回标题、价格、SKU、库存、图片、店铺、属性和规格参数。适合用户提供淘宝/天猫链接或商品 ID 后做真实参数对比。",
7
+ parameters: {
8
+ type: "object",
9
+ properties: {
10
+ itemId: {
11
+ type: "string",
12
+ description:
13
+ "淘宝/天猫数字商品 ID。可从链接中的 id 参数提取,例如 https://item.taobao.com/item.htm?id=744983869996。",
14
+ },
15
+ detailDepth: {
16
+ type: "string",
17
+ enum: ["lite", "standard", "full"],
18
+ description:
19
+ "详情深度。full 会尽量返回优惠后价格、属性、规格、SKU 和促销信息;默认 full。",
20
+ default: "full",
21
+ },
22
+ },
23
+ required: ["itemId"],
24
+ },
25
+ };
26
+
27
+ export async function taobaoTmallProductScraperFunc(
28
+ args: {
29
+ itemId: string;
30
+ detailDepth?: "lite" | "standard" | "full";
31
+ },
32
+ thunkApi: any
33
+ ) {
34
+ const itemId = String(args.itemId ?? "").trim();
35
+ if (!/^\d{6,}$/.test(itemId)) {
36
+ throw new Error("淘宝/天猫商品详情抓取失败:itemId 必须是有效的数字商品 ID。");
37
+ }
38
+
39
+ return callApifyActor(thunkApi, {
40
+ actorId: "sian.agency~taobao-tmall-product-scraper",
41
+ input: {
42
+ operation: "productDetail",
43
+ itemId,
44
+ detailDepth: args.detailDepth ?? "full",
45
+ },
46
+ resultType: "datasetItems",
47
+ displayName: "Taobao/Tmall Product Scraper",
48
+ });
49
+ }