nolo-cli 0.1.31 → 0.1.32

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 (1163) hide show
  1. package/README.md +6 -0
  2. package/agentAliases.ts +72 -0
  3. package/agentCommandSupport.ts +4 -1
  4. package/agentInternalCommandEntries.ts +2 -0
  5. package/agentMachineCommands.ts +238 -16
  6. package/agentPullCommand.ts +46 -18
  7. package/agentRecordHelpers.ts +96 -5
  8. package/agentRunCommand.ts +72 -24
  9. package/agentRunParsing.ts +6 -0
  10. package/ai/agent/agentSlice.ts +1 -589
  11. package/ai/index.ts +1 -1
  12. package/buildPublish.ts +4 -1
  13. package/buildPublishArtifactAssembly.ts +479 -162
  14. package/cli/agentAliases.ts +132 -0
  15. package/cli/agentCommandSupport.ts +80 -0
  16. package/cli/agentCreateCustomCommands.ts +278 -0
  17. package/cli/agentDialogsCommands.ts +227 -0
  18. package/cli/agentDoctorCommands.ts +203 -0
  19. package/cli/agentInternalCommandEntries.ts +45 -0
  20. package/cli/agentListCommands.ts +132 -0
  21. package/cli/agentListHelpers.ts +187 -0
  22. package/cli/agentMachineCommands.ts +698 -0
  23. package/cli/agentPullCommand.ts +167 -0
  24. package/cli/agentRecordCommands.ts +143 -0
  25. package/cli/agentRecordHelpers.ts +562 -0
  26. package/cli/agentRunCommand.ts +190 -0
  27. package/cli/agentRunLocalWorkspace.ts +182 -0
  28. package/cli/agentRunParsing.ts +298 -0
  29. package/cli/agentRuntimeLocal.ts +55 -0
  30. package/cli/agentSuperviseCommands.ts +8 -0
  31. package/cli/agentUnpublishCommands.ts +113 -0
  32. package/cli/authCommands.ts +264 -0
  33. package/cli/buildPublish.ts +138 -0
  34. package/cli/buildPublishArtifactAssembly.ts +724 -0
  35. package/cli/buildPublishImportAnalysis.ts +242 -0
  36. package/cli/cliCommandAdapters.ts +28 -0
  37. package/cli/cliCommandDispatch.ts +66 -0
  38. package/cli/cliCommandFactories.ts +66 -0
  39. package/cli/cliCommandTypes.ts +49 -0
  40. package/cli/cliEnvHelpers.ts +185 -0
  41. package/cli/cliIoTypes.ts +3 -0
  42. package/cli/cliRuntimeDoctorReport.ts +193 -0
  43. package/cli/client/agentConfigResolver.ts +1 -0
  44. package/cli/client/agentRun.ts +188 -0
  45. package/cli/client/agentRunInput.ts +10 -0
  46. package/cli/client/agentRunLocalExecution.ts +124 -0
  47. package/cli/client/agentRunLocalExecutor.ts +179 -0
  48. package/cli/client/agentRunRuntimeSelection.ts +145 -0
  49. package/cli/client/agentRunServerTransport.ts +397 -0
  50. package/cli/client/agentRunTaskRunRecorder.ts +176 -0
  51. package/cli/client/compactDialog.ts +222 -0
  52. package/cli/client/hybridRecordStore.ts +52 -0
  53. package/cli/client/localAgentRecords.ts +7 -0
  54. package/cli/client/localDialogRecords.ts +30 -0
  55. package/cli/client/localProviderResolver.ts +1 -0
  56. package/cli/client/localRuntimeAdapter.ts +676 -0
  57. package/cli/client/localToolPolicy.ts +8 -0
  58. package/cli/client/profileConfig.ts +101 -0
  59. package/cli/client/streamingOutput.ts +36 -0
  60. package/cli/client/taskRunPrompt.ts +10 -0
  61. package/cli/client/taskWorktree.ts +8 -0
  62. package/cli/client/workspaceSession.ts +11 -0
  63. package/cli/commandRegistry.ts +96 -0
  64. package/cli/connectorRunArtifact.ts +145 -0
  65. package/cli/connectorWebSocketTarget.ts +109 -0
  66. package/cli/customCodingAgentFlow.ts +208 -0
  67. package/cli/customCodingAgentRecord.ts +179 -0
  68. package/cli/defaultServer.ts +1 -0
  69. package/cli/dialogDataAccess.ts +186 -0
  70. package/cli/dialogInternalCommandEntries.ts +11 -0
  71. package/cli/dialogReadCommands.ts +180 -0
  72. package/cli/dialogReadHelpers.ts +226 -0
  73. package/cli/dialogStatusCommands.ts +123 -0
  74. package/cli/docInternalCommandEntries.ts +20 -0
  75. package/cli/hybridReadHelpers.ts +109 -0
  76. package/cli/internalCommandEntries.ts +20 -0
  77. package/cli/localRuntimeDb.ts +65 -0
  78. package/cli/machineCommandPrompts.ts +79 -0
  79. package/cli/machineCommandResolution.ts +43 -0
  80. package/cli/machineCommands.ts +324 -0
  81. package/cli/machineDaemonCommands.ts +29 -0
  82. package/cli/machineHeartbeatCommands.ts +29 -0
  83. package/cli/machineStatusCommands.ts +87 -0
  84. package/cli/machineWatchCommands.ts +41 -0
  85. package/cli/machineWsPromptMaterialization.ts +89 -0
  86. package/cli/machineWsRunDispatch.ts +635 -0
  87. package/cli/machineWsSession.ts +213 -0
  88. package/cli/noloReadBridgePrompt.ts +16 -0
  89. package/cli/pageCreateCommands.ts +219 -0
  90. package/cli/pageDeleteCommands.ts +167 -0
  91. package/cli/pageReadCommands.ts +151 -0
  92. package/cli/pageUpdateCommands.ts +249 -0
  93. package/cli/pageWriteHelpers.ts +209 -0
  94. package/cli/publishPackage.ts +36 -0
  95. package/cli/runtimeDoctorCommands.ts +67 -0
  96. package/cli/runtimeInternalCommandEntries.ts +15 -0
  97. package/cli/runtimeModeArgs.ts +33 -0
  98. package/cli/runtimePassthroughCommands.ts +22 -0
  99. package/cli/scriptCommandEntries.ts +31 -0
  100. package/cli/scriptPassthroughHelpers.ts +28 -0
  101. package/cli/secretScanHelpers.ts +31 -0
  102. package/cli/spaceAttachCommands.ts +134 -0
  103. package/cli/spaceCategoryCommands.ts +263 -0
  104. package/cli/spaceCommands.ts +295 -0
  105. package/cli/spaceDeleteCommands.ts +312 -0
  106. package/cli/spaceInternalCommandEntries.ts +21 -0
  107. package/cli/spaceMutationHelpers.ts +135 -0
  108. package/cli/spaceReadCommands.ts +323 -0
  109. package/cli/systemInternalCommandEntries.ts +65 -0
  110. package/cli/tableCommands.ts +118 -0
  111. package/cli/tableDataOutput.ts +41 -0
  112. package/cli/tableDataSafety.ts +26 -0
  113. package/cli/tableMetaCommands.ts +307 -0
  114. package/cli/tableMutationCommands.ts +266 -0
  115. package/cli/tableQueryParsing.ts +90 -0
  116. package/cli/tableQueryRequest.ts +53 -0
  117. package/cli/taskRunActions.ts +122 -0
  118. package/cli/taskRunCommand.ts +70 -0
  119. package/cli/taskRunParsing.ts +86 -0
  120. package/cli/taskRunPromptShared.ts +55 -0
  121. package/cli/tui/readlineWorkspace.ts +141 -0
  122. package/cli/tui/session.ts +50 -0
  123. package/cli/tui/tuiCatalog.ts +22 -0
  124. package/cli/tui/tuiCommandInterpreter.ts +253 -0
  125. package/cli/tui/tuiPresentation.ts +146 -0
  126. package/cli/updateCommands.ts +134 -0
  127. package/cli/workflowInternalCommandEntries.ts +31 -0
  128. package/client/agentRun.test.ts +37 -2
  129. package/client/agentRunRuntimeSelection.test.ts +1 -0
  130. package/client/agentRunRuntimeSelection.ts +2 -12
  131. package/client/agentRunServerTransport.ts +7 -4
  132. package/commandRegistry.ts +1 -0
  133. package/connectorWebSocketTarget.ts +61 -6
  134. package/machineCommands.ts +9 -3
  135. package/machineWsRunDispatch.ts +1 -1
  136. package/machineWsSession.ts +28 -7
  137. package/package.json +170 -103
  138. package/spaceAttachCommands.ts +2 -3
  139. package/agent-runtime/hostRuntimeCapabilities.ts +0 -7
  140. package/agent-runtime/shellCommandPolicy.ts +0 -117
  141. package/agent-runtime/toolGate.ts +0 -38
  142. package/ai/agent/_executeModel.ts +0 -144
  143. package/ai/agent/appWorkingMemory.ts +0 -126
  144. package/ai/agent/avatarUtils.ts +0 -24
  145. package/ai/agent/buildEditingContext.ts +0 -378
  146. package/ai/agent/buildSystemPrompt.ts +0 -580
  147. package/ai/agent/canvasEditingContext.ts +0 -49
  148. package/ai/agent/cleanAgentMessages.ts +0 -140
  149. package/ai/agent/cliChatClient.ts +0 -153
  150. package/ai/agent/contextCompiler.ts +0 -107
  151. package/ai/agent/contextLayerContract.ts +0 -44
  152. package/ai/agent/createAgentSchema.ts +0 -258
  153. package/ai/agent/executeToolCall.ts +0 -59
  154. package/ai/agent/fetchAgentContexts.ts +0 -42
  155. package/ai/agent/generatePrompt.ts +0 -3
  156. package/ai/agent/getFullChatContextKeys.ts +0 -168
  157. package/ai/agent/guidedCreation/assistant.ts +0 -82
  158. package/ai/agent/guidedCreation/capabilities.ts +0 -84
  159. package/ai/agent/guidedCreation/draft.ts +0 -62
  160. package/ai/agent/guidedCreation/types.ts +0 -38
  161. package/ai/agent/hooks/fetchPublicAgents.ts +0 -108
  162. package/ai/agent/hooks/useAgentConfig.ts +0 -89
  163. package/ai/agent/hooks/useAgentDialog.ts +0 -35
  164. package/ai/agent/hooks/useAgentFormValidation.ts +0 -202
  165. package/ai/agent/hooks/usePublicAgents.ts +0 -377
  166. package/ai/agent/pageBuilderHandoffRules.ts +0 -75
  167. package/ai/agent/persistMessageWithFixedId.ts +0 -37
  168. package/ai/agent/planSlice.ts +0 -259
  169. package/ai/agent/publicAgentCatalog.ts +0 -359
  170. package/ai/agent/publicAgentIdentity.ts +0 -76
  171. package/ai/agent/referenceUtils.ts +0 -229
  172. package/ai/agent/runAgentBackground.ts +0 -238
  173. package/ai/agent/runAgentClientLoop.ts +0 -141
  174. package/ai/agent/runtimeGuidance.ts +0 -116
  175. package/ai/agent/server/fetchPublicAgents.ts +0 -158
  176. package/ai/agent/serverOrigin.ts +0 -7
  177. package/ai/agent/startParallelAgentStreams.ts +0 -424
  178. package/ai/agent/startupProtocol.ts +0 -53
  179. package/ai/agent/streamAgentChatTurn.ts +0 -1876
  180. package/ai/agent/streamAgentChatTurnUtils.ts +0 -1068
  181. package/ai/agent/types.ts +0 -73
  182. package/ai/agent/utils/imageOutput.ts +0 -39
  183. package/ai/agent/utils/publicImageAgentMode.ts +0 -26
  184. package/ai/agent/utils/sortUtils.ts +0 -250
  185. package/ai/agent/web/agentDisplayUtils.ts +0 -171
  186. package/ai/agent/web/referencePickerUtils.ts +0 -146
  187. package/ai/agent/web/useAgentModelAvatarComponent.ts +0 -32
  188. package/ai/agent/web/useGuidedAgentCreation.ts +0 -238
  189. package/ai/ai.locale.ts +0 -1103
  190. package/ai/chat/accumulateToolCallChunks.ts +0 -126
  191. package/ai/chat/fetchUtils.native.ts +0 -278
  192. package/ai/chat/fetchUtils.ts +0 -155
  193. package/ai/chat/inlineImageUrlsForCustomProvider.ts +0 -117
  194. package/ai/chat/parseApiError.ts +0 -67
  195. package/ai/chat/parseMultilineSSE.ts +0 -95
  196. package/ai/chat/sendOpenAICompletionsRequest.native.ts +0 -710
  197. package/ai/chat/sendOpenAICompletionsRequest.ts +0 -897
  198. package/ai/chat/sendOpenAIResponseRequest.ts +0 -654
  199. package/ai/chat/shouldUseServerProxy.ts +0 -18
  200. package/ai/chat/sseClient.native.ts +0 -91
  201. package/ai/chat/sseClient.ts +0 -67
  202. package/ai/chat/streamReader.native.ts +0 -31
  203. package/ai/chat/streamReader.ts +0 -62
  204. package/ai/chat/updateTotalUsage.ts +0 -96
  205. package/ai/context/buildReferenceContext.ts +0 -437
  206. package/ai/context/calculateContextUsage.ts +0 -133
  207. package/ai/context/retention.ts +0 -165
  208. package/ai/context/tokenUtils.ts +0 -78
  209. package/ai/llm/agentCapabilities.ts +0 -74
  210. package/ai/llm/calculateGeminiImageTokens.ts +0 -57
  211. package/ai/llm/deepinfra.ts +0 -94
  212. package/ai/llm/fireworks.ts +0 -68
  213. package/ai/llm/generateRequestBody.ts +0 -165
  214. package/ai/llm/getModelContextWindow.ts +0 -84
  215. package/ai/llm/getNoloKey.ts +0 -37
  216. package/ai/llm/getPricing.ts +0 -252
  217. package/ai/llm/hooks/useModelPricing.ts +0 -75
  218. package/ai/llm/imagePricing.ts +0 -66
  219. package/ai/llm/isResponseAPIModel.ts +0 -13
  220. package/ai/llm/kimi.ts +0 -23
  221. package/ai/llm/mimo.ts +0 -71
  222. package/ai/llm/mistral.ts +0 -21
  223. package/ai/llm/modelAvatar.ts +0 -428
  224. package/ai/llm/models.ts +0 -45
  225. package/ai/llm/openrouterModels.ts +0 -6
  226. package/ai/llm/providers.ts +0 -313
  227. package/ai/llm/reasoningModels.ts +0 -29
  228. package/ai/llm/types.ts +0 -82
  229. package/ai/llm/usageRequestOptions.ts +0 -59
  230. package/ai/memory/capture.ts +0 -148
  231. package/ai/memory/consolidate.ts +0 -104
  232. package/ai/memory/delete.ts +0 -148
  233. package/ai/memory/overlay.ts +0 -84
  234. package/ai/memory/query.ts +0 -38
  235. package/ai/memory/queryShared.ts +0 -160
  236. package/ai/memory/rank.ts +0 -105
  237. package/ai/memory/recentRelationshipRecap.ts +0 -247
  238. package/ai/memory/remember.ts +0 -167
  239. package/ai/memory/runtime.ts +0 -76
  240. package/ai/memory/store.ts +0 -20
  241. package/ai/memory/storeShared.ts +0 -77
  242. package/ai/memory/types.ts +0 -46
  243. package/ai/memory/understanding.ts +0 -349
  244. package/ai/memory/understandingGreeting.ts +0 -264
  245. package/ai/messages/type.ts +0 -20
  246. package/ai/policy/commercialMultiplier.ts +0 -16
  247. package/ai/policy/personalizationDialog.ts +0 -333
  248. package/ai/policy/runtimePolicy.ts +0 -440
  249. package/ai/policy/selfUpdateFields.ts +0 -48
  250. package/ai/skills/referenceRuntime.ts +0 -274
  251. package/ai/skills/skillDiagnostics.ts +0 -251
  252. package/ai/skills/skillDocBuilder.ts +0 -139
  253. package/ai/skills/skillReferenceSummary.ts +0 -63
  254. package/ai/taskRun/taskRunProtocol.ts +0 -897
  255. package/ai/token/billingAdminAuditEvent.ts +0 -68
  256. package/ai/token/billingAdminAuditEventWriter.ts +0 -41
  257. package/ai/token/billingAnomaly.ts +0 -90
  258. package/ai/token/billingAnomalyLifecycle.ts +0 -54
  259. package/ai/token/billingAnomalyLifecycleWriter.ts +0 -44
  260. package/ai/token/billingAnomalyWriter.ts +0 -41
  261. package/ai/token/calculatePrice.ts +0 -577
  262. package/ai/token/db.ts +0 -98
  263. package/ai/token/deepinfraReconciliation.ts +0 -153
  264. package/ai/token/deepinfraRequestIdQuery.ts +0 -92
  265. package/ai/token/externalToolCost.ts +0 -354
  266. package/ai/token/hooks/useRecords.ts +0 -65
  267. package/ai/token/missingUsageEstimate.ts +0 -51
  268. package/ai/token/modelUsageQuery.ts +0 -269
  269. package/ai/token/normalizeUsage.ts +0 -124
  270. package/ai/token/openaiImageGenerationUsage.ts +0 -56
  271. package/ai/token/openaiReconciliation.ts +0 -188
  272. package/ai/token/prepareTokenUsageData.ts +0 -93
  273. package/ai/token/providerBillableEvent.ts +0 -84
  274. package/ai/token/providerBillableEventWriter.ts +0 -36
  275. package/ai/token/providerBillingAnomalyDrilldown.ts +0 -308
  276. package/ai/token/providerBillingDrilldown.ts +0 -361
  277. package/ai/token/providerBillingHealthReport.ts +0 -366
  278. package/ai/token/providerCall.ts +0 -144
  279. package/ai/token/providerCallSweeper.ts +0 -168
  280. package/ai/token/providerCallWriter.ts +0 -33
  281. package/ai/token/providerCredential.ts +0 -89
  282. package/ai/token/providerCredentialAnomaly.ts +0 -154
  283. package/ai/token/providerCredentialLifecycle.ts +0 -59
  284. package/ai/token/providerCredentialLifecycleWriter.ts +0 -44
  285. package/ai/token/providerCredentialRegistry.ts +0 -83
  286. package/ai/token/providerCredentialRegistryCommand.ts +0 -97
  287. package/ai/token/providerCredentialRegistryList.ts +0 -124
  288. package/ai/token/providerCredentialRegistryResolver.ts +0 -150
  289. package/ai/token/providerCredentialRegistryWriter.ts +0 -41
  290. package/ai/token/providerCredentialRotationCommand.ts +0 -102
  291. package/ai/token/providerCredentialRuntime.ts +0 -56
  292. package/ai/token/providerDispatchIntent.ts +0 -67
  293. package/ai/token/providerDispatchIntentWriter.ts +0 -36
  294. package/ai/token/providerGateway.ts +0 -260
  295. package/ai/token/providerReconciliation.ts +0 -148
  296. package/ai/token/providerReconciliationLocal.ts +0 -97
  297. package/ai/token/providerReconciliationRunner.ts +0 -165
  298. package/ai/token/providerReconciliationWriter.ts +0 -41
  299. package/ai/token/query.ts +0 -88
  300. package/ai/token/queryUserTokens.ts +0 -59
  301. package/ai/token/ratingResult.ts +0 -202
  302. package/ai/token/ratingResultWriter.ts +0 -33
  303. package/ai/token/resolveBillingTarget.ts +0 -52
  304. package/ai/token/saveTokenRecord.ts +0 -53
  305. package/ai/token/serverDialogProjection.ts +0 -80
  306. package/ai/token/serverTokenWriter.ts +0 -153
  307. package/ai/token/stats.ts +0 -21
  308. package/ai/token/tokenThunks.ts +0 -24
  309. package/ai/token/types.ts +0 -103
  310. package/ai/tools/agent/agentTools.ts +0 -235
  311. package/ai/tools/agent/agentUpdateShared.ts +0 -311
  312. package/ai/tools/agent/callAgentTool.ts +0 -138
  313. package/ai/tools/agent/createAgentTool.ts +0 -512
  314. package/ai/tools/agent/createDialogTool.ts +0 -69
  315. package/ai/tools/agent/createSkillAgentTool.ts +0 -62
  316. package/ai/tools/agent/parallelBudget.ts +0 -221
  317. package/ai/tools/agent/prepareAgentDraftTool.ts +0 -173
  318. package/ai/tools/agent/presets/appBuilderPreset.ts +0 -152
  319. package/ai/tools/agent/runLlmTool.ts +0 -96
  320. package/ai/tools/agent/runStreamingAgentTool.ts +0 -72
  321. package/ai/tools/agent/skillAgentArgs.ts +0 -106
  322. package/ai/tools/agent/skillAgentPreset.ts +0 -89
  323. package/ai/tools/agent/startAgentDialogTool.ts +0 -53
  324. package/ai/tools/agent/streamParallelAgentsTool.ts +0 -122
  325. package/ai/tools/agent/updateAgentTool.ts +0 -96
  326. package/ai/tools/agent/updateSelfTool.ts +0 -113
  327. package/ai/tools/amazonProductScraperTool.ts +0 -86
  328. package/ai/tools/apifyActorClient.ts +0 -45
  329. package/ai/tools/appEditGuard.ts +0 -372
  330. package/ai/tools/appReadSnapshot.ts +0 -153
  331. package/ai/tools/appTools.ts +0 -1549
  332. package/ai/tools/applyEditTool.ts +0 -259
  333. package/ai/tools/applyLineEditsTool.ts +0 -315
  334. package/ai/tools/browserTools/click.ts +0 -33
  335. package/ai/tools/browserTools/closeSession.ts +0 -29
  336. package/ai/tools/browserTools/common.ts +0 -27
  337. package/ai/tools/browserTools/openSession.ts +0 -48
  338. package/ai/tools/browserTools/readContent.ts +0 -38
  339. package/ai/tools/browserTools/selectOption.ts +0 -46
  340. package/ai/tools/browserTools/typeText.ts +0 -42
  341. package/ai/tools/category/createCategoryTool.ts +0 -66
  342. package/ai/tools/category/queryContentsByCategoryTool.ts +0 -69
  343. package/ai/tools/category/updateContentCategoryTool.ts +0 -75
  344. package/ai/tools/cfBrowserTools.ts +0 -319
  345. package/ai/tools/cfSpeechToTextTool.ts +0 -49
  346. package/ai/tools/checkEnvTool.ts +0 -102
  347. package/ai/tools/cloudflareCrawlTool.ts +0 -289
  348. package/ai/tools/codeSearchTool.ts +0 -123
  349. package/ai/tools/codeTools.ts +0 -101
  350. package/ai/tools/convertMarxistsBookTool.ts +0 -103
  351. package/ai/tools/createDocTool.ts +0 -132
  352. package/ai/tools/createPlanTool.ts +0 -999
  353. package/ai/tools/createSkillDocTool.ts +0 -155
  354. package/ai/tools/createWorkflowTool.ts +0 -154
  355. package/ai/tools/deepseekOcrTool.ts +0 -34
  356. package/ai/tools/delayTool.ts +0 -31
  357. package/ai/tools/deleteSpacesTool.ts +0 -325
  358. package/ai/tools/deleteSpacesToolModel.ts +0 -159
  359. package/ai/tools/devReloadUtils.ts +0 -29
  360. package/ai/tools/dialogMessageSearch.ts +0 -137
  361. package/ai/tools/doctorSkillTool.ts +0 -72
  362. package/ai/tools/ecommerceScraperTool.ts +0 -86
  363. package/ai/tools/emailTools.ts +0 -549
  364. package/ai/tools/evalSkillTool.ts +0 -92
  365. package/ai/tools/exaSearchTool.ts +0 -64
  366. package/ai/tools/execShellTool.ts +0 -266
  367. package/ai/tools/executeSqlTool.ts +0 -192
  368. package/ai/tools/fetchWebpageSupport.ts +0 -333
  369. package/ai/tools/fetchWebpageTool.ts +0 -97
  370. package/ai/tools/geminiImagePreviewTool.ts +0 -361
  371. package/ai/tools/generateDocxTool.ts +0 -215
  372. package/ai/tools/googleSearchScraperTool.ts +0 -106
  373. package/ai/tools/importDataTool.ts +0 -133
  374. package/ai/tools/importSkillTool.ts +0 -162
  375. package/ai/tools/index.ts +0 -2132
  376. package/ai/tools/jdProductScraperTool.ts +0 -821
  377. package/ai/tools/listFilesTool.ts +0 -85
  378. package/ai/tools/listUserSpacesTool.ts +0 -113
  379. package/ai/tools/localFilesTool.ts +0 -276
  380. package/ai/tools/marxistsOfflineBook.ts +0 -253
  381. package/ai/tools/modelUsageTools.ts +0 -206
  382. package/ai/tools/olmOcrTool.ts +0 -34
  383. package/ai/tools/openaiImageTool.ts +0 -267
  384. package/ai/tools/prepareTools.ts +0 -23
  385. package/ai/tools/readDocTool.ts +0 -84
  386. package/ai/tools/readFileTool.ts +0 -214
  387. package/ai/tools/readTool.ts +0 -194
  388. package/ai/tools/readXPostTool.ts +0 -229
  389. package/ai/tools/rememberMemoryTool.ts +0 -84
  390. package/ai/tools/remotionVideoTool.ts +0 -151
  391. package/ai/tools/searchDialogMessagesTool.ts +0 -222
  392. package/ai/tools/searchRepoTool.ts +0 -118
  393. package/ai/tools/searchWorkspaceTool.ts +0 -259
  394. package/ai/tools/skillFollowup.ts +0 -86
  395. package/ai/tools/surfWeatherTool.ts +0 -169
  396. package/ai/tools/table/addTableRowTool.ts +0 -217
  397. package/ai/tools/table/createTableTool.ts +0 -315
  398. package/ai/tools/table/rowTools.ts +0 -371
  399. package/ai/tools/table/schemaTools.ts +0 -244
  400. package/ai/tools/table/shareTableTool.ts +0 -148
  401. package/ai/tools/table/toolShared.ts +0 -129
  402. package/ai/tools/taobaoTmallProductScraperTool.ts +0 -49
  403. package/ai/tools/toolApiClient.ts +0 -255
  404. package/ai/tools/toolNameAliases.ts +0 -70
  405. package/ai/tools/toolResultError.ts +0 -42
  406. package/ai/tools/toolRunSlice.ts +0 -303
  407. package/ai/tools/toolSchemaCompatibility.ts +0 -53
  408. package/ai/tools/toolVisibility.ts +0 -4
  409. package/ai/tools/types.ts +0 -20
  410. package/ai/tools/uiAskChoiceTool.ts +0 -104
  411. package/ai/tools/updateContentTitleTool.ts +0 -84
  412. package/ai/tools/updateDocTool.ts +0 -105
  413. package/ai/tools/updateUserPreferenceProfileTool.ts +0 -145
  414. package/ai/tools/wereadGatewayTool.ts +0 -152
  415. package/ai/tools/whisperTool.ts +0 -77
  416. package/ai/tools/writeFileTool.ts +0 -213
  417. package/ai/tools/youtubeScraperTool.ts +0 -116
  418. package/ai/tools/ziweiChartTool.ts +0 -678
  419. package/ai/types.ts +0 -55
  420. package/ai/workflow/workflowExecutor.ts +0 -323
  421. package/ai/workflow/workflowSlice.ts +0 -73
  422. package/ai/workflow/workflowTypes.ts +0 -106
  423. package/app/actions/syncAppRecord.ts +0 -73
  424. package/app/admin/adminPages.ts +0 -22
  425. package/app/colors.ts +0 -1
  426. package/app/constants/animationSets.ts +0 -21
  427. package/app/constants/appEditor.ts +0 -99
  428. package/app/constants/clientDownloads.ts +0 -54
  429. package/app/constants/desktopReleaseManifest.ts +0 -68
  430. package/app/constants/homeTabs.ts +0 -15
  431. package/app/constants/routePaths.ts +0 -15
  432. package/app/email/emailApiRoutes.ts +0 -14
  433. package/app/favorite/favoriteSlice.ts +0 -690
  434. package/app/favorite/type.ts +0 -43
  435. package/app/favorite/useAgentFavorite.ts +0 -43
  436. package/app/favorite/useContentFavorite.ts +0 -41
  437. package/app/fetchOwnedApps.ts +0 -269
  438. package/app/guide/quickStartGuide.ts +0 -128
  439. package/app/hooks/deleteDbKey.ts +0 -233
  440. package/app/hooks/index.ts +0 -4
  441. package/app/hooks/useAppDetail.ts +0 -208
  442. package/app/hooks/useAppVersions.ts +0 -52
  443. package/app/hooks/useAutoResizeTextarea.ts +0 -29
  444. package/app/hooks/useChatPageTitle.ts +0 -85
  445. package/app/hooks/useClipboardFiles.ts +0 -20
  446. package/app/hooks/useDesktopLocalConnectorAutostart.ts +0 -38
  447. package/app/hooks/useDragResize.ts +0 -91
  448. package/app/hooks/useElementSizeVar.ts +0 -24
  449. package/app/hooks/useFileDropZone.ts +0 -52
  450. package/app/hooks/useHasMounted.ts +0 -11
  451. package/app/hooks/useImageLoadFallback.ts +0 -19
  452. package/app/hooks/useIsMobile.ts +0 -46
  453. package/app/hooks/useMyApps.ts +0 -375
  454. package/app/hooks/useMyContentItems.ts +0 -91
  455. package/app/hooks/useNewMessageNotification.ts +0 -81
  456. package/app/hooks/usePageMeta.ts +0 -107
  457. package/app/hooks/useRecentlyOpened.ts +0 -84
  458. package/app/hooks/useUnifiedStore.ts +0 -11
  459. package/app/hooks/useUserNotifications.ts +0 -197
  460. package/app/hooks.ts +0 -55
  461. package/app/i18n/clientResources.ts +0 -65
  462. package/app/i18n/i18n.base.ts +0 -14
  463. package/app/i18n/i18n.config.ts +0 -67
  464. package/app/i18n/i18n.server.ts +0 -13
  465. package/app/i18n/index.ts +0 -15
  466. package/app/i18n/mapLanguage.ts +0 -11
  467. package/app/i18n/translations/appBuilder.locale.ts +0 -453
  468. package/app/i18n/translations/error.locale.ts +0 -246
  469. package/app/i18n/translations/interface.locale.ts +0 -2174
  470. package/app/i18n/translations/pricing.locale.ts +0 -397
  471. package/app/i18n/translations/seo.locale.ts +0 -129
  472. package/app/i18n/types.ts +0 -6
  473. package/app/notifications/formatNotification.ts +0 -134
  474. package/app/notifications/model.ts +0 -77
  475. package/app/notifications/notificationSlice.ts +0 -141
  476. package/app/notifications/useNotificationActions.ts +0 -67
  477. package/app/pages/homeTabState.ts +0 -57
  478. package/app/pages/quickChatFlow.ts +0 -109
  479. package/app/pages/rechargeCheckout.ts +0 -23
  480. package/app/pages/usePageArt.ts +0 -91
  481. package/app/realtime/sharedSse.ts +0 -182
  482. package/app/reducer.ts +0 -36
  483. package/app/seo/pageMeta.ts +0 -123
  484. package/app/settings/config.ts +0 -54
  485. package/app/settings/dbActionThunks.ts +0 -34
  486. package/app/settings/defaultSpacePreference.ts +0 -87
  487. package/app/settings/navItems.ts +0 -73
  488. package/app/settings/prepareUserSetting.ts +0 -11
  489. package/app/settings/settingsRecord.ts +0 -8
  490. package/app/settings/web/chat-config/useAutoSaveGlobalPrompt.ts +0 -59
  491. package/app/settings/web/machineStatus.ts +0 -23
  492. package/app/settings/web/useSettingsStylesheet.ts +0 -28
  493. package/app/settings/web/userSecurityUtils.ts +0 -21
  494. package/app/stateViews/runtime.ts +0 -86
  495. package/app/store.ts +0 -53
  496. package/app/theme/colors.ts +0 -280
  497. package/app/theme/fontPreference.ts +0 -77
  498. package/app/theme/index.ts +0 -7
  499. package/app/theme/theme.config.ts +0 -120
  500. package/app/theme/themeModeBootstrap.ts +0 -123
  501. package/app/theme/useSystemTheme.ts +0 -33
  502. package/app/types/appSummary.ts +0 -114
  503. package/app/utils/appDeploySource.ts +0 -50
  504. package/app/utils/appKeys.ts +0 -55
  505. package/app/utils/appRuntimeUrl.ts +0 -51
  506. package/app/utils/async.ts +0 -28
  507. package/app/utils/asyncMapStatus.ts +0 -31
  508. package/app/utils/clipboard.ts +0 -86
  509. package/app/utils/credits.ts +0 -12
  510. package/app/utils/desktopAgentRuntimeStatusClient.ts +0 -43
  511. package/app/utils/desktopAgentRuntimeTurnClient.ts +0 -73
  512. package/app/utils/desktopLocalConnectorClient.ts +0 -83
  513. package/app/utils/env.ts +0 -12
  514. package/app/utils/excelToSlate.ts +0 -430
  515. package/app/utils/fileReaders.ts +0 -12
  516. package/app/utils/fileUtils.ts +0 -229
  517. package/app/utils/imageUtils.native.ts +0 -96
  518. package/app/utils/imageUtils.ts +0 -274
  519. package/app/utils/ime.ts +0 -43
  520. package/app/utils/myContentItems.ts +0 -290
  521. package/app/utils/processDateRange.ts +0 -30
  522. package/app/utils/retryFetch.ts +0 -61
  523. package/app/utils/slateToExcel.ts +0 -58
  524. package/app/utils/toast.native.ts +0 -42
  525. package/app/utils/toast.ts +0 -3
  526. package/app/web/spaceInitGuard.ts +0 -28
  527. package/auth/action/signOutAction.ts +0 -0
  528. package/auth/action/signUpAction.ts +0 -227
  529. package/auth/actor.ts +0 -16
  530. package/auth/adminPermissions.ts +0 -18
  531. package/auth/authSlice.ts +0 -531
  532. package/auth/billing.ts +0 -130
  533. package/auth/client/deleteUserRequest.ts +0 -86
  534. package/auth/client/loginRequest.ts +0 -14
  535. package/auth/hooks/useAuth.ts +0 -9
  536. package/auth/hooks/useDeleteOwnAccount.ts +0 -50
  537. package/auth/hooks/useDeleteOwnAccountFlow.ts +0 -66
  538. package/auth/hooks/useDeleteUser.ts +0 -45
  539. package/auth/hooks/useEnableUser.ts +0 -50
  540. package/auth/hooks/useFetchUsers.ts +0 -80
  541. package/auth/hooks/useRechargeUser.ts +0 -82
  542. package/auth/index.ts +0 -1
  543. package/auth/invite.ts +0 -19
  544. package/auth/locale.ts +0 -84
  545. package/auth/resetAuthScopedClientState.ts +0 -27
  546. package/auth/rn/tokenManager.ts +0 -72
  547. package/auth/routes.ts +0 -173
  548. package/auth/server/accessActivity.ts +0 -144
  549. package/auth/server/adminPermissions.ts +0 -43
  550. package/auth/server/adminUsageReport.ts +0 -375
  551. package/auth/server/billingAnomalies.ts +0 -235
  552. package/auth/server/billingFullChainSimulator.ts +0 -325
  553. package/auth/server/billingUsageReport.ts +0 -231
  554. package/auth/server/cliLogin.ts +0 -198
  555. package/auth/server/creatorEarningCreditConversion.ts +0 -523
  556. package/auth/server/creatorEarningsLedger.ts +0 -165
  557. package/auth/server/creatorEarningsReport.ts +0 -299
  558. package/auth/server/creatorSettlementLedger.ts +0 -386
  559. package/auth/server/creatorSettlementReport.ts +0 -442
  560. package/auth/server/creatorSplitConfig.ts +0 -191
  561. package/auth/server/deduct.ts +0 -277
  562. package/auth/server/delete.ts +0 -895
  563. package/auth/server/disable.ts +0 -62
  564. package/auth/server/emailAutomation.ts +0 -360
  565. package/auth/server/emailAutomationConfig.ts +0 -88
  566. package/auth/server/emailAutomationRules.ts +0 -94
  567. package/auth/server/emailAutomationTemplates.ts +0 -131
  568. package/auth/server/emailAutomationTypes.ts +0 -38
  569. package/auth/server/emailDbConfig.ts +0 -149
  570. package/auth/server/emailDelivery.ts +0 -964
  571. package/auth/server/emailDeliveryGuards.ts +0 -285
  572. package/auth/server/emailPolicy.ts +0 -43
  573. package/auth/server/emailPreferences.ts +0 -119
  574. package/auth/server/emailProvider.ts +0 -277
  575. package/auth/server/emailReport.ts +0 -441
  576. package/auth/server/emailRuntimeConfig.ts +0 -86
  577. package/auth/server/emailScenarioNotifications.ts +0 -341
  578. package/auth/server/enable.ts +0 -62
  579. package/auth/server/getRechargeHistory.ts +0 -111
  580. package/auth/server/getUser.ts +0 -72
  581. package/auth/server/gptProAccess.ts +0 -44
  582. package/auth/server/inviteReward.ts +0 -298
  583. package/auth/server/inviteRewardEmail.ts +0 -1
  584. package/auth/server/ledger.ts +0 -422
  585. package/auth/server/ledgerAudit.ts +0 -424
  586. package/auth/server/ledgerWitness.ts +0 -472
  587. package/auth/server/listusers.ts +0 -156
  588. package/auth/server/locks.ts +0 -32
  589. package/auth/server/login.ts +0 -184
  590. package/auth/server/productBillingSplits.ts +0 -166
  591. package/auth/server/productEntitlements.ts +0 -142
  592. package/auth/server/productPurchase.ts +0 -390
  593. package/auth/server/providerBillingDrilldown.ts +0 -47
  594. package/auth/server/providerBillingHealth.ts +0 -71
  595. package/auth/server/providerCredentials.ts +0 -136
  596. package/auth/server/recharge.ts +0 -290
  597. package/auth/server/revenueShareLedger.ts +0 -389
  598. package/auth/server/revenueShareReport.ts +0 -258
  599. package/auth/server/revenueSplitPolicy.ts +0 -119
  600. package/auth/server/revokeSessions.ts +0 -60
  601. package/auth/server/route.ts +0 -272
  602. package/auth/server/sendEmail.ts +0 -177
  603. package/auth/server/shared.ts +0 -51
  604. package/auth/server/signup.ts +0 -430
  605. package/auth/server/signupIpQuota.ts +0 -44
  606. package/auth/server/token.ts +0 -107
  607. package/auth/server/tokenUsageBilling.ts +0 -323
  608. package/auth/server/transfer.ts +0 -40
  609. package/auth/server/usageManagementAccess.ts +0 -43
  610. package/auth/server/usageReport.ts +0 -59
  611. package/auth/server/utils.ts +0 -200
  612. package/auth/sessionTokenVersion.ts +0 -38
  613. package/auth/token.ts +0 -63
  614. package/auth/tokenCookie.ts +0 -1
  615. package/auth/types.ts +0 -40
  616. package/auth/utils.ts +0 -110
  617. package/auth/web/bootstrapAuthState.ts +0 -60
  618. package/auth/web/tokenManager.ts +0 -61
  619. package/auth/web/useRegister.ts +0 -70
  620. package/chat/chat.locale.ts +0 -804
  621. package/chat/dialog/actions/addCybotAction.ts +0 -52
  622. package/chat/dialog/actions/addReferenceKeysAction.ts +0 -62
  623. package/chat/dialog/actions/builtinDialogLlm.ts +0 -35
  624. package/chat/dialog/actions/cleanupCliSession.ts +0 -40
  625. package/chat/dialog/actions/compactDialogAndForkAction.ts +0 -47
  626. package/chat/dialog/actions/createDialogAction.ts +0 -372
  627. package/chat/dialog/actions/createScheduledTaskAction.ts +0 -78
  628. package/chat/dialog/actions/handleSendMessageAction.ts +0 -197
  629. package/chat/dialog/actions/handleSendMessageResolver.ts +0 -29
  630. package/chat/dialog/actions/removeCybotAction.ts +0 -6
  631. package/chat/dialog/actions/removeDialogAgentAction.ts +0 -44
  632. package/chat/dialog/actions/replacePrimaryCybotAction.ts +0 -6
  633. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +0 -52
  634. package/chat/dialog/actions/updateDialogSummaryAction.ts +0 -405
  635. package/chat/dialog/actions/updateDialogTitleAction.ts +0 -151
  636. package/chat/dialog/actions/updateDialogTitlePolicy.ts +0 -30
  637. package/chat/dialog/actions/updateTokensAction.ts +0 -233
  638. package/chat/dialog/dialogAgents.ts +0 -54
  639. package/chat/dialog/dialogLaunchScope.ts +0 -32
  640. package/chat/dialog/dialogPageRenderMode.ts +0 -182
  641. package/chat/dialog/dialogSlice.ts +0 -872
  642. package/chat/dialog/dialogTitle.ts +0 -81
  643. package/chat/dialog/dialogTokenStats.ts +0 -12
  644. package/chat/dialog/dialogUrl.ts +0 -6
  645. package/chat/dialog/ensureDialogSpaceAction.ts +0 -208
  646. package/chat/dialog/goal.ts +0 -108
  647. package/chat/dialog/hooks/useStreamingSymbol.ts +0 -63
  648. package/chat/dialog/objectAssistantRegistry.ts +0 -286
  649. package/chat/dialog/schedule.ts +0 -17
  650. package/chat/dialog/useCreateDialog.ts +0 -52
  651. package/chat/hooks/sendPermissionResolver.ts +0 -128
  652. package/chat/hooks/useChatInput.ts +0 -130
  653. package/chat/hooks/useChatInputSeed.ts +0 -31
  654. package/chat/hooks/useMessageInteraction.ts +0 -412
  655. package/chat/hooks/useSendPermission.ts +0 -92
  656. package/chat/hooks/useThinkingVisibility.ts +0 -27
  657. package/chat/messages/browserImageUrl.ts +0 -48
  658. package/chat/messages/deleteMessages.ts +0 -47
  659. package/chat/messages/fetchAndCacheMessages.ts +0 -119
  660. package/chat/messages/fetchConvMsgs.ts +0 -51
  661. package/chat/messages/fileUrl.ts +0 -13
  662. package/chat/messages/generateMessageKey.ts +0 -21
  663. package/chat/messages/hooks/useBase64Migration.ts +0 -115
  664. package/chat/messages/messageAgent.ts +0 -8
  665. package/chat/messages/messageContent.ts +0 -199
  666. package/chat/messages/messageContract.ts +0 -88
  667. package/chat/messages/messageSlice.ts +0 -1195
  668. package/chat/messages/pendingAttachmentParts.ts +0 -143
  669. package/chat/messages/sendFirstMessage.ts +0 -190
  670. package/chat/messages/toolPresentation.ts +0 -212
  671. package/chat/messages/toolThunks.ts +0 -625
  672. package/chat/messages/web/ChatDisplayContext.ts +0 -14
  673. package/chat/messages/web/ToolMessageTypes.ts +0 -23
  674. package/chat/messages/web/diffViewerModel.ts +0 -61
  675. package/chat/messages/web/groupToolEntries.ts +0 -44
  676. package/chat/messages/web/groupToolMessages.ts +0 -35
  677. package/chat/messages/web/inlineReactArtifactParser.ts +0 -63
  678. package/chat/messages/web/streamingMarkdownModel.ts +0 -41
  679. package/chat/messages/web/toolDisplayName.ts +0 -22
  680. package/chat/messages/web/useLoopStopReason.ts +0 -43
  681. package/chat/messages/web/useStreamingReveal.ts +0 -91
  682. package/chat/messages/ziweiChartDoc.ts +0 -94
  683. package/chat/web/docxToSlate.ts +0 -597
  684. package/chat/web/fileProcessor.ts +0 -442
  685. package/chat/web/hooks/useProgressiveDisplayCount.ts +0 -102
  686. package/chat/web/messageInputAgentUi.ts +0 -277
  687. package/chat/web/messageInputKeyBehavior.ts +0 -53
  688. package/chat/web/messageInputMention.ts +0 -102
  689. package/chat/web/messageInputSendResolver.ts +0 -51
  690. package/chat/web/messageSlashCommands.ts +0 -10
  691. package/chat/web/pdfOcrProcessor.ts +0 -131
  692. package/chat/web/sidebar/allViewSearch.ts +0 -87
  693. package/chat/web/sidebar/types.ts +0 -12
  694. package/chat/web/sidebar/useChatSidebarFilteredData.ts +0 -141
  695. package/chat/web/sidebar/useSidebarDragAndDrop.ts +0 -56
  696. package/connector-experimental/index.ts +0 -5
  697. package/core/builtinAgents.ts +0 -202
  698. package/core/coin.ts +0 -42
  699. package/core/config.ts +0 -15
  700. package/core/crypto.ts +0 -51
  701. package/core/events/types.ts +0 -145
  702. package/core/generateKeyPairFromSeedV1.ts +0 -15
  703. package/core/generateMainKey.ts +0 -22
  704. package/core/init.ts +0 -41
  705. package/core/localOrigins.ts +0 -8
  706. package/core/password.ts +0 -13
  707. package/core/prefix.ts +0 -23
  708. package/create/editor/blockCommands.ts +0 -118
  709. package/create/editor/highlightExample.ts +0 -66
  710. package/create/editor/imageUpload.ts +0 -66
  711. package/create/editor/mark.ts +0 -15
  712. package/create/editor/plugins/normalizeChineseTypography.ts +0 -85
  713. package/create/editor/plugins/withBlockStructure.ts +0 -53
  714. package/create/editor/plugins/withChineseTypography.ts +0 -61
  715. package/create/editor/plugins/withLayout.ts +0 -30
  716. package/create/editor/plugins/withLinks.ts +0 -13
  717. package/create/editor/plugins/withMentions.ts +0 -15
  718. package/create/editor/plugins/withTables.ts +0 -52
  719. package/create/editor/tableCommands.ts +0 -270
  720. package/create/editor/theme/prism/default.ts +0 -145
  721. package/create/editor/theme/prism/githubDark.ts +0 -139
  722. package/create/editor/theme/prism/githubLight.ts +0 -139
  723. package/create/editor/theme/prism/index.ts +0 -23
  724. package/create/editor/theme/prism/okaidia.ts +0 -197
  725. package/create/editor/toolMentionOptions.ts +0 -19
  726. package/create/editor/transforms/fromMarkdown/index.ts +0 -260
  727. package/create/editor/transforms/fromMarkdown/inline.ts +0 -285
  728. package/create/editor/transforms/fromMarkdown/table.ts +0 -130
  729. package/create/editor/transforms/markdownToSlate.ts +0 -24
  730. package/create/editor/transforms/slateToRenderMarkdown.ts +0 -218
  731. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +0 -224
  732. package/create/editor/transforms/slateToText.ts +0 -33
  733. package/create/editor/types.ts +0 -120
  734. package/create/editor/utils/editorFactory.ts +0 -54
  735. package/create/editor/utils/hasPlainCodeBlock.ts +0 -39
  736. package/create/editor/utils/linkCommands.ts +0 -63
  737. package/create/editor/utils/pdfToSlate.ts +0 -706
  738. package/create/editor/utils/slateUtils.ts +0 -233
  739. package/create/editor/utils/txtToSlate.ts +0 -40
  740. package/create/hooks/category.ts +0 -82
  741. package/create/routePaths.ts +0 -5
  742. package/create/space/addSpaceAction.ts +0 -193
  743. package/create/space/category/categoryActions.ts +0 -427
  744. package/create/space/changeSpaceAction.ts +0 -36
  745. package/create/space/constants.ts +0 -8
  746. package/create/space/content/addContentAction.ts +0 -116
  747. package/create/space/content/contentThunks.ts +0 -90
  748. package/create/space/content/deleteContentFromSpaceAction.ts +0 -187
  749. package/create/space/content/deleteMultipleContentAction.ts +0 -112
  750. package/create/space/content/moveContentAction.ts +0 -285
  751. package/create/space/content/updateContentCategoryAction.ts +0 -154
  752. package/create/space/content/updateContentTitleAction.ts +0 -106
  753. package/create/space/content/uploadAndAddFileToSpaceAction.ts +0 -98
  754. package/create/space/contentKeyUtils.ts +0 -117
  755. package/create/space/contentLabels.ts +0 -56
  756. package/create/space/contentTypeMeta.ts +0 -170
  757. package/create/space/deleteSpaceAction.ts +0 -276
  758. package/create/space/fetchSpaceAction.ts +0 -70
  759. package/create/space/fetchSpaceSidebarStateAction.ts +0 -26
  760. package/create/space/hooks/agentFetchRetry.ts +0 -19
  761. package/create/space/hooks/useAgentFetcher.ts +0 -149
  762. package/create/space/hooks/useGroupedContent.ts +0 -118
  763. package/create/space/hooks/useSpaceEvents.ts +0 -43
  764. package/create/space/initialSpace.ts +0 -78
  765. package/create/space/loadDefaultSpaceAction.ts +0 -57
  766. package/create/space/member/addMemberAction.ts +0 -79
  767. package/create/space/member/fetchUserSpaceMembershipsAction.ts +0 -386
  768. package/create/space/member/memberThunks.ts +0 -47
  769. package/create/space/member/removeMemberAction.ts +0 -67
  770. package/create/space/publicCatalogSpace.ts +0 -39
  771. package/create/space/resolvePreferredSpaceId.ts +0 -113
  772. package/create/space/sidebarVisibleTypes.ts +0 -241
  773. package/create/space/space.locale.ts +0 -1053
  774. package/create/space/spaceAccess.ts +0 -182
  775. package/create/space/spaceCollapsedState.ts +0 -54
  776. package/create/space/spaceSlice.ts +0 -328
  777. package/create/space/spaceThunks.ts +0 -410
  778. package/create/space/types.ts +0 -27
  779. package/create/space/updateSpaceAction.ts +0 -107
  780. package/create/space/utils/permissions.ts +0 -47
  781. package/create/space/validateSpacePermission.ts +0 -38
  782. package/create/version/appVersionReplication.ts +0 -160
  783. package/create/version/versionApi.ts +0 -142
  784. package/database/actions/agentReadResolution.ts +0 -27
  785. package/database/actions/cacheMergedUserData.ts +0 -64
  786. package/database/actions/common.ts +0 -279
  787. package/database/actions/deleteFile.ts +0 -40
  788. package/database/actions/fetchUserData.ts +0 -16
  789. package/database/actions/fileContent.ts +0 -125
  790. package/database/actions/patch.ts +0 -155
  791. package/database/actions/read.ts +0 -378
  792. package/database/actions/readAndWait.ts +0 -197
  793. package/database/actions/readOutcome.ts +0 -45
  794. package/database/actions/readRequestManager.ts +0 -120
  795. package/database/actions/readResolution.ts +0 -102
  796. package/database/actions/remove.ts +0 -94
  797. package/database/actions/replication.ts +0 -366
  798. package/database/actions/upload.ts +0 -174
  799. package/database/actions/upsert.ts +0 -56
  800. package/database/actions/write.ts +0 -140
  801. package/database/client/db.native.ts +0 -73
  802. package/database/client/db.ts +0 -51
  803. package/database/client/fetchUserData.ts +0 -61
  804. package/database/client/handleError.ts +0 -19
  805. package/database/client/queryRequest.ts +0 -21
  806. package/database/dbActionThunks.ts +0 -1
  807. package/database/dbSlice.ts +0 -149
  808. package/database/email.ts +0 -42
  809. package/database/fileRing.ts +0 -51
  810. package/database/fileSharding.ts +0 -70
  811. package/database/fileStorage.native.ts +0 -92
  812. package/database/fileStorage.ts +0 -232
  813. package/database/fileUrl.ts +0 -34
  814. package/database/hooks/useUserData.ts +0 -495
  815. package/database/index.ts +0 -1
  816. package/database/queryPrefixes.ts +0 -14
  817. package/database/requests.ts +0 -443
  818. package/database/runtimeServerContext.ts +0 -35
  819. package/database/server/MemoryDB.ts +0 -76
  820. package/database/server/actorAccess.ts +0 -76
  821. package/database/server/agentDelegation.ts +0 -125
  822. package/database/server/authorityStoreConformance.ts +0 -209
  823. package/database/server/coreDataOwnership.ts +0 -13
  824. package/database/server/coreDataProxy.ts +0 -93
  825. package/database/server/cybotReadonly.ts +0 -18
  826. package/database/server/dataHandlers.ts +0 -117
  827. package/database/server/delete.ts +0 -516
  828. package/database/server/emailRepository.ts +0 -1482
  829. package/database/server/fileRead.ts +0 -337
  830. package/database/server/fileService.ts +0 -437
  831. package/database/server/handleTransaction.ts +0 -86
  832. package/database/server/patch.ts +0 -291
  833. package/database/server/query.ts +0 -178
  834. package/database/server/read.ts +0 -314
  835. package/database/server/recordIdentity.ts +0 -100
  836. package/database/server/resourceAccess.ts +0 -213
  837. package/database/server/routes.ts +0 -110
  838. package/database/server/spaceMemberAuthority.ts +0 -68
  839. package/database/server/storeBatchCompat.ts +0 -37
  840. package/database/server/testAuthorityStore.ts +0 -76
  841. package/database/server/upload.ts +0 -159
  842. package/database/server/write.ts +0 -492
  843. package/database/server/writeAuthority.ts +0 -133
  844. package/database/sqliteDb.ts +0 -46
  845. package/database/table/deleteTable.ts +0 -120
  846. package/database/tenantPlacement.ts +0 -57
  847. package/database/userDataLoadDecision.ts +0 -17
  848. package/database/userDataMerge.ts +0 -95
  849. package/database/userPreferenceRegister.ts +0 -108
  850. package/database/utils/dbPath.ts +0 -47
  851. package/database/utils/ulid.native.ts +0 -6
  852. package/integrations/anthropic/anthropicModels.ts +0 -47
  853. package/integrations/anthropic/type.ts +0 -41
  854. package/integrations/deepseek/models.ts +0 -67
  855. package/integrations/google/models.ts +0 -356
  856. package/integrations/openai/chatCompletionStreamMode.ts +0 -10
  857. package/integrations/openai/filterAndCleanMessages.ts +0 -284
  858. package/integrations/openai/flexTier.ts +0 -102
  859. package/integrations/openai/generateOpenAIRequestBody.ts +0 -274
  860. package/integrations/openai/generateResponseRequestBody.ts +0 -77
  861. package/integrations/openai/models.ts +0 -271
  862. package/integrations/openai/providerBodyCompatibility.ts +0 -23
  863. package/integrations/openai/responsesHelpers.ts +0 -297
  864. package/integrations/postmark/index.ts +0 -57
  865. package/integrations/resend/index.ts +0 -353
  866. package/integrations/weather/getWeather.ts +0 -24
  867. package/integrations/weather/index.ts +0 -6
  868. package/integrations/weather/routes.ts +0 -31
  869. package/integrations/weather/weatherApi.ts +0 -27
  870. package/integrations/weather/weatherConstants.ts +0 -2
  871. package/integrations/weather/weatherI18n.ts +0 -50
  872. package/integrations/weather/weatherService.ts +0 -50
  873. package/integrations/weather/weatherTypes.ts +0 -140
  874. package/integrations/weather/weatherUtils.ts +0 -46
  875. package/integrations/x-reader/backends/localBrowser.ts +0 -215
  876. package/integrations/x-reader/backends/publicFallback.ts +0 -31
  877. package/integrations/x-reader/backends/rawCdp.ts +0 -218
  878. package/integrations/x-reader/bridge/chromeBridgeManager.ts +0 -235
  879. package/integrations/x-reader/bridge/readXPostWithBridge.ts +0 -73
  880. package/integrations/x-reader/fixtureParser.ts +0 -101
  881. package/integrations/x-reader/index.ts +0 -9
  882. package/integrations/x-reader/redaction.ts +0 -27
  883. package/integrations/x-reader/types.ts +0 -109
  884. package/integrations/x-reader/visibleTextParser.ts +0 -108
  885. package/integrations/xai/models.ts +0 -13
  886. package/render/canvas/canvasEditContext.ts +0 -127
  887. package/render/canvas/canvasRuntime.ts +0 -57
  888. package/render/canvas/canvasSnapshotParser.ts +0 -76
  889. package/render/canvas/canvasTree.ts +0 -308
  890. package/render/canvas/types.ts +0 -46
  891. package/render/layout/deleteBehavior.ts +0 -52
  892. package/render/layout/mainLayoutSidebar.ts +0 -17
  893. package/render/layout/mainLayoutViewMode.ts +0 -81
  894. package/render/layout/topbarUtils.ts +0 -87
  895. package/render/layout/useDevReloadPending.ts +0 -30
  896. package/render/page/createPageAction.ts +0 -183
  897. package/render/page/docSlice.ts +0 -468
  898. package/render/page/server/createPage.ts +0 -176
  899. package/render/page/server/handleCreatePage.ts +0 -82
  900. package/render/page/server/index.ts +0 -4
  901. package/render/page/types.ts +0 -17
  902. package/render/page/useKeyboardSave.ts +0 -48
  903. package/render/styles/zIndex.ts +0 -12
  904. package/render/surf/WeatherIconStyles.ts +0 -17
  905. package/render/surf/color.ts +0 -9
  906. package/render/surf/config.ts +0 -46
  907. package/render/surf/screens/style.ts +0 -1
  908. package/render/surf/styles/ToggleButtonStyles.ts +0 -8
  909. package/render/surf/utils/groupedWeatherData.ts +0 -32
  910. package/render/surf/weatherUtils.ts +0 -50
  911. package/render/table/createTableAction.ts +0 -270
  912. package/render/table/deleteTableAction.ts +0 -129
  913. package/render/table/fetchAndCacheTableRows.ts +0 -174
  914. package/render/table/tableSlice.ts +0 -1106
  915. package/render/table/tableView.ts +0 -289
  916. package/render/table/toolValueUtils.ts +0 -363
  917. package/render/table/types.ts +0 -252
  918. package/render/table/useCreateTable.ts +0 -72
  919. package/render/table/useTable.ts +0 -61
  920. package/render/table/utils/tableSerialization.ts +0 -50
  921. package/render/web/elements/artifactPreviewCode.ts +0 -43
  922. package/render/web/elements/artifactRuntimePreload.ts +0 -52
  923. package/render/web/elements/codeBlockAutoPreview.ts +0 -10
  924. package/render/web/elements/mermaidPreview.ts +0 -21
  925. package/render/web/ui/useInlineEdit.ts +0 -135
  926. package/server/agentEmailRegistrationRoutes.ts +0 -29
  927. package/server/agentRunRouteContract.ts +0 -9
  928. package/server/agentRunRoutes.ts +0 -10
  929. package/server/api/methods.ts +0 -355
  930. package/server/api/tableHandlers.ts +0 -58
  931. package/server/api/types.ts +0 -27
  932. package/server/apiContract.ts +0 -88
  933. package/server/apiRouteAdapter.ts +0 -218
  934. package/server/appBundler.ts +0 -90
  935. package/server/appRoutes.ts +0 -92
  936. package/server/artifactIconsRoute.ts +0 -89
  937. package/server/artifactRuntimeRoute.ts +0 -136
  938. package/server/authenticateToken.ts +0 -118
  939. package/server/billingLedgerRoutes.ts +0 -63
  940. package/server/buildManifest.ts +0 -54
  941. package/server/cliChatRoutes.ts +0 -5
  942. package/server/cloudflareRoutes.ts +0 -35
  943. package/server/coreHeaders.ts +0 -29
  944. package/server/coreReadiness.ts +0 -48
  945. package/server/coreRoutes.ts +0 -65
  946. package/server/coreRuntime.ts +0 -98
  947. package/server/createResponse.ts +0 -68
  948. package/server/cryptoPaymentRoutes.ts +0 -8
  949. package/server/databaseRoutes.ts +0 -225
  950. package/server/desktopRuntimeRoutes.ts +0 -120
  951. package/server/devBuildInfo.ts +0 -51
  952. package/server/devReload.ts +0 -161
  953. package/server/devToolPathPolicy.ts +0 -59
  954. package/server/devToolRoutes.ts +0 -274
  955. package/server/email/cloudflareEmailProvider.ts +0 -119
  956. package/server/email/cloudflareInboundBridge.ts +0 -121
  957. package/server/email/cloudflareInboundWorker.ts +0 -28
  958. package/server/email/provider.ts +0 -149
  959. package/server/email/providerRegistry.ts +0 -22
  960. package/server/emailInboundRoutes.ts +0 -17
  961. package/server/entry.ts +0 -211
  962. package/server/handleRPCRequest.ts +0 -117
  963. package/server/handlers/activityStatsHandler.ts +0 -77
  964. package/server/handlers/agentEmailRegistrationE2EHandler.ts +0 -408
  965. package/server/handlers/agentEmailRegistrationE2ERoutes.ts +0 -6
  966. package/server/handlers/agentRun/agentLookup.ts +0 -71
  967. package/server/handlers/agentRun/autonomousRuntime.ts +0 -356
  968. package/server/handlers/agentRun/backgroundRunDialog.ts +0 -31
  969. package/server/handlers/agentRun/builtinAgents.ts +0 -271
  970. package/server/handlers/agentRun/continueDialogContext.ts +0 -102
  971. package/server/handlers/agentRun/conversationReference.ts +0 -111
  972. package/server/handlers/agentRun/debugContext.ts +0 -58
  973. package/server/handlers/agentRun/dialogLookup.ts +0 -68
  974. package/server/handlers/agentRun/foregroundStreamDialog.ts +0 -13
  975. package/server/handlers/agentRun/index.ts +0 -2090
  976. package/server/handlers/agentRun/localRuntimeBootstrap.ts +0 -85
  977. package/server/handlers/agentRun/loop.ts +0 -2622
  978. package/server/handlers/agentRun/machineConnector.ts +0 -283
  979. package/server/handlers/agentRun/machineRunAudit.ts +0 -50
  980. package/server/handlers/agentRun/modelUsageToolHandlers.ts +0 -371
  981. package/server/handlers/agentRun/referenceRuntime.ts +0 -50
  982. package/server/handlers/agentRun/requestContext.ts +0 -90
  983. package/server/handlers/agentRun/response.ts +0 -27
  984. package/server/handlers/agentRun/runBilling.ts +0 -108
  985. package/server/handlers/agentRun/runDialogPreparation.ts +0 -55
  986. package/server/handlers/agentRun/runtimeBinding.ts +0 -61
  987. package/server/handlers/agentRun/runtimeContext.ts +0 -143
  988. package/server/handlers/agentRun/runtimeExecutionContext.ts +0 -165
  989. package/server/handlers/agentRun/runtimePreparation.ts +0 -195
  990. package/server/handlers/agentRun/runtimeRouting.ts +0 -73
  991. package/server/handlers/agentRun/runtimeSystemMessages.ts +0 -230
  992. package/server/handlers/agentRun/saveDialog.ts +0 -1383
  993. package/server/handlers/agentRun/syncRunDialog.ts +0 -90
  994. package/server/handlers/agentRun/tableActivityProjection.ts +0 -132
  995. package/server/handlers/agentRun/taskRunControlPrompt.ts +0 -122
  996. package/server/handlers/agentRun/taskRunToolHandler.ts +0 -581
  997. package/server/handlers/agentRun/toolExecutor.ts +0 -2873
  998. package/server/handlers/agentRun/toolPolicyGuards.ts +0 -295
  999. package/server/handlers/agentRun/types.ts +0 -95
  1000. package/server/handlers/agentRun/workspaceLease.ts +0 -58
  1001. package/server/handlers/alphaTestRouteGuard.ts +0 -30
  1002. package/server/handlers/apifyActorHandler.ts +0 -170
  1003. package/server/handlers/appDeployFlow.ts +0 -876
  1004. package/server/handlers/appDeployHandler.ts +0 -4
  1005. package/server/handlers/appDeployMutationHandlers.ts +0 -133
  1006. package/server/handlers/appDeployReadHandlers.ts +0 -321
  1007. package/server/handlers/appDeployShared.ts +0 -230
  1008. package/server/handlers/appDeployStatusStore.ts +0 -185
  1009. package/server/handlers/appDomainHandler.ts +0 -482
  1010. package/server/handlers/appLegacyInfraCleanup.ts +0 -10
  1011. package/server/handlers/appSandboxHandler.ts +0 -1076
  1012. package/server/handlers/appSourceReadiness.ts +0 -75
  1013. package/server/handlers/appSpaceAccess.ts +0 -186
  1014. package/server/handlers/applyEditHandler.ts +0 -544
  1015. package/server/handlers/applyLineEditsHandler.ts +0 -1058
  1016. package/server/handlers/billingLedgerAuditHandler.ts +0 -82
  1017. package/server/handlers/billingLedgerWitnessHandler.ts +0 -161
  1018. package/server/handlers/billingUsageReportHandler.ts +0 -90
  1019. package/server/handlers/browserToolHandler.ts +0 -450
  1020. package/server/handlers/cfTextToSpeechHandler.ts +0 -137
  1021. package/server/handlers/cfWhisperHandler.ts +0 -206
  1022. package/server/handlers/chatBillingSse.ts +0 -79
  1023. package/server/handlers/chatHandler.ts +0 -817
  1024. package/server/handlers/chatProxyRouting.ts +0 -404
  1025. package/server/handlers/chatUpstreamRetry.ts +0 -385
  1026. package/server/handlers/checkEnvHandler.ts +0 -250
  1027. package/server/handlers/cliChatHandler.ts +0 -266
  1028. package/server/handlers/cloudflareBrowserHandler.ts +0 -275
  1029. package/server/handlers/cloudflareCrawlHandler.ts +0 -260
  1030. package/server/handlers/codeSearchHandler.ts +0 -484
  1031. package/server/handlers/connector/connectorConnectionRegistry.ts +0 -240
  1032. package/server/handlers/connector/connectorWebSocket.ts +0 -121
  1033. package/server/handlers/creatorEarningsReportHandler.ts +0 -97
  1034. package/server/handlers/creatorSettlementReportHandler.ts +0 -98
  1035. package/server/handlers/deepseekOcrHandler.ts +0 -114
  1036. package/server/handlers/deleteMemoryHandler.ts +0 -115
  1037. package/server/handlers/desktopAgentRuntimeAdapter.ts +0 -307
  1038. package/server/handlers/desktopAgentRuntimeHostCapabilities.ts +0 -25
  1039. package/server/handlers/desktopAgentRuntimeReadiness.ts +0 -62
  1040. package/server/handlers/desktopAgentRuntimeStatusHandler.ts +0 -62
  1041. package/server/handlers/desktopAgentRuntimeTurnHandler.ts +0 -169
  1042. package/server/handlers/desktopAgentRuntimeTurnService.ts +0 -346
  1043. package/server/handlers/desktopClipboardHandler.ts +0 -104
  1044. package/server/handlers/desktopFiles/handler.ts +0 -159
  1045. package/server/handlers/desktopFiles/operations.ts +0 -202
  1046. package/server/handlers/desktopFiles/sandbox.ts +0 -62
  1047. package/server/handlers/desktopFiles/store.ts +0 -81
  1048. package/server/handlers/desktopLlamaRuntimeHandler.ts +0 -394
  1049. package/server/handlers/desktopLocalConnectorHandler.ts +0 -101
  1050. package/server/handlers/desktopUpdaterHandler.ts +0 -240
  1051. package/server/handlers/dialogEvents.ts +0 -10
  1052. package/server/handlers/emailInboundHandler.ts +0 -65
  1053. package/server/handlers/eventBus.ts +0 -160
  1054. package/server/handlers/exaSearchHandler.ts +0 -73
  1055. package/server/handlers/execShellHandler.ts +0 -661
  1056. package/server/handlers/favoriteHandlers.ts +0 -423
  1057. package/server/handlers/fetchWebpageHandler.ts +0 -117
  1058. package/server/handlers/fileOutlineHandler.ts +0 -107
  1059. package/server/handlers/geminiImagePreviewHandler.ts +0 -612
  1060. package/server/handlers/getDialogBillingHandler.ts +0 -152
  1061. package/server/handlers/getTransactionsHandler.ts +0 -110
  1062. package/server/handlers/googleNativeChat.ts +0 -572
  1063. package/server/handlers/listFilesHandler.ts +0 -139
  1064. package/server/handlers/machines/machineAuth.ts +0 -149
  1065. package/server/handlers/machines/machineBinding.ts +0 -60
  1066. package/server/handlers/machines/machineHandlers.ts +0 -265
  1067. package/server/handlers/machines/machineInstallAssets.ts +0 -565
  1068. package/server/handlers/machines/machineRegistry.ts +0 -89
  1069. package/server/handlers/notificationEmitter.ts +0 -191
  1070. package/server/handlers/notificationsHandler.ts +0 -94
  1071. package/server/handlers/olmOcrHandler.ts +0 -115
  1072. package/server/handlers/openaiImageHandler.ts +0 -500
  1073. package/server/handlers/providerCallsRecentHandler.ts +0 -234
  1074. package/server/handlers/providerHealthHandler.ts +0 -36
  1075. package/server/handlers/providerReconciliationRunHandler.ts +0 -180
  1076. package/server/handlers/providerRequestIdsHandler.ts +0 -105
  1077. package/server/handlers/publicHandler.ts +0 -209
  1078. package/server/handlers/readFileHandler.ts +0 -300
  1079. package/server/handlers/readXPostHandler.ts +0 -180
  1080. package/server/handlers/rememberMemoryHandler.ts +0 -69
  1081. package/server/handlers/remotionRenderHandler.ts +0 -236
  1082. package/server/handlers/renderMarkdownHandler.ts +0 -66
  1083. package/server/handlers/revenueShareReportHandler.ts +0 -96
  1084. package/server/handlers/searchRepoHandler.ts +0 -159
  1085. package/server/handlers/tableAccess.ts +0 -38
  1086. package/server/handlers/tableToolHandlers.ts +0 -755
  1087. package/server/handlers/typecheckWorker.ts +0 -54
  1088. package/server/handlers/userEvents.ts +0 -6
  1089. package/server/handlers/userSecretsHandler.ts +0 -221
  1090. package/server/handlers/versionHandler.ts +0 -286
  1091. package/server/handlers/versionStore.ts +0 -184
  1092. package/server/handlers/wereadGatewayHandler.ts +0 -48
  1093. package/server/handlers/whisperHandler.ts +0 -158
  1094. package/server/handlers/writeFileHandler.ts +0 -168
  1095. package/server/html/desktopReleaseManifest.server.ts +0 -17
  1096. package/server/html/generateErrorResponse.ts +0 -22
  1097. package/server/html/serializeState.ts +0 -9
  1098. package/server/html/ssrPreload.ts +0 -249
  1099. package/server/html/template.ts +0 -275
  1100. package/server/httpCompression.ts +0 -102
  1101. package/server/index.ts +0 -0
  1102. package/server/liveReloadScript.ts +0 -105
  1103. package/server/luIconNames.ts +0 -14
  1104. package/server/machineRoutes.ts +0 -44
  1105. package/server/mediaRoutes.ts +0 -25
  1106. package/server/memoryRoutes.ts +0 -14
  1107. package/server/normalizedStatusRoutes.ts +0 -23
  1108. package/server/payments/crypto/cryptoUsdcBaseAddressPool.ts +0 -49
  1109. package/server/payments/crypto/cryptoUsdcBaseConfig.ts +0 -120
  1110. package/server/payments/crypto/cryptoUsdcBasePaymentProvider.ts +0 -137
  1111. package/server/payments/crypto/cryptoUsdcBaseScanner.ts +0 -272
  1112. package/server/payments/crypto/cryptoUsdcBaseWatcher.ts +0 -40
  1113. package/server/payments/crypto/cryptoUsdtTronAddressPool.ts +0 -49
  1114. package/server/payments/crypto/cryptoUsdtTronConfig.ts +0 -120
  1115. package/server/payments/crypto/cryptoUsdtTronPaymentProvider.ts +0 -135
  1116. package/server/payments/crypto/cryptoUsdtTronScanner.ts +0 -315
  1117. package/server/payments/crypto/cryptoUsdtTronWatcher.ts +0 -40
  1118. package/server/payments/paymentProvider.ts +0 -6
  1119. package/server/payments/paymentRoutes.ts +0 -27
  1120. package/server/payments/rechargeCredits.ts +0 -69
  1121. package/server/payments/waffo/waffoPaymentProvider.ts +0 -344
  1122. package/server/preview/previewCapability.ts +0 -90
  1123. package/server/preview/previewConfig.ts +0 -54
  1124. package/server/preview/previewGateway.ts +0 -71
  1125. package/server/preview/previewRealtime.ts +0 -33
  1126. package/server/providerHealthProbe.ts +0 -198
  1127. package/server/providerHealthRoutes.ts +0 -19
  1128. package/server/publicPaths.ts +0 -12
  1129. package/server/publicRequestHandler.ts +0 -15
  1130. package/server/reactAppBuilder.ts +0 -416
  1131. package/server/realtimeRoutes.ts +0 -69
  1132. package/server/renderStream.ts +0 -20
  1133. package/server/routeFactory.ts +0 -45
  1134. package/server/routes.ts +0 -125
  1135. package/server/runtimeRole.ts +0 -15
  1136. package/server/safeTempFile.ts +0 -48
  1137. package/server/scheduler/scheduledTaskRuntime.ts +0 -230
  1138. package/server/scheduler/schedulerService.ts +0 -290
  1139. package/server/serverDrain.ts +0 -129
  1140. package/server/services/browserSessionManager.ts +0 -354
  1141. package/server/shareRoutes.ts +0 -86
  1142. package/server/sqliteRoutes.ts +0 -141
  1143. package/server/taskRunBridgeRoutes.ts +0 -98
  1144. package/server/tasks.ts +0 -113
  1145. package/server/waffoPaymentRoutes.ts +0 -5
  1146. package/server/webUtilityRoutes.ts +0 -50
  1147. package/server/workerValidator.ts +0 -224
  1148. package/share/action.ts +0 -225
  1149. package/share/clientTableReplication.ts +0 -160
  1150. package/share/link.ts +0 -40
  1151. package/share/loadOwnerShares.ts +0 -154
  1152. package/share/paidAccess.ts +0 -32
  1153. package/share/publicSharePolicy.ts +0 -27
  1154. package/share/server/fetchCommunityShares.ts +0 -45
  1155. package/share/server/helpers.ts +0 -204
  1156. package/share/server/importShare.ts +0 -144
  1157. package/share/server/listCommunityShares.ts +0 -167
  1158. package/share/server/purchaseDoc.ts +0 -216
  1159. package/share/server/readCommunityShareCover.ts +0 -74
  1160. package/share/server/readSharedTable.ts +0 -140
  1161. package/share/server/tableReplication.ts +0 -354
  1162. package/share/shareSlice.ts +0 -53
  1163. package/share/tableShareState.ts +0 -74
@@ -1,2873 +0,0 @@
1
- // packages/server/handlers/agentRun/toolExecutor.ts
2
- //
3
- // 服务端 tool 执行器。
4
- // 直接调用本机 API(无需 Redux),结果以字符串返回给 LLM。
5
- // 不持久化任何内容。
6
-
7
- import { markdownToSlate } from "../../../create/editor/transforms/markdownToSlate";
8
- import { slateToRenderMarkdown } from "../../../create/editor/transforms/slateToRenderMarkdown";
9
- import { extractMentionsFromSlate } from "../../../create/editor/utils/slateUtils";
10
- import { WEB_AUTH_TOKEN_COOKIE } from "../../../auth/tokenCookie";
11
- import { DataType } from "../../../create/types";
12
- import { NOLO_CLUSTER_SERVERS } from "../../../database/config";
13
- import { createAgentKey, createKey, createUserKey } from "../../../database/keys";
14
- import { ulid } from "../../../database/utils/ulid";
15
- import { saveBufferAsFile } from "../../../database/server/fileService";
16
- import { shareKey } from "../../../share/keys";
17
- import { DEFAULT_MODEL, getApiEndpoint } from "../../../ai/llm/providers";
18
- import type { AssistantToolCall, ToolExecutionContext } from "./types";
19
- import {
20
- buildSkillDocMarkdown,
21
- resolvePageSkillMetadata,
22
- parseSkillDocProtocol,
23
- parseExternalSkillMarkdown,
24
- type SkillDocConfig,
25
- } from "../../../ai/skills/skillDocProtocol";
26
- import {
27
- buildSkillDocFromArgs,
28
- type CreateSkillDocArgs,
29
- } from "../../../ai/skills/skillDocBuilder";
30
- import {
31
- diagnoseSkillDocument,
32
- evaluateSkillDocument,
33
- } from "../../../ai/skills/skillDiagnostics";
34
- import {
35
- buildSkillAgentRecord,
36
- type CreateSkillAgentToolArgs,
37
- } from "../../../ai/tools/agent/skillAgentPreset";
38
- import {
39
- prepareAgentDraftToolFunc,
40
- type PrepareAgentDraftToolArgs,
41
- } from "../../../ai/tools/agent/prepareAgentDraftTool";
42
- import type { CreateAgentToolArgs } from "../../../ai/tools/agent/createAgentTool";
43
- import {
44
- guardDestructiveAction,
45
- guardPublicTableShare,
46
- guardKnowledgeCapture,
47
- isDestructiveShellCommand,
48
- guardWorkspaceRead,
49
- recordKnowledgeCapture,
50
- recordWorkspaceRead,
51
- } from "./toolPolicyGuards";
52
- import { buildReadDocResult } from "../../../ai/tools/readDocTool";
53
- import { buildSkillFollowupResult } from "../../../ai/tools/skillFollowup";
54
- import { runZiweiChart } from "../../../ai/tools/ziweiChartTool";
55
- import { evaluateSmallVisualEditGuard } from "../../../ai/tools/appEditGuard";
56
- import {
57
- analyzeAppStyleSystem,
58
- buildAppStyleSystemHint,
59
- } from "../../../ai/tools/appReadSnapshot";
60
- import {
61
- calculateParallelBranchPricing,
62
- normalizeBudgetCredits,
63
- summarizeParallelBudget,
64
- summarizeParallelCosts,
65
- } from "../../../ai/tools/agent/parallelBudget";
66
- import {
67
- normalizeServerOrigin,
68
- } from "../../../ai/agent/serverOrigin";
69
- import { extractEmailVerificationArtifacts } from "../../../ai/tools/emailTools";
70
- import { convertMarxistsBookToOfflineHtml } from "../../../ai/tools/marxistsOfflineBook";
71
- import { formatMarxistsOfflineBookDisplayData } from "../../../ai/tools/convertMarxistsBookTool";
72
- import {
73
- formatJdProductDisplayData,
74
- getKnownJdProductFallback,
75
- hasSparseJdSpecifications,
76
- isIncompleteProductData,
77
- jdProductScraperFunc,
78
- mergeJdProductData,
79
- parseJdBrowserExtractedData,
80
- } from "../../../ai/tools/jdProductScraperTool";
81
- import {
82
- buildDialogMessageSearchResults,
83
- clampDialogSearchNumber,
84
- normalizeDialogSearchText,
85
- } from "../../../ai/tools/dialogMessageSearch";
86
- import { getServerAuthorityStore } from "../../../database/server/db";
87
- import { createSpaceKey } from "../../../create/space/spaceKeys";
88
- import {
89
- buildDeleteSpacesPreview,
90
- filterSpaceDeletionCandidates,
91
- resolveConfirmedSpaceDeletionTargets,
92
- type SpaceMembershipLike,
93
- type SpaceRecordLike,
94
- } from "../../../ai/tools/deleteSpacesToolModel";
95
- import { canonicalizeToolName } from "../../../ai/tools/toolNameAliases";
96
- import {
97
- runCompleteDialogGoalTool,
98
- runCreateDialogGoalTool,
99
- runCreateScheduledTaskTool,
100
- runGetDialogGoalTool,
101
- runNotifyUserTool,
102
- runQueryModelUsageTool,
103
- } from "./modelUsageToolHandlers";
104
- import { runTaskRunTool } from "./taskRunToolHandler";
105
- import { projectDialogActivityToSubjectRows } from "./tableActivityProjection";
106
- import { resolveExistingDialogRef } from "./dialogLookup";
107
-
108
- const getToolExecutorStore = () => getServerAuthorityStore();
109
-
110
- const APP_DEPLOY_POLL_INTERVAL_MS = 250;
111
- const APP_DEPLOY_POLL_TIMEOUT_MS = 60_000;
112
- const DEFAULT_PARALLEL_AGENT_BRANCH_TIMEOUT_MS = 10 * 60 * 1000;
113
- const configuredParallelAgentBranchTimeoutMs = Number(
114
- process.env.PARALLEL_AGENT_BRANCH_TIMEOUT_MS,
115
- );
116
- const PARALLEL_AGENT_BRANCH_TIMEOUT_MS =
117
- Number.isFinite(configuredParallelAgentBranchTimeoutMs) &&
118
- configuredParallelAgentBranchTimeoutMs > 0
119
- ? configuredParallelAgentBranchTimeoutMs
120
- : DEFAULT_PARALLEL_AGENT_BRANCH_TIMEOUT_MS;
121
- const IMAGE_GENERATION_TOOL_NAMES = new Set([
122
- "geminiFlashImage",
123
- "geminiProImagePreview",
124
- "openAIGptImageGenerate",
125
- "openAIGptImageEdit",
126
- "openAIGptImage",
127
- ]);
128
- const FEEDBACK_AGENT_ID = "01NOLOFEEDBACKA000000000R1";
129
-
130
- const trimString = (value: unknown): string =>
131
- typeof value === "string" ? value.trim() : "";
132
-
133
- const normalizeStringArray = (value: unknown): string[] => {
134
- if (Array.isArray(value)) {
135
- return value.map(trimString).filter(Boolean);
136
- }
137
- if (typeof value === "string") {
138
- return value.split(",").map((item) => item.trim()).filter(Boolean);
139
- }
140
- return [];
141
- };
142
-
143
- const normalizeAgentReferencesForServerCreate = (value: unknown) =>
144
- Array.isArray(value)
145
- ? value
146
- .filter((item): item is Record<string, unknown> =>
147
- !!item && typeof item === "object" && !Array.isArray(item)
148
- )
149
- .map((item) => ({
150
- dbKey: trimString(item.dbKey),
151
- title: trimString(item.title),
152
- type: trimString(item.type) || "knowledge",
153
- }))
154
- .filter((item) => item.dbKey)
155
- : [];
156
-
157
- const normalizeRunnableAgentModel = (provider: string, model: string) => {
158
- try {
159
- getApiEndpoint({ provider, model } as any);
160
- return { provider, model };
161
- } catch (error) {
162
- if (
163
- error instanceof Error &&
164
- (error.message.includes("Unsupported provider") ||
165
- error.message.includes("Custom provider URL is required"))
166
- ) {
167
- return {
168
- provider: DEFAULT_MODEL.provider,
169
- model: DEFAULT_MODEL.name,
170
- };
171
- }
172
- throw error;
173
- }
174
- };
175
-
176
- const buildServerCreatedAgentRecord = (
177
- userId: string,
178
- args: CreateAgentToolArgs,
179
- currentSpaceId?: string | null,
180
- ) => {
181
- const name = trimString(args.name);
182
- const model = trimString(args.model);
183
- const provider = trimString(args.provider);
184
- if (!name) throw new Error("createAgent: name is required");
185
- if (!model) throw new Error("createAgent: model is required");
186
- if (!provider) throw new Error("createAgent: provider is required");
187
- const runnableModel = normalizeRunnableAgentModel(provider, model);
188
-
189
- const now = Date.now();
190
- const id = ulid();
191
- const greeting =
192
- typeof args.greeting === "string"
193
- ? args.greeting.trim()
194
- : args.greeting && typeof args.greeting === "object"
195
- ? args.greeting
196
- : undefined;
197
- return {
198
- id,
199
- type: DataType.AGENT,
200
- userId,
201
- createdAt: now,
202
- updatedAt: now,
203
- dialogCount: 0,
204
- messageCount: 0,
205
- tokenCount: 0,
206
- spaceId: currentSpaceId || undefined,
207
- name,
208
- model: runnableModel.model,
209
- provider: runnableModel.provider,
210
- prompt: trimString(args.prompt),
211
- introduction: trimString(args.introduction),
212
- ...(greeting ? { greeting } : {}),
213
- isPublic: args.isPublic === true,
214
- tags: normalizeStringArray(args.tags),
215
- tools: normalizeStringArray(args.tools),
216
- references: normalizeAgentReferencesForServerCreate(args.references),
217
- linkedSpaces: normalizeStringArray(args.linkedSpaces),
218
- ...(typeof args.temperature === "number" ? { temperature: args.temperature } : {}),
219
- ...(typeof args.top_p === "number" ? { top_p: args.top_p } : {}),
220
- ...(typeof args.frequency_penalty === "number"
221
- ? { frequency_penalty: args.frequency_penalty }
222
- : {}),
223
- ...(typeof args.presence_penalty === "number"
224
- ? { presence_penalty: args.presence_penalty }
225
- : {}),
226
- ...(typeof args.max_tokens === "number" ? { max_tokens: args.max_tokens } : {}),
227
- ...(args.reasoning_effort ? { reasoning_effort: args.reasoning_effort } : {}),
228
- whitelist: args.isPublic === true ? [] : [],
229
- };
230
- };
231
- const FEEDBACK_TABLE_ID = "01NOLOFEEDBACKT000000000R1";
232
- const TASK_BOARD_TABLE_ID = "NOLOTASKBOARD";
233
- const TASK_RUN_PRIMITIVE_TOOL_NAMES = new Set([
234
- "readTaskContext",
235
- "queryReadyWorkItems",
236
- "upsertWorkItem",
237
- "claimWorkItem",
238
- "openDialog",
239
- "recordArtifact",
240
- "setBlocker",
241
- "clearBlocker",
242
- "requestReview",
243
- "recordReview",
244
- "submitOutcome",
245
- "closeWorkItem",
246
- ]);
247
- const SEARCH_DIALOG_MESSAGES_SCAN_LIMIT = 500;
248
- const SEARCH_DIALOG_MESSAGES_RESULT_LIMIT = 10;
249
- const SEARCH_DIALOG_MESSAGES_CONTEXT_LIMIT = 3;
250
- const SEARCH_DIALOG_MESSAGES_CLIP_CHARS = 1800;
251
- const SEARCH_DIALOG_MESSAGES_CONTEXT_CLIP_CHARS = 600;
252
-
253
- const sanitizeGeneratedHtmlFileName = (value: unknown, fallback: string): string => {
254
- const raw = typeof value === "string" && value.trim() ? value.trim() : fallback;
255
- const sanitized =
256
- raw
257
- .replace(/[\\/:*?"<>|]+/g, "-")
258
- .replace(/\s+/g, "-")
259
- .replace(/-+/g, "-")
260
- .replace(/^-|-$/g, "")
261
- .slice(0, 100) || fallback;
262
- return /\.html?$/i.test(sanitized) ? sanitized : `${sanitized}.html`;
263
- };
264
-
265
- const buildFileContentUrl = (base: string, fileDbKey: string): string =>
266
- `${base}/api/v1/db/file/content/${encodeURIComponent(fileDbKey)}`;
267
-
268
- const normalizeBase = (base: string): string => base.replace(/\/+$/, "");
269
-
270
- const normalizeSubjectRefs = (value: unknown): Array<{ kind: string; id: string; role?: string }> => {
271
- if (!Array.isArray(value)) return [];
272
- return value
273
- .map((item) => {
274
- if (!item || typeof item !== "object") return null;
275
- const raw = item as Record<string, unknown>;
276
- const kind = typeof raw.kind === "string" ? raw.kind.trim() : "";
277
- const id = typeof raw.id === "string" ? raw.id.trim() : "";
278
- if (!kind || !id) return null;
279
- const role = typeof raw.role === "string" && raw.role.trim() ? raw.role.trim() : undefined;
280
- return { kind, id, ...(role ? { role } : {}) };
281
- })
282
- .filter((item): item is { kind: string; id: string; role?: string } => Boolean(item));
283
- };
284
-
285
- function mergeSubjectRefs(
286
- ...refGroups: unknown[]
287
- ): Array<{ kind: string; id: string; role?: string }> {
288
- const merged: Array<{ kind: string; id: string; role?: string }> = [];
289
- const seen = new Set<string>();
290
- for (const ref of refGroups.flatMap((group) => normalizeSubjectRefs(group))) {
291
- const key = `${ref.kind}\u0000${ref.id}\u0000${ref.role ?? ""}`;
292
- if (seen.has(key)) continue;
293
- seen.add(key);
294
- merged.push(ref);
295
- }
296
- return merged;
297
- }
298
-
299
- const resolveSameOriginChildRunBase = (targetBase: string, mainBase: string) => {
300
- if (normalizeServerOrigin(targetBase) !== normalizeServerOrigin(mainBase)) {
301
- return targetBase;
302
- }
303
- const port = process.env.HTTP_PORT;
304
- if (!port) return targetBase;
305
- const host = process.env.PLATFORM_SERVER_HOST || "127.0.0.1";
306
- const loopbackHost =
307
- host === "0.0.0.0" || host === "::" || host === "[::]" ? "127.0.0.1" : host;
308
- return `http://${loopbackHost}:${port}`;
309
- };
310
-
311
- const generateShareToken = (): string => {
312
- const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
313
- const charsLen = chars.length;
314
- const maxValid = 252;
315
- let token = "";
316
- while (token.length < 10) {
317
- const bytes = new Uint8Array(16);
318
- crypto.getRandomValues(bytes);
319
- for (let i = 0; i < bytes.length && token.length < 10; i += 1) {
320
- if (bytes[i] < maxValid) {
321
- token += chars.charAt(bytes[i] % charsLen);
322
- }
323
- }
324
- }
325
- return token;
326
- };
327
- const normalizeTaskRunPrimitiveArgs = (
328
- toolName: string,
329
- args: Record<string, any>,
330
- ): Record<string, any> | null => {
331
- if (!TASK_RUN_PRIMITIVE_TOOL_NAMES.has(toolName)) return null;
332
- const dbKey = args.dbKey ?? args.rowDbKey;
333
- const baseArgs = {
334
- action: toolName,
335
- ...(typeof dbKey === "string" && dbKey.trim() ? { dbKey: dbKey.trim() } : {}),
336
- ...(typeof args.tenantId === "string" && args.tenantId.trim() ? { tenantId: args.tenantId.trim() } : {}),
337
- ...(typeof args.tableId === "string" && args.tableId.trim() ? { tableId: args.tableId.trim() } : {}),
338
- ...(typeof args.rowId === "string" && args.rowId.trim() ? { rowId: args.rowId.trim() } : {}),
339
- };
340
-
341
- if (toolName !== "upsertWorkItem" || Array.isArray(args.workItems)) {
342
- return {
343
- ...baseArgs,
344
- ...args,
345
- action: toolName,
346
- ...(typeof dbKey === "string" && dbKey.trim() ? { dbKey: dbKey.trim() } : {}),
347
- rowDbKey: undefined,
348
- };
349
- }
350
-
351
- const id = args.workItemId ?? args.itemId ?? args.id;
352
- const title = args.title ?? args.summary ?? args.description;
353
- return {
354
- ...baseArgs,
355
- workItems: [
356
- {
357
- ...(typeof id === "string" && id.trim() ? { id: id.trim() } : {}),
358
- ...(typeof args.kind === "string" && args.kind.trim()
359
- ? { kind: args.kind.trim() }
360
- : typeof args.type === "string" && args.type.trim()
361
- ? { kind: args.type.trim() }
362
- : {}),
363
- ...(typeof args.ownerAgent === "string" && args.ownerAgent.trim()
364
- ? { ownerAgent: args.ownerAgent.trim() }
365
- : typeof args.owner === "string" && args.owner.trim()
366
- ? { ownerAgent: args.owner.trim() }
367
- : typeof args.agentKey === "string" && args.agentKey.trim()
368
- ? { ownerAgent: args.agentKey.trim() }
369
- : {}),
370
- ...(typeof title === "string" && title.trim() ? { title: title.trim() } : {}),
371
- ...(typeof args.status === "string" && args.status.trim()
372
- ? { status: args.status.trim() }
373
- : {}),
374
- ...(Array.isArray(args.dependsOn) ? { dependsOn: args.dependsOn } : {}),
375
- ...(Array.isArray(args.writeScope) ? { writeScope: args.writeScope } : {}),
376
- ...(typeof args.reviewPolicy === "string" && args.reviewPolicy.trim()
377
- ? { reviewPolicy: args.reviewPolicy.trim() }
378
- : {}),
379
- },
380
- ],
381
- };
382
- };
383
- const getAllowedRemoteServerBases = (): string[] =>
384
- (process.env.AGENT_TOOL_ALLOWED_SERVER_BASES ?? "")
385
- .split(",")
386
- .map((base) => normalizeServerOrigin(base.trim()))
387
- .filter((base): base is string => !!base);
388
-
389
- const buildFanoutServerList = (
390
- originServer: string,
391
- syncServers: unknown,
392
- ): string[] => {
393
- const normalizedOrigin = normalizeServerOrigin(originServer);
394
- const candidates = Array.isArray(syncServers) ? syncServers : [];
395
- const shouldIncludeNoloCluster =
396
- !!normalizedOrigin &&
397
- (/^https?:\/\/(?:localhost|127\.0\.0\.1)(?::\d+)?$/i.test(normalizedOrigin) ||
398
- NOLO_CLUSTER_SERVERS.some(
399
- (server) => normalizeServerOrigin(server) === normalizedOrigin,
400
- ));
401
- return Array.from(
402
- new Set(
403
- [
404
- normalizedOrigin,
405
- ...candidates,
406
- ...(shouldIncludeNoloCluster ? NOLO_CLUSTER_SERVERS : []),
407
- ]
408
- .map((value) =>
409
- typeof value === "string" ? normalizeServerOrigin(value) : null,
410
- )
411
- .filter((value): value is string => !!value),
412
- ),
413
- );
414
- };
415
-
416
- export const resolveDelegatedServerBase = (
417
- requestedBase: unknown,
418
- mainBase: string,
419
- ): { ok: true; base: string } | { ok: false; error: string } => {
420
- if (typeof requestedBase !== "string" || !requestedBase.trim()) {
421
- return { ok: true, base: mainBase };
422
- }
423
-
424
- const requestedOrigin = normalizeServerOrigin(requestedBase.trim());
425
- if (!requestedOrigin) {
426
- return {
427
- ok: false,
428
- error: `Invalid serverBase: ${String(requestedBase)}`,
429
- };
430
- }
431
-
432
- const mainOrigin = normalizeServerOrigin(mainBase);
433
- const isLocalMain =
434
- !!mainOrigin &&
435
- /^https?:\/\/(?:localhost|127\.0\.0\.1)(?::\d+)?$/i.test(mainOrigin);
436
- const isNoloClusterTarget = NOLO_CLUSTER_SERVERS.some(
437
- (server) => normalizeServerOrigin(server) === requestedOrigin,
438
- );
439
- if (
440
- requestedOrigin === mainOrigin ||
441
- getAllowedRemoteServerBases().includes(requestedOrigin) ||
442
- (isLocalMain && isNoloClusterTarget)
443
- ) {
444
- return { ok: true, base: requestedOrigin };
445
- }
446
-
447
- return {
448
- ok: false,
449
- error:
450
- `serverBase "${requestedOrigin}" is not allowed. ` +
451
- "Add it to AGENT_TOOL_ALLOWED_SERVER_BASES before delegating current auth to a remote nolo server.",
452
- };
453
- };
454
-
455
- export { normalizeServerOrigin };
456
-
457
- const buildDelegatedAgentInput = (task: string, input: unknown): string => {
458
- if (input === undefined || input === null) return task;
459
- if (typeof input === "string") {
460
- return `${task}\n\n--- INPUT (text) ---\n${input}`;
461
- }
462
- return `${task}\n\n--- INPUT (json) ---\n${JSON.stringify(input, null, 2)}`;
463
- };
464
-
465
- const isHttpImageData = (value: unknown): boolean =>
466
- typeof value === "string" && /^https?:\/\//i.test(value.trim());
467
-
468
- const collectLatestImageUrlsFromMessages = (messages: unknown): string[] => {
469
- if (!Array.isArray(messages)) return [];
470
- for (let index = messages.length - 1; index >= 0; index -= 1) {
471
- const content = (messages[index] as any)?.content;
472
- if (!Array.isArray(content)) continue;
473
- const urls = content
474
- .map((part) =>
475
- part?.type === "image_url" && typeof part.image_url?.url === "string"
476
- ? part.image_url.url.trim()
477
- : "",
478
- )
479
- .filter((url): url is string => isHttpImageData(url));
480
- if (urls.length > 0) return [...new Set(urls)];
481
- }
482
- return [];
483
- };
484
-
485
- const fetchPersistedDialogImageUrls = async (
486
- mainBase: string,
487
- authToken: string,
488
- dialogId?: string | null,
489
- ): Promise<string[]> => {
490
- if (!dialogId) return [];
491
- try {
492
- const res = await fetch(`${mainBase}/rpc/getConvMsgs`, {
493
- method: "POST",
494
- headers: {
495
- "Content-Type": "application/json",
496
- ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),
497
- },
498
- body: JSON.stringify({ dialogId, limit: 80 }),
499
- });
500
- if (!res.ok) return [];
501
- const messages = await res.json().catch(() => []);
502
- return collectLatestImageUrlsFromMessages(messages);
503
- } catch {
504
- return [];
505
- }
506
- };
507
-
508
- const resolveImageToolArgs = async (
509
- toolName: string,
510
- args: Record<string, any>,
511
- mainBase: string,
512
- authToken: string,
513
- context?: ToolExecutionContext,
514
- ): Promise<Record<string, any>> => {
515
- if (!IMAGE_GENERATION_TOOL_NAMES.has(toolName)) return args;
516
-
517
- const images = Array.isArray(args.images) ? args.images : [];
518
- if (images.some((image: any) => isHttpImageData(image?.data))) {
519
- return args;
520
- }
521
-
522
- let fallbackUrls = Array.isArray(context?.imageUrls)
523
- ? context.imageUrls.filter((url) => isHttpImageData(url))
524
- : [];
525
- if (fallbackUrls.length === 0) {
526
- fallbackUrls = await fetchPersistedDialogImageUrls(
527
- mainBase,
528
- authToken,
529
- context?.dialogId,
530
- );
531
- }
532
- if (fallbackUrls.length === 0) return args;
533
-
534
- return {
535
- ...args,
536
- images: fallbackUrls.slice(0, Math.max(1, images.length)).map((url) => ({
537
- data: url,
538
- })),
539
- };
540
- };
541
-
542
- const normalizeSkillImportUrl = (rawUrl: string): string => {
543
- const trimmed = rawUrl.trim();
544
- const githubBlobMatch = trimmed.match(
545
- /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/blob\/([^/]+)\/(.+)$/,
546
- );
547
- if (githubBlobMatch) {
548
- const [, owner, repo, ref, path] = githubBlobMatch;
549
- return `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/${path}`;
550
- }
551
- return trimmed;
552
- };
553
-
554
- const withTaskRunContext = (
555
- args: Record<string, any>,
556
- context?: ToolExecutionContext,
557
- ): Record<string, any> => {
558
- const hasExplicitRowTarget =
559
- (typeof args.dbKey === "string" && args.dbKey.trim()) ||
560
- (typeof args.tenantId === "string" && args.tenantId.trim() &&
561
- typeof args.tableId === "string" && args.tableId.trim() &&
562
- typeof args.rowId === "string" && args.rowId.trim());
563
- if (hasExplicitRowTarget) return args;
564
- const rowDbKey =
565
- typeof context?.runtimeContext?.taskRun?.rowDbKey === "string" &&
566
- context.runtimeContext.taskRun.rowDbKey.trim()
567
- ? context.runtimeContext.taskRun.rowDbKey.trim()
568
- : "";
569
- return rowDbKey ? { ...args, dbKey: rowDbKey } : args;
570
- };
571
-
572
- function buildAgentHandoffUserInput(args: {
573
- message: string;
574
- parentDialogId?: string;
575
- subjectRefs?: Array<{ kind: string; id: string; role?: string }>;
576
- subjectEvidenceLines?: string[];
577
- runtimeContext?: Record<string, any>;
578
- }): string {
579
- const taskRun = args.runtimeContext?.taskRun;
580
- const rowDbKey =
581
- typeof taskRun?.rowDbKey === "string" && taskRun.rowDbKey.trim()
582
- ? taskRun.rowDbKey.trim()
583
- : "";
584
- const workItemId =
585
- typeof taskRun?.workItemId === "string" && taskRun.workItemId.trim()
586
- ? taskRun.workItemId.trim()
587
- : "";
588
- const artifactIds = Array.isArray(taskRun?.artifactIds)
589
- ? taskRun.artifactIds.filter((item: unknown): item is string => typeof item === "string" && Boolean(item.trim()))
590
- : [];
591
- const subjectRefs = args.subjectRefs?.filter((ref) => ref?.kind && ref?.id) ?? [];
592
- const subjectEvidenceLines = args.subjectEvidenceLines?.filter(Boolean) ?? [];
593
- if (!args.parentDialogId && !rowDbKey && !workItemId && artifactIds.length === 0 && subjectRefs.length === 0 && subjectEvidenceLines.length === 0) {
594
- return args.message;
595
- }
596
- return [
597
- "--- Nolo agent handoff context ---",
598
- "This block is orientation for the receiving agent. It is not a workflow decision, review result, or replacement for inspecting durable records.",
599
- ...(args.parentDialogId ? [`- parentDialogId: ${args.parentDialogId}`] : []),
600
- ...(rowDbKey ? [`- task row: ${rowDbKey}`] : []),
601
- ...(workItemId ? [`- workItemId: ${workItemId}`] : []),
602
- ...(artifactIds.length ? [`- artifactIds: ${artifactIds.join(",")}`] : []),
603
- ...(subjectRefs.length
604
- ? [
605
- "- subjectRefs:",
606
- ...subjectRefs.map((ref) => ` - ${ref.kind}:${ref.id}${ref.role ? ` (${ref.role})` : ""}`),
607
- ]
608
- : []),
609
- ...(subjectEvidenceLines.length
610
- ? [
611
- "- referenced evidence snapshot (server-read durable facts at handoff time):",
612
- ...subjectEvidenceLines.map((line) => ` - ${line}`),
613
- ]
614
- : []),
615
- "- Start by reading the durable task context when task-run is available.",
616
- "- To find the work evidence, inspect the task row fields that already exist: workItems.dialogIds, workItems.outcome, review.dialogId, activityRefs, agentRuns.dialogId/resultSummary, and artifactRefs.",
617
- "- Use dialog read/search tools for exact wording or tool traces; do not infer completion or review status from this handoff text alone.",
618
- "- Durable result channels include taskRun primitives such as submitOutcome, setBlocker, requestReview, recordReview, or closeWorkItem when they are available.",
619
- "--- Handoff task ---",
620
- args.message,
621
- ].join("\n");
622
- }
623
-
624
- const asPlainRecord = (value: unknown): Record<string, any> =>
625
- value && typeof value === "object" && !Array.isArray(value) ? value as Record<string, any> : {};
626
-
627
- const summarizeStringArray = (value: unknown, max = 6): string[] => {
628
- if (!Array.isArray(value)) return [];
629
- const items = value
630
- .filter((item): item is string => typeof item === "string" && Boolean(item.trim()))
631
- .map((item) => item.trim());
632
- return items.length > max ? [...items.slice(0, max), `+${items.length - max} more`] : items;
633
- };
634
-
635
- const clipEvidenceText = (value: unknown, max = 220): string => {
636
- if (typeof value !== "string") return "";
637
- const compact = value.replace(/\s+/g, " ").trim();
638
- return compact.length > max ? `${compact.slice(0, max - 3)}...` : compact;
639
- };
640
-
641
- async function buildReferencedDialogEvidenceLines(args: {
642
- subjectRefs: Array<{ kind: string; id: string; role?: string }>;
643
- userId?: string | null;
644
- }): Promise<string[]> {
645
- const lines: string[] = [];
646
- const seenDialogIds = new Set<string>();
647
- for (const ref of args.subjectRefs) {
648
- if (ref.kind !== "dialog" || !ref.id.trim()) continue;
649
- const dialogId = ref.id.trim();
650
- if (seenDialogIds.has(dialogId)) continue;
651
- seenDialogIds.add(dialogId);
652
- try {
653
- const resolved = await resolveExistingDialogRef({
654
- dialogId,
655
- preferredUserId: args.userId,
656
- });
657
- if (!resolved?.dialogRecord) {
658
- lines.push(`dialog:${dialogId}${ref.role ? ` (${ref.role})` : ""} not found`);
659
- continue;
660
- }
661
- const dialog = asPlainRecord(resolved.dialogRecord);
662
- const runtimeCheckpoint = asPlainRecord(dialog.runtimeCheckpoint);
663
- const artifacts = asPlainRecord(dialog.artifacts);
664
- const workspaceProgress = asPlainRecord(runtimeCheckpoint.workspaceProgress);
665
- const workspaceLease = asPlainRecord(dialog.workspaceLease ?? runtimeCheckpoint.workspaceLease);
666
- const messageCount = await countDialogMessages(dialogId);
667
- const changedFiles = summarizeStringArray(
668
- artifacts.changedFiles ?? workspaceProgress.changedFiles ?? workspaceLease.changedFiles,
669
- );
670
- const workspaceRoot = typeof workspaceLease.workspaceRoot === "string" && workspaceLease.workspaceRoot.trim()
671
- ? workspaceLease.workspaceRoot.trim()
672
- : typeof workspaceProgress.workspaceRoot === "string" && workspaceProgress.workspaceRoot.trim()
673
- ? workspaceProgress.workspaceRoot.trim()
674
- : "";
675
- const status = typeof dialog.status === "string" && dialog.status.trim()
676
- ? dialog.status.trim()
677
- : "unknown";
678
- const runtimeStatus = typeof runtimeCheckpoint.status === "string" && runtimeCheckpoint.status.trim()
679
- ? runtimeCheckpoint.status.trim()
680
- : "none";
681
- const summary = clipEvidenceText(
682
- dialog.resultSummary ?? runtimeCheckpoint.lastAssistantText ?? dialog.title,
683
- );
684
- lines.push(
685
- [
686
- `dialog:${dialogId}${ref.role ? ` (${ref.role})` : ""}`,
687
- `status=${status}`,
688
- `runtimeStatus=${runtimeStatus}`,
689
- `messagesCount=${messageCount.count}${messageCount.truncated ? "+" : ""}`,
690
- `artifacts=${Object.keys(artifacts).length ? "present" : "none"}`,
691
- ...(workspaceRoot ? [`workspace=${workspaceRoot}`] : []),
692
- `changedFiles=${changedFiles.length ? changedFiles.join(",") : "none"}`,
693
- ...(summary ? [`summary="${summary}"`] : []),
694
- ].join(" "),
695
- );
696
- } catch (error) {
697
- const detail = error instanceof Error && error.message ? error.message : "read failed";
698
- lines.push(`dialog:${dialogId}${ref.role ? ` (${ref.role})` : ""} unavailable: ${detail}`);
699
- }
700
- }
701
- return lines;
702
- }
703
-
704
- async function countDialogMessages(dialogId: string, max = 200): Promise<{ count: number; truncated: boolean }> {
705
- const store = getToolExecutorStore();
706
- let count = 0;
707
- const gte = createKey(DataType.DIALOG, dialogId, "msg", "");
708
- const lte = createKey(DataType.DIALOG, dialogId, "msg", "\uffff");
709
- for await (const _ of store.iterator({ gte, lte })) {
710
- count += 1;
711
- if (count > max) return { count: max, truncated: true };
712
- }
713
- return { count, truncated: false };
714
- }
715
-
716
- const looksLikeLocalFilePath = (value: unknown): value is string => {
717
- if (typeof value !== "string") return false;
718
- const trimmed = value.trim();
719
- if (!trimmed) return false;
720
- return (
721
- trimmed.startsWith("/") ||
722
- trimmed.startsWith("./") ||
723
- trimmed.startsWith("../") ||
724
- trimmed.includes("/") ||
725
- /\.[A-Za-z0-9_-]{1,12}$/.test(trimmed)
726
- );
727
- };
728
-
729
- const normalizeToolExecutionArgs = (
730
- toolName: string,
731
- args: Record<string, any>,
732
- ): Record<string, any> => {
733
- if (toolName === "execShell") {
734
- const command =
735
- args.command ??
736
- args.runCommand ??
737
- args.run_command ??
738
- args.terminalCommand ??
739
- args.terminal_command ??
740
- args.runInBash ??
741
- args.run_in_bash ??
742
- args.executeCommand ??
743
- args.execute_command ??
744
- args.execShell ??
745
- args.bash ??
746
- args.cmd;
747
- return command == null ? args : { ...args, command };
748
- }
749
-
750
- if (toolName === "readFile") {
751
- const filePath = args.filePath ?? args.path ?? args.filename ?? args.file;
752
- return filePath == null ? args : { ...args, filePath };
753
- }
754
-
755
- if (toolName === "read") {
756
- const filePath = args.filePath ?? args.path ?? args.filename ?? args.file;
757
- if (filePath != null) return { ...args, filePath };
758
- if (process.env.NOLO_DESKTOP === "1" && looksLikeLocalFilePath(args.dbKey)) {
759
- return { ...args, filePath: args.dbKey };
760
- }
761
- }
762
-
763
- return args;
764
- };
765
-
766
- export async function executeToolOnServer(
767
- toolCall: AssistantToolCall,
768
- serverBase: string,
769
- authToken: string,
770
- context?: ToolExecutionContext,
771
- ): Promise<string> {
772
- const mainBase = normalizeBase(serverBase);
773
- const rawToolName = (toolCall.function.name || "").replace(/^functions\./, "").trim();
774
- const toolName = canonicalizeToolName(rawToolName);
775
- let args: Record<string, any> = {};
776
- try {
777
- args = JSON.parse(toolCall.function.arguments || "{}");
778
- } catch {
779
- return JSON.stringify({ error: "Invalid tool arguments JSON" });
780
- }
781
- args = normalizeToolExecutionArgs(toolName, args);
782
- args = await resolveImageToolArgs(toolName, args, mainBase, authToken, context);
783
-
784
- const currentAgentKey =
785
- typeof context?.agentKey === "string" && context.agentKey.trim()
786
- ? context.agentKey.trim()
787
- : "";
788
- const buildAuthHeaders = (): Record<string, string> => {
789
- const headers: Record<string, string> = {};
790
- if (authToken) {
791
- headers.Authorization = `Bearer ${authToken}`;
792
- headers.Cookie = `${WEB_AUTH_TOKEN_COOKIE}=${encodeURIComponent(authToken)}`;
793
- }
794
- if (currentAgentKey) {
795
- headers["X-Nolo-Agent-Key"] = currentAgentKey;
796
- }
797
- return headers;
798
- };
799
-
800
- const post = async (
801
- base: string,
802
- path: string,
803
- body: object
804
- ): Promise<string> => {
805
- const headers: Record<string, string> = {
806
- "Content-Type": "application/json",
807
- ...buildAuthHeaders(),
808
- };
809
-
810
- const res = await fetch(`${base}${path}`, {
811
- method: "POST",
812
- headers,
813
- body: JSON.stringify(body),
814
- });
815
- if (!res.ok) {
816
- return JSON.stringify({ error: `HTTP ${res.status}`, detail: await res.text() });
817
- }
818
- return res.text();
819
- };
820
-
821
- const postJson = async (
822
- base: string,
823
- path: string,
824
- body: object,
825
- ): Promise<{
826
- ok: boolean;
827
- status: number;
828
- text: string;
829
- data: any;
830
- }> => {
831
- const headers: Record<string, string> = {
832
- "Content-Type": "application/json",
833
- ...buildAuthHeaders(),
834
- };
835
-
836
- const res = await fetch(`${base}${path}`, {
837
- method: "POST",
838
- headers,
839
- body: JSON.stringify(body),
840
- });
841
- const text = await res.text();
842
- let data: any = null;
843
- try {
844
- data = text ? JSON.parse(text) : null;
845
- } catch {
846
- data = null;
847
- }
848
- return {
849
- ok: res.ok,
850
- status: res.status,
851
- text,
852
- data,
853
- };
854
- };
855
-
856
- const postMain = async (path: string, body: object): Promise<string> =>
857
- post(resolveSameOriginChildRunBase(mainBase, mainBase), path, body);
858
-
859
- const sleep = (ms: number) =>
860
- new Promise((resolve) => setTimeout(resolve, ms));
861
-
862
- const withDialogId = (body: Record<string, any>): Record<string, any> => {
863
- if (!context?.dialogId || "dialogId" in body) return body;
864
- return {
865
- ...body,
866
- dialogId: context.dialogId,
867
- };
868
- };
869
-
870
- const withFeedbackSubmitterUserId = (args: Record<string, any>): Record<string, any> => {
871
- const agentKey = typeof context?.agentKey === "string" ? context.agentKey.trim() : "";
872
- const userId = typeof context?.userId === "string" ? context.userId.trim() : "";
873
- if (
874
- !userId ||
875
- !(
876
- agentKey === `agent-pub-${FEEDBACK_AGENT_ID}` ||
877
- agentKey.endsWith(`-${FEEDBACK_AGENT_ID}`)
878
- )
879
- ) {
880
- return args;
881
- }
882
-
883
- const tableId = typeof args.tableId === "string" ? args.tableId.trim() : "";
884
- const values =
885
- args.values && typeof args.values === "object" && !Array.isArray(args.values)
886
- ? args.values
887
- : {};
888
- if (tableId === FEEDBACK_TABLE_ID) {
889
- return {
890
- ...args,
891
- values: {
892
- ...values,
893
- submitterUserId: values.submitterUserId || userId,
894
- },
895
- };
896
- }
897
- if (tableId === TASK_BOARD_TABLE_ID) {
898
- return {
899
- ...args,
900
- values: {
901
- ...values,
902
- feedbackSubmitterUserId: values.feedbackSubmitterUserId || userId,
903
- },
904
- };
905
- }
906
- return args;
907
- };
908
-
909
- const deleteDbKey = async (dbKey: string): Promise<{ ok: boolean; status: number; text: string }> => {
910
- const res = await fetch(`${mainBase}/api/v1/db/delete/${encodeURIComponent(dbKey)}`, {
911
- method: "DELETE",
912
- headers: buildAuthHeaders(),
913
- });
914
- return {
915
- ok: res.ok,
916
- status: res.status,
917
- text: await res.text(),
918
- };
919
- };
920
-
921
- const spaceMemberKeysForDelete = (spaceId: string, record: SpaceRecordLike): string[] => {
922
- const memberIds = new Set<string>();
923
- if (context?.userId) memberIds.add(context.userId);
924
- if (Array.isArray(record.members)) {
925
- for (const memberId of record.members) {
926
- if (typeof memberId === "string" && memberId.trim()) {
927
- memberIds.add(memberId.trim());
928
- }
929
- }
930
- } else if (record.members && typeof record.members === "object") {
931
- for (const memberId of Object.keys(record.members)) {
932
- if (memberId.trim()) memberIds.add(memberId.trim());
933
- }
934
- }
935
- return Array.from(memberIds).map((memberId) => createSpaceKey.member(memberId, spaceId));
936
- };
937
- const requireCurrentAgentKey = () => {
938
- if (!currentAgentKey) {
939
- return JSON.stringify({
940
- error: "Current agent key is unavailable in server-side agent mode.",
941
- });
942
- }
943
- return null;
944
- };
945
- const includesCaseInsensitive = (haystack: unknown, needle: unknown): boolean => {
946
- const normalizedNeedle =
947
- typeof needle === "string" && needle.trim() ? needle.trim().toLowerCase() : "";
948
- if (!normalizedNeedle) return true;
949
- const normalizedHaystack =
950
- typeof haystack === "string" ? haystack.toLowerCase() : String(haystack || "").toLowerCase();
951
- return normalizedHaystack.includes(normalizedNeedle);
952
- };
953
- const participantText = (participants: any): string =>
954
- Array.isArray(participants)
955
- ? participants
956
- .map((participant) =>
957
- [participant?.name, participant?.email]
958
- .filter((value) => typeof value === "string" && value.trim())
959
- .join(" "),
960
- )
961
- .join("\n")
962
- : "";
963
- const EMAIL_WAIT_GRACE_MS = 10_000;
964
- const parseEmailTimestamp = (value: unknown): number | null => {
965
- if (typeof value === "number" && Number.isFinite(value)) {
966
- return value;
967
- }
968
- if (typeof value === "string" && value.trim()) {
969
- const parsed = Date.parse(value);
970
- return Number.isFinite(parsed) ? parsed : null;
971
- }
972
- return null;
973
- };
974
- const emailReceivedAtMs = (email: any): number | null =>
975
- parseEmailTimestamp(email?.meta?.provider?.receivedAt) ??
976
- parseEmailTimestamp(email?.receivedAt) ??
977
- parseEmailTimestamp(email?.createdAt) ??
978
- parseEmailTimestamp(email?.updatedAt);
979
- const emailMatchesWaitFilters = (email: any, waitArgs: Record<string, any>): boolean =>
980
- includesCaseInsensitive(email?.subject, waitArgs.subjectContains) &&
981
- includesCaseInsensitive(email?.from?.email, waitArgs.fromContains) &&
982
- includesCaseInsensitive(participantText(email?.to), waitArgs.toContains) &&
983
- includesCaseInsensitive(
984
- [email?.subject, email?.text, email?.html].filter(Boolean).join("\n"),
985
- waitArgs.bodyContains,
986
- );
987
- const emailIsFreshForWait = (email: any, waitStartedAtMs: number): boolean => {
988
- const receivedAtMs = emailReceivedAtMs(email);
989
- if (receivedAtMs == null) return true;
990
- return receivedAtMs >= waitStartedAtMs - EMAIL_WAIT_GRACE_MS;
991
- };
992
-
993
- const runChildAgent = async (
994
- agentKey: string,
995
- userInput: string,
996
- requestedServerBase?: unknown,
997
- requestedTimeoutMs?: unknown,
998
- options?: {
999
- background?: boolean;
1000
- parentDialogId?: string;
1001
- subjectRefs?: Array<{ kind: string; id: string; role?: string }>;
1002
- idempotencyKey?: string;
1003
- },
1004
- ) => {
1005
- const target = resolveDelegatedServerBase(requestedServerBase, mainBase);
1006
- if (!target.ok) {
1007
- return {
1008
- ok: false as const,
1009
- status: 400,
1010
- error: target.error,
1011
- };
1012
- }
1013
-
1014
- const childRunBase = resolveSameOriginChildRunBase(target.base, mainBase);
1015
- const childSubjectRefs = mergeSubjectRefs(
1016
- context?.runtimeContext?.subjectRefs,
1017
- options?.subjectRefs,
1018
- );
1019
- const childRuntimeContext = options?.background || childSubjectRefs.length || options?.idempotencyKey
1020
- ? {
1021
- ...(context?.runtimeContext ?? {}),
1022
- surface: context?.runtimeContext?.surface ?? "server-script",
1023
- entrypoint:
1024
- options?.background
1025
- ? "agent-tool:startAgentDialog"
1026
- : context?.runtimeContext?.entrypoint ?? "agent-tool:callAgent",
1027
- ...(childSubjectRefs.length ? { subjectRefs: childSubjectRefs } : {}),
1028
- ...(options?.idempotencyKey ? { idempotencyKey: options.idempotencyKey } : {}),
1029
- }
1030
- : context?.runtimeContext;
1031
- const res = await fetch(`${childRunBase}/api/agent/run`, {
1032
- method: "POST",
1033
- headers: { "Content-Type": "application/json", ...buildAuthHeaders() },
1034
- body: JSON.stringify({
1035
- agentKey,
1036
- userInput,
1037
- stream: false,
1038
- ...(options?.background ? { background: true } : {}),
1039
- spaceId: context?.currentSpaceId ?? undefined,
1040
- ...(options?.parentDialogId ? { parentDialogId: options.parentDialogId } : {}),
1041
- ...(childRuntimeContext ? { runtimeContext: childRuntimeContext } : {}),
1042
- ...(typeof requestedTimeoutMs === "number" &&
1043
- Number.isFinite(requestedTimeoutMs) &&
1044
- requestedTimeoutMs > 0
1045
- ? { timeoutMs: requestedTimeoutMs }
1046
- : {}),
1047
- }),
1048
- });
1049
- if (!res.ok) {
1050
- return {
1051
- ok: false as const,
1052
- status: res.status,
1053
- error: await res.text(),
1054
- };
1055
- }
1056
- const payload = await res.json();
1057
- return {
1058
- ok: true as const,
1059
- payload,
1060
- serverBase: target.base,
1061
- };
1062
- };
1063
-
1064
- const waitForAppDeployResult = async (jobId: string) => {
1065
- const deadline = Date.now() + APP_DEPLOY_POLL_TIMEOUT_MS;
1066
- let latestPayload: any = null;
1067
-
1068
- while (Date.now() < deadline) {
1069
- const statusResult = await postJson(
1070
- mainBase,
1071
- "/api/app/deploy/status",
1072
- { jobId },
1073
- );
1074
-
1075
- if (!statusResult.ok) {
1076
- return JSON.stringify(
1077
- statusResult.data ?? {
1078
- error: `appDeploy status: HTTP ${statusResult.status}`,
1079
- detail: statusResult.text,
1080
- },
1081
- );
1082
- }
1083
-
1084
- latestPayload = statusResult.data;
1085
- if (
1086
- latestPayload?.status === "succeeded" ||
1087
- latestPayload?.status === "failed"
1088
- ) {
1089
- if (latestPayload.status === "succeeded" && latestPayload.result) {
1090
- const result = latestPayload.result;
1091
- return JSON.stringify({
1092
- ...result,
1093
- jobId: latestPayload.jobId,
1094
- status: latestPayload.status,
1095
- summary: latestPayload.summary,
1096
- steps: latestPayload.steps,
1097
- appUrl: result.customUrl ?? result.url,
1098
- });
1099
- }
1100
- return JSON.stringify(latestPayload);
1101
- }
1102
-
1103
- await sleep(APP_DEPLOY_POLL_INTERVAL_MS);
1104
- }
1105
-
1106
- return JSON.stringify({
1107
- ...(latestPayload && typeof latestPayload === "object"
1108
- ? latestPayload
1109
- : {
1110
- success: true,
1111
- jobId,
1112
- status: "pending",
1113
- summary: "部署任务仍在进行中",
1114
- }),
1115
- timeout: true,
1116
- nextAction:
1117
- "部署任务还未完成。请稍后再次查询该 jobId,或等待服务端完成后再继续向用户确认最终访问链接。",
1118
- });
1119
- };
1120
-
1121
- const normalizeAppFiles = () => {
1122
- if (Array.isArray(args.files) && args.files.length > 0) return args.files;
1123
- if (Array.isArray(args.pages) && args.pages.length > 0) return args.pages;
1124
- return undefined;
1125
- };
1126
- const serverToolName = toolName;
1127
- const taskRunPrimitiveArgs = normalizeTaskRunPrimitiveArgs(serverToolName, args);
1128
- if (taskRunPrimitiveArgs) {
1129
- return runTaskRunTool(withTaskRunContext(taskRunPrimitiveArgs, context), authToken);
1130
- }
1131
-
1132
- switch (serverToolName) {
1133
- // ── 网络/外部 API(同构,前后端都能调,这里走服务端代理)──
1134
- case "fetchWebpage":
1135
- return postMain("/api/fetch-webpage", withDialogId({ url: args.url }));
1136
- case "convertMarxistsBookToOfflineHtml": {
1137
- const result = await convertMarxistsBookToOfflineHtml({
1138
- startUrl: args.startUrl,
1139
- encoding: args.encoding,
1140
- maxPages: args.maxPages,
1141
- fetchImpl: fetch,
1142
- });
1143
- const fileName = sanitizeGeneratedHtmlFileName(
1144
- args.singleFileName,
1145
- `${result.title || "marxists-offline-book"}.html`,
1146
- );
1147
- const rawData: Record<string, unknown> = {
1148
- title: result.title,
1149
- startUrl: result.startUrl,
1150
- indexUrl: result.indexUrl,
1151
- stylesheetUrl: result.stylesheetUrl,
1152
- pages: result.pages,
1153
- validation: result.validation,
1154
- fileName,
1155
- };
1156
- if (args.saveAsFile !== false) {
1157
- if (!context?.userId) {
1158
- rawData.saveWarning =
1159
- "saveAsFile was requested, but the server tool execution context has no userId.";
1160
- } else {
1161
- const { fileId, metadata } = await saveBufferAsFile(
1162
- Buffer.from(result.html, "utf8"),
1163
- {
1164
- tenantId: context.userId,
1165
- originalName: fileName,
1166
- mimeType: "text/html; charset=utf-8",
1167
- ownerType: "user",
1168
- ownerId: context.userId,
1169
- uploadedBy: context.userId,
1170
- source: "ai-generated",
1171
- model: "convertMarxistsBookToOfflineHtml",
1172
- prompt: result.startUrl,
1173
- tags: ["offline-book", "marxists-org", "html"],
1174
- clientMetadata: {
1175
- fileCategory: "document",
1176
- sourceUrl: result.startUrl,
1177
- indexUrl: result.indexUrl,
1178
- stylesheetUrl: result.stylesheetUrl,
1179
- pageCount: result.validation.pageCount,
1180
- },
1181
- },
1182
- );
1183
- const fileDbKey =
1184
- typeof (metadata as any).dbKey === "string"
1185
- ? (metadata as any).dbKey
1186
- : `file-${context.userId}-${fileId}`;
1187
- rawData.fileId = fileId;
1188
- rawData.fileDbKey = fileDbKey;
1189
- rawData.fileUrl = buildFileContentUrl(mainBase, fileDbKey);
1190
- }
1191
- }
1192
- if (args.outputMode === "html") {
1193
- rawData.html = result.html;
1194
- }
1195
- return JSON.stringify({
1196
- rawData,
1197
- displayData: formatMarxistsOfflineBookDisplayData({
1198
- ...rawData,
1199
- htmlIncluded: args.outputMode === "html",
1200
- }),
1201
- });
1202
- }
1203
- case "read_x_post":
1204
- return postMain(
1205
- "/api/read-x-post",
1206
- withDialogId({
1207
- url: args.url,
1208
- keepOpen: args.keepOpen,
1209
- profileDir: args.profileDir,
1210
- headless: args.headless,
1211
- }),
1212
- );
1213
- case "wereadGateway":
1214
- return postMain(
1215
- "/api/weread/gateway",
1216
- withDialogId(args),
1217
- );
1218
- case "exa_search":
1219
- return postMain(
1220
- "/api/exa-search",
1221
- withDialogId({
1222
- query: args.query,
1223
- numResults: args.numResults ?? 5,
1224
- contents: args.contents,
1225
- }),
1226
- );
1227
- case "youtubeScraper":
1228
- case "ecommerceScraper":
1229
- case "amazonProductScraper":
1230
- return postMain(
1231
- "/api/apify-actor",
1232
- withDialogId({ actorId: args.actorId ?? serverToolName, input: args }),
1233
- );
1234
- case "taobaoTmallProductScraper":
1235
- return postMain(
1236
- "/api/apify-actor",
1237
- withDialogId({
1238
- actorId: "sian.agency~taobao-tmall-product-scraper",
1239
- input: {
1240
- operation: "productDetail",
1241
- itemId: args.itemId,
1242
- detailDepth: args.detailDepth ?? "full",
1243
- },
1244
- resultType: "datasetItems",
1245
- }),
1246
- );
1247
- case "jdProductScraper": {
1248
- const result = await jdProductScraperFunc({
1249
- skuId: args.skuId,
1250
- url: args.url,
1251
- });
1252
- const skuId = typeof result.rawData?.skuId === "string" ? result.rawData.skuId : "";
1253
- if (
1254
- skuId &&
1255
- (isIncompleteProductData(result.rawData) ||
1256
- hasSparseJdSpecifications(result.rawData))
1257
- ) {
1258
- const mobileUrl = `https://item.m.jd.com/product/${skuId}.html`;
1259
- const apifyText = await postMain(
1260
- "/api/apify-actor",
1261
- withDialogId({
1262
- actorId: "apify~web-scraper",
1263
- input: {
1264
- startUrls: [{ url: mobileUrl }],
1265
- maxPagesPerCrawl: 1,
1266
- maxRequestRetries: 1,
1267
- maxConcurrency: 1,
1268
- proxyConfiguration: { useApifyProxy: true },
1269
- pageFunction: `async function pageFunction(context) {
1270
- await new Promise((resolve) => setTimeout(resolve, 1500));
1271
- return {
1272
- url: context.request.url,
1273
- itemOnly: window._itemOnly || null,
1274
- itemInfo: window._itemInfo || null,
1275
- priceInfo: window.__price || window._price || null,
1276
- title: document.title,
1277
- html: document.documentElement ? document.documentElement.innerHTML : ""
1278
- };
1279
- }`,
1280
- },
1281
- resultType: "datasetItems",
1282
- }),
1283
- );
1284
- let apifyData: any = null;
1285
- try {
1286
- apifyData = JSON.parse(apifyText || "null");
1287
- } catch {
1288
- apifyData = null;
1289
- }
1290
- const browserItem = Array.isArray(apifyData) ? apifyData[0] : null;
1291
- if (browserItem && typeof browserItem === "object" && !("error" in browserItem)) {
1292
- const browserFallback = parseJdBrowserExtractedData(browserItem, {
1293
- skuId,
1294
- url: mobileUrl,
1295
- });
1296
- result.rawData = mergeJdProductData(result.rawData, browserFallback);
1297
- }
1298
- }
1299
- if (skuId && isIncompleteProductData(result.rawData)) {
1300
- const knownFallback = getKnownJdProductFallback(skuId);
1301
- if (knownFallback) {
1302
- result.rawData = mergeJdProductData(result.rawData, knownFallback);
1303
- }
1304
- }
1305
- result.displayData = formatJdProductDisplayData(result.rawData);
1306
- return JSON.stringify(result);
1307
- }
1308
- case "geminiFlashImage":
1309
- case "geminiProImagePreview":
1310
- return postMain("/api/gemini-image-preview", withDialogId(args));
1311
- case "openAIGptImageGenerate":
1312
- return postMain(
1313
- "/api/openai-image",
1314
- withDialogId({
1315
- ...args,
1316
- operation: "generate",
1317
- model: "gpt-image-2",
1318
- })
1319
- );
1320
- case "openAIGptImageEdit":
1321
- return postMain(
1322
- "/api/openai-image",
1323
- withDialogId({
1324
- ...args,
1325
- operation: "edit",
1326
- model: "gpt-image-2",
1327
- })
1328
- );
1329
- case "openAIGptImage":
1330
- return postMain("/api/openai-image", withDialogId(args));
1331
- case "remotionRenderVideo":
1332
- return postMain("/api/remotion/render", withDialogId(args));
1333
- case "ui_ask_choice": {
1334
- const question =
1335
- typeof args.question === "string" ? args.question.trim() : "";
1336
- const choices = Array.isArray(args.choices) ? args.choices : [];
1337
- const blocking = args.blocking !== false;
1338
- if (!question || choices.length === 0) {
1339
- return JSON.stringify({
1340
- error: "ui_ask_choice",
1341
- detail: "ui_ask_choice 需要 question 和至少一个 choice。",
1342
- });
1343
- }
1344
- return JSON.stringify({
1345
- type: "ui_ask_choice",
1346
- question,
1347
- choices,
1348
- blocking,
1349
- });
1350
- }
1351
- case "queryModelUsage": {
1352
- try {
1353
- return JSON.stringify(await runQueryModelUsageTool(args, context));
1354
- } catch (err: any) {
1355
- return JSON.stringify({
1356
- error: "queryModelUsage",
1357
- detail: err?.message ?? String(err),
1358
- });
1359
- }
1360
- }
1361
- case "createScheduledTask": {
1362
- try {
1363
- return JSON.stringify(await runCreateScheduledTaskTool(args, context));
1364
- } catch (err: any) {
1365
- return JSON.stringify({
1366
- error: "createScheduledTask",
1367
- detail: err?.message ?? String(err),
1368
- });
1369
- }
1370
- }
1371
- case "createDialogGoal": {
1372
- try {
1373
- return JSON.stringify(await runCreateDialogGoalTool(args, context));
1374
- } catch (err: any) {
1375
- return JSON.stringify({
1376
- error: "createDialogGoal",
1377
- detail: err?.message ?? String(err),
1378
- });
1379
- }
1380
- }
1381
- case "getDialogGoal": {
1382
- try {
1383
- return JSON.stringify(await runGetDialogGoalTool(args, context));
1384
- } catch (err: any) {
1385
- return JSON.stringify({
1386
- error: "getDialogGoal",
1387
- detail: err?.message ?? String(err),
1388
- });
1389
- }
1390
- }
1391
- case "completeDialogGoal": {
1392
- try {
1393
- return JSON.stringify(await runCompleteDialogGoalTool(args, context));
1394
- } catch (err: any) {
1395
- return JSON.stringify({
1396
- error: "completeDialogGoal",
1397
- detail: err?.message ?? String(err),
1398
- });
1399
- }
1400
- }
1401
- case "taskRun":
1402
- return runTaskRunTool(withTaskRunContext(args, context), authToken);
1403
- case "notifyUser": {
1404
- try {
1405
- return JSON.stringify(await runNotifyUserTool(args, context));
1406
- } catch (err: any) {
1407
- return JSON.stringify({
1408
- error: "notifyUser",
1409
- detail: err?.message ?? String(err),
1410
- });
1411
- }
1412
- }
1413
- case "rememberMemory":
1414
- return postMain("/api/memory/remember", withDialogId({
1415
- content: args.content,
1416
- scope: args.scope,
1417
- spaceId: context?.currentSpaceId ?? undefined,
1418
- }));
1419
- case "callAgent": {
1420
- const agentKey = typeof args.agentKey === "string" ? args.agentKey.trim() : "";
1421
- const task = typeof args.task === "string" ? args.task.trim() : "";
1422
- if (!agentKey) {
1423
- return JSON.stringify({ error: "callAgent: agentKey is required" });
1424
- }
1425
- if (!task) {
1426
- return JSON.stringify({ error: "callAgent: task is required" });
1427
- }
1428
- const childRun = await runChildAgent(
1429
- agentKey,
1430
- buildDelegatedAgentInput(task, args.input),
1431
- args.serverBase,
1432
- );
1433
- if (!childRun.ok) {
1434
- return JSON.stringify({
1435
- error: `callAgent: HTTP ${childRun.status}`,
1436
- detail: childRun.error,
1437
- });
1438
- }
1439
- const payload = childRun.payload;
1440
- return JSON.stringify({
1441
- success: true,
1442
- agentKey,
1443
- ...(childRun.serverBase ? { serverBase: childRun.serverBase } : {}),
1444
- dialogId: payload?.dialogId ?? null,
1445
- model: payload?.model ?? null,
1446
- provider: payload?.provider ?? null,
1447
- content: typeof payload?.content === "string" ? payload.content : "",
1448
- usage: payload?.usage ?? null,
1449
- artifacts: payload?.artifacts ?? null,
1450
- });
1451
- }
1452
- case "runStreamingAgent": {
1453
- const agentKey = typeof args.agentKey === "string" ? args.agentKey.trim() : "";
1454
- const userInput = typeof args.userInput === "string" ? args.userInput.trim() : "";
1455
- if (!agentKey) {
1456
- return JSON.stringify({ error: "runStreamingAgent: agentKey is required" });
1457
- }
1458
- if (!userInput) {
1459
- return JSON.stringify({ error: "runStreamingAgent: userInput is required" });
1460
- }
1461
- const childRun = await runChildAgent(agentKey, userInput, args.serverBase);
1462
- if (!childRun.ok) {
1463
- return JSON.stringify({
1464
- error: `runStreamingAgent: HTTP ${childRun.status}`,
1465
- detail: childRun.error,
1466
- });
1467
- }
1468
- const payload = childRun.payload;
1469
- return JSON.stringify({
1470
- success: true,
1471
- handoff: true,
1472
- agentKey,
1473
- ...(childRun.serverBase ? { serverBase: childRun.serverBase } : {}),
1474
- dialogId: payload?.dialogId ?? null,
1475
- ...(payload?.dialogKey ? { dialogKey: payload.dialogKey } : {}),
1476
- model: payload?.model ?? null,
1477
- content: typeof payload?.content === "string" ? payload.content : "",
1478
- usage: payload?.usage ?? null,
1479
- artifacts: payload?.artifacts ?? null,
1480
- });
1481
- }
1482
- case "startAgentDialog": {
1483
- const targetAgentKey =
1484
- typeof args.targetAgentKey === "string"
1485
- ? args.targetAgentKey.trim()
1486
- : typeof args.agentKey === "string"
1487
- ? args.agentKey.trim()
1488
- : "";
1489
- const message =
1490
- typeof args.message === "string"
1491
- ? args.message.trim()
1492
- : typeof args.userInput === "string"
1493
- ? args.userInput.trim()
1494
- : "";
1495
- if (!targetAgentKey) {
1496
- return JSON.stringify({ error: "startAgentDialog: targetAgentKey is required" });
1497
- }
1498
- if (!message) {
1499
- return JSON.stringify({ error: "startAgentDialog: message is required" });
1500
- }
1501
- const parentDialogId =
1502
- typeof args.parentDialogId === "string" && args.parentDialogId.trim()
1503
- ? args.parentDialogId.trim()
1504
- : typeof context?.dialogId === "string" && context.dialogId.trim()
1505
- ? context.dialogId.trim()
1506
- : undefined;
1507
- const timeoutMs =
1508
- typeof args.timeoutMs === "number" && Number.isFinite(args.timeoutMs) && args.timeoutMs > 0
1509
- ? args.timeoutMs
1510
- : undefined;
1511
- const subjectRefs = normalizeSubjectRefs(args.subjectRefs);
1512
- const childSubjectRefs = mergeSubjectRefs(
1513
- context?.runtimeContext?.subjectRefs,
1514
- subjectRefs,
1515
- );
1516
- const subjectEvidenceLines = await buildReferencedDialogEvidenceLines({
1517
- subjectRefs: childSubjectRefs,
1518
- userId: context?.userId,
1519
- });
1520
- const childMessage = buildAgentHandoffUserInput({
1521
- message,
1522
- parentDialogId,
1523
- subjectRefs: childSubjectRefs,
1524
- subjectEvidenceLines,
1525
- runtimeContext: context?.runtimeContext,
1526
- });
1527
- const childRun = await runChildAgent(
1528
- targetAgentKey,
1529
- childMessage,
1530
- args.serverBase,
1531
- timeoutMs,
1532
- {
1533
- background: true,
1534
- parentDialogId,
1535
- subjectRefs: childSubjectRefs,
1536
- ...(typeof args.idempotencyKey === "string" && args.idempotencyKey.trim()
1537
- ? { idempotencyKey: args.idempotencyKey.trim() }
1538
- : {}),
1539
- },
1540
- );
1541
- if (!childRun.ok) {
1542
- return JSON.stringify({
1543
- error: `startAgentDialog: HTTP ${childRun.status}`,
1544
- detail: childRun.error,
1545
- });
1546
- }
1547
- const payload = childRun.payload;
1548
- const childDialogId = typeof payload?.dialogId === "string" && payload.dialogId.trim()
1549
- ? payload.dialogId.trim()
1550
- : "";
1551
- const childDialogKey = typeof payload?.dialogKey === "string" && payload.dialogKey.trim()
1552
- ? payload.dialogKey.trim()
1553
- : undefined;
1554
- const activityProjection = childDialogId
1555
- ? await projectDialogActivityToSubjectRows({
1556
- db: getToolExecutorStore(),
1557
- subjectRefs: childSubjectRefs,
1558
- activityRef: {
1559
- type: "dialog",
1560
- dialogId: childDialogId,
1561
- ...(childDialogKey ? { dialogKey: childDialogKey } : {}),
1562
- role: "child-dialog",
1563
- agentKey: targetAgentKey,
1564
- ...(parentDialogId ? { parentDialogId } : {}),
1565
- status: typeof payload?.status === "string" && payload.status.trim()
1566
- ? payload.status.trim()
1567
- : "pending",
1568
- updatedAt: new Date().toISOString(),
1569
- },
1570
- })
1571
- : undefined;
1572
- return JSON.stringify({
1573
- success: true,
1574
- status: payload?.status ?? "pending",
1575
- targetAgentKey,
1576
- childDialogId: childDialogId || null,
1577
- childDialogKey: childDialogKey ?? null,
1578
- ...(parentDialogId ? { parentDialogId } : {}),
1579
- ...(childRun.serverBase ? { serverBase: childRun.serverBase } : {}),
1580
- ...(activityProjection && activityProjection.updatedRowDbKeys.length
1581
- ? {
1582
- activityProjection: {
1583
- updatedRowDbKeys: activityProjection.updatedRowDbKeys,
1584
- },
1585
- }
1586
- : {}),
1587
- });
1588
- }
1589
- case "streamParallelAgents": {
1590
- const task = typeof args.task === "string" ? args.task.trim() : "";
1591
- const agents = Array.isArray(args.agents) ? args.agents : [];
1592
- const returnMode = args.returnMode === "continue" ? "continue" : "handoff";
1593
- const displayMode = "inline";
1594
- const defaultServerBase = args.serverBase;
1595
- const parallelSessionId = `parallel-${Date.now()}-${Math.random()
1596
- .toString(36)
1597
- .slice(2, 10)}`;
1598
- const timeoutMs =
1599
- typeof args.timeoutMs === "number" && Number.isFinite(args.timeoutMs) && args.timeoutMs > 0
1600
- ? args.timeoutMs
1601
- : PARALLEL_AGENT_BRANCH_TIMEOUT_MS;
1602
- const budgetCredits = normalizeBudgetCredits(args.budgetCredits);
1603
- if (!task) {
1604
- return JSON.stringify({ error: "streamParallelAgents: task is required" });
1605
- }
1606
- if (agents.length === 0) {
1607
- return JSON.stringify({ error: "streamParallelAgents: agents is required" });
1608
- }
1609
-
1610
- const results = await Promise.all(
1611
- agents.map(async (agent: Record<string, any>, index: number) => {
1612
- const agentKey =
1613
- typeof agent?.agentKey === "string" ? agent.agentKey.trim() : "";
1614
- const label =
1615
- typeof agent?.label === "string" && agent.label.trim()
1616
- ? agent.label.trim()
1617
- : `Agent ${index + 1}`;
1618
- const branchId =
1619
- typeof agent?.branchId === "string" && agent.branchId.trim()
1620
- ? agent.branchId.trim()
1621
- : `branch-${index + 1}`;
1622
- if (!agentKey) {
1623
- return {
1624
- ok: false,
1625
- label,
1626
- branchId,
1627
- agentKey,
1628
- error: "missing agentKey",
1629
- spentCredits: null,
1630
- };
1631
- }
1632
-
1633
- const childRun = await Promise.race([
1634
- runChildAgent(agentKey, task, agent?.serverBase ?? defaultServerBase, timeoutMs),
1635
- sleep(timeoutMs).then(() => ({
1636
- ok: false as const,
1637
- status: 408,
1638
- error: `branch timeout after ${timeoutMs}ms`,
1639
- })),
1640
- ]);
1641
- if (!childRun.ok) {
1642
- return {
1643
- ok: false,
1644
- label,
1645
- branchId,
1646
- agentKey,
1647
- error: childRun.error,
1648
- status: childRun.status,
1649
- authForwarded: Boolean(authToken),
1650
- spentCredits: null,
1651
- };
1652
- }
1653
-
1654
- const payload = childRun.payload;
1655
- const pricing = calculateParallelBranchPricing({
1656
- usage: payload?.usage,
1657
- agentKey,
1658
- dialogId: payload?.dialogId ?? null,
1659
- agentConfig: {
1660
- id: agentKey,
1661
- model:
1662
- typeof payload?.model === "string" ? payload.model : null,
1663
- provider:
1664
- typeof payload?.provider === "string"
1665
- ? payload.provider
1666
- : null,
1667
- inputPrice:
1668
- typeof payload?.inputPrice === "number"
1669
- ? payload.inputPrice
1670
- : null,
1671
- outputPrice:
1672
- typeof payload?.outputPrice === "number"
1673
- ? payload.outputPrice
1674
- : null,
1675
- },
1676
- });
1677
- return {
1678
- ok: true,
1679
- label,
1680
- branchId,
1681
- parallelSessionId,
1682
- parallelIndex: index,
1683
- agentKey,
1684
- agentName: label,
1685
- ...(childRun.serverBase ? { serverBase: childRun.serverBase } : {}),
1686
- dialogId: payload?.dialogId ?? null,
1687
- model: payload?.model ?? null,
1688
- provider: payload?.provider ?? null,
1689
- content:
1690
- typeof payload?.content === "string" ? payload.content.trim() : "",
1691
- usage: payload?.usage ?? null,
1692
- artifacts: payload?.artifacts ?? null,
1693
- spentCredits: pricing.spentCredits,
1694
- billedModel: pricing.billedModel,
1695
- billedProvider: pricing.billedProvider,
1696
- billingServiceTier: pricing.billingServiceTier,
1697
- pricingError: pricing.pricingError,
1698
- };
1699
- }),
1700
- );
1701
-
1702
- const successful = results.filter((item) => item.ok);
1703
- const costSummary = summarizeParallelCosts(results);
1704
- const budget = summarizeParallelBudget({
1705
- budgetCredits,
1706
- results,
1707
- });
1708
- const stats = {
1709
- total: results.length,
1710
- succeeded: successful.length,
1711
- failed: results.length - successful.length,
1712
- };
1713
- const mergedContent = successful
1714
- .map((item) => `## ${item.label}\n\n${item.content || "(无内容)"}`)
1715
- .join("\n\n");
1716
-
1717
- return JSON.stringify({
1718
- success: true,
1719
- handoff: returnMode === "handoff",
1720
- returnMode,
1721
- displayMode,
1722
- toolName: "streamParallelAgents",
1723
- content: mergedContent,
1724
- summary: `并行调用 ${stats.total} 个 Agent · ${stats.succeeded} 成功 · ${stats.failed} 失败`,
1725
- stats,
1726
- costSummary,
1727
- ...(budget ? { budget } : {}),
1728
- parallelSessionId,
1729
- results,
1730
- timeoutMs,
1731
- usage: successful.map((item) => item.usage).filter(Boolean),
1732
- });
1733
- }
1734
- case "ziweiChart":
1735
- return JSON.stringify(runZiweiChart(args));
1736
-
1737
- // ── LevelDB 读写(同构,前后端均可用)──
1738
- case "read": {
1739
- if (looksLikeLocalFilePath(args.filePath)) {
1740
- return postMain("/api/read-file", {
1741
- filePath: args.filePath,
1742
- startLine: args.startLine,
1743
- endLine: args.endLine,
1744
- });
1745
- }
1746
- const dbKey = args.dbKey;
1747
- if (!dbKey) return JSON.stringify({ error: "read: dbKey is required" });
1748
- const blockedReadResult = guardWorkspaceRead(dbKey, context);
1749
- if (blockedReadResult) return blockedReadResult;
1750
- const res = await fetch(`${mainBase}/api/v1/db/read/${encodeURIComponent(dbKey)}`, {
1751
- headers: { Authorization: `Bearer ${authToken}` },
1752
- });
1753
- if (!res.ok) return JSON.stringify({ error: `read: HTTP ${res.status}`, detail: await res.text() });
1754
- recordWorkspaceRead(dbKey, context);
1755
- return res.text();
1756
- }
1757
- case "searchDialogMessages": {
1758
- const dialogKey = normalizeDialogSearchText(args.dialogKey);
1759
- const query = normalizeDialogSearchText(args.query);
1760
- if (!dialogKey.startsWith("dialog-")) {
1761
- return JSON.stringify({ error: "searchDialogMessages: dialogKey must be a dialog-* dbKey" });
1762
- }
1763
- if (!query) {
1764
- return JSON.stringify({ error: "searchDialogMessages: query is required" });
1765
- }
1766
- const blockedReadResult = guardWorkspaceRead(dialogKey, context);
1767
- if (blockedReadResult) return blockedReadResult;
1768
- const dialogId = dialogKey.split("-").at(-1) || dialogKey;
1769
- const scanLimit = clampDialogSearchNumber(
1770
- args.scanLimit,
1771
- SEARCH_DIALOG_MESSAGES_SCAN_LIMIT,
1772
- 1,
1773
- SEARCH_DIALOG_MESSAGES_SCAN_LIMIT,
1774
- );
1775
- const resultLimit = clampDialogSearchNumber(args.limit, 5, 1, SEARCH_DIALOG_MESSAGES_RESULT_LIMIT);
1776
- const contextMessages = clampDialogSearchNumber(
1777
- args.contextMessages,
1778
- 1,
1779
- 0,
1780
- SEARCH_DIALOG_MESSAGES_CONTEXT_LIMIT,
1781
- );
1782
- const res = await fetch(`${mainBase}/rpc/getConvMsgs`, {
1783
- method: "POST",
1784
- headers: {
1785
- Authorization: `Bearer ${authToken}`,
1786
- "Content-Type": "application/json",
1787
- },
1788
- body: JSON.stringify({ dialogId, limit: scanLimit }),
1789
- });
1790
- if (!res.ok) {
1791
- return JSON.stringify({ error: `searchDialogMessages: HTTP ${res.status}`, detail: await res.text() });
1792
- }
1793
- const newestFirst = await res.json();
1794
- const messages = Array.isArray(newestFirst) ? [...newestFirst].reverse() : [];
1795
- const matches = buildDialogMessageSearchResults({
1796
- messages,
1797
- query,
1798
- limit: resultLimit,
1799
- contextMessages,
1800
- role: typeof args.role === "string" ? args.role : undefined,
1801
- includeTools: args.includeTools,
1802
- contentClipChars: SEARCH_DIALOG_MESSAGES_CLIP_CHARS,
1803
- contextClipChars: SEARCH_DIALOG_MESSAGES_CONTEXT_CLIP_CHARS,
1804
- });
1805
- recordWorkspaceRead(dialogKey, context);
1806
- return JSON.stringify({
1807
- success: true,
1808
- dialogKey,
1809
- query,
1810
- scannedMessages: messages.length,
1811
- matches,
1812
- });
1813
- }
1814
- case "readDoc":
1815
- case "readPage": {
1816
- const id = typeof args.id === "string" ? args.id.trim() : "";
1817
- if (!id) return JSON.stringify({ error: `${serverToolName}: id is required` });
1818
- const blockedReadResult = guardWorkspaceRead(id, context);
1819
- if (blockedReadResult) return blockedReadResult;
1820
- const res = await fetch(`${mainBase}/api/v1/db/read/${encodeURIComponent(id)}`, {
1821
- headers: { Authorization: `Bearer ${authToken}` },
1822
- });
1823
- if (!res.ok) {
1824
- return JSON.stringify({
1825
- error: `${serverToolName}: HTTP ${res.status}`,
1826
- detail: await res.text(),
1827
- });
1828
- }
1829
- const page = await res.json();
1830
- recordWorkspaceRead(id, context);
1831
- return JSON.stringify(buildReadDocResult(page).rawData);
1832
- }
1833
- case "deleteSpaces": {
1834
- if (!context?.userId) {
1835
- return JSON.stringify({ error: "deleteSpaces: userId is required" });
1836
- }
1837
-
1838
- const query = typeof args.query === "string" ? args.query.trim() : "";
1839
- if (!query) {
1840
- return JSON.stringify({ error: "deleteSpaces: query is required" });
1841
- }
1842
-
1843
- const membershipsRes = await postJson(mainBase, "/rpc/getUserSpaceMemberships", {
1844
- userId: context.userId,
1845
- });
1846
- if (!membershipsRes.ok || !Array.isArray(membershipsRes.data)) {
1847
- return JSON.stringify({
1848
- error: `deleteSpaces: membership HTTP ${membershipsRes.status}`,
1849
- detail: membershipsRes.text,
1850
- });
1851
- }
1852
-
1853
- const candidates = filterSpaceDeletionCandidates(
1854
- membershipsRes.data as SpaceMembershipLike[],
1855
- {
1856
- query,
1857
- matchMode: args.matchMode,
1858
- }
1859
- );
1860
- const spaceRecordsById: Record<string, SpaceRecordLike | null> = {};
1861
- for (const candidate of candidates) {
1862
- const spaceId = String(candidate.spaceId ?? "").replace(/^space-/, "");
1863
- if (!spaceId) continue;
1864
- const readRes = await fetch(`${mainBase}/api/v1/db/read/${encodeURIComponent(createSpaceKey.space(spaceId))}`, {
1865
- headers: buildAuthHeaders(),
1866
- });
1867
- if (!readRes.ok) {
1868
- spaceRecordsById[spaceId] = null;
1869
- continue;
1870
- }
1871
- try {
1872
- spaceRecordsById[spaceId] = await readRes.json();
1873
- } catch {
1874
- spaceRecordsById[spaceId] = null;
1875
- }
1876
- }
1877
-
1878
- const preview = buildDeleteSpacesPreview({
1879
- currentUserId: context.userId,
1880
- candidates,
1881
- spaceRecordsById,
1882
- });
1883
-
1884
- const confirmedSpaceIds = Array.isArray(args.confirmedSpaceIds)
1885
- ? args.confirmedSpaceIds.filter((id: unknown): id is string => typeof id === "string" && id.trim())
1886
- : [];
1887
- if (confirmedSpaceIds.length === 0) {
1888
- return JSON.stringify({
1889
- requiresConfirmation: true,
1890
- message:
1891
- "请让用户确认后,再带 confirmedSpaceIds 调用 deleteSpaces。只会删除 Space 壳和成员关系,不删除挂载内容。",
1892
- ...preview,
1893
- });
1894
- }
1895
-
1896
- const { targets, missingConfirmedSpaceIds } =
1897
- resolveConfirmedSpaceDeletionTargets(preview, confirmedSpaceIds);
1898
- const deletedSpaceIds: string[] = [];
1899
- const deletedKeys: string[] = [];
1900
- const failures: Array<{ dbKey: string; status: number; detail: string }> = [];
1901
-
1902
- for (const target of targets) {
1903
- const record = spaceRecordsById[target.spaceId];
1904
- if (!record) continue;
1905
- const keys = [
1906
- ...spaceMemberKeysForDelete(target.spaceId, record),
1907
- createSpaceKey.space(target.spaceId),
1908
- ];
1909
- let targetFailed = false;
1910
- for (const key of keys) {
1911
- const result = await deleteDbKey(key);
1912
- if (!result.ok) {
1913
- targetFailed = true;
1914
- failures.push({ dbKey: key, status: result.status, detail: result.text });
1915
- } else {
1916
- deletedKeys.push(key);
1917
- }
1918
- }
1919
- if (!targetFailed) deletedSpaceIds.push(target.spaceId);
1920
- }
1921
-
1922
- return JSON.stringify({
1923
- deletedSpaceIds,
1924
- deletedKeys,
1925
- missingConfirmedSpaceIds,
1926
- skipped: preview.skipped,
1927
- failures,
1928
- });
1929
- }
1930
- case "createDoc":
1931
- case "createPage": {
1932
- const blockedKnowledgeResult = guardKnowledgeCapture({
1933
- context,
1934
- target: "doc",
1935
- });
1936
- if (blockedKnowledgeResult) return blockedKnowledgeResult;
1937
- const res = await fetch(`${mainBase}/api/page/create`, {
1938
- method: "POST",
1939
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
1940
- body: JSON.stringify({
1941
- title: args.title ?? "新文档",
1942
- content: args.content ?? "",
1943
- spaceId: args.spaceId,
1944
- categoryId: args.categoryId,
1945
- }),
1946
- });
1947
- if (!res.ok) return JSON.stringify({ error: `createDoc: HTTP ${res.status}`, detail: await res.text() });
1948
- recordKnowledgeCapture(context);
1949
- return res.text();
1950
- }
1951
- case "createSkillDoc": {
1952
- let title = "New Skill";
1953
- let content = "";
1954
- try {
1955
- const built = buildSkillDocFromArgs(args as CreateSkillDocArgs);
1956
- title = built.title;
1957
- content = built.content;
1958
- } catch (error: any) {
1959
- return JSON.stringify({
1960
- error: "createSkillDoc",
1961
- detail: typeof error?.message === "string" ? error.message : String(error),
1962
- });
1963
- }
1964
-
1965
- const blockedKnowledgeResult = guardKnowledgeCapture({
1966
- context,
1967
- target: "doc",
1968
- });
1969
- if (blockedKnowledgeResult) return blockedKnowledgeResult;
1970
-
1971
- const res = await fetch(`${mainBase}/api/page/create`, {
1972
- method: "POST",
1973
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
1974
- body: JSON.stringify({
1975
- title,
1976
- content,
1977
- spaceId: args.spaceId,
1978
- categoryId: args.categoryId,
1979
- }),
1980
- });
1981
- if (!res.ok) {
1982
- return JSON.stringify({ error: `createSkillDoc: HTTP ${res.status}`, detail: await res.text() });
1983
- }
1984
- recordKnowledgeCapture(context);
1985
- const created = await res.json();
1986
- return JSON.stringify(
1987
- buildSkillFollowupResult({
1988
- dbKey: created?.dbKey ?? created?.id ?? "",
1989
- title: created?.title ?? title,
1990
- skillId: (args as CreateSkillDocArgs).name || undefined,
1991
- spaceId: created?.spaceId ?? args.spaceId ?? null,
1992
- toolNames: Array.isArray((args as CreateSkillDocArgs).toolNames)
1993
- ? (args as CreateSkillDocArgs).toolNames
1994
- : [],
1995
- hasEvalConfig: Array.isArray((args as CreateSkillDocArgs).evalCases)
1996
- && (args as CreateSkillDocArgs).evalCases!.length > 0,
1997
- }).rawData
1998
- );
1999
- }
2000
- case "doctorSkill": {
2001
- let page: any = null;
2002
- if (typeof args.id === "string" && args.id.trim()) {
2003
- const res = await fetch(`${mainBase}/api/v1/db/read/${encodeURIComponent(args.id.trim())}`, {
2004
- headers: { Authorization: `Bearer ${authToken}` },
2005
- });
2006
- if (!res.ok) {
2007
- return JSON.stringify({ error: `doctorSkill: HTTP ${res.status}`, detail: await res.text() });
2008
- }
2009
- page = await res.json();
2010
- }
2011
- const result = await diagnoseSkillDocument(
2012
- {
2013
- id: page?.dbKey ?? args.id,
2014
- title: page?.title,
2015
- content: typeof args.content === "string" ? args.content : page?.content ?? "",
2016
- meta: resolvePageSkillMetadata(page),
2017
- tools: page?.tools,
2018
- },
2019
- );
2020
- return JSON.stringify(result);
2021
- }
2022
- case "evalSkill": {
2023
- let page: any = null;
2024
- const loadPage = async (dbKey: string) => {
2025
- const res = await fetch(`${mainBase}/api/v1/db/read/${encodeURIComponent(dbKey)}`, {
2026
- headers: { Authorization: `Bearer ${authToken}` },
2027
- });
2028
- if (!res.ok) return undefined;
2029
- return res.json();
2030
- };
2031
- if (typeof args.id === "string" && args.id.trim()) {
2032
- page = await loadPage(args.id.trim());
2033
- if (!page) {
2034
- return JSON.stringify({ error: `evalSkill: 未找到 ${args.id}` });
2035
- }
2036
- }
2037
- const result = await evaluateSkillDocument(
2038
- {
2039
- id: page?.dbKey ?? args.id,
2040
- title: page?.title,
2041
- content: typeof args.content === "string" ? args.content : page?.content ?? "",
2042
- meta: resolvePageSkillMetadata(page),
2043
- tools: page?.tools,
2044
- },
2045
- {
2046
- loadPage,
2047
- },
2048
- );
2049
- return JSON.stringify(result);
2050
- }
2051
- case "createSkillAgent": {
2052
- if (!context?.userId) {
2053
- return JSON.stringify({ error: "createSkillAgent: missing userId in execution context" });
2054
- }
2055
-
2056
- const agent = buildSkillAgentRecord({
2057
- userId: context.userId,
2058
- currentSpaceId: context.currentSpaceId ?? undefined,
2059
- args: args as CreateSkillAgentToolArgs,
2060
- });
2061
-
2062
- const res = await fetch(`${mainBase}/api/v1/db/write/`, {
2063
- method: "POST",
2064
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
2065
- body: JSON.stringify({
2066
- userId: context.userId,
2067
- customKey: agent.dbKey,
2068
- data: agent,
2069
- }),
2070
- });
2071
- if (!res.ok) {
2072
- return JSON.stringify({ error: `createSkillAgent: HTTP ${res.status}`, detail: await res.text() });
2073
- }
2074
- if (agent.isPublic) {
2075
- const publicRes = await fetch(`${mainBase}/api/v1/db/write/`, {
2076
- method: "POST",
2077
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
2078
- body: JSON.stringify({
2079
- userId: context.userId,
2080
- customKey: agent.publicDbKey,
2081
- data: agent,
2082
- }),
2083
- });
2084
- if (!publicRes.ok) {
2085
- return JSON.stringify({
2086
- error: `createSkillAgent(public): HTTP ${publicRes.status}`,
2087
- detail: await publicRes.text(),
2088
- });
2089
- }
2090
- }
2091
- return res.text();
2092
- }
2093
- case "prepareAgentDraft": {
2094
- const result = await prepareAgentDraftToolFunc(args as PrepareAgentDraftToolArgs);
2095
- return JSON.stringify(result);
2096
- }
2097
- case "createAgent": {
2098
- if (!context?.userId) {
2099
- return JSON.stringify({ error: "createAgent: missing userId in execution context" });
2100
- }
2101
- let agent: ReturnType<typeof buildServerCreatedAgentRecord>;
2102
- try {
2103
- agent = buildServerCreatedAgentRecord(
2104
- context.userId,
2105
- args as CreateAgentToolArgs,
2106
- context.currentSpaceId,
2107
- );
2108
- } catch (error) {
2109
- return JSON.stringify({
2110
- error: error instanceof Error ? error.message : String(error),
2111
- });
2112
- }
2113
- const privateKey = createAgentKey.private(context.userId, agent.id);
2114
- const publicKey = createAgentKey.public(agent.id);
2115
- const writeAgent = async (customKey: string) =>
2116
- fetch(`${mainBase}/api/v1/db/write/`, {
2117
- method: "POST",
2118
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
2119
- body: JSON.stringify({
2120
- userId: context.userId,
2121
- customKey,
2122
- data: agent,
2123
- }),
2124
- });
2125
-
2126
- const privateRes = await writeAgent(privateKey);
2127
- if (!privateRes.ok) {
2128
- return JSON.stringify({
2129
- error: `createAgent(private): HTTP ${privateRes.status}`,
2130
- detail: await privateRes.text(),
2131
- });
2132
- }
2133
- if (agent.isPublic) {
2134
- const publicRes = await writeAgent(publicKey);
2135
- if (!publicRes.ok) {
2136
- return JSON.stringify({
2137
- error: `createAgent(public): HTTP ${publicRes.status}`,
2138
- detail: await publicRes.text(),
2139
- });
2140
- }
2141
- }
2142
- return JSON.stringify({
2143
- rawData: {
2144
- ...agent,
2145
- dbKey: privateKey,
2146
- publicDbKey: agent.isPublic ? publicKey : undefined,
2147
- },
2148
- displayData: [
2149
- `已创建 Agent: ${agent.name}`,
2150
- `- ID: ${agent.id}`,
2151
- `- 模型: ${agent.model}`,
2152
- `- Provider: ${agent.provider}`,
2153
- `- 是否公开: ${agent.isPublic ? "是" : "否"}`,
2154
- agent.isPublic ? `- Public Key: ${publicKey}` : "",
2155
- ].filter(Boolean).join("\n"),
2156
- });
2157
- }
2158
- case "importSkill": {
2159
- const sourceUrl = typeof args.url === "string" ? normalizeSkillImportUrl(args.url) : "";
2160
- let rawMarkdown =
2161
- typeof args.content === "string" ? args.content.trim() : "";
2162
- if (!rawMarkdown && !sourceUrl) {
2163
- return JSON.stringify({ error: "importSkill: url 或 content 至少需要一个" });
2164
- }
2165
- if (!rawMarkdown) {
2166
- const sourceRes = await fetch(sourceUrl);
2167
- if (!sourceRes.ok) {
2168
- return JSON.stringify({
2169
- error: `importSkill(fetch): HTTP ${sourceRes.status}`,
2170
- detail: await sourceRes.text(),
2171
- });
2172
- }
2173
- rawMarkdown = (await sourceRes.text()).trim();
2174
- }
2175
-
2176
- const parsed = parseExternalSkillMarkdown(rawMarkdown);
2177
- const title = typeof args.title === "string" && args.title.trim()
2178
- ? args.title.trim()
2179
- : parsed.name || "Imported Skill";
2180
- const skillConfig: SkillDocConfig = {
2181
- version: "0.1",
2182
- kind: "skill",
2183
- id:
2184
- (parsed.name || title)
2185
- .trim()
2186
- .toLowerCase()
2187
- .replace(/[^a-z0-9]+/g, "-")
2188
- .replace(/^-+|-+$/g, "") || "imported-skill",
2189
- name: parsed.name || title,
2190
- description: parsed.description || "Imported external skill.",
2191
- triggerMode: "explicit",
2192
- toolNames: parsed.allowedTools,
2193
- budgetTier: "medium",
2194
- dispatchPreferred: false,
2195
- modalities: ["text"],
2196
- };
2197
- const content = buildSkillDocMarkdown({
2198
- body: [
2199
- parsed.body,
2200
- parsed.compatibility ? `## Compatibility\n${parsed.compatibility}` : "",
2201
- sourceUrl ? `Imported from: ${sourceUrl}` : "",
2202
- ]
2203
- .filter(Boolean)
2204
- .join("\n\n"),
2205
- skillConfig,
2206
- });
2207
-
2208
- const blockedKnowledgeResult = guardKnowledgeCapture({
2209
- context,
2210
- target: "doc",
2211
- });
2212
- if (blockedKnowledgeResult) return blockedKnowledgeResult;
2213
-
2214
- const res = await fetch(`${mainBase}/api/page/create`, {
2215
- method: "POST",
2216
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
2217
- body: JSON.stringify({
2218
- title,
2219
- content,
2220
- spaceId: args.spaceId,
2221
- categoryId: args.categoryId,
2222
- }),
2223
- });
2224
- if (!res.ok) {
2225
- return JSON.stringify({ error: `importSkill: HTTP ${res.status}`, detail: await res.text() });
2226
- }
2227
- recordKnowledgeCapture(context);
2228
- const created = await res.json();
2229
- return JSON.stringify(
2230
- buildSkillFollowupResult({
2231
- dbKey: created?.dbKey ?? created?.id ?? "",
2232
- title: created?.title ?? title,
2233
- skillId: skillConfig.id,
2234
- spaceId: created?.spaceId ?? args.spaceId ?? null,
2235
- toolNames: skillConfig.toolNames ?? [],
2236
- importedFrom: sourceUrl || null,
2237
- hasEvalConfig: false,
2238
- }).rawData
2239
- );
2240
- }
2241
- case "shareTable": {
2242
- const blockedShareResult = guardPublicTableShare(context);
2243
- if (blockedShareResult) return blockedShareResult;
2244
- if (!context?.userId) {
2245
- return JSON.stringify({ error: "shareTable requires an authenticated user." });
2246
- }
2247
-
2248
- const tableDbKey =
2249
- typeof args.dbKey === "string" && args.dbKey.trim()
2250
- ? args.dbKey.trim()
2251
- : typeof args.tenantId === "string" &&
2252
- args.tenantId.trim() &&
2253
- typeof args.tableId === "string" &&
2254
- args.tableId.trim()
2255
- ? `meta-${args.tenantId.trim()}-${args.tableId.trim()}`
2256
- : "";
2257
- if (!tableDbKey) {
2258
- return JSON.stringify({
2259
- error: "shareTable requires dbKey, or both tenantId and tableId.",
2260
- });
2261
- }
2262
-
2263
- const tableReadRes = await fetch(
2264
- `${mainBase}/api/v1/db/read/${encodeURIComponent(tableDbKey)}`,
2265
- { headers: buildAuthHeaders() },
2266
- );
2267
- if (!tableReadRes.ok) {
2268
- return JSON.stringify({
2269
- error: `shareTable: failed to read table meta (${tableReadRes.status})`,
2270
- detail: await tableReadRes.text(),
2271
- });
2272
- }
2273
- const tableReadPayload = await tableReadRes.json();
2274
- const tableMeta = tableReadPayload?.data ?? tableReadPayload;
2275
- const tableOwnerId =
2276
- (typeof args.tenantId === "string" && args.tenantId.trim()) ||
2277
- (typeof tableMeta?.tenantId === "string" && tableMeta.tenantId.trim()) ||
2278
- context.userId;
2279
- const tableId =
2280
- (typeof args.tableId === "string" && args.tableId.trim()) ||
2281
- (typeof tableMeta?.tableId === "string" && tableMeta.tableId.trim()) ||
2282
- tableDbKey;
2283
-
2284
- let settings: any = null;
2285
- try {
2286
- const settingsRes = await fetch(
2287
- `${mainBase}/api/v1/db/read/${encodeURIComponent(createUserKey.settings(context.userId))}`,
2288
- { headers: buildAuthHeaders() },
2289
- );
2290
- if (settingsRes.ok) {
2291
- const settingsPayload = await settingsRes.json();
2292
- settings = settingsPayload?.data ?? settingsPayload;
2293
- }
2294
- } catch {
2295
- settings = null;
2296
- }
2297
-
2298
- const originServer =
2299
- normalizeServerOrigin(settings?.currentServer) ??
2300
- normalizeServerOrigin(mainBase) ??
2301
- normalizeBase(mainBase);
2302
- const fanoutServers = buildFanoutServerList(originServer, settings?.syncServers);
2303
- const token = generateShareToken();
2304
- const dbKey = shareKey.create(token);
2305
- const createdAt = Date.now();
2306
- const title =
2307
- (typeof args.title === "string" && args.title.trim()) ||
2308
- (typeof tableMeta?.displayName === "string" && tableMeta.displayName.trim()) ||
2309
- tableId;
2310
- const description =
2311
- typeof args.description === "string" && args.description.trim()
2312
- ? args.description.trim()
2313
- : undefined;
2314
- const visibility = args.visibility === "private" ? "private" : "community";
2315
-
2316
- const sharedObject = {
2317
- type: DataType.TABLE,
2318
- version: 1,
2319
- data: {
2320
- mode: "live",
2321
- tableDbKey,
2322
- tableOwnerId,
2323
- originServer,
2324
- },
2325
- meta: {
2326
- authorId: context.userId,
2327
- createdAt,
2328
- visibility,
2329
- title,
2330
- description,
2331
- originalId: tableDbKey,
2332
- mode: "live",
2333
- tableDbKey,
2334
- tableOwnerId,
2335
- originServer,
2336
- },
2337
- };
2338
- const indexKeys = shareKey.allIndexKeysFromShare(dbKey, sharedObject);
2339
- const writeBody = {
2340
- data: sharedObject,
2341
- customKey: dbKey,
2342
- userId: context.userId,
2343
- indexKeys,
2344
- };
2345
- const originResult = {
2346
- server: originServer,
2347
- ...(await postJson(originServer, "/api/v1/db/write/", writeBody)),
2348
- };
2349
- if (!originResult.ok) {
2350
- return JSON.stringify({
2351
- error: "shareTable: failed to publish on origin server",
2352
- originServer,
2353
- detail: originResult.text ?? "",
2354
- });
2355
- }
2356
- const replicaServers = fanoutServers.filter(
2357
- (server) => normalizeServerOrigin(server) !== originServer,
2358
- );
2359
- const replicaResults = await Promise.all(
2360
- replicaServers.map(async (server) => ({
2361
- server,
2362
- ...(await postJson(server, "/api/v1/db/write/", writeBody)),
2363
- })),
2364
- );
2365
- const writeResults = [originResult, ...replicaResults];
2366
-
2367
- const replicaFailures = writeResults
2368
- .filter(
2369
- (result) =>
2370
- normalizeServerOrigin(result.server) !== originServer && !result.ok,
2371
- )
2372
- .map((result) => ({
2373
- server: result.server,
2374
- status: result.status,
2375
- detail: result.text,
2376
- }));
2377
-
2378
- return JSON.stringify({
2379
- token,
2380
- key: dbKey,
2381
- url: `/share/${token}`,
2382
- originServer,
2383
- replicatedServers: fanoutServers,
2384
- ...(replicaFailures.length > 0 ? { replicaFailures } : {}),
2385
- });
2386
- }
2387
- case "createTable":
2388
- {
2389
- const blockedKnowledgeResult = guardKnowledgeCapture({
2390
- context,
2391
- target: "table",
2392
- });
2393
- if (blockedKnowledgeResult) return blockedKnowledgeResult;
2394
- }
2395
- {
2396
- const result = await postMain("/api/table/create", {
2397
- spaceId: args.spaceId,
2398
- title: args.title,
2399
- description: args.description,
2400
- tags: args.tags,
2401
- categoryId: args.categoryId,
2402
- columns: args.columns,
2403
- withDefaultRows: args.withDefaultRows,
2404
- });
2405
- recordKnowledgeCapture(context);
2406
- return result;
2407
- }
2408
- case "addTableRow":
2409
- return postMain(
2410
- "/api/table/add-row",
2411
- withFeedbackSubmitterUserId({
2412
- tenantId: args.tenantId,
2413
- tableId: args.tableId,
2414
- values: args.values,
2415
- }),
2416
- );
2417
- case "queryTableRows":
2418
- return postMain("/api/table/query-rows", {
2419
- tenantId: args.tenantId,
2420
- tableId: args.tableId,
2421
- filters: args.filters,
2422
- columns: args.columns,
2423
- limit: args.limit,
2424
- offset: args.offset,
2425
- includeBaseFields: args.includeBaseFields,
2426
- sortBy: args.sortBy,
2427
- sortOrder: args.sortOrder,
2428
- });
2429
- case "updateTableRow":
2430
- return postMain("/api/table/update-row", {
2431
- tenantId: args.tenantId,
2432
- tableId: args.tableId,
2433
- rowId: args.rowId,
2434
- dbKey: args.dbKey,
2435
- changes: args.changes,
2436
- });
2437
- case "deleteTableRow":
2438
- {
2439
- const blockedDeleteResult = guardDestructiveAction({
2440
- context,
2441
- target: "table_row_delete",
2442
- detail: "deleteTableRow",
2443
- });
2444
- if (blockedDeleteResult) return blockedDeleteResult;
2445
- }
2446
- return postMain("/api/table/delete-row", {
2447
- tenantId: args.tenantId,
2448
- tableId: args.tableId,
2449
- rowId: args.rowId,
2450
- dbKey: args.dbKey,
2451
- });
2452
- case "addTableRows":
2453
- return postMain("/api/table/add-rows", {
2454
- tenantId: args.tenantId,
2455
- tableId: args.tableId,
2456
- rows: args.rows,
2457
- });
2458
- case "updateTableRows":
2459
- return postMain("/api/table/update-rows", {
2460
- tenantId: args.tenantId,
2461
- tableId: args.tableId,
2462
- updates: args.updates,
2463
- });
2464
- case "deleteTableRows":
2465
- {
2466
- const blockedDeleteResult = guardDestructiveAction({
2467
- context,
2468
- target: "table_row_delete",
2469
- detail: "deleteTableRows",
2470
- });
2471
- if (blockedDeleteResult) return blockedDeleteResult;
2472
- }
2473
- return postMain("/api/table/delete-rows", {
2474
- tenantId: args.tenantId,
2475
- tableId: args.tableId,
2476
- rowIds: args.rowIds,
2477
- dbKeys: args.dbKeys,
2478
- });
2479
- case "addTableColumn":
2480
- return postMain("/api/table/add-column", {
2481
- tenantId: args.tenantId,
2482
- tableId: args.tableId,
2483
- name: args.name,
2484
- label: args.label,
2485
- type: args.type,
2486
- description: args.description,
2487
- required: args.required,
2488
- options: args.options,
2489
- });
2490
- case "deleteTableColumn":
2491
- {
2492
- const blockedDeleteResult = guardDestructiveAction({
2493
- context,
2494
- target: "table_column_delete",
2495
- detail: "deleteTableColumn",
2496
- });
2497
- if (blockedDeleteResult) return blockedDeleteResult;
2498
- }
2499
- return postMain("/api/table/delete-column", {
2500
- tenantId: args.tenantId,
2501
- tableId: args.tableId,
2502
- columnName: args.columnName,
2503
- });
2504
- case "renameTableColumn":
2505
- return postMain("/api/table/rename-column", {
2506
- tenantId: args.tenantId,
2507
- tableId: args.tableId,
2508
- oldName: args.oldName,
2509
- newName: args.newName,
2510
- });
2511
- case "renameTableColumnLabel":
2512
- return postMain("/api/table/rename-column-label", {
2513
- tenantId: args.tenantId,
2514
- tableId: args.tableId,
2515
- columnName: args.columnName,
2516
- newLabel: args.newLabel,
2517
- });
2518
- case "renameTable":
2519
- return postMain("/api/table/rename", {
2520
- tenantId: args.tenantId,
2521
- tableId: args.tableId,
2522
- newName: args.newName,
2523
- });
2524
-
2525
- case "updateDoc":
2526
- case "update_page": {
2527
- const { id, title, content, mode = "replace" } = args;
2528
- if (!id) return JSON.stringify({ error: "updateDoc: id (dbKey) is required" });
2529
- if (typeof content !== "string") {
2530
- return JSON.stringify({ error: "updateDoc: content is required" });
2531
- }
2532
-
2533
- const existingRes = await fetch(`${mainBase}/api/v1/db/read/${encodeURIComponent(id)}`, {
2534
- headers: { Authorization: `Bearer ${authToken}` },
2535
- });
2536
- if (!existingRes.ok) {
2537
- return JSON.stringify({ error: `updateDoc(read): HTTP ${existingRes.status}`, detail: await existingRes.text() });
2538
- }
2539
-
2540
- const existing = await existingRes.json();
2541
- const currentMarkdown =
2542
- typeof existing?.content === "string" && existing.content.trim()
2543
- ? existing.content
2544
- : slateToRenderMarkdown(
2545
- Array.isArray(existing?.slateData) ? existing.slateData : [],
2546
- );
2547
- const mergedMarkdown = mode === "append"
2548
- ? [currentMarkdown, content].filter(Boolean).join("\n\n")
2549
- : content;
2550
- const parsedProtocol = parseSkillDocProtocol(
2551
- mergedMarkdown,
2552
- existing?.meta,
2553
- existing?.tools,
2554
- );
2555
- const slateData = markdownToSlate(parsedProtocol.content) as any[];
2556
- const tools = extractMentionsFromSlate(slateData as any);
2557
-
2558
- const changes: Record<string, any> = {
2559
- slateData,
2560
- content: parsedProtocol.content,
2561
- tools,
2562
- ...(parsedProtocol.meta ? { meta: parsedProtocol.meta } : {}),
2563
- updated_at: new Date().toISOString(),
2564
- };
2565
- if (typeof title === "string" && title.trim()) {
2566
- changes.title = title.trim();
2567
- }
2568
-
2569
- const res = await fetch(`${mainBase}/api/v1/db/patch/${encodeURIComponent(id)}`, {
2570
- method: "PATCH",
2571
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
2572
- body: JSON.stringify(changes),
2573
- });
2574
- if (!res.ok) return JSON.stringify({ error: `updateDoc: HTTP ${res.status}`, detail: await res.text() });
2575
- return JSON.stringify({ success: true, id, title: changes.title ?? existing?.title });
2576
- }
2577
-
2578
- // ── 数据库(服务端专属)──
2579
- case "executeSql":
2580
- return postMain("/api/v1/sqlite/execute_sql", { sql: args.sql, params: args.params });
2581
-
2582
- // ── 文件系统 / shell(由目标 server 直接提供)──
2583
- case "readFile":
2584
- return postMain("/api/read-file", { filePath: args.filePath, startLine: args.startLine, endLine: args.endLine });
2585
- case "writeFile":
2586
- return postMain("/api/write-file", { filePath: args.filePath, content: args.content, overwrite: args.overwrite });
2587
- case "applyEdit":
2588
- return postMain("/api/apply-edit", { filePath: args.filePath, edits: args.edits });
2589
- case "execShell":
2590
- if (isDestructiveShellCommand({ command: args.command, input: args.input })) {
2591
- const blockedDeleteResult = guardDestructiveAction({
2592
- context,
2593
- target: "shell_command",
2594
- detail: "execShell destructive command",
2595
- });
2596
- if (blockedDeleteResult) return blockedDeleteResult;
2597
- }
2598
- return postMain("/api/exec-shell", {
2599
- command: args.command,
2600
- cwd: args.cwd,
2601
- shell: args.shell,
2602
- interactive: args.interactive,
2603
- pty: args.pty,
2604
- sessionId: args.sessionId,
2605
- input: args.input,
2606
- close: args.close,
2607
- });
2608
- case "codeSearch":
2609
- return postMain("/api/code-search", {
2610
- query: args.query,
2611
- path: args.path ?? args.pathScope ?? args.dirPath,
2612
- glob: args.glob,
2613
- mode: args.mode ?? "content",
2614
- maxResults: args.maxResults ?? args.maxFiles,
2615
- caseSensitive: args.caseSensitive,
2616
- });
2617
- case "search_workspace":
2618
- return postMain("/api/search-repo", {
2619
- query: args.query,
2620
- pathScope: args.pathScope,
2621
- maxResults: args.maxResults,
2622
- contextLines: args.contextLines,
2623
- });
2624
- case "applyLineEdits":
2625
- return postMain("/api/apply-line-edits", { filePath: args.filePath, edits: args.edits });
2626
- case "checkEnv":
2627
- case "check_env":
2628
- return postMain("/api/check-env", { check: args.check ?? "build" });
2629
-
2630
- // ── 浏览器自动化(服务端 Puppeteer)──
2631
- case "browser_openSession":
2632
- case "browser_closeSession":
2633
- case "browser_selectOption":
2634
- case "browser_click":
2635
- case "browser_typeText":
2636
- case "browser_readContent":
2637
- case "browser_probePage":
2638
- return postMain("/api/browser-tool", {
2639
- toolName: serverToolName,
2640
- params: args,
2641
- });
2642
-
2643
- case "email_provision_identity": {
2644
- const missingAgentKey = requireCurrentAgentKey();
2645
- if (missingAgentKey) return missingAgentKey;
2646
- const result = await postJson(mainBase, "/rpc/provisionAgentEmailIdentity", {
2647
- ...args,
2648
- agentId: currentAgentKey,
2649
- });
2650
- if (!result.ok) {
2651
- return JSON.stringify(
2652
- result.data ?? {
2653
- error: `email_provision_identity: HTTP ${result.status}`,
2654
- detail: result.text,
2655
- },
2656
- );
2657
- }
2658
- return JSON.stringify(result.data ?? {});
2659
- }
2660
- case "email_wait_for": {
2661
- const missingAgentKey = requireCurrentAgentKey();
2662
- if (missingAgentKey) return missingAgentKey;
2663
-
2664
- const timeoutSecondsRaw =
2665
- typeof args.timeoutSeconds === "number"
2666
- ? args.timeoutSeconds
2667
- : Number(args.timeoutSeconds ?? 60);
2668
- const timeoutMs = Math.min(Math.max(timeoutSecondsRaw, 1), 180) * 1000;
2669
- const pollIntervalRaw =
2670
- typeof args.pollIntervalMs === "number"
2671
- ? args.pollIntervalMs
2672
- : Number(args.pollIntervalMs ?? 3000);
2673
- const pollIntervalMs = Math.min(Math.max(pollIntervalRaw, 500), 10_000);
2674
- const limitRaw =
2675
- typeof args.limit === "number" ? args.limit : Number(args.limit ?? 20);
2676
- const limit = Math.min(Math.max(limitRaw, 1), 200);
2677
- const startedAt = Date.now();
2678
- let attempts = 0;
2679
-
2680
- while (Date.now() - startedAt <= timeoutMs) {
2681
- attempts += 1;
2682
- const result = await postJson(mainBase, "/rpc/listEmails", {
2683
- ownerId: currentAgentKey,
2684
- mailbox: typeof args.mailbox === "string" ? args.mailbox : "inbox",
2685
- status: args.status,
2686
- tag: args.tag,
2687
- limit,
2688
- });
2689
- if (!result.ok) {
2690
- return JSON.stringify(
2691
- result.data ?? {
2692
- error: `email_wait_for: HTTP ${result.status}`,
2693
- detail: result.text,
2694
- },
2695
- );
2696
- }
2697
- const items = Array.isArray(result.data) ? result.data : [];
2698
- const match = items.find(
2699
- (email) => emailIsFreshForWait(email, startedAt) && emailMatchesWaitFilters(email, args),
2700
- );
2701
- if (match) {
2702
- return JSON.stringify({
2703
- email: match,
2704
- attempts,
2705
- waitedMs: Date.now() - startedAt,
2706
- });
2707
- }
2708
- await sleep(pollIntervalMs);
2709
- }
2710
-
2711
- return JSON.stringify({
2712
- error: `等待邮件超时:${Math.ceil(timeoutMs / 1000)} 秒内没有匹配邮件`,
2713
- });
2714
- }
2715
- case "email_extract_verification": {
2716
- let email: any = null;
2717
- let text = typeof args.text === "string" ? args.text : undefined;
2718
- let html = typeof args.html === "string" ? args.html : undefined;
2719
- if (typeof args.dbKey === "string" && args.dbKey.trim()) {
2720
- const result = await postJson(mainBase, "/rpc/getEmail", {
2721
- dbKey: args.dbKey.trim(),
2722
- });
2723
- if (!result.ok) {
2724
- return JSON.stringify(
2725
- result.data ?? {
2726
- error: `email_extract_verification: HTTP ${result.status}`,
2727
- detail: result.text,
2728
- },
2729
- );
2730
- }
2731
- email = result.data;
2732
- text = typeof email?.text === "string" ? email.text : text;
2733
- html = typeof email?.html === "string" ? email.html : html;
2734
- }
2735
- if (!text && !html) {
2736
- return JSON.stringify({
2737
- error: "必须提供 dbKey、text 或 html 中至少一个",
2738
- });
2739
- }
2740
- return JSON.stringify({
2741
- email,
2742
- ...extractEmailVerificationArtifacts({ text, html }),
2743
- });
2744
- }
2745
-
2746
- // ── 应用部署管理 ──
2747
- case "appPreflight":
2748
- return postMain("/api/app/preflight", {
2749
- name: args.name,
2750
- code: args.code,
2751
- files: normalizeAppFiles(),
2752
- appId: args.appId,
2753
- framework: args.framework,
2754
- spaceId: args.spaceId,
2755
- });
2756
- case "appDeploy": {
2757
- const nextFiles = normalizeAppFiles();
2758
- const guardUserInput =
2759
- typeof context?.userInput === "string" ? context.userInput.trim() : "";
2760
- if (args.appId && guardUserInput && (typeof args.code === "string" || (Array.isArray(nextFiles) && nextFiles.length > 0))) {
2761
- const previousRead = await postJson(mainBase, "/api/app/prepare-edit", {
2762
- appId: args.appId,
2763
- });
2764
- if (previousRead.ok) {
2765
- const guardResult = evaluateSmallVisualEditGuard({
2766
- userInput: guardUserInput,
2767
- previousSource: previousRead.data ?? {},
2768
- nextSource: {
2769
- code: typeof args.code === "string" ? args.code : undefined,
2770
- files: nextFiles,
2771
- },
2772
- });
2773
- if (!guardResult.ok) {
2774
- return JSON.stringify(guardResult.rawData);
2775
- }
2776
- }
2777
- }
2778
-
2779
- const deployStart = await postJson(mainBase, "/api/app/deploy", {
2780
- name: args.name,
2781
- code: args.code,
2782
- files: nextFiles,
2783
- appId: args.appId,
2784
- framework: args.framework,
2785
- spaceId: args.spaceId,
2786
- });
2787
- if (!deployStart.ok) {
2788
- return JSON.stringify(
2789
- deployStart.data ?? {
2790
- error: `appDeploy: HTTP ${deployStart.status}`,
2791
- detail: deployStart.text,
2792
- },
2793
- );
2794
- }
2795
-
2796
- const jobId =
2797
- typeof deployStart.data?.jobId === "string"
2798
- ? deployStart.data.jobId
2799
- : "";
2800
- if (!jobId) {
2801
- return deployStart.text;
2802
- }
2803
- return waitForAppDeployResult(jobId);
2804
- }
2805
- case "appList":
2806
- return postMain("/api/app/list", args.spaceId ? { spaceId: args.spaceId } : {});
2807
- case "appDelete": {
2808
- if (!args.appId) {
2809
- return JSON.stringify({ error: "appDelete: appId is required; call appList first" });
2810
- }
2811
- {
2812
- const blockedDeleteResult = guardDestructiveAction({
2813
- context,
2814
- target: "app_delete",
2815
- detail: "appDelete",
2816
- });
2817
- if (blockedDeleteResult) return blockedDeleteResult;
2818
- }
2819
- const lookupRes = await fetch(`${mainBase}/api/app/get`, {
2820
- method: "POST",
2821
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${authToken}` },
2822
- body: JSON.stringify({ appId: args.appId }),
2823
- });
2824
- if (!lookupRes.ok) {
2825
- return JSON.stringify({ error: `appDelete lookup: HTTP ${lookupRes.status}`, detail: await lookupRes.text() });
2826
- }
2827
- const lookupJson = await lookupRes.json().catch(() => null) as { appKey?: string } | null;
2828
- if (!lookupJson?.appKey) {
2829
- return JSON.stringify({ error: "appDelete: appKey not found" });
2830
- }
2831
- const deleteRes = await fetch(`${mainBase}/api/v1/db/delete/${encodeURIComponent(lookupJson.appKey)}`, {
2832
- method: "DELETE",
2833
- headers: { Authorization: `Bearer ${authToken}` },
2834
- });
2835
- if (!deleteRes.ok) {
2836
- return JSON.stringify({ error: `appDelete: HTTP ${deleteRes.status}`, detail: await deleteRes.text() });
2837
- }
2838
- return deleteRes.text();
2839
- }
2840
- case "appRead":
2841
- if (!args.appId) {
2842
- return JSON.stringify({ error: "appRead: appId is required; call appList first" });
2843
- }
2844
- {
2845
- const readResult = await postJson(mainBase, "/api/app/prepare-edit", {
2846
- appId: args.appId,
2847
- });
2848
- if (!readResult.ok) {
2849
- return JSON.stringify(
2850
- readResult.data ?? {
2851
- error: `appRead: HTTP ${readResult.status}`,
2852
- detail: readResult.text,
2853
- },
2854
- );
2855
- }
2856
- const styleSystemAnalysis = analyzeAppStyleSystem(readResult.data ?? {});
2857
- const styleSystemHint = buildAppStyleSystemHint(styleSystemAnalysis);
2858
- return JSON.stringify({
2859
- ...(readResult.data ?? {}),
2860
- styleSystemStatus: styleSystemAnalysis.status,
2861
- legacyMigrationRecommended:
2862
- styleSystemAnalysis.legacyMigrationRecommended,
2863
- styleSystemEvidence: styleSystemAnalysis.evidence,
2864
- ...(styleSystemHint ? { styleSystemHint } : {}),
2865
- });
2866
- }
2867
-
2868
- default:
2869
- return JSON.stringify({
2870
- error: `Tool "${toolCall.function.name}" is not available in server-side agent mode.`,
2871
- });
2872
- }
2873
- }